Files
CapaKraken/tooling/docker/app-dev-start.sh
T
Hartmut 3e2b242151
CI / Architecture Guardrails (push) Successful in 2m40s
CI / Lint (push) Successful in 3m17s
CI / Typecheck (push) Successful in 3m27s
CI / Unit Tests (push) Successful in 6m41s
CI / Build (push) Successful in 6m5s
CI / E2E Tests (push) Failing after 4m21s
CI / Fresh-Linux Docker Deploy (push) Failing after 5m43s
CI / Release Images (push) Has been skipped
CI / Assistant Split Regression (push) Successful in 5m11s
ci: fix fresh-DB bootstrap for e2e and docker-deploy
- e2e: use prisma db push --force-reset so the job starts from a
  guaranteed clean schema (previous runs hit missing audit_logs
  even though push reported in-sync; suspected stale service volume).
- docker-deploy: run prisma db push before db:migrate:deploy in
  app-dev-start.sh. The migrations/*.sql files are idempotent
  supplements (IF NOT EXISTS guards) that assume base tables already
  exist; a fresh container has no tables, so the first incremental
  migration's FK on "users" fails. db push creates the baseline,
  migrate deploy then layers on the incremental additions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-12 22:22:35 +02:00

62 lines
2.5 KiB
Bash

#!/bin/sh
set -eu
# Wait for postgres to be ready before running migrations
echo "Waiting for postgres..."
until pg_isready -h "${POSTGRES_HOST:-postgres}" -p "${POSTGRES_PORT:-5432}" -q; do
sleep 1
done
echo "Postgres is ready."
# The bind mount (.:/app) provides workspace-level node_modules symlinks from
# the *host*, but those symlinks target the root node_modules/.pnpm store.
# Inside the container, /app/node_modules is a named volume whose pnpm
# content-addressable hashes may differ from the host's. Re-running install
# regenerates the workspace symlinks so they resolve against the container's
# pnpm store. --frozen-lockfile ensures no lock changes; --prefer-offline
# avoids network round-trips when packages are already cached in the volume.
# CI=true suppresses interactive prompts (e.g. "reinstall from scratch?")
CI=true pnpm install --frozen-lockfile
# Regenerate Prisma client (needed after bind-mount overlays the image layer)
pnpm --filter @capakraken/db db:generate
# Sync full schema to the DB first. The files under prisma/migrations/ are
# idempotent SUPPLEMENTS (see "IF NOT EXISTS" guards in each migration.sql);
# they assume the base tables already exist from a prior `db push`. On a
# fresh DB, migrate deploy alone would fail because the first incremental
# migration references "users" before it exists.
pnpm --filter @capakraken/db exec prisma db push --schema ./prisma/schema.prisma --accept-data-loss --skip-generate
# Run pending migrations so a fresh checkout picks up incremental additions
pnpm --filter @capakraken/db db:migrate:deploy
pnpm check:exports
pnpm check:imports
repo_home="/tmp/capakraken-dev-home"
# Cross-platform stat: GNU stat uses -c, BSD/macOS stat uses -f
if stat -c '%u' /app >/dev/null 2>&1; then
repo_uid="$(stat -c '%u' /app)"
repo_gid="$(stat -c '%g' /app)"
else
repo_uid="$(stat -f '%u' /app)"
repo_gid="$(stat -f '%g' /app)"
fi
mkdir -p /app/apps/web/.next
mkdir -p "$repo_home/.config/pnpm"
chown -R "$repo_uid:$repo_gid" /app/apps/web/.next
chown -R "$repo_uid:$repo_gid" "$repo_home"
# Cross-platform privilege drop: setpriv (Linux) or su (macOS/BSD)
if command -v setpriv >/dev/null 2>&1; then
exec setpriv --reuid="$repo_uid" --regid="$repo_gid" --clear-groups \
env HOME="$repo_home" XDG_CONFIG_HOME="$repo_home/.config" \
pnpm --filter @capakraken/web exec next dev -H 0.0.0.0 -p 3100
else
exec su -s /bin/sh "#${repo_uid}" -c \
"HOME='$repo_home' XDG_CONFIG_HOME='$repo_home/.config' pnpm --filter @capakraken/web exec next dev -H 0.0.0.0 -p 3100"
fi