A self-hosted mirror for Linux distros and privacy tools, served by Caddy with directory listing.
- Push this repo to your Git host
- Deploy using Docker Compose:
docker compose up -d - Ensure the
/data/mirrorvolume persists across redeploys
Edit mirrors.conf. Each line follows the format:
NAME|METHOD|SOURCE|EXTRA_ARGS
For example:
my-distro|rsync|rsync://mirror.example.org/distro/|
some-project|wget|https://releases.example.org/|--mirror --no-parent
Comment out a line with # to disable it. Push your changes to redeploy.
├── Caddyfile # Caddy web server configuration
├── Dockerfile # Container image definition
├── docker-compose.yml # Compose file for deployment
├── entrypoint.sh # Container startup (cron + caddy)
├── mirrors.conf # Mirror list (edit this)
└── sync-mirrors.sh # Sync engine (reads mirrors.conf)
| Path | Description |
|---|---|
/ |
Browse all mirrors |
/health |
Health check (returns ok) |
/status |
Last sync timestamp |
Check sync logs:
docker exec mirror-server cat /var/log/mirror/qubes.log
Trigger a manual sync:
docker exec mirror-server /usr/local/bin/sync-mirrors.sh
- Mirrors sync every hour by default with a random delay (up to 40 minutes) to avoid overwhelming upstreams. Change the cron schedule in the Dockerfile.
- Verify upstream rsync/wget URLs before your first sync, as endpoints can change.
- Current mirrors require approximately 8 TB of disk space total. The largest mirrors are Debian (~1.7 TB), Ubuntu (~2.6 TB), and Rocky Linux (~2 TB).