init-admin.sh 3.7 KB

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