Scanning archi-dev-box from OUTSIDE found five ports serving their screens with no login — lnd-ui 18083, bitcoin-ui 8334, fips-ui 8336, electrs-ui 50002 and the Fedimint Guardian 8175 — none of which appeared in the gate's unprotected list. They are host-networked, so Podman publishes nothing to pin and their manifests declared 'ports: []'; the gate builds its map from declared ports, so it neither protected them nor reported them. An audit that reports success while five screens are open is worse than no audit. Their nginx now listens on 127.0.0.1 instead of 0.0.0.0, and each port is declared 'auth: gated' so the daemon owns the outside. 'bind:' on a host-networked app is a statement of where the container listens, not a publish instruction — quadlet already skips PublishPort in host mode. Guardian 8175 is declared on the fedimint app because its companion has no manifest, and the gate keys on port, not container. Credential paths were NOT exposed and are verified so: /lnd-connect-info, the /proxy/lnd/ passthrough, container logs and every RPC method through these screens all return 401 unauthenticated. What leaked was the page shell. Also fixes the delivery gap that would have made this unshippable: only bitcoin-ui, lnd-ui and electrs-ui were ever rsynced to /opt/archipelago/docker, so edits to fips-ui and fedimint-ui reached nodes through no path at all. All five now sync; the two whose rebuilds the daemon owns are synced without being handed to container-specs. Every remaining undeclared port is now declared with a stated reason — gated: botfights 9100, router 8084, pine 10380; exempt with rationale: fedimint consensus 8173/8174, gateway 8176/9737, netbird 8086/8087 (TLS + own auth, and enrolled devices cannot hold a session), pine TLS 10381, lightning-stack REST 8091 (macaroon, mirrors lnd). Zero undeclared ports remain across all 56 manifests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
99 lines
3.5 KiB
YAML
99 lines
3.5 KiB
YAML
app:
|
|
id: fedimint-gateway
|
|
name: Fedimint Gateway
|
|
version: 0.10.0
|
|
description: Fedimint gateway service with automatic LND-or-LDK backend selection.
|
|
|
|
container:
|
|
image: 146.59.87.168:3000/lfg2025/gatewayd:v0.10.0
|
|
pull_policy: if-not-present
|
|
network: archy-net
|
|
entrypoint: ["sh", "-lc"]
|
|
# The bitcoind host comes from $FM_BITCOIND_URL, filled by the
|
|
# {{BITCOIN_HOST}} derived-env below — it resolves to whichever bitcoin
|
|
# container is actually running (Knots, Core, or any future distro archy
|
|
# ships), so the gateway is never pinned to one node's container name.
|
|
# (Was hardcoded http://host.archipelago:8332 — the host gateway IP where
|
|
# bitcoind does not listen — which crash-looped the gateway, 2026-07-22.)
|
|
custom_args:
|
|
- >-
|
|
if [ -f /lnd/tls.cert ] && [ -f /lnd/data/chain/bitcoin/mainnet/admin.macaroon ]; then
|
|
exec gatewayd --data-dir /data --listen 0.0.0.0:8176 --bcrypt-password-hash "$FEDI_HASH" --network bitcoin --bitcoind-url "$FM_BITCOIND_URL" --bitcoind-username "$FM_BITCOIND_USERNAME" --bitcoind-password "$FM_BITCOIND_PASSWORD" lnd --lnd-rpc-host lnd:10009 --lnd-tls-cert /lnd/tls.cert --lnd-macaroon /lnd/data/chain/bitcoin/mainnet/admin.macaroon;
|
|
else
|
|
exec gatewayd --data-dir /data --listen 0.0.0.0:8176 --bcrypt-password-hash "$FEDI_HASH" --network bitcoin --bitcoind-url "$FM_BITCOIND_URL" --bitcoind-username "$FM_BITCOIND_USERNAME" --bitcoind-password "$FM_BITCOIND_PASSWORD" ldk --ldk-lightning-port 9737 --ldk-alias archipelago-gateway;
|
|
fi
|
|
derived_env:
|
|
- key: FM_BITCOIND_URL
|
|
template: "http://{{BITCOIN_HOST}}:8332"
|
|
# The gateway's admin API is gated by a bcrypt password hash. Generate it on
|
|
# first install (random password + its bcrypt hash, both 0600 rootless-owned)
|
|
# so the app installs from its manifest alone — `fedimint-gateway-hash` holds
|
|
# the hash passed to gatewayd, `fedimint-gateway-hash.pw` the plaintext for
|
|
# any client that must authenticate. Self-heals a wrongly root-owned hash.
|
|
generated_secrets:
|
|
- name: fedimint-gateway-hash
|
|
kind: bcrypt
|
|
secret_env:
|
|
- key: FM_BITCOIND_PASSWORD
|
|
secret_file: bitcoin-rpc-password
|
|
- key: FEDI_HASH
|
|
secret_file: fedimint-gateway-hash
|
|
data_uid: "1000:1000"
|
|
|
|
dependencies:
|
|
- app_id: bitcoin-core
|
|
version: ">=26.0"
|
|
- app_id: fedimint
|
|
version: ">=0.10.0"
|
|
|
|
resources:
|
|
cpu_limit: 2
|
|
memory_limit: 2Gi
|
|
disk_limit: 10Gi
|
|
|
|
security:
|
|
capabilities: []
|
|
readonly_root: true
|
|
network_policy: isolated
|
|
|
|
ports:
|
|
- host: 8176
|
|
container: 8176
|
|
protocol: tcp
|
|
auth: none
|
|
auth_rationale: >-
|
|
Fedimint gateway API, protected by its own bcrypt password (--bcrypt-password-hash)
|
|
and reached by federation peers and clients that cannot hold a browser session.
|
|
- host: 9737
|
|
container: 9737
|
|
protocol: tcp
|
|
auth: none
|
|
auth_rationale: >-
|
|
LDK Lightning p2p for the gateway. The BOLT-8 noise handshake authenticates and
|
|
encrypts the connection itself.
|
|
|
|
volumes:
|
|
- type: bind
|
|
source: /var/lib/archipelago/fedimint-gateway
|
|
target: /data
|
|
options: [rw]
|
|
- type: bind
|
|
source: /var/lib/archipelago/lnd
|
|
target: /lnd
|
|
options: [ro]
|
|
|
|
environment:
|
|
- FM_BITCOIND_USERNAME=archipelago
|
|
|
|
health_check:
|
|
type: http
|
|
endpoint: http://localhost:8176
|
|
path: /
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
|
|
bitcoin_integration:
|
|
rpc_access: admin
|
|
sync_required: true
|