Docker
git clone https://github.com/jp1337/easywall.git
cd easywall
docker compose up -d
Open https://localhost:12227 and complete the setup wizard.
Where to pull from
The same linux/amd64 + linux/arm64 image, pushed to all three by CI. Public, no
authentication.
| Registry | Image |
|---|---|
| GitHub Container Registry | ghcr.io/jp1337/easywall |
| Docker Hub | docker.io/kermit1337/easywall |
| Quay.io | quay.io/jp1337/easywall |
Quay is behind as of v2.4.0. The publishing token is being rejected, so that mirror is skipped until it is replaced. Use GHCR or Docker Hub.
Which tag
| Tag | Moves | For |
|---|---|---|
:latest |
on tagged releases only | production |
:vX.Y.Z |
never | pinning, e.g. v2.4.0 |
:edge |
after every green build on main |
tracking development, demo hosts |
:sha-<commit> |
never | rollback and debugging |
# docker-compose.override.yml — pin a version
services:
easywall:
image: ghcr.io/jp1337/easywall:v2.4.0
Why host networking
nftables acts on the host’s network namespace. In its own namespace the container
would filter only its own traffic, which is not what you asked for. NET_ADMIN is
what lets it issue the netlink calls that reach host tables.
network_mode: host
cap_add:
- NET_ADMIN
This is also why easywall in a container still coexists with Docker’s own rules —
it owns table inet easywall and nothing else.
Needs
- Docker Engine 24+, Compose v2
- A Linux host with nftables
Your own certificate
volumes:
- /etc/letsencrypt:/etc/letsencrypt:ro
- ./config:/etc/easywall
# config/web.toml
[tls]
cert = "/etc/letsencrypt/live/example.com/fullchain.pem"
key = "/etc/letsencrypt/live/example.com/privkey.pem"
Updating
docker compose pull && docker compose up -d
Watchtower automates it. Nightly or weekly on
:latest for production; the public demo runs it against :edge.
Checking what you pulled
Every image carries the source commit in an OCI label:
docker buildx imagetools inspect \
--format '{{ index .Manifest.Annotations "org.opencontainers.image.revision" }}' \
ghcr.io/jp1337/easywall:latest
Compare it against the commit the release tag points at. The workflows that publish
these images are
release.yml
and
publish-edge.yml.