Fased on Hetzner (Docker VPS Guide)
Goal
Run a persistent Fased Gateway on a Hetzner VPS using Docker, with durable state, baked-in binaries, and predictable restart behavior. Pick a small Debian/Ubuntu VPS and scale up if you hit OOMs. Provider pricing changes, so check the current plan before provisioning. Security model reminder:- Company-shared agents are fine when everyone is in the same trust boundary and the runtime is business-only.
- Keep strict separation: dedicated VPS/runtime + dedicated accounts; no personal Apple/Google/browser/password-manager profiles on that host.
- If users are adversarial to each other, split by gateway/host/OS user.
What are we doing (simple terms)?
- Rent a small Linux server (Hetzner VPS)
- Install Docker (isolated app runtime)
- Start the Fased Gateway in Docker
- Persist
~/.fased+~/.fased/workspaceon the host (survives restarts/rebuilds) - Join the VPS to Tailscale before onboarding
- Keep the gateway loopback-only
- Access the Control UI privately from your laptop through Tailscale
- bootstrap with SSH only long enough to provision the host
- join the VPS to your Tailscale tailnet
- keep the gateway on loopback
- use Tailscale or a private SSH tunnel over Tailscale for ongoing admin access
If you are on another Linux VPS, map packages accordingly. For the generic Docker flow, see Docker.
Quick path (experienced operators)
- Provision Hetzner VPS
- Install Docker
- Join the VPS to Tailscale
- Clone the Fased repository
- Create persistent host directories
- Configure
.envanddocker-compose.yml - Bake required binaries into the image
docker compose up -d- Verify persistence and Gateway access
What you need
- Hetzner VPS with initial root access
- SSH access from your laptop
- Basic comfort with SSH + copy/paste
- ~20 minutes
- Docker and Docker Compose
- Model auth credentials
- Optional provider credentials
- WhatsApp QR
- Telegram bot token
- Gmail OAuth
1) Provision the VPS
Create an Ubuntu or Debian VPS in Hetzner. Connect as root for the bootstrap phase:2) Install Docker (on the VPS)
2.5) Join the VPS to Tailscale before onboarding
Create or sign into your Tailscale account first, then join the VPS to your tailnet before you onboard the runtime.tailscale up prints a login URL in SSH. Open that URL in
your local computer’s browser, then return to the SSH session. Use a Tailscale
auth key only when you need unattended provisioning, cloud-init, Terraform, or
another non-interactive install path.
3) Clone the Fased repository
4) Create persistent host directories
Docker containers are ephemeral. All long-lived state must live on the host.5) Configure environment variables
Create.env in the repository root.
6) Docker Compose configuration
Create or updatedocker-compose.yml.
--allow-unconfigured is only for bootstrap convenience, it is not a replacement for a proper gateway configuration. Still set auth (gateway.auth.token or password) and use private bind settings for your deployment.
7) Bake required binaries into the image (critical)
Installing binaries inside a running container is a trap. Anything installed at runtime will be lost on restart. All external binaries required by skills must be installed at image build time. The examples below show three common binaries only:gogfor Gmail accessgoplacesfor Google Placeswaclifor WhatsApp
- Update the Dockerfile
- Rebuild the image
- Restart the containers
8) Build and launch
9) Verify Gateway
18789 for the
container, while the host keeps that mapping on 127.0.0.1 only.
From your laptop, prefer a Tailscale/private path:
- Tailscale SSH tunnel
- Tailscale Serve on the host
- or another private tailnet path you control
What persists where (source of truth)
Fased runs in Docker, but Docker is not the source of truth. All long-lived state must survive restarts, rebuilds, and reboots.| Component | Location | Persistence mechanism | Notes |
|---|---|---|---|
| Gateway config | /home/node/.fased/ | Host volume mount | Includes fased.json, tokens |
| Model auth profiles | /home/node/.fased/ | Host volume mount | OAuth tokens, API keys |
| Skill configs | /home/node/.fased/skills/ | Host volume mount | Skill-level state |
| Agent workspace | /home/node/.fased/workspace/ | Host volume mount | Code and agent artifacts |
| WhatsApp session | /home/node/.fased/ | Host volume mount | Preserves QR login |
| Gmail keyring | /home/node/.fased/ | Host volume + password | Requires GOG_KEYRING_PASSWORD |
| External binaries | /usr/local/bin/ | Docker image | Must be baked at build time |
| Node runtime | Container filesystem | Docker image | Rebuilt every image build |
| OS packages | Container filesystem | Docker image | Do not install at runtime |
| Docker container | Ephemeral | Restartable | Can be destroyed |
Automation
If you automate this guide with cloud-init, Terraform, Ansible, or another provisioning tool, keep the same order:- create the VPS
- join Tailscale
- install Docker and Fased
- keep the Gateway loopback-only on the host
- verify private operator access before relying on the runtime