Liten statisk blogg med mobilvennlig Markdown-editor, bildeopplasting og innhold i git. Én hovedbruker, valgfrie gjester.
- Python 66.4%
- HTML 15.7%
- CSS 9%
- JavaScript 5.4%
- Shell 2.4%
- Other 1.1%
next-parameteren godtok "//evil.com", som nettlesere tolker som en ekstern URL. Nå godtas bare stier som starter med én skråstrek. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JcEy43fNYpwg6K6oTKakWR |
||
|---|---|---|
| soapbox | ||
| tests | ||
| .gitignore | ||
| Caddyfile.example | ||
| compose.yaml | ||
| Containerfile | ||
| pyproject.toml | ||
| README.md | ||
| uv.lock | ||
Soapbox
En liten blogg: statiske sider, mobilvennlig Markdown-editor med bildeopplasting og live forhåndsvisning, innhold versjonert i git. Én hovedbruker («soapbox») pluss valgfrie gjester.
Hvordan det henger sammen
data/
├── content/ git-repo – alt innhold, kan klones/flyttes fritt
│ ├── site.toml tittel, beskrivelse, språk
│ ├── posts/<slug>/index.md + bilder → /<slug>/
│ └── guests/<bruker>/<slug>/index.md → /<bruker>/<slug>/
├── public/ generert statisk side (bygges automatisk ved lagring)
├── soapbox.sqlite brukere og passord-hasher – det eneste som ikke ligger i git
└── secret_key cookie-signering (genereres automatisk)
- Slug lages av tittelen (
Grønt er skjønt→groent-er-skjoent). 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 sammepublic/både påblog.domene.no/ogannet-domene.com/blog/uten rebuild. - Bilder ligger i samme mappe som innlegget og refereres som
. Ved opplasting skaleres de ned (maks 2000 px) og EXIF fjernes (ingen GPS-posisjon publiseres). - Hver lagring er en git-commit med brukeren som forfatter. Se historikken under
Innstillinger, eller
git -C data/content log. - Gjester ser og redigerer bare egne innlegg. Hovedbrukeren ser alt og administrerer gjester.
Kjøre lokalt
uv sync
SOAPBOX_DATA_DIR=./data uv run soapbox create-user olemd --role owner
SOAPBOX_DATA_DIR=./data uv run soapbox serve --debug
# → http://localhost:8080/admin/
Tester: uv run pytest. Lint: uv run ruff check . && uv run ruff format .
Konfigurasjon (miljøvariabler)
| 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_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 |
SOAPBOX_OWNER_USER / _PASSWORD |
– | Oppretter hovedbruker ved første start |
Container og Caddy
BUILDAH_FORMAT=docker podman build \
--build-arg BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--build-arg GIT_REVISION="$(git describe --always --dirty)" \
-t soapbox .
podman compose up -d # se compose.yaml
Caddy er ren reverse proxy, se Caddyfile.example. Ved sub-path skal Caddy ikke strippe
prefikset – appen monteres selv under SOAPBOX_BASE_PATH.
Flytte bloggen (nytt domene og/eller sub-path)
- Kopier
data/-volumet (eller baregit clonedata/contentog opprett brukerne på nytt). - Sett
SOAPBOX_SITE_URLog eventueltSOAPBOX_BASE_PATHtil de nye verdiene. - Start – siden bygges på nytt. Ingen innhold trenger endring.
Tema
Et tema er en mappe under soapbox/themes/<navn>/ med templates/ (base.html, index.html,
post.html) og static/ (kopieres til /theme/). Enkleste tilpasning: kopier green, endre
CSS-variablene øverst i style.css. Malene får site, posts/post, html og rel(sti).
Veien videre (ikke i denne omgangen)
- Poste lenker til fediverset/Bluesky og vise svar som kommentarer.
- Push av innholdsrepoet til en ekstern git-remote.