diff --git a/.env.example b/.env.example index 25b72d4..050e58e 100644 --- a/.env.example +++ b/.env.example @@ -32,13 +32,13 @@ SOAPBOX_OWNER_PASSWORD=bytt-meg-naa #SOAPBOX_SECRET_KEY= # --- Bare for run.sh / compose (ikke lest av appen) --- -# Adresse og port containeren eksponeres på; Caddy proxyer hit. -# Caddy på samme maskin: SOAPBOX_BIND=127.0.0.1 -# Caddy på en annen maskin via SOAPBOX_BIND=100.x.y.z (denne maskinens -# Tailscale: Tailscale-IP, se `tailscale ip -4`) -# Appen har ingen egen TLS eller IP-filtrering, så bind aldri til 0.0.0.0 på -# en maskin med offentlig IP – bruk en adresse bare Caddy når. -SOAPBOX_BIND=127.0.0.1 +# Port Caddy proxyer til. Tom SOAPBOX_BIND = lytt på alle adresser, IPv4 og +# IPv6 – riktig når Caddy står på en annen maskin og når appen over Tailscale +# med MagicDNS (kan gi enten v4 eller v6). Sett SOAPBOX_BIND til én adresse +# (f.eks. 127.0.0.1 når Caddy kjører lokalt) for å begrense. Appen har ingen +# egen TLS eller IP-filtrering, så på en maskin med offentlig IP bør +# brannmuren bare slippe Caddy/tailnettet inn på porten. +SOAPBOX_BIND= SOAPBOX_PORT=8080 # Podman-volum (navn) eller katalog (absolutt sti) for /data SOAPBOX_VOLUME=soapbox-data diff --git a/Caddyfile.example b/Caddyfile.example index be976d1..0bf3c8a 100644 --- a/Caddyfile.example +++ b/Caddyfile.example @@ -5,8 +5,8 @@ blog.domene.no { } # Eksempel 3: Caddy på en annen maskin, appen nås over Tailscale. -# På app-maskinen: SOAPBOX_BIND=. Her brukes MagicDNS-navnet, -# men Tailscale-IP-en (100.x.y.z) fungerer like godt. +# App-maskinen lytter på alle adresser (standard), så MagicDNS-navnet fungerer +# uansett om det løses til IPv4 eller IPv6. blogg.domene.no { encode zstd gzip reverse_proxy app-maskin.tailnet-navn.ts.net:8080 diff --git a/README.md b/README.md index 55c9f31..0a6f2a2 100644 --- a/README.md +++ b/README.md @@ -70,8 +70,9 @@ Ny versjon: `git pull && ./build.sh && ./run.sh`. Data ligger i podman-volumet ` (standard `./backups/soapbox-data-.tar.gz`) og beholder de `SOAPBOX_BACKUP_KEEP` nyeste (standard 5). Gjenopprett med `podman volume import soapbox-data `. -Caddy er ren reverse proxy, se `Caddyfile.example`. Kjører Caddy på en annen maskin (f.eks. over -Tailscale), sett `SOAPBOX_BIND` til denne maskinens Tailscale-IP så appen bare lytter på tailnettet. Ved sub-path skal Caddy **ikke** strippe +Caddy er ren reverse proxy, se `Caddyfile.example`. Appen lytter som standard på alle adresser +(IPv4 og IPv6), så Caddy kan stå på en annen maskin og nå den over Tailscale/MagicDNS. Sett +`SOAPBOX_BIND=127.0.0.1` for å begrense når Caddy kjører lokalt. Ved sub-path skal Caddy **ikke** strippe prefikset – appen monteres selv under stien fra `SOAPBOX_SITE_URL`. ## Flytte bloggen (nytt domene og/eller sub-path) diff --git a/compose.yaml b/compose.yaml index 3477eb6..844d52c 100644 --- a/compose.yaml +++ b/compose.yaml @@ -6,7 +6,8 @@ services: container_name: soapbox restart: always ports: - - "${SOAPBOX_BIND:-127.0.0.1}:${SOAPBOX_PORT:-8080}:8080" + # Alle adresser (v4+v6). Sett f.eks. "127.0.0.1:${SOAPBOX_PORT:-8080}:8080" for å begrense. + - "${SOAPBOX_PORT:-8080}:8080" volumes: - ${SOAPBOX_VOLUME:-soapbox-data}:/data:Z env_file: diff --git a/run.sh b/run.sh index 54eeeb2..9367f45 100755 --- a/run.sh +++ b/run.sh @@ -16,7 +16,7 @@ fi # Verdier som bare gjelder for podman-kjøringen (ikke appen) envval() { grep -E "^$1=" "$ENV_FILE" | head -n1 | cut -d= -f2- || true; } -BIND="$(envval SOAPBOX_BIND)"; BIND="${BIND:-127.0.0.1}" +BIND="$(envval SOAPBOX_BIND)" # tom = alle adresser (v4+v6) PORT="$(envval SOAPBOX_PORT)"; PORT="${PORT:-8080}" VOLUME="$(envval SOAPBOX_VOLUME)"; VOLUME="${VOLUME:-soapbox-data}" MEMORY="$(envval SOAPBOX_MEMORY)"; MEMORY="${MEMORY:-512m}" @@ -60,10 +60,10 @@ podman run -d --replace --name soapbox \ --restart=always \ --cap-drop=all --security-opt=no-new-privileges \ --memory "$MEMORY" \ - -p "${BIND}:${PORT}:8080" \ + -p "${BIND:+${BIND}:}${PORT}:8080" \ -v "${VOLUME}:/data:Z" \ --env-file "$ENV_FILE" \ "$IMAGE" -echo "soapbox kjører på http://${BIND}:${PORT}/ (data i ${VOLUME})" +echo "soapbox lytter på ${BIND:-alle adresser}:${PORT} (data i ${VOLUME})" echo "Logger: podman logs -f soapbox" diff --git a/soapbox/cli.py b/soapbox/cli.py index dd6ce4a..a798cca 100644 --- a/soapbox/cli.py +++ b/soapbox/cli.py @@ -16,7 +16,9 @@ def main(argv: list[str] | None = None) -> int: sub = parser.add_subparsers(dest="cmd", required=True) serve = sub.add_parser("serve", help="Start webserveren") - serve.add_argument("--host", default="0.0.0.0") + serve.add_argument( + "--host", default="*", help="Adresse å lytte på; '*' = alle, både IPv4 og IPv6" + ) serve.add_argument("--port", type=int, default=8080) serve.add_argument( "--debug", @@ -44,12 +46,14 @@ def main(argv: list[str] | None = None) -> int: app = create_app(cfg) if args.debug: - app.run(host=args.host, port=args.port, debug=True) + # Werkzeugs dev-server kjenner ikke "*"; "::" gir dual-stack på Linux + app.run(host="::" if args.host == "*" else args.host, port=args.port, debug=True) else: from waitress import serve as waitress_serve - print(f"Soapbox lytter på http://{args.host}:{args.port}{cfg.base_path}/admin/") - waitress_serve(app, host=args.host, port=args.port, threads=4) + print(f"Soapbox lytter på {args.host}:{args.port}{cfg.base_path}/admin/") + # listen= (ikke host=) er det som gir dual-stack med "*" + waitress_serve(app, listen=f"{args.host}:{args.port}", threads=4) return 0 if args.cmd == "build":