frieren
a self-hosted git server in one binary — everyone reads, only the owner writes
build: Makefile golden path and deploy examples
ee24d045842c661c785fdcd83f0af01856231eff
justin06lee · Aug 18, 2026, 10:09 PM (5h ago)
Makefile | 25 +++++++++++++++++++++++++ deploy/Caddyfile | 6 ++++++ deploy/frieren.service | 30 ++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+)
| @@ -0,0 +1,25 @@ | |||
| 1 | + | VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo dev) | |
| 2 | + | INSTALL_DIR := $(HOME)/.local/bin | |
| 3 | + | ||
| 4 | + | .PHONY: all build install update test clean | |
| 5 | + | ||
| 6 | + | all: build install | |
| 7 | + | ||
| 8 | + | build: | |
| 9 | + | go build -ldflags "-X main.version=$(VERSION)" -o dist/frieren . | |
| 10 | + | ||
| 11 | + | install: build | |
| 12 | + | mkdir -p $(INSTALL_DIR) | |
| 13 | + | install dist/frieren $(INSTALL_DIR)/frieren | |
| 14 | + | @case ":$$PATH:" in \ | |
| 15 | + | *:"$(INSTALL_DIR)":*) echo "installed $(INSTALL_DIR)/frieren" ;; \ | |
| 16 | + | *) echo "installed $(INSTALL_DIR)/frieren — NOTE: $(INSTALL_DIR) is not in your PATH" ;; \ | |
| 17 | + | esac | |
| 18 | + | ||
| 19 | + | update: all | |
| 20 | + | ||
| 21 | + | test: | |
| 22 | + | go test ./... | |
| 23 | + | ||
| 24 | + | clean: | |
| 25 | + | rm -rf dist |
| @@ -0,0 +1,6 @@ | |||
| 1 | + | # Caddy reverse proxy: automatic HTTPS in front of frieren. | |
| 2 | + | # Point your domain's DNS at this machine, then `caddy run`. | |
| 3 | + | ||
| 4 | + | git.example.com { | |
| 5 | + | reverse_proxy 127.0.0.1:7420 | |
| 6 | + | } |
| @@ -0,0 +1,30 @@ | |||
| 1 | + | # systemd unit for the machine that hosts frieren. | |
| 2 | + | # | |
| 3 | + | # sudo useradd --system --create-home --home-dir /srv/frieren frieren | |
| 4 | + | # sudo install frieren /usr/local/bin/frieren | |
| 5 | + | # sudo install -m 600 -o frieren /dev/null /srv/frieren/env | |
| 6 | + | # echo "FRIEREN_TOKEN=$(frieren token)" | sudo tee /srv/frieren/env | |
| 7 | + | # sudo cp deploy/frieren.service /etc/systemd/system/ | |
| 8 | + | # sudo systemctl enable --now frieren | |
| 9 | + | ||
| 10 | + | [Unit] | |
| 11 | + | Description=frieren self-hosted git server | |
| 12 | + | After=network.target | |
| 13 | + | ||
| 14 | + | [Service] | |
| 15 | + | User=frieren | |
| 16 | + | Group=frieren | |
| 17 | + | EnvironmentFile=/srv/frieren/env | |
| 18 | + | ExecStart=/usr/local/bin/frieren serve -addr 127.0.0.1:7420 -root /srv/frieren/repos | |
| 19 | + | Restart=always | |
| 20 | + | RestartSec=2 | |
| 21 | + | ||
| 22 | + | # Hardening | |
| 23 | + | NoNewPrivileges=true | |
| 24 | + | ProtectSystem=strict | |
| 25 | + | ProtectHome=true | |
| 26 | + | ReadWritePaths=/srv/frieren/repos | |
| 27 | + | PrivateTmp=true | |
| 28 | + | ||
| 29 | + | [Install] | |
| 30 | + | WantedBy=multi-user.target | |
| 0 | 31 |