feat(docker): bundle PostgreSQL into the unified container

Transition from a multi-service architecture to an all-in-one container
by bundling PostgreSQL directly within the Docker image. This simplifies
deployment, especially for environments like CasaOS, by removing the
need for an external database service.

- Update Dockerfile to install and configure PostgreSQL
- Implement database initialization logic in docker-entrypoint.sh
- Update .env.example to reflect auto-generation of credentials
- Simplify docker-compose.yml to a single service
- Update README.md with new deployment instructions and architecture details
This commit is contained in:
Tomas Dvorak
2026-05-21 13:21:19 +02:00
parent 67dc5cc737
commit 5da6360ed9
5 changed files with 153 additions and 146 deletions
+73 -11
View File
@@ -1,24 +1,86 @@
#!/bin/sh
# Unified entrypoint for Trackeep
# Starts both backend and nginx in one container
# All-in-one entrypoint for Trackeep
# Initializes and starts PostgreSQL, then backend + nginx
set -e
# Backend configuration
PGDATA=${PGDATA:-/var/lib/postgresql/data}
# Auto-generate DB_PASSWORD if not provided
if [ -z "$DB_PASSWORD" ]; then
DB_PASSWORD=$(tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c 32)
echo "========================================"
echo "WARNING: DB_PASSWORD was not set."
echo "Auto-generated password: $DB_PASSWORD"
echo "Set DB_PASSWORD explicitly to keep it stable across restarts."
echo "========================================"
fi
DB_USER=${DB_USER:-trackeep}
DB_NAME=${DB_NAME:-trackeep}
# Initialize PostgreSQL if data directory is empty
if [ ! -f "$PGDATA/PG_VERSION" ]; then
echo "Initializing PostgreSQL database cluster..."
su -s /bin/sh postgres -c "initdb -D $PGDATA --auth-local=trust --auth-host=md5"
# Allow local TCP connections
echo "host all all 127.0.0.1/32 md5" >> "$PGDATA/pg_hba.conf"
echo "host all all ::1/128 md5" >> "$PGDATA/pg_hba.conf"
# Start postgres temporarily to create user and database
su -s /bin/sh postgres -c "pg_ctl -D $PGDATA -l /var/log/postgresql/server.log start"
# Wait until postgres accepts connections
echo "Waiting for PostgreSQL to accept connections..."
for i in $(seq 1 30); do
if su -s /bin/sh postgres -c "pg_isready -q"; then
break
fi
sleep 1
done
# Create role and database
su -s /bin/sh postgres -c "psql -c \"CREATE USER \\\"$DB_USER\\\" WITH PASSWORD '$DB_PASSWORD';\""
su -s /bin/sh postgres -c "psql -c \"CREATE DATABASE \\\"$DB_NAME\\\" OWNER \\\"$DB_USER\\\";\""
su -s /bin/sh postgres -c "pg_ctl -D $PGDATA stop"
echo "PostgreSQL initialized."
fi
# Start PostgreSQL
echo "Starting PostgreSQL..."
su -s /bin/sh postgres -c "pg_ctl -D $PGDATA -l /var/log/postgresql/server.log start"
# Wait for PostgreSQL to be ready
echo "Waiting for PostgreSQL to be ready..."
for i in $(seq 1 30); do
if su -s /bin/sh postgres -c "pg_isready -q"; then
echo "PostgreSQL is ready."
break
fi
echo "Waiting for PostgreSQL... ($i/30)"
sleep 1
done
# Backend connects to the bundled local PostgreSQL
export BACKEND_PORT=8081
export DB_HOST=${DB_HOST:-postgres}
export DB_PORT=${DB_PORT:-5432}
export DB_NAME=${DB_NAME:-trackeep}
export DB_USER=${DB_USER:-trackeep}
export DB_PASSWORD=${DB_PASSWORD}
export JWT_SECRET=${JWT_SECRET}
export DB_HOST=localhost
export DB_PORT=5432
export DB_NAME="$DB_NAME"
export DB_USER="$DB_USER"
export DB_PASSWORD="$DB_PASSWORD"
export DB_SSL_MODE=disable
export JWT_SECRET=${JWT_SECRET:-}
export GIN_MODE=${GIN_MODE:-release}
export CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS:-*}
# Start backend in background
cd /app
echo "Starting Trackeep backend on port ${BACKEND_PORT}..."
./main &
BACKEND_PID=$!
# Wait for backend to be ready
echo "Waiting for backend to be ready..."
@@ -31,6 +93,6 @@ for i in $(seq 1 30); do
sleep 2
done
# Start nginx
echo "Starting nginx..."
# Start nginx in foreground (keeps container alive)
echo "Starting nginx on port 8080..."
nginx -g "daemon off;"