Install atreoAGENT
atreoAGENT runs in a single Docker container. The recommended deployment is via Docker Compose.
Docker Compose
Section titled “Docker Compose”-
Create a project directory on your server:
Terminal window mkdir atreoagent && cd atreoagent -
Create
docker-compose.yml:services:atreoagent:image: ghcr.io/atreolabs/atreoagent:latestcontainer_name: atreoagentrestart: unless-stoppednetwork_mode: hostcap_add:- NET_ADMINdevices:- /dev/net/tunvolumes:- ./agent-data:/var/lib/atreoagent# Optional: mount the Docker socket to allow using container names in app# InternalURL (e.g. http://jellyfin:8096) without exposing ports.# The agent queries the Docker API read-only to resolve names to IPs.# - /var/run/docker.sock:/var/run/docker.sock:roenvironment:# WireGuard port (default: 51820)# WG_PORT: "51820"# Auto port-mapping via NAT-PMP/UPnP (default: true). Set false if your# router has none and you forward the WG UDP port manually instead.# See /agent/manual-port-forwarding/.# WG_UPNP_ENABLED: "false"# Public IP OVERRIDE. Only for CGNAT/proxied control paths where the# auto-derived address is wrong. Leave unset in the normal case.# ENDPOINT_IP: ""# ENDPOINT_PORT: "51820"# Built-in proxy ports (defaults: 80/443/9091)# PROXY_HTTP_PORT: "80"# PROXY_HTTPS_PORT: "443"# PROXY_AUTH_PORT: "9091"# Disable the built-in proxy if using your own (Caddy/Traefik/nginx)# PROXY_ENABLED: "false"# Tunnel firewall (default: enabled). Keep it on: it fails closed, so# the agent refuses to start if iptables/ip6tables can't be configured.# Disable only if you genuinely can't run them — this exposes every host# port to every paired peer.# WG_FIREWALL_ENABLED: "false"# Built-in SMTP server (off by default; LAN only).# See /agent/smtp/ before enabling.# SMTP_ENABLED: "true"# SMTP_LISTEN: "192.168.1.10:2525"The bind mount creates an
agent-data/directory next to yourdocker-compose.yml. Everything the agent persists (keys, certs, ACL cache, config) lives there, so it’s easy to back up, inspect, or share with other containers. -
Start the agent:
Terminal window docker compose up -d -
Watch the logs for your pairing URL:
Terminal window docker logs -f atreoagentYou’ll see something like:
atreoAGENT v1.0.0Generating device keypair...Pairing required.Open this URL in a browser signed in to atreoLINK:https://app.atreolink.com/approve/abc123#<pair-token>Waiting for approval... -
Open that URL in a browser where you’re signed in to your atreoLINK account, and approve. See Pair your server for the full walkthrough.
-
You’re done. The agent configures WireGuard, obtains wildcard TLS certificates, and starts the reverse proxy automatically.
Building from source
Section titled “Building from source”If you’d rather build the image yourself:
git clone https://github.com/atreoLABS/atreoAGENT.gitcd atreoAGENTdocker compose up -d --buildVerifying the install
Section titled “Verifying the install”After pairing, the startup log shows the agent’s main subsystems coming online:
Device paired successfullyWireGuard interface up on 100.64.0.1/24, fd00:64::1/64 (wg-atreo)NAT-PMP: mapped external port 51820 -> internal 51820TLS certificate obtained for *.alice.atreo.linkHTTPS proxy listening on :443Forward-auth listening on :9091Notification API listening on :9876Tunnel connected to atreoLINKYou can also check the live status with:
docker exec atreoagent atreoagent statusListening ports
Section titled “Listening ports”| Port | Protocol | Purpose | Bound to |
|---|---|---|---|
51820 | UDP | WireGuard tunnel | 0.0.0.0 (public) |
80 | TCP | HTTP redirect to 443 | 0.0.0.0 |
443 | TCP | HTTPS reverse proxy | 0.0.0.0 |
9091 | TCP | Forward-auth endpoint | tunnel IP 100.64.0.1 |
9876 | TCP | Notification API | 0.0.0.0 (LAN reachable; bearer-token gated) |
2525 | TCP | SMTP-to-push gateway | configurable, off by default |
The SMTP port is off unless you enable it; if you do, bind it to a LAN interface only (why).
What’s installed
Section titled “What’s installed”After installation:
- A persistent Docker container named
atreoagent. - A bind-mounted
agent-data/directory next to your compose file containing all keys, certificates, and config. - A WireGuard interface called
wg-atreoon the host.
© 2026 atreoLABS. All rights reserved.
WireGuard is a registered trademark of Jason A. Donenfeld.

