Skip to the content.

Hardening checklist

The compose stack ships with reasonable container hardening (cap_drop ALL, read-only rootfs, no-new-privileges, digest-pinned image, mem/cpu limits, healthcheck). That handles container-side security. The host the stack runs on is your responsibility.

This is a checklist, not a tutorial — each item links out to a canonical reference. The point is “did you actually do these” before you point a public IP at this stack and start serving real users.

Pre-deploy

Sysctls

Host-system

awg-server (only if AWG enabled)

awg-server runs amneziavpn/amneziawg-go, the official Amnezia upstream image. Userspace WireGuard fundamentally needs NET_ADMIN to manage the TUN device + iptables NAT rules — there’s no way to drop that capability without breaking the daemon. This is the only container in egressor with NET_ADMIN.

Compensating hardenings (already enforced in awg-server/compose.yaml):

The compensating-controls bundle plus the digest pin makes the residual risk roughly equivalent to the singbox-server container’s risk surface, even though cap_drop: [ALL] isn’t viable here.

Architecture caveat — amneziavpn/amneziawg-go is amd64-only as of 2026-04. ARM hosts (Oracle Ampere, Raspberry Pi) currently can’t pull the upstream image. Either build the daemon from source (the upstream repo at github.com/amnezia-vpn/amneziawg-go has a Dockerfile that builds on ARM) and pin the resulting image’s digest in awg-server/compose.yaml, or skip AWG until upstream ships a multi-arch image. Do not swap in a random community-maintained ARM image — it defeats the digest-pin discipline. See hazards.md.

Things specifically NOT in scope

These are out of scope for egressor. If you need them, build them alongside.

After deploy

Periodic

These run as cron in production (the quickstart’s cron block). Check quarterly that they’re still firing:

A silent cron is a dead cron. Wire a NOTIFY= script (Discord, Slack, or your own webhook) into each so a failure pings someone. The suppliedscripts all support NOTIFY as an env-var hook.