init-admin.sh 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #!/bin/sh
  2. # VidReview Init Script
  3. # - FRESH: runs DB migrations, creates admin + locks registration + saves credentials
  4. # - UPDATE: skips, leaves DB and data intact
  5. DB_HOST="${DB_HOST:-vidreview-db}"
  6. DB_CONTAINER="${DB_CONTAINER:-$DB_HOST}"
  7. DB_NAME="${DB_NAME:-vidreview}"
  8. DB_USER="${DB_USER:-vidreview}"
  9. OUTPUT_DIR="${OUTPUT_DIR:-/seed-output}"
  10. ADMIN_EMAIL="${ADMIN_EMAIL:-admin@vidreview.local}"
  11. ADMIN_NAME="${ADMIN_NAME:-Admin}"
  12. API_CONTAINER="${API_CONTAINER:-vidreview-api}"
  13. run_psql() {
  14. docker exec "$DB_CONTAINER" psql -U "$DB_USER" -d "$DB_NAME" "$@" 2>&1
  15. }
  16. run_node() {
  17. docker exec "$API_CONTAINER" node "$@" 2>&1
  18. }
  19. run_api() {
  20. docker exec "$API_CONTAINER" "$@" 2>&1
  21. }
  22. mkdir -p "$OUTPUT_DIR"
  23. echo "============================================================"
  24. echo " VidReview Init Script"
  25. echo "============================================================"
  26. echo ""
  27. echo " Checking database state..."
  28. # Run Prisma migrations first (creates tables on fresh DB)
  29. echo " Running DB migrations..."
  30. # db push creates/updates tables without needing a migrations directory
  31. run_api npx prisma db push --accept-data-loss
  32. MIGRATE_EXIT=$?
  33. if [ "$MIGRATE_EXIT" -ne 0 ]; then
  34. echo " ERROR: db push failed (exit $MIGRATE_EXIT). Output above."
  35. exit 1
  36. fi
  37. echo " DB schema synced."
  38. # Check if admin already exists
  39. ADMIN_COUNT_RAW=$(run_psql -t -c "SELECT COUNT(*) FROM \"User\" WHERE \"globalRole\"='ADMIN';" 2>&1)
  40. ADMIN_COUNT=$(echo "$ADMIN_COUNT_RAW" | tr -d '[:space:]' | grep -E '^[0-9]+$' || echo "")
  41. if [ -z "$ADMIN_COUNT" ]; then
  42. echo " ERROR: Could not read DB count."
  43. echo " Output was: $ADMIN_COUNT_RAW"
  44. exit 1
  45. fi
  46. echo " Admin users in DB: $ADMIN_COUNT"
  47. if [ "$ADMIN_COUNT" -gt 0 ]; then
  48. echo ""
  49. echo " UPDATE DEPLOY: skipping admin creation."
  50. echo " DB already has an admin account."
  51. echo ""
  52. exit 0
  53. fi
  54. # FRESH DEPLOY
  55. echo ""
  56. echo " FRESH DEPLOY: setting up initial account"
  57. RANDOM_PASS="$(head -c 32 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9!@#$%' | head -c 24)"
  58. echo " Password generated."
  59. PASS_HASH=$(run_node -e "require('bcryptjs').hash('$RANDOM_PASS',10).then(h=>process.stdout.write(h)).catch(e=>{console.error(e);process.exit(1)})")
  60. if [ -z "$PASS_HASH" ]; then
  61. echo " ERROR: Could not generate bcrypt hash."
  62. exit 1
  63. fi
  64. echo " Hash generated."
  65. echo " Locking user registration..."
  66. run_psql -c "INSERT INTO \"SiteSetting\" (id,name,value) VALUES (gen_random_uuid()::text, E'registration_enabled', E'false') ON CONFLICT (name) DO UPDATE SET value=E'false';"
  67. echo " Creating admin account..."
  68. run_psql -c "INSERT INTO \"User\" (id,email,name,password,\"globalRole\",active,\"storageQuota\",\"storageUsed\",\"createdAt\",\"updatedAt\") VALUES (gen_random_uuid()::text, E'$ADMIN_EMAIL', E'$ADMIN_NAME', E'$PASS_HASH', E'ADMIN', true, 524288000, 0, NOW(), NOW());"
  69. CREDENTIALS_FILE="$OUTPUT_DIR/admin-credentials.txt"
  70. TIMESTAMP=$(date -u '+%Y-%m-%d %H:%M:%S UTC')
  71. cat > "$CREDENTIALS_FILE" << 'HEREDOC'
  72. VidReview Admin Account - FRESH DEPLOY
  73. Generated: TIMESTAMP_PLACEHOLDER
  74. ========================================================
  75. Email: EMAIL_PLACEHOLDER
  76. Password: PASS_PLACEHOLDER
  77. Role: ADMIN (full system access)
  78. Save this file securely. This is the only time
  79. the password is shown.
  80. ========================================================
  81. HEREDOC
  82. sed -i "s/TIMESTAMP_PLACEHOLDER/$TIMESTAMP/" "$CREDENTIALS_FILE"
  83. sed -i "s/EMAIL_PLACEHOLDER/$ADMIN_EMAIL/" "$CREDENTIALS_FILE"
  84. sed -i "s/PASS_PLACEHOLDER/$RANDOM_PASS/" "$CREDENTIALS_FILE"
  85. echo ""
  86. echo "============================================================"
  87. echo " Admin account created"
  88. echo "============================================================"
  89. echo ""
  90. echo " Email: $ADMIN_EMAIL"
  91. echo " Password: $RANDOM_PASS"
  92. echo ""
  93. echo " Credentials saved to: $CREDENTIALS_FILE"
  94. echo ""