A self-hosted platform dashboard for deploying web apps with automatic DNS and SSL — no cloud required.
HermitHost is a unified control panel that wraps Coolify (deployment engine), Technitium or Cloudflare (DNS), and Traefik (reverse proxy + SSL) into a single, intuitive dashboard. Deploy web applications from Git repositories, manage DNS records, monitor application health, and issue HTTPS certificates — all without complex configuration or cloud dependencies.
HermitHost operates in two modes: LAN mode runs everything on your local network with a private .hh TLD and internal CA (step-ca), while Internet mode uses public domains and Let's Encrypt for HTTPS. Both modes automatically handle certificate renewal and DNS provisioning. The dashboard is the only interface you interact with — the underlying infrastructure (Coolify, Technitium, Traefik) remains abstracted and automatically managed.
Key capabilities include deploying sites from any Git repository, creating and managing DNS records, monitoring application HTTP status and SSL certificate expiry in real time, managing Docker container lifecycles, streaming deployment logs, and exporting/importing full system backups. Whether you're running a home lab, private cloud, or small-scale production environment, HermitHost simplifies self-hosting without sacrificing control.
HermitHost coordinates three core services to provide its full-stack functionality. Traefik acts as the reverse proxy and SSL termination point, receiving requests from browsers and routing them to the HermitHost dashboard, API, or deployed applications. The HermitHost API (Express.js) serves as the orchestration layer, communicating with Coolify to manage application deployments, Technitium/Cloudflare to manage DNS records, Docker to monitor container state, and step-ca (in LAN mode) to issue certificates. The frontend (SvelteKit) provides the dashboard interface.
graph TD
Browser["User Browser"]
Traefik["Traefik (Reverse Proxy)"]
API["HermitHost API"]
Frontend["HermitHost Dashboard"]
Coolify["Coolify (Deployment Engine)"]
Docker["Docker Daemon"]
Technitium["Technitium (DNS)"]
StepCA["step-ca (LAN Internal CA)"]
LetsEncrypt["Lets Encrypt (Internet Mode)"]
Browser -->|HTTPS| Traefik
Traefik -->|API routes| API
Traefik -->|Static routes| Frontend
Traefik -->|DNS-01 challenge| Technitium
Traefik -->|ACME LAN| StepCA
Traefik -->|ACME Internet| LetsEncrypt
API -->|Deploy and status| Coolify
API -->|Create records| Technitium
API -->|Container state| Docker
Coolify -->|Build and run| Docker
sequenceDiagram
participant Traefik
participant stepCA as step-ca
participant Lego as Lego ACME Client
participant Technitium
Traefik->>stepCA: Request DNS-01 challenge for myapp.hh
stepCA-->>Traefik: Challenge token
Traefik->>Lego: Issue cert for myapp.hh
Lego->>Technitium: RFC2136 + TSIG write _acme-challenge.myapp.hh TXT
Technitium-->>Lego: Record created
Lego->>stepCA: Validate DNS challenge
stepCA->>Technitium: Query TXT record
Technitium-->>stepCA: Token verified
stepCA-->>Traefik: Certificate issued
Traefik->>Traefik: Store cert in acme volume
sequenceDiagram
participant User
participant Dashboard as HermitHost Dashboard
participant API
participant Coolify
participant Docker
participant Traefik
User->>Dashboard: Create new site (repo URL + domain)
Dashboard->>API: POST /api/sites
API->>Coolify: Create application
Coolify-->>API: Application ID
API->>Coolify: Trigger build
Coolify->>Docker: Build image + run container
Docker-->>Coolify: Container running
API->>API: Write Traefik route config
Traefik->>Traefik: Pick up route from dynamic config
Traefik->>Traefik: Request SSL certificate
Traefik-->>Traefik: Cert issued + stored
API-->>Dashboard: Deployment complete
User->>Traefik: Visit myapp.hh
Traefik-->>User: Site live with HTTPS
- One-command setup —
bash scripts/setup.shhandles all initialization interactively - Two operating modes — LAN mode (
.hhTLD, internal CA, DNS-01) and Internet mode (public domains, Let's Encrypt, HTTP-01) - Automatic SSL certificates — ACME-based issuance and renewal; step-ca for LAN, Let's Encrypt for Internet
- Git-based deployments — Deploy applications from any Git repository via the Coolify integration
- Unified DNS management — Bundled Technitium for internal networks or switchable Cloudflare for public domains
- Real-time health monitoring — HTTP status, SSL expiry dates, and DNS resolution checks cached every 60 seconds
- Deployment log streaming — Watch builds and deployments in real time from the dashboard
- Docker container management — Start, stop, restart, and inspect all running containers
- Backup and restore — Export full system configuration as JSON, import to restore or migrate
- TSIG-authenticated dynamic DNS — Secure DNS record provisioning via RFC2136
- Docker socket proxy — Least-privilege container access with an unprivileged proxy daemon
- Automatic state checkpoint — Container state captured on shutdown; containers restored to prior state on restart
- Docker v20.10 or later and Docker Compose v2.20 or later
- Operating System: Linux (recommended), macOS with Docker Desktop, or WSL2
- Memory: 4GB minimum (8GB recommended)
- Disk space: 10GB minimum
- Ports: 80/443 (LAN mode) or 8080/8443 (Internet mode), 53 or 53053 (DNS)
- Public IP or hostname (Internet mode only — required for Let's Encrypt validation)
Clone the repository and run the interactive setup:
git clone https://github.com/your-org/hermithost.git
cd hermithost
bash scripts/setup.shThe setup script will ask you:
- Operating mode: LAN (internal
.hhdomains) or Internet (public domains) - ACME email: Your email for SSL certificate notifications
- Server hostname: Your server's IP address or public hostname (Internet mode only)
Then start the stack:
bash scripts/start.shAccess the HermitHost dashboard:
- LAN mode: https://hermithost.hh (after pointing your DNS resolver at HermitHost)
- Internet mode: https://hermithost.yourdomain.com
git clone https://github.com/your-org/hermithost.git
cd hermithost
cp .env.template .envEdit .env and set these operator-configurable variables:
# Required
HERMITHOST_PORT_MODE=lan # or "internet"
ACME_EMAIL=your-email@example.com # SSL certificate notifications
NS_HOSTNAME=192.168.1.100 # Your server IP (LAN) or hostname (Internet)
# Optional (can be set in dashboard later)
DNS_PROVIDER=technitium # or "cloudflare"
COOLIFY_PORT=8000
DNS_PORT=53053 # 53 if allowed; default avoids conflicts
STEP_CA_PASSWORD=your-secure-password # LAN mode onlyOr run the interactive setup:
bash scripts/setup.shbash scripts/setup.shThis script will:
- Generate all required secrets (database passwords, TSIG keys, API tokens)
- Configure the Technitium TSIG key for secure DNS updates
- Set up Traefik dynamic config directory
- Activate Git pre-commit hooks (PII blocking)
- In LAN mode: initialize step-ca and root CA certificate
The script is idempotent — safe to run multiple times; it only fills empty values and never overwrites existing configuration.
bash scripts/start.shIn LAN mode, this starts step-ca and step-ca-init. In Internet mode, these services are skipped. Traefik will begin issuing certificates immediately.
Open the HermitHost dashboard — everything is managed from here:
- LAN mode: https://hermithost.hh (after pointing your DNS resolver at HermitHost)
- Internet mode: https://hermithost.yourdomain.com
Log in with the HERMITHOST_PASSWORD you set (or configured via Settings after first run).
LAN mode runs HermitHost entirely within your local network using a private .hh top-level domain. All sites are only accessible from devices on your LAN; no public internet access is required.
How it works:
- DNS: Technitium runs as your local DNS resolver on port 53 (or DNS_PORT). All
.hhqueries resolve to your HermitHost server. - SSL certificates: step-ca acts as an internal Certificate Authority. Traefik requests certificates for
*.hhdomains via ACME DNS-01 challenges. The challenge is written to Technitium via RFC2136 (TSIG-authenticated dynamic DNS), validated, and the certificate is issued by step-ca. - Setup: Point your devices' DNS resolver to your HermitHost server's IP and port 53 (or DNS_PORT). Install the step-ca root CA certificate in your browser's or OS trust store (available in Settings → SSL).
Example DNS flow:
laptop (192.168.1.50)
→ queries hermithost.hh
→ resolver configured to Technitium (192.168.1.100:53)
→ Technitium returns hermithost.hh = 192.168.1.100
→ laptop connects to https://hermithost.hh
Internet mode runs HermitHost with public domain names, making it accessible over the internet. Traefik obtains certificates from Let's Encrypt.
How it works:
- Domains: You own a public domain (e.g.,
example.com). Point your domain's DNS A record to your HermitHost server's public IP address. - SSL certificates: Traefik requests certificates from Let's Encrypt using HTTP-01 validation. Let's Encrypt verifies you control the domain by requesting
http://yourdomain.com/.well-known/acme-challenge/token. Traefik listens on port 8080 (configurable) to serve this challenge. - Access: Sites are live at https://myapp.yourdomain.com once their DNS A record is configured and the certificate is issued.
Ports:
- Traefik HTTP: port 8080 (configurable TRAEFIK_HTTP_PORT)
- Traefik HTTPS: port 8443 (configurable TRAEFIK_HTTPS_PORT)
These avoid conflicts with system services on port 80/443.
- Open the HermitHost dashboard — navigate to http://localhost:3000 or your configured HermitHost domain
- Click "Add Site" — enter your Git repository URL and desired domain name
- HermitHost provisions everything:
- DNS A record (pointing to your server)
- Traefik route (proxies requests to the deployed app)
- Coolify application (clones repo, builds, deploys)
- Monitor deployment logs — view real-time build output in the site detail page
- Access your site — once deployment completes, visit https://yourdomain.hh (LAN) or https://yourdomain.com (Internet)
The dashboard provides full DNS zone and record management. The default DNS provider is Technitium (bundled, no external dependencies). You can switch to Cloudflare anytime via Settings.
Technitium is deployed automatically. Access the Technitium UI at http://localhost:5380 (internal only). No additional setup is required.
To use Cloudflare as your DNS provider:
-
Create a Cloudflare API token:
- Go to https://dash.cloudflare.com/profile/api-tokens
- Create a custom token with permissions: Zone:Edit and Zone:Create (account-level scopes)
- Note: The "Edit zone DNS" template is insufficient — you must use a custom token with both permissions
-
Configure in HermitHost:
- Open the dashboard → Settings → DNS Provider
- Select "Cloudflare"
- Paste your API token
- Click "Save" — the system will verify connectivity
-
Use your domain's Cloudflare nameservers — ensure your registrar points your domain to Cloudflare
HermitHost automates SSL certificate issuance and renewal. Certificates are stored in the traefik-acme volume and never require manual management.
- Issuer: step-ca (internal CA)
- Validity: 30 days
- Renewal: Automatic (Traefik renews at 14 days remaining)
- Trust: Must install the step-ca root CA certificate in your browser/OS
- Download from: Settings → SSL → Download Root CA
- Import into your browser's certificate store
- Issuer: Let's Encrypt
- Validity: 90 days
- Renewal: Automatic (Traefik renews at 30 days remaining)
- No installation needed: Let's Encrypt root CAs are trusted by all browsers
View all active certificates in the dashboard: Settings → SSL
To inspect certificates via Docker:
docker exec traefik cat /acme/acme.json| Script | Description |
|---|---|
bash scripts/setup.sh |
First-time initialization: generates secrets, configures services, provisions Coolify credentials |
bash scripts/start.sh |
Start the HermitHost stack (applies correct mode automatically) |
bash scripts/stop.sh |
Gracefully stop all deployed site containers and HermitHost services; checkpoints container state |
bash scripts/restart.sh |
Restart the entire stack |
bash scripts/status.sh |
Display service status and health check results |
bash scripts/rotate-tsig.sh |
Rotate the TSIG secret for secure DNS updates (requires Traefik restart after) |
Operator-configurable variables in .env. For the complete list, see .env.template.
| Variable | Description | Default |
|---|---|---|
HERMITHOST_PORT_MODE |
Operating mode: lan or internet |
(prompted) |
ACME_EMAIL |
Email for SSL cert notifications | (prompted) |
NS_HOSTNAME |
Server IP (LAN) or hostname (Internet) | (prompted) |
DNS_PROVIDER |
Active DNS provider: technitium or cloudflare |
technitium |
CLOUDFLARE_TOKEN |
Cloudflare API token (also settable in Settings UI) | (empty) |
COOLIFY_PORT |
Internal deployment engine port | 8000 |
DNS_PORT |
Host port for DNS (use 53 if allowed; avoid conflicts) | 53053 |
TRAEFIK_HTTP_PORT |
Traefik HTTP port (Internet mode) | 8080 |
TRAEFIK_HTTPS_PORT |
Traefik HTTPS port (Internet mode) | 8443 |
STEP_CA_PASSWORD |
step-ca (LAN mode) password | (auto-generated) |
TECHNITIUM_URL |
Technitium API endpoint | http://technitium:5380 |
| Service | Image/Tech | Purpose | Ports |
|---|---|---|---|
| HermitHost API | Node.js/Express | Orchestration layer; Coolify/DNS/Docker abstraction | 3001 |
| HermitHost Dashboard | Node.js/SvelteKit | Web UI | 3000 |
| Traefik | traefik:v3 | Reverse proxy, ACME client, SSL termination | 80, 443, 8080, 8443 |
| Coolify | coolify/coolify | Application deployment engine (internal) | — |
| Technitium DNS | technitium/technitium-core | DNS resolver and authoritative server | 53 (or DNS_PORT) |
| step-ca | smallstep/step-ca | Internal CA (LAN mode only) | 9000 |
| PostgreSQL | postgres:15 | Coolify database | 5432 |
| Redis | redis:7 | Coolify cache and queue | 6379 |
| Volume | Purpose | Data |
|---|---|---|
traefik-acme |
ACME certificates and metadata | JSON (acme.json) |
coolify-db |
PostgreSQL data | Database tables |
coolify-redis |
Redis persistence | Cache/queue data |
technitium-config |
DNS zones and records | JSON config |
step-ca-config |
step-ca PKI data (LAN mode) | Certificates, keys |
hermithost-net: Bridges HermitHost API, dashboard, and infrastructure services.
coolify (external network): Shared with all deployed applications; allows Coolify containers to communicate.
- Open the dashboard → Settings → Backup
- Click "Export" to download a JSON archive containing all sites, DNS records, and configuration
- Save this file in a secure location
curl -X GET http://localhost:3000/api/backup/export > hermithost-backup.json- Open the dashboard → Settings → Backup
- Click "Import" and select your backup JSON file
- The system will validate the backup before restoring
Automatic state checkpoint occurs on graceful shutdown (scripts/stop.sh). Containers are restored to their prior state when the stack restarts.
Contributions are welcome. To contribute:
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Git hooks are automatically activated by
scripts/setup.sh— they block commits containing PII - Run tests:
npm run test - Validate Docker builds:
docker compose build - Commit and push:
git push origin feature/my-feature - Open a pull request
Note: The pre-commit hook (git config core.hooksPath .githooks) blocks accidental commits of secrets, API keys, and email addresses.
HermitHost is licensed under the MIT License. See LICENSE for details.