Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 169 additions & 0 deletions ENVIRONMENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,175 @@ Le `nginx-strangler` et `server-nestjs` sont inclus dans ce docker-compose et d
pnpm docker:dev
```

## Référence des variables d'environnement

### Variables communes

| Variable | Défaut | Description |
|----------|--------|-------------|
| `NODE_ENV` | `development` | Mode d'exécution : `development`, `production`, `test` |
| `SERVER_HOST` | `localhost` | Interface d'écoute du serveur (NestJS) |
| `SERVER_PORT` | `0` (dynamique) | Port du serveur (NestJS) |
| `SESSION_SECRET` | — | Secret de signature des cookies de session (min 32 caractères) |
| `CONTACT_EMAIL` | `cloudpinative-relations@interieur.gouv.fr` | Email de contact affiché dans l'interface |
| `DEV_SETUP` | — | Active les données de démo au démarrage (`true`) |

### Intégration / CI

| Variable | Défaut | Description |
|----------|--------|-------------|
| `INTEGRATION` | — | Active le mode intégration (`true`) |
| `CI` | — | Active le mode CI (`true`) |
| `APP_VERSION` | `unknown` | Version de l'application (prod uniquement) |

---

### Variables Keycloak

| Variable | Défaut | Description |
|----------|--------|-------------|
| `KEYCLOAK_PROTOCOL` | — | Protocole : `http` ou `https` |
| `KEYCLOAK_DOMAIN` | — | Domaine Keycloak (host:port) |
| `KEYCLOAK_PUBLIC_PROTOCOL` | `KEYCLOAK_PROTOCOL` | Protocole exposé publiquement |
| `KEYCLOAK_PUBLIC_DOMAIN` | `KEYCLOAK_DOMAIN` | Domaine exposé publiquement |
| `KEYCLOAK_REALM` | — | Nom du royaume |
| `KEYCLOAK_CLIENT_ID` | — | Client ID côté backend |
| `KEYCLOAK_CLIENT_SECRET` | — | Secret du client backend |
| `KEYCLOAK_ADMIN` | — | Identifiant admin Keycloak |
| `KEYCLOAK_ADMIN_PASSWORD` | — | Mot de passe admin Keycloak |
| `KEYCLOAK_ADMIN_CLIENT_ID` | `admin-cli` | Client admin pour le royaume master |
| `KEYCLOAK_REDIRECT_URI` | — | URL de redirection post-auth |
| `KEYCLOAK_JWKS_CACHE_TTL_MS` | `300000` (5 min) | Cache TTL des JWKS en ms |
| `KEYCLOAK_JWKS_TIMEOUT_MS` | `5000` (5 s) | Timeout de fetch JWKS en ms |
| `KEYCLOAK_OPENID_CONFIGURATION_CACHE_TTL_MS` | `300000` (5 min) | Cache TTL openid-configuration en ms |
| `ADMIN_KC_USER_ID` | — | IDs des admins Keycloak (liste CSV) |

### Variables Base de données

| Variable | Défaut | Description |
|----------|--------|-------------|
| `DB_URL` | — | URL PostgreSQL (Prisma) |

### Variables OpenCDS

| Variable | Défaut | Description |
|----------|--------|-------------|
| `OPENCDS_URL` | — | URL de l'API OpenCDS (vide = désactivé) |
| `OPENCDS_API_TOKEN` | — | Token d'authentification |
| `OPENCDS_API_TLS_REJECT_UNAUTHORIZED` | `true` | Vérification TLS (true / false) |

### Variables client (Vite)

| Variable | Défaut | Description |
|----------|--------|-------------|
| `VITE_SERVER_HOST` | — | Hôte du serveur backend (client) |
| `VITE_SERVER_PORT` | `4001` | Port du serveur backend (client) |
| `VITE_KEYCLOAK_DOMAIN` | — | Domaine Keycloak (client) |
| `VITE_KEYCLOAK_REALM` | — | Royaume Keycloak (client) |
| `VITE_KEYCLOAK_PROTOCOL` | — | Protocole Keycloak (client) |
| `VITE_KEYCLOAK_CLIENT_ID` | — | Client ID Keycloak (client) |
| `VITE_KEYCLOAK_REDIRECT_URI` | `http://localhost:8080` | URL de redirection post-auth (client) |
| `VITE_OPENCDS_ENABLED` | `false` | Active le module OpenCDS (client) |
| `VITE_CONTACT_EMAIL` | — | Email de contact (client) |

---

### Variables ArgoCD

| Variable | Défaut | Description |
|----------|--------|-------------|
| `USE_ARGOCD` | `false` | Active le plugin ArgoCD (`true`) |
| `ARGO_NAMESPACE` | `argocd` | Namespace ArgoCD |
| `ARGOCD_URL` | — | URL publique ArgoCD |
| `ARGOCD_INTERNAL_URL` | — | URL interne ArgoCD |
| `ARGOCD_EXTRA_REPOSITORIES` | — | Répôts additionnels (JSON) |

### Variables GitLab

| Variable | Défaut | Description |
|----------|--------|-------------|
| `USE_GITLAB` | `false` | Active le plugin GitLab (`true`) |
| `GITLAB_URL` | — | URL publique GitLab |
| `GITLAB_INTERNAL_URL` | — | URL interne GitLab |
| `GITLAB_TOKEN` | — | Token d'authentification |
| `GITLAB_MIRROR_TOKEN_EXPIRATION_DAYS` | `180` | Durée avant rotation token mirror (jours) |
| `GITLAB_MIRROR_TOKEN_ROTATION_THRESHOLD_DAYS` | `90` | Seuil de rotation token mirror (jours) |

### Variables Harbor (Registry)

| Variable | Défaut | Description |
|----------|--------|-------------|
| `USE_HARBOR` | `false` | Active le plugin Harbor (`true`) |
| `HARBOR_URL` | — | URL publique Harbor |
| `HARBOR_INTERNAL_URL` | — | URL interne Harbor |
| `HARBOR_ADMIN` | — | Identifiant administrateur Harbor |
| `HARBOR_ADMIN_PASSWORD` | — | Mot de passe administrateur Harbor |
| `HARBOR_RULE_TEMPLATE` | — | Template de règle de rétention |
| `HARBOR_RULE_COUNT` | — | Nombre de règles de rétention |
| `HARBOR_RETENTION_CRON` | `0 22 2 * * *` | Cron de nettoyage Harbor |
| `HARBOR_ROBOT_ROTATION_THRESHOLD_DAYS` | `90` | Seuil de rotation des robots (jours) |
| `HARBOR_PROJECT_SLUG_CACHE_TTL_MS` | `300000` (5 min) | Cache TTL des slugs projet (ms) |

### Variables Nexus

| Variable | Défaut | Description |
|----------|--------|-------------|
| `USE_NEXUS` | `false` | Active le plugin Nexus (`true`) |
| `NEXUS_URL` | — | URL publique Nexus |
| `NEXUS_INTERNAL_URL` | — | URL interne Nexus |
| `NEXUS_ADMIN` | — | Identifiant administrateur Nexus |
| `NEXUS_ADMIN_PASSWORD` | — | Mot de passe administrateur Nexus |
| `NEXUS__SECRET_EXPOSE_INTERNAL_URL` | — | Expose l'URL interne comme URL secrète (`true`) |

### Variables SonarQube

| Variable | Défaut | Description |
|----------|--------|-------------|
| `USE_SONARQUBE` | `false` | Active le plugin SonarQube (`true`) |
| `SONARQUBE_URL` | — | URL publique SonarQube |
| `SONARQUBE_INTERNAL_URL` | — | URL interne SonarQube |
| `SONAR_API_TOKEN` | — | Token d'API SonarQube |

### Variables Service Chain

| Variable | Défaut | Description |
|----------|--------|-------------|
| `USE_SERVICE_CHAIN` | `false` | Active le plugin Service Chain (`true`) |

### Variables Vault

| Variable | Défaut | Description |
|----------|--------|-------------|
| `USE_VAULT` | `false` | Active le plugin Vault (`true`) |
| `VAULT_URL` | — | URL publique Vault |
| `VAULT_INTERNAL_URL` | — | URL interne Vault |
| `VAULT_TOKEN` | — | Token de service Vault |
| `VAULT_KV_NAME` | `forge-dso` | Nom du secret KV Vault |
| `VAULT__DEPLOY_VAULT_CONNECTION_IN_NS` | — | Déploie la connexion Vault dans les namespaces (`true`) |

### Variables DSO (Environnements)

| Variable | Défaut | Description |
|----------|--------|-------------|
| `DSO_ENV_CHART_VERSION` | `dso-env-1.6.0` | Version du chart dso-env |
| `DSO_NS_CHART_VERSION` | `dso-ns-1.1.5` | Version du chart dso-ns |

### Variables plugins (mode mock)

| Variable | Défaut | Description |
|----------|--------|-------------|
| `MOCK_PLUGINS` | — | Active le mode mock des plugins (`true`) |
| `PROJECTS_ROOT_DIR` | — | Dossier racine des projets |
| `PLUGINS_DIR` | `/plugins` | Dossier des plugins externes |

### Variables E2E (tests)

| Variable | Défaut | Description |
|----------|--------|-------------|
| `E2E` | — | Active les tests E2E (`true`) |

---

## Configuration pour le développement hybride avec un environnement d'intégration existant

Le développement hybride branché sur l'environnement d'intégration suit cette organisation des composants:
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Afin de pouvoir démarrer l'application, il vous faudra également récupérer (
- `apps/server/.env.docker`
- `apps/server/.env.integ`

Si vous ne les avez pas déjà, référez-vous à [./ENVIRONMENTS.md](./ENVIRONMENTS.md) qui est la documentation consacrée au sujet.
Si vous ne les avez pas déjà, référez-vous à [`ENVIRONMENTS.md`](./ENVIRONMENTS.md) (singulier) qui est la documentation consacrée au sujet.

### Lancement rapide utilisant l'application en local et les services sur un environnement distant

Expand Down
9 changes: 9 additions & 0 deletions apps/server-nestjs/.env-example
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,12 @@ OPENCDS_URL=
OPENCDS_API_TOKEN=token
# Vérification du certificat TLS de l'API OpenCDS (true | false)
OPENCDS_API_TLS_REJECT_UNAUTHORIZED=true

# --- Activation des plugins externes ---
# Mettez "true" et renseignez les variables ci-dessus pour activer chaque plugin.
USE_ARGOCD=false
USE_GITLAB=false
USE_NEXUS=false
USE_HARBOR=false
USE_SONARQUBE=false
USE_VAULT=false
10 changes: 10 additions & 0 deletions apps/server-nestjs/.env.docker-example
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,13 @@ OPENCDS_URL=
OPENCDS_API_TOKEN=token
# Vérification du certificat TLS de l'API OpenCDS (true | false)
OPENCDS_API_TLS_REJECT_UNAUTHORIZED=false

# --- Activation des plugins externes ---
# Mettez "true" et renseignez les variables ci-dessus pour activer chaque plugin.
USE_ARGOCD=false
USE_GITLAB=false
USE_NEXUS=false
USE_HARBOR=false
USE_SONARQUBE=false
USE_SERVICE_CHAIN=true
USE_VAULT=false
2 changes: 1 addition & 1 deletion apps/server-nestjs/.env.integ-example
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ NEXUS_INTERNAL_URL=

# --- Divers ---
# Répertoire racine des projets dans Gitlab
PROJECTS_ROOT_DIR=
PROJECTS_ROOT_DIR=forge-mi/projects

# --- SonarQube ---
# Token d'API SonarQube
Expand Down
26 changes: 12 additions & 14 deletions apps/server-nestjs/src/main.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,35 @@ import { DeploymentModule } from './modules/deployment/deployment.module'
import { EnvironmentModule } from './modules/environment/environment.module'
import { HealthzModule } from './modules/healthz/healthz.module'
import { InfrastructureModule } from './modules/infrastructure/infrastructure.module'
import { KeycloakModule } from './modules/keycloak/keycloak.module'
import { LogModule } from './modules/log/log.module'
import { PluginModule } from './modules/plugin/plugin.module'
import { ProjectBulkModule } from './modules/project-bulk/project-bulk.module'
import { ProjectHooksModule } from './modules/project-hooks/project-hooks.module'
import { ProjectMembersModule } from './modules/project-members/project-members.module'
import { ProjectRolesModule } from './modules/project-roles/project-roles.module'
import { ProjectSecretsModule } from './modules/project-secrets/project-secrets.module'
import { ProjectServicesModule } from './modules/project-services/project-services.module'
import { ProjectModule } from './modules/project/project.module'
import { ServiceChainModule } from './modules/service-chain/service-chain.module'
import { SystemSettingsModule } from './modules/system-settings/system-settings.module'
import { VersionModule } from './modules/version/version.module'

@Module({
imports: [
InfrastructureModule,
DeploymentModule,
EnvironmentModule,
HealthzModule,
KeycloakModule,
ScheduleModule.forRoot(),
SystemSettingsModule,
ServiceChainModule,
ProjectModule,
ProjectHooksModule,
ProjectSecretsModule,
ProjectServicesModule,
InfrastructureModule,
LogModule,
PluginModule,
ProjectBulkModule,
ProjectHooksModule,
ProjectMembersModule,
ProjectModule,
ProjectRolesModule,
LogModule,
DeploymentModule,
EnvironmentModule,
ProjectSecretsModule,
ProjectServicesModule,
ScheduleModule.forRoot(),
SystemSettingsModule,
VersionModule,
],
controllers: [],
Expand Down
2 changes: 1 addition & 1 deletion apps/server-nestjs/src/modules/argocd/argocd.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,7 @@ function formatDeploymentSourceValueSources(
}]
: []
return [...internalValueSources, ...externalValueSource]
.sort((a, b) => a.order - b.order)
.toSorted((a, b) => a.order - b.order)
.map(entry => entry.value)
}

Expand Down
16 changes: 8 additions & 8 deletions apps/server-nestjs/src/modules/healthz/healthz.module.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Module } from '@nestjs/common'
import { ConditionalModule } from '@nestjs/config'
import { TerminusModule } from '@nestjs/terminus'
Comment thread
shikanime marked this conversation as resolved.
import { optIn } from 'src/utils/config.utils'
import { ArgoCDModule } from '../argocd/argocd.module'
import { GitlabModule } from '../gitlab/gitlab.module'
import { ConfigurationModule } from '../infrastructure/configuration/configuration.module'
import { DatabaseModule } from '../infrastructure/database/database.module'
import { KeycloakModule } from '../keycloak/keycloak.module'
import { NexusModule } from '../nexus/nexus.module'
Expand All @@ -17,13 +18,12 @@ import { HealthzService } from './healthz.service'
TerminusModule,
DatabaseModule,
KeycloakModule,
GitlabModule,
VaultModule,
NexusModule,
RegistryModule,
ArgoCDModule,
ConfigurationModule,
ServiceChainModule,
ConditionalModule.registerWhen(ArgoCDModule, 'USE_ARGOCD'),
ConditionalModule.registerWhen(GitlabModule, 'USE_GITLAB'),
ConditionalModule.registerWhen(NexusModule, 'USE_NEXUS'),
ConditionalModule.registerWhen(RegistryModule, 'USE_HARBOR'),
ConditionalModule.registerWhen(ServiceChainModule, optIn('USE_SERVICE_CHAIN')),
ConditionalModule.registerWhen(VaultModule, 'USE_VAULT'),
],
controllers: [HealthzController],
providers: [HealthzService],
Expand Down
Loading
Loading