Standalone mode and config reference
A node runs without the panel from one config.yaml file and the ingressd CLI. Every apply is recorded in git, secrets are encrypted with age, and a managed node can leave the panel at any time.
The node, the edge build and the connector are licensed under Apache-2.0. Standalone mode needs no account.
Managed or standalone#
| Managed | Standalone | |
|---|---|---|
| Config | Compiled by the panel, signed, pushed to the node | config.yaml on the node, edited by you |
| Several nodes per home | Yes, with failover DNS | One node per config |
| Access-policy emails | Sent by the panel | Your SES or SMTP account |
| Certificates | Shared between your nodes | Stored on the node |
Both run the same binaries.
Start a standalone node#
On a node built from source (make build in the node repository), install the binaries and units, then create a starter config:
$ sudo ./deploy/install.sh bin $ ingressd init $ ingressd validate $ ingressd apply
ingressd init creates the config directory, an age key for secrets and a starter config.yaml, and records it in git. Back up the key: it decrypts secrets.age.
Commands#
| Command | Does |
|---|---|
ingressd validate [-f file] |
Checks a config without applying it. |
ingressd diff |
Shows what apply would change. |
ingressd apply [-m message] |
Applies config.yaml and records it in git. --dry-run shows the diff only. |
ingressd history / ingressd rollback <revision> |
Lists applied changes; restores and applies an earlier one. |
ingressd serve |
Runs the node: applies at start and whenever config.yaml changes. |
ingressd secret set <name> |
Stores a secret, referenced in the config as secret://name. |
ingressd tunnel config <tunnel> |
Prints the WireGuard config to import on a router. |
ingressd tunnel enroll-token <tunnel> --join |
Creates a one-time join string for ingressd-connector. |
ingressd doctor |
Checks the host, config, DNS and tunnels. |
ingressd logs [-f] / ingressd stats |
Searches or follows access logs; traffic totals per host. |
ingressd export -o backup.tar.gz / ingressd restore |
Exports or restores config, secrets and history. |
ingressd node detach |
Leaves managed mode and keeps the config and secrets. |
ingressd import <config.yaml> |
Validates, writes and applies a config, for example one exported from the panel. |
config.yaml#
The top-level sections:
| Section | Holds |
|---|---|
edge |
Node name, public addresses, ACME account, GeoIP and CrowdSec settings. |
email |
How sign-in codes are sent: ses, smtp or log. |
access |
Portal host, session length and code limits. |
tunnels |
One per home: site: router or site: connector, listen port, transit /30. |
groups, policies, service_tokens |
Who may sign in to which app. |
apps |
HTTP apps: hostnames, origin or pool, TLS to the origin, WAF, bot challenge, rate limits, cache, Always Online. |
pools |
Several origins with health checks, steering and failover tiers. |
l4 |
Game and TCP/UDP services. |
security |
Global IP, country and ASN deny lists. |
smartdns, mesh |
Smart DNS exits and services; the WireGuard mesh between nodes. |
alerts, logging, backups |
Notification channels, log retention, scheduled backups. |
A small example:
version: 1 edge: name: fra-1 public_ipv4: 203.0.113.24 acme: { email: you@example.net } tunnels: home: type: wireguard site: router listen_port: 51820 transit: 100.64.0.0/30 public_key: "<router public key>" apps: media: hosts: [media.example.net] origin: http://192.168.1.20:8096 tunnel: home waf: { mode: block, paranoia: 1 }
The full annotated reference is examples/config.yaml in the node repository; it is validated in the node's tests, so it always matches the schema.
Moving between modes#
- Managed to standalone:
ingressd node detachon the node. It keeps serving with its current config and secrets. - Standalone to managed: enrol the node with
ingressd node enroll --panel https://app.ingressd.com --token <token>. The panel's config replaces the local one.