{"id":26579621,"url":"https://github.com/steveanik/nebula","last_synced_at":"2026-04-13T16:05:14.253Z","repository":{"id":283775118,"uuid":"952884220","full_name":"SteveAnik/nebula","owner":"SteveAnik","description":"Synchronize configuration of multiple Pi-hole v6.x instances.","archived":false,"fork":false,"pushed_at":"2025-03-22T04:29:32.000Z","size":0,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-22T05:23:48.517Z","etag":null,"topics":["dns","dns-server","docker","docker-compose","golang","pihole","replication","sync"],"latest_commit_sha":null,"homepage":"https://www.youtube.com/watch?v=OcSBggDyeJ4","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SteveAnik.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-22T04:29:18.000Z","updated_at":"2025-03-22T04:34:32.000Z","dependencies_parsed_at":"2025-03-22T05:33:56.380Z","dependency_job_id":null,"html_url":"https://github.com/SteveAnik/nebula","commit_stats":null,"previous_names":["steveanik/nebula"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SteveAnik%2Fnebula","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SteveAnik%2Fnebula/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SteveAnik%2Fnebula/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SteveAnik%2Fnebula/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SteveAnik","download_url":"https://codeload.github.com/SteveAnik/nebula/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245061635,"owners_count":20554613,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dns","dns-server","docker","docker-compose","golang","pihole","replication","sync"],"created_at":"2025-03-23T06:18:14.214Z","updated_at":"2026-04-13T16:05:14.247Z","avatar_url":"https://github.com/SteveAnik.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# nebula-sync\n\n[![Release version](https://img.shields.io/github/v/release/lovelaze/nebula-sync)](https://github.com/lovelaze/nebula-sync/releases/latest)\n[![Tests](https://img.shields.io/github/actions/workflow/status/lovelaze/nebula-sync/test.yml?branch=main\u0026label=tests)](https://github.com/lovelaze/nebula-sync/actions/workflows/test.yml?query=branch%3Amain)\n![Go version](https://img.shields.io/github/go-mod/go-version/lovelaze/nebula-sync)\n[![Docker image size](https://img.shields.io/docker/image-size/lovelaze/nebula-sync/latest)](https://hub.docker.com/r/lovelaze/nebula-sync)\n\nSynchronize Pi-hole v6.x configuration to replicas.\n\nThis project is not a part of the [official Pi-hole project](https://github.com/pi-hole), but uses the api provided by Pi-hole instances to perform the synchronization actions.\n\n## Features\n- **Full sync**: Use Pi-hole Teleporter for full synchronization.\n- **Selective sync**: Selective feature synchronization.\n- **Cron schedule**: Run on chron schedule.\n\n## Installation\n\n\n### Linux/OSX binary\nDownload binary from the [latest release](https://github.com/lovelaze/nebula-sync/releases/latest) or build from source:\n```\ngo install github.com/lovelaze/nebula-sync@latest\n```\n\nRun binary:\n```bash\n# run\nnebula-sync run\n\n# read envs from file\nnebula-sync run --env-file .env\n```\n\n### Docker Compose (recommended)\n\n```yaml\n---\nservices:\n  nebula-sync:\n    image: ghcr.io/lovelaze/nebula-sync:latest\n    container_name: nebula-sync\n    environment:\n    - PRIMARY=http://ph1.example.com|password\n    - REPLICAS=http://ph2.example.com|password,http://ph3.example.com|password\n    - FULL_SYNC=true\n    - RUN_GRAVITY=true\n    - CRON=0 * * * *\n```\n\n### Docker CLI\n\n```bash\ndocker run --rm \\\n  --name nebula-sync \\\n  -e PRIMARY=\"http://ph1.example.com|password\" \\\n  -e REPLICAS=\"http://ph2.example.com|password\" \\\n  -e FULL_SYNC=true \\\n  -e RUN_GRAVITY=true \\\n  ghcr.io/lovelaze/nebula-sync:latest\n```\n\n## Examples\nEnv and docker-compose examples can be found [here](https://github.com/lovelaze/nebula-sync/tree/main/examples)\n\n## Configuration\n\nThe following environment variables can be specified:\n\n### Required Environment Variables\n\n| Name      | Default | Example                                          | Description                                              |\n|-----------|---------|--------------------------------------------------|----------------------------------------------------------|\n| `PRIMARY` | n/a     | `http://ph1.example.com\\|password`                       | Specifies the primary Pi-hole configuration              |\n| `REPLICAS`| n/a     | `http://ph2.example.com\\|password,http://ph3.example.com\\|password` | Specifies the list of replica Pi-hole configurations     |\n| `FULL_SYNC` | n/a   | `true`                                           | Specifies whether to perform a full synchronization      |\n\n\u003e **Note:** When `FULL_SYNC=true`, the system will perform a full Teleporter import/export from the primary Pi-hole to the replicas. This will synchronize all settings and configurations.\n\n### Optional Environment Variables\n\n| Name                               | Default | Example         | Description                                        |\n|------------------------------------|---------|-----------------|----------------------------------------------------|\n| `CRON`                             | n/a     | `0 * * * *`     | Specifies the cron schedule for synchronization    |\n| `RUN_GRAVITY`                      | false   | true            | Specifies whether to run gravity after syncing     |\n| `TZ`                               | n/a     | `Europe/London` | Specifies the timezone for logs and cron           |\n| `CLIENT_SKIP_TLS_VERIFICATION`     | false   | true            | Skips SSL certificate verification                 |\n| `CLIENT_RETRY_DELAY_SECONDS`       | 1       | 5               | Seconds to delay between connection attempts       |\n| `CLIENT_TIMEOUT_SECONDS`           | 20      | 60              | Http client timeout in seconds                     |\n\n\u003e **Note:** The following optional settings apply only if `FULL_SYNC=false`. They allow for granular control of synchronization if a full sync is not wanted.\n\n| Name                              | Default | Description                            |\n|-----------------------------------|---------|----------------------------------------|\n| `SYNC_CONFIG_DNS`                  | false   | Synchronize DNS settings               |\n| `SYNC_CONFIG_DHCP`                 | false   | Synchronize DHCP settings              |\n| `SYNC_CONFIG_NTP`                  | false   | Synchronize NTP settings               |\n| `SYNC_CONFIG_RESOLVER`             | false   | Synchronize resolver settings          |\n| `SYNC_CONFIG_DATABASE`             | false   | Synchronize database settings          |\n| `SYNC_CONFIG_MISC`                 | false   | Synchronize miscellaneous settings     |\n| `SYNC_CONFIG_DEBUG`                | false   | Synchronize debug settings             |\n| `SYNC_GRAVITY_DHCP_LEASES`         | false   | Synchronize DHCP leases                |\n| `SYNC_GRAVITY_GROUP`               | false   | Synchronize groups                     |\n| `SYNC_GRAVITY_AD_LIST`             | false   | Synchronize ad lists                   |\n| `SYNC_GRAVITY_AD_LIST_BY_GROUP`    | false   | Synchronize ad lists by group          |\n| `SYNC_GRAVITY_DOMAIN_LIST`         | false   | Synchronize domain lists               |\n| `SYNC_GRAVITY_DOMAIN_LIST_BY_GROUP`| false   | Synchronize domain lists by group      |\n| `SYNC_GRAVITY_CLIENT`              | false   | Synchronize clients                    |\n| `SYNC_GRAVITY_CLIENT_BY_GROUP`     | false   | Synchronize clients by group           |\n\n\n## Disclaimer\n\nThis project is an unofficial, community-maintained project and is not affiliated with the [official Pi-hole project](https://github.com/pi-hole). It aims to add sync/replication features not available in the core Pi-hole product but operates independently of Pi-hole LLC. Although tested across various environments, using any software from the Internet involves inherent risks. See the [license](https://github.com/lovelaze/nebula-sync/blob/main/LICENSE) for more details.\n\nPi-hole and the Pi-hole logo are [registered trademarks](https://pi-hole.net/trademark-rules-and-brand-guidelines) of Pi-hole LLC.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsteveanik%2Fnebula","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsteveanik%2Fnebula","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsteveanik%2Fnebula/lists"}