setup 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. shopt -s nullglob
  4. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  5. PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
  6. ENV_FILE="$PROJECT_ROOT/.env"
  7. MIGRATIONS_DIR="$PROJECT_ROOT/migrations"
  8. # Carrega as variáveis de ambiente do arquivo .env se ele existir
  9. if [[ -f "$ENV_FILE" ]]; then
  10. set -a
  11. # shellcheck disable=SC1090
  12. source "$ENV_FILE"
  13. set +a
  14. fi
  15. # Fallbacks caso não estejam definidas no .env
  16. DB_HOST="${DB_HOST:-127.0.0.1}"
  17. DB_PORT="${DB_PORT:-5432}"
  18. DB_NAME="${DB_NAME:-}"
  19. DB_USER="${DB_USER:-}"
  20. DB_PASSWORD="${DB_PASSWORD:-${DB_PASS:-}}"
  21. # Validações básicas
  22. if [[ -z "$DB_NAME" ]]; then
  23. echo "Erro: DB_NAME não está configurado no .env."
  24. exit 1
  25. fi
  26. if [[ -z "$DB_USER" ]]; then
  27. echo "Erro: DB_USER não está configurado no .env."
  28. exit 1
  29. fi
  30. # Exporta a senha temporariamente para o psql não pedir interativamente
  31. export PGPASSWORD="$DB_PASSWORD"
  32. MIGRATION_FILES=("$MIGRATIONS_DIR"/*.sql)
  33. if [[ ${#MIGRATION_FILES[@]} -eq 0 ]]; then
  34. echo "Erro: nenhuma migration .sql encontrada em $MIGRATIONS_DIR."
  35. exit 1
  36. fi
  37. echo "Verificando se o banco '$DB_NAME' existe..."
  38. DB_EXISTS="$(psql "host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=postgres" -tAc "SELECT 1 FROM pg_database WHERE datname = '$DB_NAME'")"
  39. if [[ "$DB_EXISTS" != "1" ]]; then
  40. echo "Banco '$DB_NAME' não existe. Criando..."
  41. psql "host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=postgres" -v ON_ERROR_STOP=1 -c "CREATE DATABASE \"$DB_NAME\" OWNER \"$DB_USER\""
  42. else
  43. echo "Banco '$DB_NAME' já existe. Preservando dados existentes."
  44. fi
  45. echo "Garantindo tabela de controle de migrações..."
  46. psql "host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME" -v ON_ERROR_STOP=1 <<SQL
  47. CREATE TABLE IF NOT EXISTS schema_migrations (
  48. migration_name TEXT PRIMARY KEY,
  49. applied_at TIMESTAMP NOT NULL DEFAULT NOW()
  50. );
  51. INSERT INTO schema_migrations (migration_name)
  52. SELECT 'migrations_v1.sql'
  53. WHERE EXISTS (
  54. SELECT 1
  55. FROM information_schema.tables
  56. WHERE table_schema = 'public'
  57. AND table_name = 'company'
  58. )
  59. AND EXISTS (
  60. SELECT 1
  61. FROM information_schema.tables
  62. WHERE table_schema = 'public'
  63. AND table_name = 'integration'
  64. )
  65. AND NOT EXISTS (
  66. SELECT 1
  67. FROM schema_migrations
  68. WHERE migration_name = 'migrations_v1.sql'
  69. );
  70. SQL
  71. for migration_file in "${MIGRATION_FILES[@]}"; do
  72. migration_name="$(basename "$migration_file")"
  73. already_applied="$(psql "host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME" -tAc "SELECT 1 FROM schema_migrations WHERE migration_name = '$migration_name'")"
  74. if [[ "$already_applied" == "1" ]]; then
  75. echo "Pulando $migration_name (já aplicada)."
  76. continue
  77. fi
  78. echo "Aplicando migração: $migration_name..."
  79. psql "host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME" -v ON_ERROR_STOP=1 -f "$migration_file"
  80. psql "host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME" -v ON_ERROR_STOP=1 -c "INSERT INTO schema_migrations (migration_name) VALUES ('$migration_name')"
  81. done
  82. echo "--------------------------------------------------------"
  83. echo "Banco de dados '$DB_NAME' preservado e migrações aplicadas com sucesso!"
  84. echo "--------------------------------------------------------"