https://github.com/antnsn/stackd
GitOps daemon for Docker Compose stacks — auto-applies changes from git, monitors container health, and streams logs via a built-in dashboard
https://github.com/antnsn/stackd
devops docker docker-compose gitops homelab self-hosted
Last synced: 3 days ago
JSON representation
GitOps daemon for Docker Compose stacks — auto-applies changes from git, monitors container health, and streams logs via a built-in dashboard
- Host: GitHub
- URL: https://github.com/antnsn/stackd
- Owner: antnsn
- License: agpl-3.0
- Created: 2026-03-26T23:19:00.000Z (11 days ago)
- Default Branch: master
- Last Pushed: 2026-04-03T09:33:07.000Z (4 days ago)
- Last Synced: 2026-04-03T15:20:25.349Z (4 days ago)
- Topics: devops, docker, docker-compose, gitops, homelab, self-hosted
- Language: Go
- Size: 1.02 MB
- Stars: 5
- Watchers: 0
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
---
**stackd** is a lightweight GitOps daemon for Docker Compose. It watches your Git repositories, pulls changes, injects secrets via Infisical, and applies your stacks automatically. A built-in dashboard lets you monitor repos, stacks, and container logs in real time.
Think of it as ArgoCD for Docker Compose, without the YAML sprawl.
## Features
- **GitOps sync** — polls one or more Git repos and applies `docker compose up -d` on change
- **Infisical integration** — wraps deploys with `infisical run` to inject secrets; no `.env` files in Git
- **Live dashboard** — dark-mode UI with stack status, container health, and real-time log streaming
- **Web shell** — browser-based terminal (docker exec PTY) for any running container via xterm.js
- **Activity feed** — live SSE stream of git pulls and stack applies across all repos
- **Per-stack sync** — trigger a pull + apply for a single stack from the detail panel
- **Settings UI** — manage repos, SSH keys, Infisical credentials, and auth token from the dashboard
- **Multi-repo** — manage as many repos as you need; each gets its own sync loop and stack config
## Quick Start
> **Note:** `SECRET_KEY` is required. stackd will refuse to start without it — it encrypts SSH keys and tokens stored in the database.
```yaml
services:
stackd:
container_name: stackd
image: ghcr.io/antnsn/stackd:latest
environment:
- SECRET_KEY=change-me-use-a-strong-random-value
- DB_URL=sqlite:///data/stackd.db
- PORT=8080
volumes:
- /path/to/stackd-data:/data
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "8080:8080"
restart: unless-stopped
```
Generate a strong `SECRET_KEY`:
```sh
openssl rand -hex 32
```
Then:
```sh
docker compose up -d
```
Open `http://localhost:8080` and use the **Settings** page to add your first repository.
## Documentation
| | |
|---|---|
| [Configuration](docs/configuration.md) | All env vars and their defaults |
| [Installation](docs/installation.md) | Docker Compose setup, volume mounts, first run |
| [SSH Setup](docs/ssh.md) | SSH key configuration via Settings UI and troubleshooting |
| [Infisical Secrets](docs/infisical.md) | Secrets injection — global token, per-stack toml |
| [Database](docs/database.md) | SQLite config store, SECRET_KEY, persistence, PostgreSQL option |
| [Security](docs/security.md) | Auth, rate limiting, production hardening |
| [Observability](docs/observability.md) | Logging, health probes, Prometheus metrics |
| [API Reference](docs/api.md) | Full HTTP API with request/response examples |
| [Multi-Repo Setup](docs/multi-repo.md) | Managing multiple repositories |
| [Post-Sync Hooks](docs/post-sync-hooks.md) | Alternatives now that env-var hooks are removed |
| [Architecture](docs/architecture.md) | How stackd works internally |
## License
AGPL-3.0 — see [LICENSE](LICENSE). For commercial licensing, see [COMMERCIAL.md](COMMERCIAL.md).
```
---