# 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//index.md + bilder → // │ └── guests///index.md → /// ├── 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 samme `public/` både på `blog.domene.no/` og `annet-domene.com/blog/` uten rebuild. * **Bilder** ligger i samme mappe som innlegget og refereres som `![](bilde.jpg)`. 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 ```sh 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) Se `.env.example` for en kommentert mal. Alt har standardverdier; kun `SOAPBOX_SITE_URL` og 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_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 ```sh cp .env.example .env # sett SOAPBOX_SITE_URL og hovedbruker ./build.sh # bygger localhost/soapbox:latest med build-metadata ./run.sh # podman run --replace med .env, port 127.0.0.1:8080 # eller: podman compose up -d ``` Ny versjon: `git pull && ./build.sh && ./run.sh`. Data ligger i podman-volumet `soapbox-data` (`podman volume inspect soapbox-data` viser stien). 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) 1. Kopier `data/`-volumet (eller bare `git clone` `data/content` og opprett brukerne på nytt). 2. Sett `SOAPBOX_SITE_URL` og eventuelt `SOAPBOX_BASE_PATH` til de nye verdiene. 3. Start – siden bygges på nytt. Ingen innhold trenger endring. ## Tema Et tema er en mappe under `soapbox/themes//` 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)`. ## Lisens AGPL-3.0-or-later, se `LICENSE`. Bloggen lenker til kildekoden i footeren, slik lisensen krever for nettverkstjenester. Endrer du koden og hoster den, må lenken peke til din versjon (`SOURCE_URL` i `soapbox/build.py`). ## Veien videre (ikke i denne omgangen) * Poste lenker til fediverset/Bluesky og vise svar som kommentarer. * Push av innholdsrepoet til en ekstern git-remote.