From 2cb9c5a451be25e3d31fa68914323e1f2ade1444 Mon Sep 17 00:00:00 2001 From: "Alex Pooley (@zuedev)" Date: Thu, 7 May 2026 23:18:27 +0100 Subject: add mirroring functionality --- .gitignore | 3 ++- .gitinfo | 5 ++++- docker-compose.yaml | 1 + etc/cron.d/5m | 1 + scripts/push-repo-mirrors.bash | 49 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 etc/cron.d/5m create mode 100644 scripts/push-repo-mirrors.bash diff --git a/.gitignore b/.gitignore index 5e97b8d..6718e71 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /repositories/ -/tailscale-data/ \ No newline at end of file +/tailscale-data/ +/.secrets/ \ No newline at end of file diff --git a/.gitinfo b/.gitinfo index 224c513..0a7bbee 100644 --- a/.gitinfo +++ b/.gitinfo @@ -1,5 +1,8 @@ { "$schema": "https://onedev.docker-compose.zue.dev/gitinfo/~raw/main/gitinfo.schema.json", "root": "https://git.zue.dev/git.zue.dev", - "description": "Server configuration for my git server, powered by Docker." + "description": "Server configuration for my git server, powered by Docker.", + "mirrors": [ + "https://github.com/zuedev/git.zue.dev" + ] } diff --git a/docker-compose.yaml b/docker-compose.yaml index 856487e..87dd9ad 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -8,6 +8,7 @@ services: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC0kwVbA9ZdXOAuiyPeXsJ7HSujPtCIYtFPl2GdajHDT0SwsZDUMNr/p6Y9DyQjOI1zqD73ndGSOIe6EY7adB3L6ZSODvDwFlGMtP5sXE0UESOcJJdU7m4wHWieM3xal5nz1Y2BJyp2x04Ol5+kpak9A4MqUcHz29Z4ubgPG/UUWENoKZIfHXSCZfvJBO82InrvieAu/dpKzmtkXNJ9bP+fSkiNnCOVo+ZvCbIuZm8tOoQIhshzdeVhfNmdUj9LNErkoGoJ+CA13eXYlqT9B8o45E+M8lLxQr/RpzCk/3likszBzVqITB6Vkrvey8BcHhcbrs+5LYbxvb6s+1bsRHNAwO+w7SgrD3eX8AQqFKvb6xzrFji+996NWSC2hVLcKZyDvSM2p6ws4IDLFLD64IS+73SEZv2fN847j0vmqJqXYPpB/jQKuUG+rWeonkDXBfPjFrHtp75nk5bSBBDi+LQBGW52nz6/gtOWP46USV46BW2zF+YFSyw/2Ta7DMhrvXlLWuDV/CpK0FytpHjQWjHoiDfrZfiDAOu8sPIiH7hjZevHqzNJ+xOZDNqNbYqxxB1gLeK4u6xX9c4Jkk259r09tMutFACbzxxPQr3LYBKW8IrPcX1rfuE4+aZ1UysfjG/2FmKOPeWca9tVSQUK7RSThvzWDGdm0gXxI0HrPwmfZQ== zuedev volumes: - ./repositories:/repositories + - ./.secrets/github_token:/run/secrets/github_token:ro network_mode: service:tailscale depends_on: - tailscale diff --git a/etc/cron.d/5m b/etc/cron.d/5m new file mode 100644 index 0000000..7568027 --- /dev/null +++ b/etc/cron.d/5m @@ -0,0 +1 @@ +*/5 * * * * git /bin/bash /scripts/push-repo-mirrors.bash >> /home/git/.logs/push-repo-mirrors.log 2>&1 diff --git a/scripts/push-repo-mirrors.bash b/scripts/push-repo-mirrors.bash new file mode 100644 index 0000000..e25d39f --- /dev/null +++ b/scripts/push-repo-mirrors.bash @@ -0,0 +1,49 @@ +#!/bin/bash + +# This script pushes the repository mirrors to their respective remote URLs if they are defined in the .gitinfo file. + +for repository in /repositories/*; do + echo "Processing repository: $(basename "$repository")" + + cd /repositories/$(basename "$repository") + + gitinfoExists=$(git ls-tree HEAD -- .gitinfo 2>/dev/null) + + echo "gitinfoExists: $gitinfoExists" + + # does gitinfo exist? + if [ -z "$gitinfoExists" ]; then + echo "No .gitinfo found for $(basename "$repository"). Skipping." + continue + fi + + gitinfoContents=$(git cat-file -p @:.gitinfo) + + echo "gitinfoContents: $gitinfoContents" + + # extract mirrors from gitinfo (json format) + mirrors=$(echo "$gitinfoContents" | grep -oP '"mirrors":\s*\[\K[^\]]+') + + echo "Extracted mirrors: $mirrors" + + # push to each mirror + for mirror in $(echo "$mirrors" | tr ',' '\n'); do + case "$mirror" in + *github.com*) + # do we have a /run/secrets/github_token defined? + if [ ! -f /run/secrets/github_token ]; then + echo "/run/secrets/github_token not found. Skipping push to $mirror." + continue + fi + + GITHUB_TOKEN=$(cat /run/secrets/github_token) + + echo "Pushing to GitHub mirror: $mirror" + git push --mirror "https://x-access-token:$GITHUB_TOKEN@$mirror" || echo "Failed to push to $mirror" + ;; + *) + echo "Unknown mirror type: $mirror. Skipping." + ;; + esac + done +done \ No newline at end of file -- cgit v1.2.3