Getting Started
This guide gets Holden running on your server. Once set up, you’ll add apps via the Deploying Apps guide.
Prerequisites
Section titled “Prerequisites”- Docker installed and running
- Traefik running on a network called
traefik
1. Run Holden
Section titled “1. Run Holden”services: holden: image: benjick/holden:latest container_name: holden restart: unless-stopped ports: - "127.0.0.1:6021:6021" # Internal API (CLI) labels: - "holden.orchestrator=true" # Required for self-updates volumes: - /var/run/docker.sock:/var/run/docker.sock - /appdata:/appdata - /backups:/backups - ./data:/data environment: HOLDEN_BASE_DATA_DIR: /appdata HOLDEN_TRAEFIK_NETWORK: traefik HOLDEN_PUBLIC_DOMAIN: holden.example.com HOLDEN_WEBHOOK_SECRET: change-me-to-something-random HOLDEN_BACKUP_DIR: /backups GITHUB_USERNAME: your-username # Optional, for GHCR GITHUB_PAT: ghp_xxxx # Optional, for private repos/GHCR networks: - traefik
networks: traefik: external: truemkdir -p datadocker run -d \ --name holden \ --network traefik \ --label holden.orchestrator=true \ -p 127.0.0.1:6021:6021 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /appdata:/appdata \ -v /backups:/backups \ -v ./data:/data \ -e HOLDEN_BASE_DATA_DIR=/appdata \ -e HOLDEN_TRAEFIK_NETWORK=traefik \ -e HOLDEN_PUBLIC_DOMAIN=holden.example.com \ -e HOLDEN_WEBHOOK_SECRET=change-me-to-something-random \ -e HOLDEN_BACKUP_DIR=/backups \ benjick/holden:latestPorts:
- 6021 - Internal API for CLI. Bound to localhost only for security. Webhooks (6020) are accessed via Traefik on the Docker network.
Volumes:
/var/run/docker.sock- Docker socket. Lets Holden manage containers on your host./appdata:/appdata- Persistent storage for your apps. Database files, uploads, etc. live here. The host and container paths must be identical — Holden creates sibling containers via the Docker socket, so volume paths it writes are resolved by the Docker daemon against the host filesystem, not from inside Holden’s container./backups:/backups- Backup snapshots created during the maintenance window. Containers are stopped before backup, so files are never copied mid-write./data- Holden’s persistent state: app registrations (apps.yml), encryption keys, and password seed. Generated automatically on first run.
2. Add Your First App
Section titled “2. Add Your First App”Register an app using the CLI or the internal API:
holden app add my-app --repo https://github.com/you/my-appSee Deploying Apps for the full guide.
Verify It’s Running
Section titled “Verify It’s Running”Check the logs:
docker logs holdenYou should see Holden start up and begin reconciling any registered apps.
Next: Deploy Your First App
Section titled “Next: Deploy Your First App” Deploying Apps Add your first app to Holden