From 744ff5277015bf62114140700c28681abcf3f41c Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Tue, 14 Jul 2026 10:56:19 -0600 Subject: [PATCH] fix(kener): define REDIS_URL and drop unused databases Kener v4 requires Redis for its BullMQ queues, caching and scheduler, so the app crashed on startup with "REDIS_URL is not defined in environment variables" right after printing that it was running (issue #976). The template also spun up both a postgres and a mariadb container while DATABASE_URL pointed at SQLite, so neither database was ever used (issue #282). Changes, aligned with the upstream docker-compose.yml (rajnandan1/kener): - Add a redis:7-alpine service with a healthcheck and persistent volume, wire REDIS_URL=redis://redis:6379 and make kener depend on redis being healthy - Remove the unused postgres and mysql services plus their env vars and generated passwords; keep SQLite (upstream default) persisted in the kener_db volume - Set ORIGIN to https:// instead of http://localhost:3000 so CSRF protection works behind the generated domain - Drop the stale /app/uploads bind mount (kener v4 only persists /app/database) and the obsolete compose version key Deploy-tested on a Dokploy instance: migrations and seed complete, schedulers start, "Kener version 4.1.2 is running!", HTTP 200 on the generated domain, both containers stable. Closes #976 Closes #282 Co-Authored-By: Claude Fable 5 --- blueprints/kener/docker-compose.yml | 34 +++++++++++++---------------- blueprints/kener/template.toml | 22 ++----------------- 2 files changed, 17 insertions(+), 39 deletions(-) diff --git a/blueprints/kener/docker-compose.yml b/blueprints/kener/docker-compose.yml index 01f9a689..90dde8e2 100644 --- a/blueprints/kener/docker-compose.yml +++ b/blueprints/kener/docker-compose.yml @@ -1,39 +1,35 @@ -version: "3.8" - services: kener: image: rajnandan1/kener:latest environment: - TZ=${TZ} - KENER_SECRET_KEY=${KENER_SECRET_KEY} # 🔐 API key / secret + - ORIGIN=${ORIGIN} + - REDIS_URL=${REDIS_URL} - DATABASE_URL=${DATABASE_URL} - KENER_BASE_PATH=${KENER_BASE_PATH} - - ORIGIN=${ORIGIN} - RESEND_API_KEY=${RESEND_API_KEY} # 🔐 API key - RESEND_SENDER_EMAIL=${RESEND_SENDER_EMAIL} ports: - 3000 volumes: - kener_db:/app/database - - ../files/uploads:/app/uploads + depends_on: + redis: + condition: service_healthy restart: unless-stopped - postgres: - image: postgres:alpine - environment: - - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} # 🔐 DB password - - POSTGRES_DB=${POSTGRES_DB} - restart: unless-stopped - - mysql: - image: mariadb:11 - environment: - - MYSQL_USER=${MYSQL_USER} - - MYSQL_PASSWORD=${MYSQL_PASSWORD} # 🔐 DB password - - MYSQL_DATABASE=${MYSQL_DATABASE} - - MYSQL_RANDOM_ROOT_PASSWORD=true + redis: + image: redis:7-alpine + volumes: + - kener_redis:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 restart: unless-stopped volumes: kener_db: {} + kener_redis: {} diff --git a/blueprints/kener/template.toml b/blueprints/kener/template.toml index 916f987e..fba7cde4 100644 --- a/blueprints/kener/template.toml +++ b/blueprints/kener/template.toml @@ -1,8 +1,6 @@ [variables] main_domain = "${domain}" KENER_SECRET_KEY = "${password:64}" -POSTGRES_PASSWORD = "${password:32}" -MYSQL_PASSWORD = "${password:32}" [config] [[config.domains]] @@ -13,25 +11,9 @@ host = "${main_domain}" [config.env] TZ = "Etc/UTC" KENER_SECRET_KEY = "${KENER_SECRET_KEY}" # 🔐 API key / secret +ORIGIN = "https://${main_domain}" +REDIS_URL = "redis://redis:6379" DATABASE_URL = "sqlite://./database/kener.sqlite.db" KENER_BASE_PATH = "" -ORIGIN = "http://localhost:3000" RESEND_API_KEY = "" RESEND_SENDER_EMAIL = "Accounts " -POSTGRES_USER = "user" -POSTGRES_DB = "kener_db" -MYSQL_USER = "user" -MYSQL_DATABASE = "kener_db" -MYSQL_RANDOM_ROOT_PASSWORD = "true" -MYSQL_PASSWORD = "${MYSQL_PASSWORD}" # 🔐 DB password -POSTGRES_PASSWORD = "${POSTGRES_PASSWORD}" # 🔐 DB password - -[[config.mounts]] -type = "volume" -source = "kener_db" -target = "/app/database" - -[[config.mounts]] -type = "bind" -source = "../files/uploads" -target = "/app/uploads"