summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Caddyfile22
-rw-r--r--Dockerfile20
-rw-r--r--README44
-rw-r--r--cgitrc.template27
-rw-r--r--config.env16
-rw-r--r--entrypoint.sh19
-rwxr-xr-xstart_container.sh37
7 files changed, 185 insertions, 0 deletions
diff --git a/Caddyfile b/Caddyfile
new file mode 100644
index 0000000..b783e7b
--- /dev/null
+++ b/Caddyfile
@@ -0,0 +1,22 @@
1{$DOMAIN} {
2 handle {$CGIT_CSS} {
3 root * /usr/share/webapps/cgit
4 file_server
5 }
6
7 handle {$CGIT_LOGO} {
8 root * /usr/share/webapps/cgit
9 file_server
10 }
11
12 handle {
13 reverse_proxy unix/{$FCGI_SOCK} {
14 transport fastcgi {
15 env SCRIPT_FILENAME /usr/share/webapps/cgit/cgit.cgi
16 env QUERY_STRING {query}
17 env HTTP_HOST {host}
18 env PATH_INFO {path}
19 }
20 }
21 }
22}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..35208e9
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,20 @@
1FROM alpine:latest
2
3RUN apk add --no-cache \
4 caddy \
5 cgit \
6 git \
7 fcgiwrap \
8 spawn-fcgi \
9 gettext \
10 openssl
11
12COPY cgitrc.template /etc/cgitrc.template
13COPY Caddyfile /etc/caddy/Caddyfile
14COPY entrypoint.sh /entrypoint.sh
15RUN chmod +x /entrypoint.sh
16
17# 80 required for Let's Encrypt HTTP-01 challenge, 443 for HTTPS
18EXPOSE 80 443
19
20ENTRYPOINT ["/entrypoint.sh"]
diff --git a/README b/README
new file mode 100644
index 0000000..c37fae2
--- /dev/null
+++ b/README
@@ -0,0 +1,44 @@
1CGIT-CADDY CONTAINER
2
3Build:
4 podman build -t cgit-caddy .
5
6Run (first time or after changes):
7 ./start_container.sh
8
9Run (manual):
10 podman run -d \
11 --name cgit \
12 --network public-routed \
13 --ip 10.89.0.2 \
14 --cap-add=NET_ADMIN \
15 --env-file config.env \
16 -v cgit_data:/data \
17 -v /git:/git \
18 localhost/cgit-caddy
19
20 sleep 2
21 podman exec cgit ip addr add 37.27.166.242/32 dev eth0
22 ip route add 37.27.166.242/32 via 10.89.0.2
23
24Restart:
25 podman restart cgit
26
27Stop:
28 podman stop cgit && podman rm cgit && ip route del 37.27.166.242/32
29
30Cleanup (remove everything):
31 podman stop cgit
32 podman rm cgit
33 podman volume rm cgit_data
34 ip route del 37.27.166.242/32
35 podman network rm public-routed # only if no other containers use it
36
37Logs:
38 podman logs -f cgit
39
40Shell:
41 podman exec -it cgit sh
42
43Create repo:
44 git init --bare /git/myrepo
diff --git a/cgitrc.template b/cgitrc.template
new file mode 100644
index 0000000..950bf64
--- /dev/null
+++ b/cgitrc.template
@@ -0,0 +1,27 @@
1css=${CGIT_CSS}
2logo=${CGIT_LOGO}
3root-title=Git Repositories
4root-desc=
5scan-path=${GIT_PATH}
6
7# Features
8enable-index-links=1
9enable-commit-graph=1
10enable-log-filecount=1
11enable-log-linecount=1
12enable-http-clone=1
13enable-blame=1
14
15# Downloads
16snapshots=tar.gz zip tar.xz
17
18# Clone URL
19clone-url=https://$HTTP_HOST/$CGIT_REPO_URL
20
21# Caching (0 = disabled)
22cache-size=0
23
24# Appearance
25max-repo-count=50
26max-stats=year
27side-by-side-diffs=1
diff --git a/config.env b/config.env
new file mode 100644
index 0000000..417ce14
--- /dev/null
+++ b/config.env
@@ -0,0 +1,16 @@
1# Container config
2CONTAINER_NAME=cgit
3DOMAIN=git2.noml.ch
4
5# Network
6PRIVATE_SUBNET=10.89.0.0/24
7PRIVATE_IP=10.89.0.2
8PUBLIC_IP=37.27.166.242
9NETWORK=public-routed
10
11# Paths (inside container)
12GIT_PATH=/git
13XDG_DATA_HOME=/data # mounted as caddy_data volume, stores SSL certs
14CGIT_CSS=/cgit.css
15CGIT_LOGO=/cgit.png
16FCGI_SOCK=/run/fcgiwrap.sock
diff --git a/entrypoint.sh b/entrypoint.sh
new file mode 100644
index 0000000..bf3753f
--- /dev/null
+++ b/entrypoint.sh
@@ -0,0 +1,19 @@
1#!/bin/sh
2set -e
3
4# Check cert matches domain, else clear and renew
5if [ -d "/data/caddy/certificates" ]; then
6 CERT_CN=$(echo | openssl s_client -connect ${DOMAIN}:443 2>/dev/null | openssl x509 -noout -subject 2>/dev/null | grep -o "CN=.*" | cut -d= -f2 || true)
7 if [ -n "$CERT_CN" ] && [ "$CERT_CN" != "$DOMAIN" ]; then
8 echo "Cert mismatch: $CERT_CN != $DOMAIN, clearing certs"
9 rm -rf /data/caddy/certificates/
10 fi
11fi
12
13# Generate cgitrc from template
14envsubst < /etc/cgitrc.template > /etc/cgitrc
15
16spawn-fcgi -s ${FCGI_SOCK} /usr/bin/fcgiwrap
17chmod 666 ${FCGI_SOCK}
18
19exec caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
diff --git a/start_container.sh b/start_container.sh
new file mode 100755
index 0000000..bf1c167
--- /dev/null
+++ b/start_container.sh
@@ -0,0 +1,37 @@
1#!/bin/bash
2set -e
3
4# Load config
5source "$(dirname "$0")/config.env"
6
7# Create network if not exists
8if ! podman network exists ${NETWORK}; then
9 echo "Creating network: ${NETWORK} (subnet: ${PRIVATE_SUBNET})"
10 podman network create --subnet=${PRIVATE_SUBNET} ${NETWORK}
11else
12 echo "Network exists: ${NETWORK}"
13fi
14
15# Stop existing container if running
16podman stop ${CONTAINER_NAME} 2>/dev/null || true
17podman rm ${CONTAINER_NAME} 2>/dev/null || true
18ip route del ${PUBLIC_IP}/32 2>/dev/null || true
19
20# Run container
21podman run -d \
22 --name ${CONTAINER_NAME} \
23 --network ${NETWORK} \
24 --ip ${PRIVATE_IP} \
25 --cap-add=NET_ADMIN \
26 --env-file "$(dirname "$0")/config.env" \
27 -v ${CONTAINER_NAME}_data:/data \
28 -v /git:/git \
29 localhost/cgit-caddy
30
31# Setup public IP
32sleep 2
33IFACE=$(podman exec ${CONTAINER_NAME} sh -c "ip -o link | grep -v lo | head -1 | cut -d: -f2 | tr -d ' ' | cut -d@ -f1")
34podman exec ${CONTAINER_NAME} ip addr add ${PUBLIC_IP}/32 dev ${IFACE}
35ip route add ${PUBLIC_IP}/32 via ${PRIVATE_IP}
36
37echo "Running at https://${DOMAIN}/"