aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--.gitinfo5
-rw-r--r--docker-compose.yaml1
-rw-r--r--etc/cron.d/5m1
-rw-r--r--scripts/push-repo-mirrors.bash49
5 files changed, 57 insertions, 2 deletions
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