fix: parsing url cassé par le mdp postgres

This commit is contained in:
Nathan FONTEYNE 2026-07-08 13:51:11 +02:00
parent f9198bcc3e
commit d159a4ef23
4 changed files with 26 additions and 9 deletions

View file

@ -1,9 +1,15 @@
NODE_ENV=production NODE_ENV=production
PORT=3000 PORT=3000
# Postgres # Postgres — the app connects with these discrete fields (not a DATABASE_URL),
DATABASE_URL=postgres://octane:changeme@postgres:5432/octane # so POSTGRES_PASSWORD can safely contain any character without needing
# URL-encoding. Only POSTGRES_PASSWORD needs to be set; the rest already
# match the "postgres" service in docker-compose.yml.
POSTGRES_PASSWORD=changeme POSTGRES_PASSWORD=changeme
# PGHOST=postgres
# PGPORT=5432
# PGDATABASE=octane
# PGUSER=octane
# Sessions # Sessions
SESSION_SECRET=change-me-to-a-long-random-string SESSION_SECRET=change-me-to-a-long-random-string

View file

@ -17,7 +17,6 @@ cp .env.example .env
Éditer `.env` (au minimum) : Éditer `.env` (au minimum) :
``` ```
DATABASE_URL=postgres://octane:changeme@postgres:5432/octane
POSTGRES_PASSWORD=changeme POSTGRES_PASSWORD=changeme
SESSION_SECRET=une-longue-chaine-aleatoire SESSION_SECRET=une-longue-chaine-aleatoire
@ -31,6 +30,8 @@ TRAEFIK_NETWORK_NAME=traefik-proxy
APP_DOMAIN=octane.dandrove.com APP_DOMAIN=octane.dandrove.com
``` ```
`POSTGRES_PASSWORD` est la seule variable Postgres à renseigner : l'app se connecte avec des champs séparés (host/port/base/utilisateur déjà pré-remplis avec les valeurs par défaut du service `postgres`), pas une URL unique — donc n'importe quel caractère spécial dans le mot de passe (généré par `openssl rand -base64` par exemple) fonctionne sans encodage particulier.
`AUTHENTIK_ISSUER_URL` utilise ici le nom du conteneur Authentik sur le réseau `traefik-proxy` (remplacez `authentik-server` par le vrai nom de service de votre stack Authentik — `docker ps` sur cette stack vous le donnera) plutôt que l'URL publique, pour éviter un aller-retour inutile par Traefik. L'URL publique fonctionne aussi si vous préférez. `AUTHENTIK_ISSUER_URL` utilise ici le nom du conteneur Authentik sur le réseau `traefik-proxy` (remplacez `authentik-server` par le vrai nom de service de votre stack Authentik — `docker ps` sur cette stack vous le donnera) plutôt que l'URL publique, pour éviter un aller-retour inutile par Traefik. L'URL publique fonctionne aussi si vous préférez.
Pour générer `POSTGRES_PASSWORD` et `SESSION_SECRET` (valeurs aléatoires, à ne jamais commiter) : Pour générer `POSTGRES_PASSWORD` et `SESSION_SECRET` (valeurs aléatoires, à ne jamais commiter) :
@ -270,8 +271,8 @@ Le [Démarrage rapide](#démarrage-rapide-serveur-avec-traefik) ci-dessus couvre
| Variable | Description | | Variable | Description |
|---|---| |---|---|
| `DATABASE_URL` | Chaîne de connexion Postgres (déjà cohérente avec le service `postgres` du compose) | | `POSTGRES_PASSWORD` | Mot de passe Postgres, utilisé à la fois par le service `postgres` et par l'app (connexion par champs séparés, pas d'URL — aucun caractère à encoder) |
| `POSTGRES_PASSWORD` | Mot de passe du service Postgres | | `PGHOST` / `PGPORT` / `PGDATABASE` / `PGUSER` | Optionnels, déjà cohérents par défaut avec le service `postgres` du compose (`postgres`/`5432`/`octane`/`octane`) |
| `SESSION_SECRET` | Chaîne aléatoire longue pour signer les cookies de session | | `SESSION_SECRET` | Chaîne aléatoire longue pour signer les cookies de session |
| `AUTHENTIK_ISSUER_URL` | URL d'issuer OIDC de l'application Authentik (interne, ex: `http://authentik-server:9000/application/o/octane-website/`, ou publique) | | `AUTHENTIK_ISSUER_URL` | URL d'issuer OIDC de l'application Authentik (interne, ex: `http://authentik-server:9000/application/o/octane-website/`, ou publique) |
| `OIDC_CLIENT_ID` / `OIDC_CLIENT_SECRET` | Identifiants du provider Authentik | | `OIDC_CLIENT_ID` / `OIDC_CLIENT_SECRET` | Identifiants du provider Authentik |
@ -295,7 +296,6 @@ Dans `.env`, mettre :
``` ```
DEV_BYPASS_AUTH=true DEV_BYPASS_AUTH=true
DATABASE_URL=postgres://octane:changeme@postgres:5432/octane
POSTGRES_PASSWORD=changeme POSTGRES_PASSWORD=changeme
SESSION_SECRET=une-longue-chaine-aleatoire SESSION_SECRET=une-longue-chaine-aleatoire
``` ```
@ -312,7 +312,8 @@ Ou sans Docker du tout, avec un Postgres local :
```bash ```bash
npm install npm install
# démarrer un Postgres local, renseigner DATABASE_URL dans .env # démarrer un Postgres local, puis dans .env : PGHOST=localhost (au lieu du
# nom de service Docker "postgres" par défaut) + POSTGRES_PASSWORD assorti
npm run migrate npm run migrate
npm start npm start
``` ```

View file

@ -13,7 +13,17 @@ function required(name) {
module.exports = { module.exports = {
nodeEnv: process.env.NODE_ENV || 'development', nodeEnv: process.env.NODE_ENV || 'development',
port: parseInt(process.env.PORT, 10) || 3000, port: parseInt(process.env.PORT, 10) || 3000,
databaseUrl: required('DATABASE_URL'), // Discrete connection fields rather than a single DATABASE_URL: a
// password containing "/", "+", "=", "@" etc. (as produced by e.g.
// `openssl rand -base64`) would otherwise need manual URL-encoding
// to avoid breaking the connection string parser.
pg: {
host: process.env.PGHOST || 'postgres',
port: parseInt(process.env.PGPORT, 10) || 5432,
database: process.env.PGDATABASE || 'octane',
user: process.env.PGUSER || 'octane',
password: required('POSTGRES_PASSWORD'),
},
sessionSecret: required('SESSION_SECRET'), sessionSecret: required('SESSION_SECRET'),
// DEV_BYPASS_AUTH lets you run the app locally without a real Authentik // DEV_BYPASS_AUTH lets you run the app locally without a real Authentik
// instance: /auth/login prompts for a name instead of redirecting to OIDC. // instance: /auth/login prompts for a name instead of redirecting to OIDC.

View file

@ -1,6 +1,6 @@
const { Pool } = require('pg'); const { Pool } = require('pg');
const config = require('../config'); const config = require('../config');
const pool = new Pool({ connectionString: config.databaseUrl }); const pool = new Pool(config.pg);
module.exports = pool; module.exports = pool;