#!/bin/sh set -eu postgres_pid='' web_pid='' worker_pid='' stop_services() { [ -z "$web_pid" ] || kill -TERM "$web_pid" 2>/dev/null || true [ -z "$worker_pid" ] || kill -TERM "$worker_pid" 2>/dev/null || true [ -z "$postgres_pid" ] || kill -TERM "$postgres_pid" 2>/dev/null || true wait || true } trap stop_services INT TERM EXIT : "${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}" : "${SESSION_SECRET:?SESSION_SECRET is required}" : "${INTEGRATION_ENCRYPTION_KEY:?INTEGRATION_ENCRYPTION_KEY is required}" : "${BOOTSTRAP_TOKEN:?BOOTSTRAP_TOKEN is required}" export POSTGRES_DB="${POSTGRES_DB:-devrunbook}" export POSTGRES_USER="${POSTGRES_USER:-devrunbook}" export DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@127.0.0.1:5432/${POSTGRES_DB}" export CONTENT_ROOT="${CONTENT_ROOT:-/content}" export ARTIFACT_ROOT="${ARTIFACT_ROOT:-/config/artifacts}" export INTEGRATION_ENCRYPTION_KEY_VERSION="${INTEGRATION_ENCRYPTION_KEY_VERSION:-v1}" if [ -z "${INTEGRATION_ENCRYPTION_OLD_KEYS:-}" ]; then export INTEGRATION_ENCRYPTION_OLD_KEYS='{}' fi mkdir -p "$PGDATA" "$ARTIFACT_ROOT" /config/operator-content chown -R postgres:postgres "$PGDATA" chown -R node:node "$ARTIFACT_ROOT" /config/operator-content chmod 0700 "$PGDATA" docker-entrypoint.sh postgres & postgres_pid=$! attempt=0 until pg_isready -h 127.0.0.1 -U "$POSTGRES_USER" -d "$POSTGRES_DB" >/dev/null 2>&1; do attempt=$((attempt + 1)) if [ "$attempt" -ge 60 ]; then echo "PostgreSQL did not become ready" >&2 exit 1 fi sleep 1 done gosu node ./packages/db/node_modules/.bin/tsx packages/db/src/migrate.ts gosu node node apps/web/.next/standalone/apps/web/server.js & web_pid=$! gosu node node apps/worker/dist/index.js & worker_pid=$! while kill -0 "$postgres_pid" 2>/dev/null \ && kill -0 "$web_pid" 2>/dev/null \ && kill -0 "$worker_pid" 2>/dev/null; do sleep 2 done echo "A required DevRunbook process stopped unexpectedly" >&2 exit 1