clone

a personal forge on plain git: static pages, stacked-diff reviews, signed local ci, repo sites and releases

main
forge / server / Caddyfile.example
Caddyfile.example 1.8K
1# Pages, plus clones: git clone https://git.example.com/cat/greet.git. Git's2# paths, smart and dumb, go to git http-backend, which serves only repos with3# git-daemon-export-ok (not private ones); nothing else inside a bare repo is4# served. A path www has no file for goes to the private server (private5# repos' pages, sign-in, the 404). forge server caddyfile prints the full6# config, which also lets a token clone a private repo (forward_auth).7git.example.com {8 @git path_regexp git ^/[A-Za-z0-9_-][^/]*/[^/]+\.git/(HEAD|info/refs|objects/info/(alternates|http-alternates|packs)|objects/[0-9a-f]{2}/([0-9a-f]{38}|[0-9a-f]{62})|objects/pack/pack-([0-9a-f]{40}|[0-9a-f]{64})\.(pack|idx)|git-upload-pack)$9 handle @git {10 reverse_proxy unix//run/fcgiwrap.socket {11 transport fastcgi {12 env SCRIPT_FILENAME /usr/lib/git-core/git-http-backend13 env GIT_PROJECT_ROOT /srv/git14 env PATH_INFO {path}15 }16 }17 }18 @bare path_regexp bare ^/[A-Za-z0-9_-][^/]*/[^/]+\.git(/.*)?$19 handle @bare {20 respond 40421 }22 # Sites are served from their own origin below, away from the forge.23 @sites path /sites/* /previews/*24 handle @sites {25 redir https://pages.example.com{uri}26 }27 @public file {28 root /srv/git/.forge/www29 try_files {path} {path}/30 }31 handle @public {32 root * /srv/git/.forge/www33 file_server34 }35 handle {36 reverse_proxy 127.0.0.1:809337 }38}3940# Set FORGE_SITES_URL=https://pages.example.com/sites/{owner}/{repo}/{site}/ and41# FORGE_PREVIEWS_URL=https://pages.example.com/previews/{owner}/{repo}/{site}/{branch}/42# in /srv/git/.forge/config, and the matching forge.sitesurl / forge.previewsurl43# git config on developer machines so builds get the right FORGE_SITE_BASE.44pages.example.com {45 root * /srv/git/.forge/www46 @sites path /sites/* /previews/*47 file_server @sites48}