nym: polish Containerfile, compose, entrypoint, and README.

Host-side binary download notes and compose port mapping clarifications.
This commit is contained in:
Hernâni Marques 2026-07-16 23:50:57 +02:00
parent 3945de5831
commit e7469b47f9
4 changed files with 51 additions and 19 deletions

View file

@ -1,26 +1,34 @@
# koopa-nym — nym-node (nym.com mixnet / NymVPN network) # koopa-nym — nym-node (nym.com mixnet / NymVPN network)
# Fetch binary on host first (see scripts/nym/build.sh), then: # Fetch binary on host first (see scripts/nym/build.sh), then:
# podman build -t localhost/koopa-nym:latest -f Containerfile . # podman build -t localhost/koopa-nym:latest -f Containerfile .
#
# Process runs as uid/gid 1000 (not root). With rootless podman use
# userns=keep-id so host ./data owned by hernani stays writable (see compose.yml).
FROM docker.io/library/debian:bookworm-slim FROM docker.io/library/debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive \ ENV DEBIAN_FRONTEND=noninteractive \
NYM_HOME=/var/lib/nym \ NYM_HOME=/var/lib/nym \
PATH=/usr/local/bin:$PATH PATH=/usr/local/bin:$PATH \
HOME=/var/lib/nym
RUN apt-get update \ RUN apt-get update \
&& apt-get install -y --no-install-recommends \ && apt-get install -y --no-install-recommends \
ca-certificates libssl3 \ ca-certificates libssl3 \
&& rm -rf /var/lib/apt/lists/* \ && rm -rf /var/lib/apt/lists/* \
&& mkdir -p /var/lib/nym /usr/local/bin && groupadd --gid 1000 nym \
&& useradd --uid 1000 --gid 1000 --home-dir /var/lib/nym --shell /usr/sbin/nologin nym \
&& mkdir -p /var/lib/nym /usr/local/bin \
&& chown -R nym:nym /var/lib/nym
# Pre-downloaded on host into build context as ./nym-node # Pre-downloaded on host into build context as ./nym-node
COPY nym-node /usr/local/bin/nym-node COPY nym-node /usr/local/bin/nym-node
RUN chmod +x /usr/local/bin/nym-node \ RUN chmod 755 /usr/local/bin/nym-node \
&& /usr/local/bin/nym-node --version || true && /usr/local/bin/nym-node --version || true
COPY entrypoint.sh /usr/local/bin/nym-entrypoint COPY entrypoint.sh /usr/local/bin/nym-entrypoint
RUN chmod +x /usr/local/bin/nym-entrypoint RUN chmod 755 /usr/local/bin/nym-entrypoint
EXPOSE 1789/udp 1789/tcp 1790 8080 9000 51822/udp EXPOSE 1789/udp 1789/tcp 1790 8080 9000 51822/udp
WORKDIR /var/lib/nym WORKDIR /var/lib/nym
USER nym:nym
ENTRYPOINT ["/usr/local/bin/nym-entrypoint"] ENTRYPOINT ["/usr/local/bin/nym-entrypoint"]

View file

@ -9,6 +9,7 @@ Mirror in this repo: `configs/nym/`.
|---------|--------| |---------|--------|
| Container | `koopa-nym` | | Container | `koopa-nym` |
| Image | `localhost/koopa-nym:latest` | | Image | `localhost/koopa-nym:latest` |
| Process user | **non-root** `nym` **uid/gid 1000** (`USER` + compose `userns_mode: keep-id`) |
| Default mode | **`mixnode`** (safest on a home host; no open-internet exit) | | Default mode | **`mixnode`** (safest on a home host; no open-internet exit) |
| Optional modes | `entry-gateway`, `exit-gateway` (+ WireGuard for dVPN) — see env | | Optional modes | `entry-gateway`, `exit-gateway` (+ WireGuard for dVPN) — see env |
| Local ID | `koopa-nym` | | Local ID | `koopa-nym` |
@ -45,12 +46,28 @@ before enabling.
```bash ```bash
cd ~/koopa-nym # or this mirror cd ~/koopa-nym # or this mirror
cp .env.example .env # edit PUBLIC_IPS, LOCATION, MODE cp .env.example .env # edit PUBLIC_IPS, LOCATION, MODE
# host data must be writable by uid 1000 (hernani)
mkdir -p data && chown -R "$(id -u):$(id -g)" data
# sync compose + entrypoint from admin-log if this tree is a copy
podman build -t localhost/koopa-nym:latest -f Containerfile . podman build -t localhost/koopa-nym:latest -f Containerfile .
podman compose up -d # or podman run … # IMPORTANT: port maps only apply on create — not on plain podman start
podman compose down
podman compose up -d --force-recreate --build
podman exec koopa-nym id # expect uid=1000(nym)
podman port koopa-nym # must list 1789/tcp+udp and 1790/tcp
ss -lntp | grep -E '1789|1790|9080'
# bonding: use Nym wallet / harbourmaster; node must accept operator T&Cs # bonding: use Nym wallet / harbourmaster; node must accept operator T&Cs
curl -sS http://127.0.0.1:9080/api/v1/roles | jq . curl -sS http://127.0.0.1:9080/api/v1/roles | jq .
``` ```
### If WAN `1790` is “connection refused” but `1789` works
Almost always **container publish/bind**, not VeciGate:
1. Old container created without a solid `1790/tcp` map → **recreate** (above).
2. Process bound only on `[::]:1790` while host proxy expects IPv4 → defaults are now **`0.0.0.0:1790`**.
3. Confirm: `podman port koopa-nym` shows `1790/tcp -> 0.0.0.0:1790`, then `nc -vz WAN 1790`.
Secrets layout (values in **koopa-admin-secrets**): Secrets layout (values in **koopa-admin-secrets**):
| Live | Secrets mirror | | Live | Secrets mirror |

View file

@ -10,6 +10,9 @@ services:
image: localhost/koopa-nym:latest image: localhost/koopa-nym:latest
container_name: koopa-nym container_name: koopa-nym
restart: unless-stopped restart: unless-stopped
# Non-root (image USER nym = 1000). keep-id → host ./data owned by hernani works.
user: "1000:1000"
userns_mode: keep-id
env_file: env_file:
- .env - .env
environment: environment:
@ -21,22 +24,25 @@ services:
NYMNODE_HOSTNAME: ${NYMNODE_HOSTNAME:-} NYMNODE_HOSTNAME: ${NYMNODE_HOSTNAME:-}
NYMNODE_WG_ENABLED: ${NYMNODE_WG_ENABLED:-false} NYMNODE_WG_ENABLED: ${NYMNODE_WG_ENABLED:-false}
NYMNODE_ACCEPT_OPERATOR_TERMS: ${NYMNODE_ACCEPT_OPERATOR_TERMS:-true} NYMNODE_ACCEPT_OPERATOR_TERMS: ${NYMNODE_ACCEPT_OPERATOR_TERMS:-true}
NYMNODE_HTTP_BIND_ADDRESS: "[::]:8080" # IPv4 binds: rootless podman port-proxy is reliable with 0.0.0.0
NYMNODE_MIXNET_BIND_ADDRESS: "[::]:1789" # ([::] can leave verloc without a host IPv4 listener → WAN "connection refused")
NYMNODE_VERLOC_BIND_ADDRESS: "[::]:1790" NYMNODE_HTTP_BIND_ADDRESS: ${NYMNODE_HTTP_BIND_ADDRESS:-0.0.0.0:8080}
NYMNODE_ENTRY_BIND_ADDRESS: "[::]:9000" NYMNODE_MIXNET_BIND_ADDRESS: ${NYMNODE_MIXNET_BIND_ADDRESS:-0.0.0.0:1789}
NYMNODE_VERLOC_BIND_ADDRESS: ${NYMNODE_VERLOC_BIND_ADDRESS:-0.0.0.0:1790}
NYMNODE_ENTRY_BIND_ADDRESS: ${NYMNODE_ENTRY_BIND_ADDRESS:-0.0.0.0:9000}
NYMNODE_EXTRA_ARGS: ${NYMNODE_EXTRA_ARGS:-} NYMNODE_EXTRA_ARGS: ${NYMNODE_EXTRA_ARGS:-}
volumes: volumes:
# identity + config.toml (bond keys live here — back up) # identity + config.toml (bond keys live here — back up)
- ./data:/var/lib/nym - ./data:/var/lib/nym
ports: ports:
- "9080:8080" # HTTP API / swagger # Host publish must be recreated if ports change (podman start ≠ re-map).
- "1789:1789/tcp" # mixnet - "0.0.0.0:9080:8080/tcp" # HTTP API / swagger (local/LAN)
- "1789:1789/udp" - "0.0.0.0:1789:1789/tcp" # mixnet
- "1790:1790" # verloc - "0.0.0.0:1789:1789/udp"
- "0.0.0.0:1790:1790/tcp" # verloc (was missing/unreliable with bare "1790:1790")
# gateway / WG — uncomment when mode needs them: # gateway / WG — uncomment when mode needs them:
# - "19000:9000" # entry client websocket # - "0.0.0.0:19000:9000/tcp" # entry client websocket
# - "51822:51822/udp" # WireGuard # - "0.0.0.0:51822:51822/udp" # WireGuard
labels: labels:
org.hacktivism.service: nym org.hacktivism.service: nym
org.hacktivism.container: koopa-nym org.hacktivism.container: koopa-nym

View file

@ -9,10 +9,11 @@ PUBLIC_IPS="${NYMNODE_PUBLIC_IPS:-}"
LOCATION="${NYMNODE_LOCATION:-}" LOCATION="${NYMNODE_LOCATION:-}"
HOSTNAME_OPT="${NYMNODE_HOSTNAME:-}" HOSTNAME_OPT="${NYMNODE_HOSTNAME:-}"
WG="${NYMNODE_WG_ENABLED:-false}" WG="${NYMNODE_WG_ENABLED:-false}"
HTTP_BIND="${NYMNODE_HTTP_BIND_ADDRESS:-[::]:8080}" # Prefer 0.0.0.0 for rootless podman host port publishing (IPv4 WAN / DNAT).
MIX_BIND="${NYMNODE_MIXNET_BIND_ADDRESS:-[::]:1789}" HTTP_BIND="${NYMNODE_HTTP_BIND_ADDRESS:-0.0.0.0:8080}"
VERLOC_BIND="${NYMNODE_VERLOC_BIND_ADDRESS:-[::]:1790}" MIX_BIND="${NYMNODE_MIXNET_BIND_ADDRESS:-0.0.0.0:1789}"
ENTRY_BIND="${NYMNODE_ENTRY_BIND_ADDRESS:-[::]:9000}" VERLOC_BIND="${NYMNODE_VERLOC_BIND_ADDRESS:-0.0.0.0:1790}"
ENTRY_BIND="${NYMNODE_ENTRY_BIND_ADDRESS:-0.0.0.0:9000}"
ACCEPT_TC="${NYMNODE_ACCEPT_OPERATOR_TERMS:-true}" ACCEPT_TC="${NYMNODE_ACCEPT_OPERATOR_TERMS:-true}"
ARGS=(run --id "$ID" --mode "$MODE") ARGS=(run --id "$ID" --mode "$MODE")