Utled SOAPBOX_BASE_PATH fra stien i SOAPBOX_SITE_URL

https://domene.no/blog gir automatisk base-path /blog. SOAPBOX_BASE_PATH
beholdes kun som overstyring (tom verdi) for proxyer som stripper
prefikset. Dokumentasjon og Caddyfile-eksempel oppdatert; README hadde
også utdatert slug-eksempel og beskrivelse av SITE_URL.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JcEy43fNYpwg6K6oTKakWR
This commit is contained in:
Ole-Morten Duesund 2026-08-26 15:04:13 +02:00
commit 73d1e46467
4 changed files with 18 additions and 13 deletions

View file

@ -12,9 +12,9 @@
# Må oppdateres og containeren startes på nytt hvis bloggen flyttes.
SOAPBOX_SITE_URL=https://blog.domene.no
# Sub-path bloggen ligger under bak Caddy, f.eks. /blog. Tom = rot.
# Må stemme med stien i SOAPBOX_SITE_URL.
SOAPBOX_BASE_PATH=
# Sub-path utledes automatisk fra SOAPBOX_SITE_URL (…/blog → /blog).
# Sett denne bare hvis proxyen stripper prefikset før appen (da: tom verdi).
#SOAPBOX_BASE_PATH=
# Standardtema før noe er valgt i admin. Valget lagres i content/site.toml.
# Egne temaer: /data/content/themes/<navn>/ (følger med i git og backup).

View file

@ -1,10 +1,10 @@
# Eksempel 1: bloggen på et eget domene (SOAPBOX_BASE_PATH tom)
# Eksempel 1: bloggen på et eget domene (SOAPBOX_SITE_URL=https://blog.domene.no)
blog.domene.no {
encode zstd gzip
reverse_proxy localhost:8080
}
# Eksempel 2: bloggen under en sub-path (SOAPBOX_BASE_PATH=/blog).
# Eksempel 2: bloggen under en sub-path (SOAPBOX_SITE_URL=https://annet-domene.com/blog).
# Appen forventer å få hele stien inkl. /blog, så ingen strip_prefix her.
annet-domene.com {
encode zstd gzip

View file

@ -16,7 +16,7 @@ data/
└── secret_key cookie-signering (genereres automatisk)
```
* **Slug** lages av tittelen (`Grønt er skjønt``groent-er-skjoent`). Den følger tittelen så
* **Slug** lages av tittelen (`Grønt er skjønt``grønt-er-skjønt`). Den følger tittelen så
lenge innlegget er utkast, og fryses ved publisering så lenker aldri brekker.
* **Alle interne lenker er relative.** Malene regner ut `../` ut fra sidens dybde, og absolutte
lenker du skriver i Markdown (`/annet-innlegg/`) skrives om. Derfor fungerer samme `public/`
@ -47,8 +47,8 @@ hovedbrukeren bør settes.
| Variabel | Standard | Beskrivelse |
|---|---|---|
| `SOAPBOX_DATA_DIR` | `./data` (`/data` i container) | Alt persistent |
| `SOAPBOX_BASE_PATH` | `` | `/blog` hvis bloggen ligger under en sub-path |
| `SOAPBOX_SITE_URL` | `http://localhost:8080` | Absolutt URL til rot, brukes **bare** i `feed.xml` |
| `SOAPBOX_BASE_PATH` | stien i `SOAPBOX_SITE_URL` | Overstyring, kun hvis proxyen stripper prefikset |
| `SOAPBOX_SITE_URL` | `http://localhost:8080` | Absolutt URL til rot inkl. sub-path; brukes i Open Graph, feed, sitemap og til å utlede base-path |
| `SOAPBOX_THEME` | `green` | Mappe under `soapbox/themes/` |
| `SOAPBOX_MAX_IMAGE_PX` | `2000` | Lengste side på opplastede bilder |
| `SOAPBOX_SECRET_KEY` | autogenerert | Overstyr hvis du vil ha nøkkelen utenfor volumet |
@ -71,7 +71,7 @@ Ny versjon: `git pull && ./build.sh && ./run.sh`. Data ligger i podman-volumet `
nyeste (standard 5). Gjenopprett med `podman volume import soapbox-data <fil>`.
Caddy er ren reverse proxy, se `Caddyfile.example`. Ved sub-path skal Caddy **ikke** strippe
prefikset appen monteres selv under `SOAPBOX_BASE_PATH`.
prefikset appen monteres selv under stien fra `SOAPBOX_SITE_URL`.
## Flytte bloggen (nytt domene og/eller sub-path)
@ -92,8 +92,8 @@ podman volume export soapbox-data | ssh ny-server 'podman volume import soapbox-
git clone gammel-server:/sti/til/data/content ./data/content
```
Deretter, uansett metode: sett `SOAPBOX_SITE_URL` og eventuelt `SOAPBOX_BASE_PATH` til de nye
verdiene og start. Siden bygges på nytt ved oppstart.
Deretter, uansett metode: sett `SOAPBOX_SITE_URL` til den nye adressen (sub-path utledes
derfra) og start. Siden bygges på nytt ved oppstart.
## Tema

View file

@ -13,6 +13,7 @@ import secrets
import tomllib
from dataclasses import dataclass, field
from pathlib import Path
from urllib.parse import urlsplit
@dataclass
@ -100,8 +101,12 @@ def load_config(env: dict[str, str] | None = None) -> Config:
key_file.write_text(secret)
key_file.chmod(0o600)
base_path = _normalize_base_path(env.get("SOAPBOX_BASE_PATH", ""))
site_url = env.get("SOAPBOX_SITE_URL", "http://localhost:8080" + base_path).rstrip("/")
# Base-path utledes fra stien i SOAPBOX_SITE_URL (https://x.no/blog → /blog).
# SOAPBOX_BASE_PATH er kun en overstyring for oppsett der proxyen stripper
# prefikset før forespørselen når appen.
site_url = env.get("SOAPBOX_SITE_URL", "http://localhost:8080").rstrip("/")
explicit = env.get("SOAPBOX_BASE_PATH")
base_path = _normalize_base_path(explicit if explicit is not None else urlsplit(site_url).path)
cfg = Config(
data_dir=data_dir,