AGHSync keeps your AdGuardHome instances in sync automatically. Designate one instance as the master — AGHSync propagates its configuration to every slave instance on a schedule, on demand, or via webhook.







blocked_services, dhcp, dns, filtering, parental, rewrite, safebrowsing, safesearch, tls0 * * * * for hourly)POST /api/v1/webhook/sync for external integrations (e.g. AdGuardHome post-update hooks)Success, Partial Failure, Error), trigger source, start time, and duration+N / -N summary badge/api/docsX-API-Token header) or Basic Auth/api/docs for the full endpoint referencedocker run -d \
--name aghsync \
-p 8080:8080 \
-v aghsync-data:/app/data \
t0mer/aghsync
services:
aghsync:
image: t0mer/aghsync
ports:
- "8080:8080"
volumes:
- aghsync-data:/app/data
environment:
LOG_LEVEL: info
volumes:
aghsync-data:
docker compose up -d
Download the binary for your platform from the Releases page.
# Linux / macOS
chmod +x aghsync-linux-amd64
./aghsync-linux-amd64
# Windows
aghsync-windows-amd64.exe
| Flag | Description |
|---|---|
--port <n> | Listening port. Default: 8080. Overridden by AGHSYNC_PORT. |
--log-level <level> | debug / info / warning / error. Default: warning. |
--reset-password | Interactively reset the UI login password. |
--service <action> | Manage the OS service: install / uninstall / start / stop / restart. |
| Variable | Description |
|---|---|
AGHSYNC_PORT | Server port — takes precedence over --port. |
LOG_LEVEL | Log level — takes precedence over --log-level. |
AGHSYNC_DATA | Directory for aghsync.db. Default: current working directory. |
Port resolution order (highest → lowest): AGHSYNC_PORT → --port → built-in default (8080).
| OS | Architecture |
|---|---|
| Linux | amd64, arm64, armv7, armv6, 386 |
| macOS | amd64 (Intel), arm64 (Apple Silicon) |
| Windows | amd64, arm64 |
Docker images: linux/amd64, linux/arm64, linux/arm/v7
The full REST API is documented at /api/docs (Swagger UI).
Key endpoints:
| Method | Path | Description |
|---|---|---|
GET | /api/v1/instances | List all instances |
POST | /api/v1/instances | Add an instance |
PUT | /api/v1/instances/{id} | Update an instance |
DELETE | /api/v1/instances/{id} | Remove an instance |
PUT | /api/v1/instances/{id}/promote | Promote slave to master |
GET | /api/v1/instances/{id}/sync-config | Get master sync config |
PUT | /api/v1/instances/{id}/sync-config | Update master sync config |
GET | /api/v1/instances/statuses | Online/offline status for all instances |
GET | /api/v1/instances/{id}/stats | DNS stats for one instance |
POST | /api/v1/sync/run | Trigger a manual sync |
GET | /api/v1/sync/status | Current and last run status |
PUT | /api/v1/sync/schedule | Update the cron schedule |
POST | /api/v1/webhook/sync | Webhook trigger |
GET | /api/v1/history | List sync runs |
GET | /api/v1/history/{runId} | Run detail with per-config diffs |
GET | /api/v1/settings | Get application settings |
PUT | /api/v1/settings/ui-auth | Enable/disable UI auth |
POST | /api/v1/settings/api-token | Generate API token |
DELETE | /api/v1/settings/api-token | Remove API token |
GET | /api/v1/backup/export | Download settings backup |
POST | /api/v1/backup/restore | Restore from backup |
Authentication:
/api/v1 requests pass through (bootstrap mode)X-API-Token: <token> or valid Basic Auth credentials (when UI auth is enabled)# Prerequisites: Go 1.22+, Node 20+
# Start backend + frontend with hot reload
./scripts/dev.sh
# Run tests
go test ./...
# Build all release targets → dist/
./scripts/build.sh
# Build Docker image
docker build -t aghsync .
Content type
Image
Digest
sha256:c401d62dc…
Size
10.2 MB
Last updated
4 months ago
docker pull techblog/aghsync