init-admin.sh 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #!/bin/sh
  2. # VidReview Init Script
  3. # - FRESH: creates admin + locks registration + saves credentials
  4. # - UPDATE: skips, leaves DB 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. mkdir -p "$OUTPUT_DIR"
  19. echo "============================================================"
  20. echo " VidReview Init Script"
  21. echo "============================================================"
  22. # Check if admin already exists
  23. echo ""
  24. echo " Checking database..."
  25. COUNT_RAW=$(docker exec "$DB_HOST" psql -U "$DB_USER" -d "$DB_NAME" \
  26. -t -c "SELECT COUNT(*) FROM \"User\" WHERE \"globalRole\"='ADMIN';" 2>&1)
  27. echo " [debug] raw count: $COUNT_RAW"
  28. ADMIN_COUNT=$(echo "$COUNT_RAW" | tr -d '[:space:]' | grep -E '^[0-9]+$' || echo "")
  29. if [ -z "$ADMIN_COUNT" ]; then
  30. echo " ERROR: Could not read DB count."
  31. echo " Output was: $COUNT_RAW"
  32. exit 1
  33. fi
  34. echo " Admin users in DB: $ADMIN_COUNT"
  35. if [ "$ADMIN_COUNT" -gt 0 ]; then
  36. echo ""
  37. echo " UPDATE DEPLOY: skipping admin creation."
  38. echo " DB already has an admin account."
  39. echo ""
  40. exit 0
  41. fi
  42. # FRESH DEPLOY
  43. echo ""
  44. echo " FRESH DEPLOY: setting up initial account"
  45. RANDOM_PASS="vid-$(date +%s)-$(head -c 10 /dev/urandom | tr -dc 'a-z0-9')"
  46. echo " Password generated."
  47. 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)})")
  48. if [ -z "$PASS_HASH" ]; then
  49. echo " ERROR: Could not generate bcrypt hash."
  50. exit 1
  51. fi
  52. echo " Hash generated."
  53. echo " Locking user registration..."
  54. 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';"
  55. echo " Creating admin account..."
  56. 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());"
  57. CREDENTIALS_FILE="$OUTPUT_DIR/admin-credentials.txt"
  58. TIMESTAMP=$(date -u '+%Y-%m-%d %H:%M:%S UTC')
  59. cat > "$CREDENTIALS_FILE" << 'HEREDOC'
  60. VidReview Admin Account - FRESH DEPLOY
  61. Generated: TIMESTAMP_PLACEHOLDER
  62. ========================================================
  63. Email: EMAIL_PLACEHOLDER
  64. Password: PASS_PLACEHOLDER
  65. Role: ADMIN (full system access)
  66. Save this file securely. This is the only time
  67. the password is shown.
  68. ========================================================
  69. HEREDOC
  70. sed -i "s/TIMESTAMP_PLACEHOLDER/$TIMESTAMP/" "$CREDENTIALS_FILE"
  71. sed -i "s/EMAIL_PLACEHOLDER/$ADMIN_EMAIL/" "$CREDENTIALS_FILE"
  72. sed -i "s/PASS_PLACEHOLDER/$RANDOM_PASS/" "$CREDENTIALS_FILE"
  73. echo ""
  74. echo "============================================================"
  75. echo " Admin account created"
  76. echo "============================================================"
  77. echo ""
  78. echo " Email: $ADMIN_EMAIL"
  79. echo " Password: $RANDOM_PASS"
  80. echo ""
  81. echo " Credentials saved to: $CREDENTIALS_FILE"
  82. echo ""