Compare commits

..
Author SHA1 Message Date
Mauricio SiuandClaude Fable 5 744ff52770 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://<domain> 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 <noreply@anthropic.com>
2026-07-14 10:56:19 -06:00
5 changed files with 71 additions and 48 deletions
+47 -6
View File
@@ -1,24 +1,65 @@
services:
gitlab:
image: gitlab/gitlab-ce:19.1.2-ce.0
image: gitlab/gitlab-ce:latest
restart: unless-stopped
shm_size: "256m"
hostname: gitlab.example.com
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://${GITLAB_HOST}'
gitlab_rails['gitlab_ssh_host'] = '${GITLAB_HOST}'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_host'] = 'postgresql'
gitlab_rails['db_port'] = '5432'
gitlab_rails['db_database'] = '${POSTGRES_DB}'
gitlab_rails['db_username'] = '${POSTGRES_USER}'
gitlab_rails['db_password'] = '${POSTGRES_PASSWORD}'
# Redis config for external TCP connection
gitlab_rails['redis_url'] = 'redis://redis:6379/0'
gitlab_rails['redis_host'] = 'redis'
gitlab_rails['redis_port'] = 6379
gitlab_rails['redis_socket'] = nil
gitlab_rails['gitlab_email_enabled'] = false
gitlab_rails['gitlab_default_can_create_group'] = true
gitlab_rails['gitlab_username_changing_enabled'] = false
unicorn['worker_processes'] = 2
unicorn['worker_timeout'] = 60
postgresql['enable'] = false
redis['enable'] = false
nginx['enable'] = true
nginx['listen_port'] = 80
nginx['listen_https'] = false
gitlab_rails['initial_root_password'] = '${GITLAB_ROOT_PASSWORD}'
gitlab_rails['gitlab_email_enabled'] = false
puma['worker_processes'] = 0
sidekiq['concurrency'] = 10
prometheus_monitoring['enable'] = false
ports:
- "80"
- "2224"
volumes:
- gitlab_config:/etc/gitlab
- gitlab_logs:/var/log/gitlab
- gitlab_data:/var/opt/gitlab
depends_on:
- postgresql
- redis
postgresql:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgresql_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
- redis_data:/data
volumes:
gitlab_config:
gitlab_logs:
gitlab_data:
postgresql_data:
redis_data:
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "gitlab-ce",
"name": "GitLab CE",
"version": "19.1.2",
"version": "latest",
"description": "GitLab Community Edition is a free and open source platform for managing Git repositories, CI/CD pipelines, and project management.",
"logo": "gitlab-ce.svg",
"links": {
+6 -2
View File
@@ -1,11 +1,15 @@
[variables]
main_domain = "${domain}"
gitlab_root_password = "${password:32}"
postgres_db = "gitlab"
postgres_user = "gitlab"
postgres_password = "${password:32}"
[config]
env = [
"GITLAB_HOST=${main_domain}",
"GITLAB_ROOT_PASSWORD=${gitlab_root_password}",
"POSTGRES_DB=${postgres_db}",
"POSTGRES_USER=${postgres_user}",
"POSTGRES_PASSWORD=${postgres_password}",
]
[[config.domains]]
+15 -19
View File
@@ -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: {}
+2 -20
View File
@@ -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 <accounts@resend.dev>"
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"