Changeset 5a2cb69 in Klonkt


Ignore:
Timestamp:
06/21/2026 11:12:08 PM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
19b0727
Parents:
7bd97a6
Message:

feat(self-host): Docker-image + compose + quickstart-README

Dockerfile (multi-stage node:20-bookworm → -slim): native better-sqlite3 +
gebundelde ffmpeg (ffmpeg-static) uit builder, cwebp uit Debian 'webp', draait
als non-root, healthcheck. docker-compose met persistent storage-volume.
README: zelf-host-quickstart (Docker + Node + Caddy-HTTPS + eerste-keer-setup).
Op de VPS gebouwd + getest: build OK, GET / 200, DB auto-migreert, ffmpeg+cwebp
aanwezig, healthcheck healthy. Distributie (publiceren) wacht op GitHub-stap.

Co-Authored-By: Claude <noreply@…>

Files:
3 added
1 edited

Legend:

Unmodified
Added
Removed
  • README.md

    r7bd97a6 r5a2cb69  
    99## Filosofie
    1010
    11 - **Editorial feel.** Magazine-typografie (Fraunces + Literata + Plus Jakarta), royale spacing, 8 paletten waaronder Sage / Paper / Ocean / Forest / Stone / Midnight / Sunset / Cream. Light + dark per palette.
     11- **Editorial feel.** Magazine-typografie (Fraunces + Literata + Plus Jakarta), royale spacing, 12 paletten (o.a. Sage, Paper, Ocean, Forest, Stone, Midnight, Sunset, Cream, Rose, Goud, Terracotta, Lilac). Light + dark per palette.
    1212- **App-feel waar het telt.** Geen full page reloads — htmx swaps + (binnenkort) View Transitions. Voelt als app, niet als website.
    1313- **Server-rendered.** Geen build step, geen SPA-tax. EJS + htmx + minimale Alpine.
     
    2626| **2.0 — E2EE DMs** | MLS protocol via `@openmls/openmls`, single-device first | ⚪ apart project |
    2727
    28 ## Quick start
     28## Zelf hosten
     29
     30Klonkt is een **Node-app** (geen PHP) — draai 'm op een VPS, in Docker of op een
     31Node-hostingplatform. **Niet** op klassieke shared PHP-hosting. De database
     32(SQLite) maakt zichzelf aan bij de eerste start; er is geen los installatiescript.
     33
     34### Optie A — Docker (aanbevolen)
     35
     36Alles (Node, ffmpeg, cwebp) zit in het image; je hoeft alleen Docker te hebben.
    2937
    3038```bash
    31 npm install
     39git clone <repo-url> klonkt && cd klonkt
    3240cp .env.example .env
    33 # zet SESSION_SECRET op iets random (>=32 chars in production)
    34 npm run migrate
    35 npm run dev
     41# vul in .env minimaal in: SESSION_SECRET (>=32 random tekens) + PUBLIC_BASE_URL
     42docker compose up -d
    3643```
    3744
    38 Open http://localhost:3000
     45De app draait nu op poort 3000. Alle data (database + geüploade media/audio)
     46blijft bewaard in het `klonkt-data`-volume, ook na een update. Updaten:
     47
     48```bash
     49git pull && docker compose up -d --build
     50```
     51
     52### Optie B — direct met Node (Node 20+)
     53
     54```bash
     55git clone <repo-url> klonkt && cd klonkt
     56npm ci
     57cp .env.example .env        # SESSION_SECRET + PUBLIC_BASE_URL invullen
     58npm start                   # database wordt bij de eerste start aangemaakt
     59```
     60
     61Open http://localhost:3000. Voor productie: zet 'm achter een procesmanager
     62(pm2/systemd) zodat 'ie aanblijft. `cwebp` is optioneel (Debian/Ubuntu:
     63`apt install webp`) voor WebP-afbeeldingen — ontbreekt 'ie, dan wordt het
     64origineel bewaard. (`npm run dev` = watch-mode voor ontwikkeling.)
     65
     66### HTTPS (productie)
     67
     68Zet een reverse-proxy vóór de app voor TLS. Met **Caddy** (automatisch
     69Let's Encrypt) volstaat één blok:
     70
     71```caddy
     72jouwdomein.nl {
     73    reverse_proxy localhost:3000
     74    encode gzip zstd
     75}
     76```
     77
     78### Eerste keer
     79
     80Open je site en ga naar **`/auth/register`** — de **eerste gebruiker wordt
     81automatisch beheerder**; daarna sluit registratie zich. Wachtwoord kwijt?
     82`npm run reset-admin` (in Docker: `docker compose exec klonkt npm run reset-admin`).
    3983
    4084## Stack
Note: See TracChangeset for help on using the changeset viewer.