From b9e1a7c71226a2b7d4330a33b3e470eb028748c9 Mon Sep 17 00:00:00 2001 From: Jonas Thelemann Date: Wed, 21 Oct 2026 05:39:13 +0200 Subject: [PATCH 1/2] chore(docker): cap the container log size of every production service --- src/production/adminer/compose.yaml | 5 +++++ src/production/cadvisor/compose.yaml | 5 +++++ src/production/cloudflared/compose.yaml | 5 +++++ src/production/debezium/compose.yaml | 5 +++++ src/production/elasticsearch/compose.yaml | 5 +++++ src/production/geoip/compose.yaml | 5 +++++ src/production/grafana/compose.yaml | 5 +++++ src/production/jobber/compose.yaml | 5 +++++ src/production/memcached/compose.yaml | 5 +++++ src/production/node-exporter/compose.yaml | 5 +++++ src/production/portainer-agent/compose.yaml | 5 +++++ src/production/portainer/compose.yaml | 5 +++++ src/production/postgraphile/compose.yaml | 5 +++++ src/production/postgres/compose.yaml | 10 +++++++++ src/production/prometheus/compose.yaml | 5 +++++ src/production/reccoom/compose.yaml | 15 +++++++++++++ src/production/redis/compose.yaml | 5 +++++ src/production/redpanda/compose.yaml | 10 +++++++++ src/production/traefik/compose.yaml | 10 +++++++++ src/production/tusd/compose.yaml | 5 +++++ src/production/vibetype/compose.yaml | 5 +++++ src/production/zammad/compose.yaml | 25 +++++++++++++++++++++ 22 files changed, 155 insertions(+) diff --git a/src/production/adminer/compose.yaml b/src/production/adminer/compose.yaml index cd39c944..f94cc2b2 100644 --- a/src/production/adminer/compose.yaml +++ b/src/production/adminer/compose.yaml @@ -9,3 +9,8 @@ services: - node.labels.vibetype.storage == true update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/cadvisor/compose.yaml b/src/production/cadvisor/compose.yaml index 4ebd6218..db0e2cbe 100644 --- a/src/production/cadvisor/compose.yaml +++ b/src/production/cadvisor/compose.yaml @@ -6,3 +6,8 @@ services: - traefik.http.routers.cadvisor-secure.tls.certresolver=default update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/cloudflared/compose.yaml b/src/production/cloudflared/compose.yaml index f05a8598..baad7f27 100644 --- a/src/production/cloudflared/compose.yaml +++ b/src/production/cloudflared/compose.yaml @@ -24,5 +24,10 @@ services: retries: 3 start_period: 30s image: cloudflare/cloudflared:2026.9.1 + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m secrets: - cloudflared-tunnel-token diff --git a/src/production/debezium/compose.yaml b/src/production/debezium/compose.yaml index 49e309d2..0f82164a 100644 --- a/src/production/debezium/compose.yaml +++ b/src/production/debezium/compose.yaml @@ -6,6 +6,11 @@ services: - node.labels.vibetype.storage == true update_config: order: stop-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m debezium-postgres-connector: deploy: placement: diff --git a/src/production/elasticsearch/compose.yaml b/src/production/elasticsearch/compose.yaml index 8e982e8d..92bb395a 100644 --- a/src/production/elasticsearch/compose.yaml +++ b/src/production/elasticsearch/compose.yaml @@ -6,3 +6,8 @@ services: - node.labels.vibetype.storage == true update_config: order: stop-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/geoip/compose.yaml b/src/production/geoip/compose.yaml index fc5fc9a9..3ecbe3de 100644 --- a/src/production/geoip/compose.yaml +++ b/src/production/geoip/compose.yaml @@ -3,3 +3,8 @@ services: deploy: update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/grafana/compose.yaml b/src/production/grafana/compose.yaml index 8193a4da..3a56e37e 100644 --- a/src/production/grafana/compose.yaml +++ b/src/production/grafana/compose.yaml @@ -9,3 +9,8 @@ services: - node.labels.vibetype.storage == true update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/jobber/compose.yaml b/src/production/jobber/compose.yaml index a6889ce5..a7d61ff4 100644 --- a/src/production/jobber/compose.yaml +++ b/src/production/jobber/compose.yaml @@ -8,6 +8,11 @@ services: order: stop-first environment: SENTRY_CRONS: ${SENTRY_CRONS} + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m volumes: - (( append )) - postgres-backup-data:/backups/ diff --git a/src/production/memcached/compose.yaml b/src/production/memcached/compose.yaml index c448c776..7d734814 100644 --- a/src/production/memcached/compose.yaml +++ b/src/production/memcached/compose.yaml @@ -3,3 +3,8 @@ services: deploy: update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/node-exporter/compose.yaml b/src/production/node-exporter/compose.yaml index 74a27e86..65b4f2fe 100644 --- a/src/production/node-exporter/compose.yaml +++ b/src/production/node-exporter/compose.yaml @@ -3,3 +3,8 @@ services: deploy: update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/portainer-agent/compose.yaml b/src/production/portainer-agent/compose.yaml index 601a15a3..24a32cf3 100644 --- a/src/production/portainer-agent/compose.yaml +++ b/src/production/portainer-agent/compose.yaml @@ -3,3 +3,8 @@ services: deploy: update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/portainer/compose.yaml b/src/production/portainer/compose.yaml index 533b84dc..cf880593 100644 --- a/src/production/portainer/compose.yaml +++ b/src/production/portainer/compose.yaml @@ -10,3 +10,8 @@ services: - node.labels.vibetype.storage == true update_config: order: stop-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/postgraphile/compose.yaml b/src/production/postgraphile/compose.yaml index 059dedcc..0fcee5e4 100644 --- a/src/production/postgraphile/compose.yaml +++ b/src/production/postgraphile/compose.yaml @@ -8,3 +8,8 @@ services: update_config: order: start-first image: ghcr.io/maevsi/postgraphile:2.2.6 + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/postgres/compose.yaml b/src/production/postgres/compose.yaml index 7d5a802e..1026f216 100644 --- a/src/production/postgres/compose.yaml +++ b/src/production/postgres/compose.yaml @@ -10,6 +10,11 @@ services: - node.labels.vibetype.storage == true update_config: order: stop-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m postgres-backup: # You cannot access the database backup directly. deploy: @@ -24,6 +29,11 @@ services: POSTGRES_PASSWORD_FILE: /run/secrets/postgres-password POSTGRES_USER_FILE: /run/secrets/postgres-user image: prodrigestivill/postgres-backup-local:18-alpine + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m secrets: - postgres-backup-db - postgres-password diff --git a/src/production/prometheus/compose.yaml b/src/production/prometheus/compose.yaml index 79946299..388381c7 100644 --- a/src/production/prometheus/compose.yaml +++ b/src/production/prometheus/compose.yaml @@ -9,3 +9,8 @@ services: - node.labels.vibetype.storage == true update_config: order: stop-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/reccoom/compose.yaml b/src/production/reccoom/compose.yaml index f5713c4a..a28e6177 100644 --- a/src/production/reccoom/compose.yaml +++ b/src/production/reccoom/compose.yaml @@ -6,6 +6,11 @@ services: environment: SENTRY_TRACES_SAMPLE_RATE: "0.1" image: ghcr.io/maevsi/reccoom:0.23.0 + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m reccoom-consumer: deploy: update_config: @@ -13,6 +18,11 @@ services: environment: SENTRY_TRACES_SAMPLE_RATE: "0.1" image: ghcr.io/maevsi/reccoom:0.23.0 + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m reccoom-migration: deploy: update_config: @@ -27,3 +37,8 @@ services: - node.labels.vibetype.storage == true update_config: order: stop-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/redis/compose.yaml b/src/production/redis/compose.yaml index 174a83aa..3021be27 100644 --- a/src/production/redis/compose.yaml +++ b/src/production/redis/compose.yaml @@ -6,3 +6,8 @@ services: - node.labels.vibetype.storage == true update_config: order: stop-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/redpanda/compose.yaml b/src/production/redpanda/compose.yaml index a9d699c9..97bde120 100644 --- a/src/production/redpanda/compose.yaml +++ b/src/production/redpanda/compose.yaml @@ -6,6 +6,11 @@ services: - node.labels.vibetype.storage == true update_config: order: stop-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m redpanda-console: deploy: labels: @@ -16,3 +21,8 @@ services: - node.labels.vibetype.storage == true update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/traefik/compose.yaml b/src/production/traefik/compose.yaml index 36f08d77..51ebb938 100644 --- a/src/production/traefik/compose.yaml +++ b/src/production/traefik/compose.yaml @@ -25,6 +25,11 @@ services: environment: CF_DNS_API_TOKEN_FILE: /run/secrets/traefik-cf-dns-api-token CF_ZONE_API_TOKEN_FILE: /run/secrets/traefik-cf-zone-api-token + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m secrets: - traefik-cf-dns-api-token - traefik-cf-zone-api-token @@ -51,6 +56,11 @@ services: environment: STACK_DOMAIN: ${STACK_DOMAIN} image: ldez/traefik-certs-dumper:v2.11.4 + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m volumes: - acme-data:/etc/traefik/acme/ volumes: diff --git a/src/production/tusd/compose.yaml b/src/production/tusd/compose.yaml index 54e38bba..5e9d3d2a 100644 --- a/src/production/tusd/compose.yaml +++ b/src/production/tusd/compose.yaml @@ -7,3 +7,8 @@ services: - traefik.http.routers.tusd-secure.tls.certresolver=default update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m diff --git a/src/production/vibetype/compose.yaml b/src/production/vibetype/compose.yaml index 5f1c5b9e..54018225 100644 --- a/src/production/vibetype/compose.yaml +++ b/src/production/vibetype/compose.yaml @@ -8,6 +8,11 @@ services: update_config: order: start-first image: ghcr.io/maevsi/vibetype:15.23.3 + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m # vibetype-beta: # # You can access the main project frontend's beta version at [beta.app.localhost](https://beta.app.localhost/). # deploy: diff --git a/src/production/zammad/compose.yaml b/src/production/zammad/compose.yaml index b50c3cd0..1f1b37e5 100644 --- a/src/production/zammad/compose.yaml +++ b/src/production/zammad/compose.yaml @@ -6,6 +6,11 @@ services: - node.labels.vibetype.storage == true update_config: order: stop-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m zammad-init: deploy: placement: @@ -23,6 +28,11 @@ services: - node.labels.vibetype.storage == true update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m zammad-railsserver: deploy: placement: @@ -30,6 +40,11 @@ services: - node.labels.vibetype.storage == true update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m zammad-scheduler: deploy: placement: @@ -37,6 +52,11 @@ services: - node.labels.vibetype.storage == true update_config: order: stop-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m zammad-websocket: deploy: placement: @@ -44,3 +64,8 @@ services: - node.labels.vibetype.storage == true update_config: order: start-first + logging: + driver: json-file + options: + max-file: "3" + max-size: 20m From cb2e0ae38076425bfd81b559681178f0b6f0dba9 Mon Sep 17 00:00:00 2001 From: Jonas Thelemann Date: Wed, 21 Oct 2026 05:54:16 +0200 Subject: [PATCH 2/2] fix(redpanda): disable the unlicensed enterprise balancing features (#311) --- artifacts/docs/README.md | 6 +++++- src/development/redpanda/compose.yaml | 12 +++++++++++ .../redpanda/configurations/cluster-config.sh | 21 +++++++++++++++++++ src/production/redpanda/compose.yaml | 7 +++++++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100755 src/development/redpanda/configurations/cluster-config.sh diff --git a/artifacts/docs/README.md b/artifacts/docs/README.md index 8cf8b8b2..daad8ffe 100644 --- a/artifacts/docs/README.md +++ b/artifacts/docs/README.md @@ -16,7 +16,7 @@ Services: adminer, cloudflared, portainer, portainer-agent, postgraphile, postgr ### event-streaming -Services: debezium, debezium-postgres-connector, postgres, redpanda, redpanda-console, sqitch, traefik +Services: debezium, debezium-postgres-connector, postgres, redpanda, redpanda-cluster-config, redpanda-console, sqitch, traefik ### recommendation @@ -144,6 +144,10 @@ You cannot access the caching system via a web interface. You can access the event streaming platform's ui as described under `redpanda-console`. +### redpanda-cluster-config + +The broker's one-shot task for adjusting its cluster configuration after startup. + ### redpanda-console You can access the event streaming platform's ui at [redpanda.app.localhost](https://redpanda.app.localhost/). diff --git a/src/development/redpanda/compose.yaml b/src/development/redpanda/compose.yaml index 00653ade..0c5d3be8 100644 --- a/src/development/redpanda/compose.yaml +++ b/src/development/redpanda/compose.yaml @@ -21,6 +21,18 @@ services: image: redpandadata/redpanda:v26.2.3 volumes: - redpanda-data:/var/lib/redpanda/data + redpanda-cluster-config: + # The broker's one-shot task for adjusting its cluster configuration after startup. + command: /entrypoint.sh + deploy: + labels: + - dargstack.profiles=event-streaming + restart_policy: + condition: on-failure + entrypoint: sh + image: curlimages/curl:8.22.0 + volumes: + - ./configurations/cluster-config.sh:/entrypoint.sh:ro redpanda-console: # You can access the event streaming platform's ui at [redpanda.app.localhost](https://redpanda.app.localhost/). deploy: diff --git a/src/development/redpanda/configurations/cluster-config.sh b/src/development/redpanda/configurations/cluster-config.sh new file mode 100755 index 00000000..df30ad63 --- /dev/null +++ b/src/development/redpanda/configurations/cluster-config.sh @@ -0,0 +1,21 @@ +#!/bin/sh +set -eu + +ADMIN_URL="http://redpanda:9644/v1/cluster_config" + +# Wait for Redpanda's admin API to be reachable. +echo "Waiting for Redpanda to be ready..." +while ! curl --output /dev/null --silent "$ADMIN_URL"; do + sleep 5 +done + +# The continuous balancing features are licensed enterprise features, +# and the cluster runs on the community edition. +# Disabling both keeps the broker on its unlicensed properties. +echo "Disabling the unlicensed enterprise balancing features..." +curl --fail --output /dev/null --silent --show-error \ + -X PUT "$ADMIN_URL" \ + -H "Content-Type: application/json" \ + -d '{"config_properties": {"core_balancing_continuous": false, "partition_auto_balancing_continuous": false}}' + +echo "The enterprise balancing features are disabled." diff --git a/src/production/redpanda/compose.yaml b/src/production/redpanda/compose.yaml index 97bde120..d8c45513 100644 --- a/src/production/redpanda/compose.yaml +++ b/src/production/redpanda/compose.yaml @@ -11,6 +11,13 @@ services: options: max-file: "3" max-size: 20m + redpanda-cluster-config: + deploy: + placement: + constraints: + - node.labels.vibetype.storage == true + update_config: + order: stop-first redpanda-console: deploy: labels: