From cb02b494f468ca8671a013eb27162b68da773c95 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Wed, 17 Dec 2025 13:15:40 +0100 Subject: [PATCH] Update environment configuration for PostgreSQL: Add new environment variables for NextAuth and PostgreSQL settings in .env file, update docker-compose.yml to utilize these variables, and enhance README documentation for environment setup. Ensure DATABASE_URL is constructed dynamically if not defined. --- .env | 30 +++++++++++++++++++++++++----- .env.example | 19 +++++++++++++++++++ .gitignore | 1 + README.docker.md | 23 +++++++++++++++++++++-- docker-compose.yml | 3 +++ lib/prisma.ts | 25 ++++++++++++++++++++++++- prisma/seed.ts | 29 ++++++++++++++++++++++++++++- 7 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 .env.example diff --git a/.env b/.env index 6491611..fbb4685 100644 --- a/.env +++ b/.env @@ -5,8 +5,28 @@ # Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. # See the documentation for all the connection string options: https://pris.ly/d/connection-strings -DATABASE_URL="file:./data/dev.db" -AUTH_SECRET="your-secret-key-change-this-in-production" -AUTH_URL="http://localhost:3000" -PRISMA_DATA_PATH="/Users/julien.froidefond/Sites/DAIS/public/got-gaming/data" -UPLOADS_PATH="/Users/julien.froidefond/Sites/DAIS/public/got-gaming/public/uploads" \ No newline at end of file +# DATABASE_URL="file:./data/dev.db" +# AUTH_SECRET="your-secret-key-change-this-in-production" +# AUTH_URL="http://localhost:3000" +# PRISMA_DATA_PATH="/Users/julien.froidefond/Sites/DAIS/public/got-gaming/data" +# UPLOADS_PATH="/Users/julien.froidefond/Sites/DAIS/public/got-gaming/public/uploads" + +# NextAuth Configuration +NEXTAUTH_SECRET=change-this-secret-in-production +NEXTAUTH_URL=http://localhost:3000 + +# PostgreSQL Configuration +POSTGRES_USER=gotgaming +POSTGRES_PASSWORD=change-this-in-production +POSTGRES_DB=gotgaming +POSTGRES_HOST=localhost +POSTGRES_PORT=5433 + +# Database URL (construite automatiquement si non définie) +# Si vous définissez cette variable, elle sera utilisée telle quelle +# Sinon, elle sera construite à partir des variables POSTGRES_* ci-dessus +# DATABASE_URL=postgresql://gotgaming:change-this-in-production@got-postgres:5432/gotgaming?schema=public + +# Docker Volumes (optionnel) +POSTGRES_DATA_PATH=./data/postgres +UPLOADS_PATH=./public/uploads diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..a8d4b21 --- /dev/null +++ b/.env.example @@ -0,0 +1,19 @@ +# NextAuth Configuration +NEXTAUTH_SECRET=change-this-secret-in-production +NEXTAUTH_URL=http://localhost:3000 + +# PostgreSQL Configuration +POSTGRES_USER=gotgaming +POSTGRES_PASSWORD=change-this-in-production +POSTGRES_DB=gotgaming +POSTGRES_HOST=got-postgres +POSTGRES_PORT=5432 + +# Database URL (construite automatiquement si non définie) +# Si vous définissez cette variable, elle sera utilisée telle quelle +# Sinon, elle sera construite à partir des variables POSTGRES_* ci-dessus +# DATABASE_URL=postgresql://gotgaming:change-this-in-production@got-postgres:5432/gotgaming?schema=public + +# Docker Volumes (optionnel) +POSTGRES_DATA_PATH=./data/postgres +UPLOADS_PATH=./public/uploads diff --git a/.gitignore b/.gitignore index e0c4486..d1101a2 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ yarn-debug.log* yarn-error.log* # local env files +.env .env*.local # vercel diff --git a/README.docker.md b/README.docker.md index b12017e..e219daf 100644 --- a/README.docker.md +++ b/README.docker.md @@ -24,17 +24,36 @@ docker-compose logs -f ## Variables d'environnement -Créez un fichier `.env` à la racine du projet avec les variables suivantes : +Créez un fichier `.env` à la racine du projet à partir du template `.env.example` : + +```bash +cp .env.example .env +``` + +Puis modifiez les valeurs dans `.env` selon votre configuration : ```env +# NextAuth Configuration NEXTAUTH_SECRET=your-secret-key-here NEXTAUTH_URL=http://localhost:3000 + +# PostgreSQL Configuration POSTGRES_USER=gotgaming POSTGRES_PASSWORD=change-this-in-production POSTGRES_DB=gotgaming -DATABASE_URL=postgresql://gotgaming:change-this-in-production@got-postgres:5432/gotgaming?schema=public + +# Database URL (optionnel - construite automatiquement si non définie) +# DATABASE_URL=postgresql://gotgaming:change-this-in-production@got-postgres:5432/gotgaming?schema=public + +# Docker Volumes (optionnel) +POSTGRES_DATA_PATH=./data/postgres +UPLOADS_PATH=./public/uploads ``` +**Important** : +- Le fichier `.env` est ignoré par Git (ne pas commiter vos secrets) +- Si vous changez `POSTGRES_PASSWORD` après la première initialisation, vous devrez soit réinitialiser la base, soit changer le mot de passe manuellement dans PostgreSQL + ## Volumes persistants ### Base de données PostgreSQL diff --git a/docker-compose.yml b/docker-compose.yml index 5e389e2..cd3f65e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,6 +35,9 @@ services: - "3040:3000" environment: - NODE_ENV=production + - POSTGRES_USER=${POSTGRES_USER:-gotgaming} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-change-this-in-production} + - POSTGRES_DB=${POSTGRES_DB:-gotgaming} - DATABASE_URL=postgresql://${POSTGRES_USER:-gotgaming}:${POSTGRES_PASSWORD:-change-this-in-production}@got-postgres:5432/${POSTGRES_DB:-gotgaming}?schema=public - NEXTAUTH_URL=${NEXTAUTH_URL:-http://localhost:3000} - NEXTAUTH_SECRET=${NEXTAUTH_SECRET:-change-this-secret-in-production} diff --git a/lib/prisma.ts b/lib/prisma.ts index 94bf7d8..ce54d63 100644 --- a/lib/prisma.ts +++ b/lib/prisma.ts @@ -2,8 +2,31 @@ import { PrismaClient } from "@/prisma/generated/prisma/client"; import { PrismaPg } from "@prisma/adapter-pg"; import { Pool } from "pg"; +// Construire DATABASE_URL si elle n'est pas définie, en utilisant les variables individuelles +let databaseUrl = process.env.DATABASE_URL; + +if (!databaseUrl) { + const user = process.env.POSTGRES_USER || "gotgaming"; + const password = process.env.POSTGRES_PASSWORD || "change-this-in-production"; + const host = process.env.POSTGRES_HOST || "got-postgres"; + const port = process.env.POSTGRES_PORT || "5432"; + const db = process.env.POSTGRES_DB || "gotgaming"; + + // Encoder le mot de passe pour l'URL + const encodedPassword = encodeURIComponent(password); + databaseUrl = `postgresql://${user}:${encodedPassword}@${host}:${port}/${db}?schema=public`; +} + +if (typeof databaseUrl !== "string") { + throw new Error("DATABASE_URL must be a string"); +} + +// Logger l'URL de connexion (masquer le mot de passe pour la sécurité) +const logUrl = databaseUrl.replace(/:\/\/[^:]+:[^@]+@/, "://***:***@"); +console.log(`[Prisma] Connecting to PostgreSQL: ${logUrl}`); + const pool = new Pool({ - connectionString: process.env.DATABASE_URL, + connectionString: databaseUrl, }); const adapter = new PrismaPg(pool); diff --git a/prisma/seed.ts b/prisma/seed.ts index e9421f7..963b0a6 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -7,8 +7,35 @@ import { PrismaPg } from "@prisma/adapter-pg"; import { Pool } from "pg"; import bcrypt from "bcryptjs"; +// Construire DATABASE_URL si elle n'est pas définie (même logique que lib/prisma.ts) +let databaseUrl = process.env.DATABASE_URL; + +if (!databaseUrl) { + const user = process.env.POSTGRES_USER || "gotgaming"; + const password = process.env.POSTGRES_PASSWORD || "change-this-in-production"; + // Si on est dans Docker, utiliser le nom du service, sinon localhost avec le port externe + const host = + process.env.POSTGRES_HOST || + (process.env.DOCKER_ENV ? "got-postgres" : "localhost"); + const port = + process.env.POSTGRES_PORT || (process.env.DOCKER_ENV ? "5432" : "5433"); + const db = process.env.POSTGRES_DB || "gotgaming"; + + // Encoder le mot de passe pour l'URL + const encodedPassword = encodeURIComponent(password); + databaseUrl = `postgresql://${user}:${encodedPassword}@${host}:${port}/${db}?schema=public`; +} + +if (typeof databaseUrl !== "string") { + throw new Error("DATABASE_URL must be a string"); +} + +// Logger l'URL de connexion (masquer le mot de passe pour la sécurité) +const logUrl = databaseUrl.replace(/:\/\/[^:]+:[^@]+@/, "://***:***@"); +console.log(`[Seed] Connecting to PostgreSQL: ${logUrl}`); + const pool = new Pool({ - connectionString: process.env.DATABASE_URL, + connectionString: databaseUrl, }); const adapter = new PrismaPg(pool);