init-db.sh 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/bin/bash
  2. set -e
  3. trap 'echo "An error occurred. Exiting..."; exit 1' ERR
  4. cmd="$@"
  5. # Construct DATABASE_URL from environment variables if not already set
  6. if [ -z "$DATABASE_URL" ]; then
  7. export DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
  8. fi
  9. # The cloud deploys follow "PostgreSQL is ready!" and "Migrations applied
  10. # successfully!" in this log to tell a failed migration from a failed start
  11. # (.github/scripts/wait-healthy.sh).
  12. echo "Waiting for PostgreSQL to be ready..."
  13. until pg_isready -d "$DATABASE_URL" -q; do
  14. echo "PostgreSQL is unavailable - sleeping 2s..."
  15. sleep 2
  16. done
  17. echo "PostgreSQL is ready!"
  18. # The Prisma CLI, the schema and the migrations live in their own folder so
  19. # the CLI's dependencies stay out of the server's node_modules (see Dockerfile).
  20. app_dir="$PWD"
  21. cd "$app_dir/tools"
  22. echo "Applying database migrations..."
  23. if ! npx prisma migrate deploy 2>/dev/null; then
  24. # P3005: existing DB without migration history (from db push).
  25. # Create empty migration table so migrate deploy can run.
  26. # 0_init is fully idempotent — safe on any DB state.
  27. echo "Existing database detected. Creating migration table..."
  28. npx prisma db execute --stdin <<< 'CREATE TABLE IF NOT EXISTS "_prisma_migrations" ("id" VARCHAR(36) PRIMARY KEY NOT NULL, "checksum" VARCHAR(64) NOT NULL, "finished_at" TIMESTAMPTZ, "migration_name" VARCHAR(255) NOT NULL, "logs" TEXT, "rolled_back_at" TIMESTAMPTZ, "started_at" TIMESTAMPTZ NOT NULL DEFAULT now(), "applied_steps_count" INTEGER NOT NULL DEFAULT 0)'
  29. npx prisma migrate deploy
  30. fi
  31. echo "Migrations applied successfully!"
  32. cd "$app_dir"
  33. # Photo embedding is the one thing here that depends on a native module, and
  34. # sharp's prebuilt binaries need an x86-64-v2 CPU. Some virtualised hosts do not
  35. # advertise one — Proxmox's default kvm64 processor model, for instance, reports
  36. # a baseline x86-64 even on modern hardware. Report it at boot rather than
  37. # leaving it to be found when a certificate comes out without its photos.
  38. # Never fatal: everything else in the app works without it.
  39. if ! sharp_error=$(node -e "require('sharp')" 2>&1); then
  40. echo "WARNING: sharp could not be loaded. Inspection certificates will render without photos."
  41. echo "$sharp_error" | sed 's/^/ /'
  42. fi
  43. echo "Starting application..."
  44. exec $cmd