From bf771426413c97c3b888d6ede6f3ba3b6809cc81 Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Fri, 27 Feb 2026 15:11:47 +0100 Subject: [PATCH] **feat(compose):** add separate deploy and dev Docker Compose files - Introduced `compose.yml` for deployment, pulling the image from the registry - Added `compose.dev.yml` for local development, building the image from source - Updated `README.md` and `.claude/CLAUDE.md` with instructions for both configurations - Introduced `DB_PATH` environment variable to customize SQLite database file location - Updated `main.go` to use `DB_PATH` with a default fallback (`./diun.db`) --- .claude/CLAUDE.md | 6 +++++- README.md | 18 +++++++++++++++--- cmd/diunwebhook/main.go | 6 +++++- docker-compose.yml => compose.dev.yml | 1 - compose.yml | 15 +++++++++++++++ 5 files changed, 40 insertions(+), 6 deletions(-) rename docker-compose.yml => compose.dev.yml (90%) create mode 100644 compose.yml diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index eb69080..3a34e72 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -17,9 +17,12 @@ go run ./cmd/diunwebhook/ # Build Docker image docker build -t diun-webhook-dashboard . -# Run with Docker Compose +# Run with Docker Compose (deploy — pulls from registry) docker compose up -d +# Run with Docker Compose (dev — builds locally) +docker compose -f compose.dev.yml up -d + # Frontend (from frontend/ directory) bun install # install deps bun run dev # dev server on :5173 (proxies /api and /webhook to :8080) @@ -56,6 +59,7 @@ The app is a Go HTTP server that receives [DIUN](https://crazymax.dev/diun/) web **Environment variables:** - `PORT` — listen port (default `8080`) +- `DB_PATH` — path to SQLite database file (default `./diun.db`); set to e.g. `/data/diun.db` in Docker to use a separate mountable directory - `WEBHOOK_SECRET` — when set, every `POST /webhook` must include a matching `Authorization` header; when unset, the webhook is open (a warning is logged at startup) **Key data flow:** diff --git a/README.md b/README.md index 2eb5046..a489201 100644 --- a/README.md +++ b/README.md @@ -28,12 +28,20 @@ docker run --rm -p 8080:8080 diun-webhook-dashboard # open http://localhost:8080 ``` -### Docker Compose +### Docker Compose (deploy) ```bash +# Pulls from Gitea registry, persists DB to a named volume docker compose up -d # open http://localhost:8080 ``` +### Docker Compose (dev) +```bash +# Builds the image locally from source +docker compose -f compose.dev.yml up -d +# open http://localhost:8080 +``` + ## Webhook authentication Set `WEBHOOK_SECRET` to protect the webhook endpoint with token authentication. When set, every `POST /webhook` must include a matching `Authorization` header. When unset, the webhook is open (a warning is logged at startup). @@ -44,6 +52,9 @@ WEBHOOK_SECRET=your-secret-token-here go run ./cmd/diunwebhook/ # Or via Docker Compose (.env file or inline) WEBHOOK_SECRET=your-secret-token-here docker compose up -d + +# Custom database path (useful for Docker volume mounts) +DB_PATH=/data/diun.db go run ./cmd/diunwebhook/ ``` ## DIUN configuration example @@ -93,7 +104,8 @@ pkg/diunwebhook/ — core library (handlers, DB, models) frontend/ — React SPA (Bun + Vite + React 19 + Tailwind + shadcn/ui) .gitea/workflows/ — CI/CD workflows (Gitea Actions) Dockerfile — 3-stage multi-stage build -docker-compose.yml — single-service compose file +compose.yml — deploy compose (pulls from Gitea registry) +compose.dev.yml — dev compose (builds locally) ``` ## Development @@ -127,7 +139,7 @@ Aim for 80-90% coverage. Coverage below 80% will emit a warning in CI but will n ## Production notes - Behind a reverse proxy, ensure the app is reachable at `/webhook` from DIUN. -- Data is persisted to `diun.db` in the working directory. Mount a volume to preserve data across container recreations. +- Data is persisted to `diun.db` in the working directory by default. Set `DB_PATH` to change the location (e.g. `DB_PATH=/data/diun.db`). The deploy compose file uses a named volume at `/data`. - Set `WEBHOOK_SECRET` to protect the webhook endpoint if exposed publicly. ## License diff --git a/cmd/diunwebhook/main.go b/cmd/diunwebhook/main.go index 156d974..feb3269 100644 --- a/cmd/diunwebhook/main.go +++ b/cmd/diunwebhook/main.go @@ -14,7 +14,11 @@ import ( ) func main() { - if err := diun.InitDB("./diun.db"); err != nil { + dbPath := os.Getenv("DB_PATH") + if dbPath == "" { + dbPath = "./diun.db" + } + if err := diun.InitDB(dbPath); err != nil { log.Fatalf("InitDB: %v", err) } diff --git a/docker-compose.yml b/compose.dev.yml similarity index 90% rename from docker-compose.yml rename to compose.dev.yml index fa7cef9..ce1841b 100644 --- a/docker-compose.yml +++ b/compose.dev.yml @@ -1,4 +1,3 @@ -version: "3.9" services: app: build: . diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..d25799f --- /dev/null +++ b/compose.yml @@ -0,0 +1,15 @@ +services: + app: + image: gitea.jeanlucmakiola.de/makiolaj/diundashboard:latest + ports: + - "8080:8080" + environment: + - WEBHOOK_SECRET=${WEBHOOK_SECRET:-} + - PORT=${PORT:-8080} + - DB_PATH=/data/diun.db + volumes: + - diun-data:/data + restart: unless-stopped + +volumes: + diun-data: