Files
Archivum/README.md
Bjorn Blomberg cd588197b9
All checks were successful
build-and-push / build (push) Successful in 15m15s
feat: Authentik OIDC SSO, allow/deny RBAC, admin console & Gitea CI
Authentication & RBAC
- Add confidential OIDC client (Authentik) with /auth/oidc/login +
  /auth/oidc/callback: discovery, code exchange, id_token verify (go-oidc),
  groups claim → role (Archivum-admin → admin, else user). Sessions carry groups.
- Rework ACL into an allow/deny model (new `effect` column + migration).
  db.EffectiveAccess resolves user + all groups over the path and its ancestors:
  default deny, explicit deny always beats allow.
- Enforce ACL for ALL non-admin users (not just guest) across list/read/save/
  delete/move/create/history/diff/images/upload. Admins bypass.
- Seed built-in Archivum-admin / Archivum-reader groups; login allow-list on
  users & groups; public (guest) user access is ACL-configurable.

Admin API & UI
- New GraphQL ops: oidcConfig/updateOidcConfig, group CRUD, membership,
  setUserRole/setUserLogin/setGroupLogin, userGroups, loginOptions.
- Rebuilt AdminView: SSO config, user/group management + membership, login
  toggles, and an allow/deny access-control matrix per path.
- LoginView: "Sign in with Authentik" + public-user option; OIDC callback route.

Rendering/editor
- Fix bug where inline marks (bold/italic/code/strike/link) were dropped on
  TipTap→AsciiDoc save. Add RENDERING_IMPROVEMENTS.md with proposals.

CI / build
- .gitea/workflows/build.yaml: build on the Pi5 runner, push
  localhost:5000/archivum:{latest,<sha>}. Add .dockerignore; bump Go image to 1.25.
- Docs: ARCHITECTURE.md, README.md, docs/AUTHENTIK_SETUP.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 21:58:50 +02:00

232 lines
6.4 KiB
Markdown

# Archivum
Archivum är ett självhostat wiki- och dokumenthanteringssystem. Det är tänkt att användas för allt från enkla anteckningar och teknisk dokumentation till världsbyggande inför rollspelskampanjer. Alla dokument lagras som **AsciiDoc**-filer (`.adoc`) på disk, vilket innebär att du kan läsa och redigera dem direkt med valfritt predikat — utan att öppna webbgränssnittet. Applikationen renderar dokumenten till HTML i webbläsaren och hanterar automatisk **versionshantering via Git**, så att varje sparning skapar ett commit och alla ändringar kan rullas tillbaka.
> Se [ARCHITECTURE.md](ARCHITECTURE.md) för detaljerad dokumentation om arkitektur, exekveringsflöden och komponentstruktur.
---
## Användningsområden
- **Anteckningar** — snabbanteckningar och personliga kunskapsbaser
- **Wiki** — team-wiki med dokumentträd och historik
- **Teknisk dokumentation** — API-dokumentation, systembeskrivningar, runbooks
- **Rollspelskampanjer** — världsbyggande, NPC-register, kartor och händelseloggar
---
## Krav
### För att köra med Docker (rekommenderat)
- [Docker](https://docs.docker.com/get-docker/) ≥ 24
- [Docker Compose](https://docs.docker.com/compose/) v2
### För lokal utveckling
- [Go](https://go.dev/dl/) ≥ 1.22
- [Node.js](https://nodejs.org/) ≥ 20 + npm
- [Git](https://git-scm.com/) (används av backenden för versionshantering)
---
## Snabbstart med Docker Compose
### Alternativ A — Hämta image från privat registry (rekommenderat)
Det enklaste sättet att köra Archivum är att hämta en färdigbyggd image från ett privat registry, utan att behöva källkoden.
**1. Logga in mot ditt registry (om det kräver autentisering):**
```bash
docker login ditt-registry.example.com
```
**2. Skapa en `docker-compose.yml`:**
```yaml
services:
archivum:
image: ditt-registry.example.com/archivum:latest
container_name: archivum
restart: unless-stopped
ports:
- "${HOST_PORT:-8080}:4000"
environment:
DOCKER_PATH: /config
UI_DIR: /srv/archivum/ui
PUID: ${PUID:-1000}
PGID: ${PGID:-1000}
TZ: ${TZ:-Europe/Stockholm}
volumes:
- ${DOCKER_PATH:-./local}/config:/config
- ${DOCKER_PATH:-./local}/data:/data
networks:
- archivum-net
networks:
archivum-net:
driver: bridge
```
> Om du kör en **reverse proxy** (t.ex. Nginx Proxy Manager eller Traefik) i en separat compose-stack kan du låta dem dela nätverk istället för att exponera porten direkt. Deklarera då det externa nätverket:
>
> ```yaml
> networks:
> proxy-net:
> external: true
> ```
>
> Och byt ut `archivum-net` mot `proxy-net` i service-definitionen. Ta även bort `ports`-sektionen om proxyn hanterar all trafik.
**3. Skapa en `.env`-fil i samma katalog som `docker-compose.yml`:**
```env
# Sökväg på hosten där config/ och data/ skapas
DOCKER_PATH=/opt/archivum
# Port som exponeras på hosten
HOST_PORT=8080
# Kör containern som denna användare/grupp (kör `id` för att se dina värden)
PUID=1000
PGID=1000
# Tidszon
TZ=Europe/Stockholm
```
**4. Starta:**
```bash
docker compose up -d
```
**5. Öppna** `http://localhost:8080` i webbläsaren. Installationsguiden startar automatiskt vid första körningen.
---
### Alternativ B — Bygg imagen lokalt från källkod
Klona repot och använd den medföljande compose-filen som också bygger imagen:
```bash
docker compose -f docker/docker-compose.yml up -d --build
```
---
## Lokal utveckling
### Backend
```bash
cd backend
go run ./cmd/server
# Servern lyssnar på :4000
# config.json i backend/ används som konfiguration
```
### Frontend
```bash
cd frontend
npm install
npm run dev
# Dev-server på :5173 med proxy till :4000
```
Öppna `http://localhost:5173`. API-anrop proxyas automatiskt till backend-servern.
### Bygga frontend för produktion
```bash
cd frontend
npm run build
# Utdata i frontend/dist/
```
---
## Konfiguration
Konfigurationen lagras i `config.json`. Filen skapas automatiskt av installationsguiden.
| Fält | Beskrivning |
|----------------|-----------------------------------------------------|
| `storage_path` | Sökväg till katalogen där .adoc-filer och Git-repot lagras |
| `db_path` | Sökväg till SQLite-databasen (användarkonton) |
| `jwt_secret` | Hemlig nyckel för session-tokens |
| `listen_addr` | TCP-adress att lyssna på, t.ex. `:4000` |
| `ldap` | Valfri LDAP-konfiguration för företagsinloggning |
---
## Autentisering & behörigheter
Archivum stöder tre inloggningssätt:
- **SSO via Authentik (OIDC)** — rekommenderat. Användare loggar in genom
Authentik (som i sin tur autentiserar mot LDAP). Grupp-medlemskap avgör roll
och åtkomst. Se [`docs/AUTHENTIK_SETUP.md`](docs/AUTHENTIK_SETUP.md).
- **Lokala konton** — skapas i setup-guiden och i admin-panelen (bcrypt).
- **Publik användare** — anonym, väljs på login-sidan; ser bara det admin delat.
**Roller:** medlemmar i gruppen `Archivum-admin` är administratörer (ser/gör allt,
administrerar sidan). Alla andra styrs av åtkomstreglerna.
**Åtkomstmodell:** per sökväg (dokument eller mapp) tilldelar admin `allow`/`deny`
till användare och grupper. Standard är **deny**; en `allow` ger tillgång, en
`deny` vinner alltid. Reglerna kombineras över användarens alla grupper och
överliggande mappar. Hanteras under **Admin Settings → Access Control**.
## Automatiskt bygge (Gitea Actions)
Vid push till `main` bygger den självhostade Gitea-runnern (arm64, på Pi5)
imagen och pushar den till registryn:
```
localhost:5000/archivum:latest
localhost:5000/archivum:<commit-sha>
```
Workflow: [`.gitea/workflows/build.yaml`](.gitea/workflows/build.yaml). Deploya
sedan `localhost:5000/archivum:latest` från din compose-stack på Pi5.
## Dokumentformat
Alla dokument skrivs i [AsciiDoc](https://asciidoc.org/). Exempeldokument:
```asciidoc
= Mitt dokument
:author: Anna Andersson
:date: 2026-04-12
== Introduktion
Det här är ett *fetstilt* stycke med en https://example.com[länk].
== Kodexempel
[source,go]
----
fmt.Println("Hello, Archivum!")
----
```
Filen sparas som `mitt-dokument.adoc` i `storage_path` och versionshanteras automatiskt.
---
## Docker: Multi-arch build
För att bygga och pusha en image som stöder både AMD64 och ARM64 (Raspberry Pi):
```bash
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t ditt-registry/archivum:latest \
-f docker/Dockerfile --push .
```