mirror of
https://github.com/Dokploy/templates.git
synced 2026-07-10 16:35:27 +02:00
The tb-node image runs as the non-root "thingsboard" user (uid 799), but the freshly created /data named volume is owned by root, so "touch /data/.thingsboard-installed" failed with permission denied after every successful install. Combined with "set -e" and "restart: on-failure", the init container kept re-running the installer forever and the main thingsboard service (gated on service_completed_successfully) never started, leaving the domain returning 404. Running the init service as root lets the marker be written so the init completes and stays idempotent across redeploys. Also widened the main service healthcheck start window (start_period 300s, retries 10) so the slow first boot on modest VPS hardware is not marked unhealthy while docker compose up --wait is in progress. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
83 lines
2.4 KiB
YAML
83 lines
2.4 KiB
YAML
version: "3.8"
|
|
|
|
services:
|
|
thingsboard:
|
|
image: thingsboard/tb-node:4.3.1.1
|
|
restart: unless-stopped
|
|
depends_on:
|
|
thingsboard-db:
|
|
condition: service_healthy
|
|
thingsboard-init:
|
|
condition: service_completed_successfully
|
|
expose:
|
|
- "8080"
|
|
environment:
|
|
TB_SERVICE_ID: tb-ce-node
|
|
TB_QUEUE_TYPE: in-memory
|
|
JAVA_OPTS: ${JAVA_OPTS}
|
|
SPRING_DATASOURCE_URL: jdbc:postgresql://thingsboard-db:5432/${POSTGRES_DB}
|
|
SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER}
|
|
SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD}
|
|
SECURITY_CORS_ALLOWED_ORIGINS: ${SECURITY_CORS_ALLOWED_ORIGINS}
|
|
volumes:
|
|
- thingsboard-logs:/var/log/thingsboard
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "timeout 5 bash -c '</dev/tcp/127.0.0.1/8080'"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 10
|
|
start_period: 300s
|
|
|
|
thingsboard-init:
|
|
image: thingsboard/tb-node:4.3.1.1
|
|
restart: on-failure
|
|
# The image runs as the non-root "thingsboard" user, which cannot write
|
|
# the install marker to the freshly created (root-owned) /data volume.
|
|
user: root
|
|
depends_on:
|
|
thingsboard-db:
|
|
condition: service_healthy
|
|
command:
|
|
- bash
|
|
- -c
|
|
- |
|
|
set -e
|
|
if [ -f /data/.thingsboard-installed ]; then
|
|
echo "ThingsBoard database already initialized."
|
|
exit 0
|
|
fi
|
|
INSTALL_TB=true LOAD_DEMO=$${LOAD_DEMO:-false} start-tb-node.sh
|
|
touch /data/.thingsboard-installed
|
|
environment:
|
|
TB_SERVICE_ID: tb-ce-node
|
|
TB_QUEUE_TYPE: in-memory
|
|
JAVA_OPTS: ${JAVA_OPTS}
|
|
LOAD_DEMO: ${LOAD_DEMO}
|
|
SPRING_DATASOURCE_URL: jdbc:postgresql://thingsboard-db:5432/${POSTGRES_DB}
|
|
SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER}
|
|
SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD}
|
|
volumes:
|
|
- thingsboard-install:/data
|
|
- thingsboard-logs:/var/log/thingsboard
|
|
|
|
thingsboard-db:
|
|
image: postgres:18
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_DB: ${POSTGRES_DB}
|
|
POSTGRES_USER: ${POSTGRES_USER}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
volumes:
|
|
- thingsboard-db:/var/lib/postgresql
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
start_period: 10s
|
|
|
|
volumes:
|
|
thingsboard-db:
|
|
thingsboard-install:
|
|
thingsboard-logs:
|