Merge pull request 'Update doc operations : déploiement, postgresql, secrets' (#44) from operations_postgresql_secret into main

Reviewed-on: Deuxfleurs/guide.deuxfleurs.fr#44
This commit is contained in:
baptiste 2025-02-25 23:34:58 +00:00
commit 84aa89dd86
4 changed files with 142 additions and 32 deletions

View file

@ -1,36 +1,100 @@
--- ---
title: "Créer une BDD" title: "Créer une BDD psql"
description: "Création d'une base de données pour une nouvelle application" description: "Création d'une base de données PostgreSQL pour une nouvelle application"
date: 2022-12-22 date: 2025-02-25
dateCreated: 2022-12-22 dateCreated: 2022-12-22
weight: 11 weight: 12
extra: extra:
parent: 'operations/deployer.md' parent: 'operations/deployer.md'
--- ---
## 1. Create a LDAP user and assign a password for your service ## Le besoin
Go to guichet.deuxfleurs.fr On déploie une application sur l'infra Deuxfleurs, et cette application a besoin de stocker des données dans une base PostgreSQL.
1. Everything takes place in `ou=services,ou=users,dc=deuxfleurs,dc=fr` On utilise pour cela le service PostgreSQL existant de Deuxfleurs, déployé en cluster avec [Stolon](@/operations/stolon.md).
2. Create a new user, like `johny`
3. Generate a random password with `openssl rand -base64 32`
4. Hash it with `slappasswd`
5. Add a `userpassword` entry with the hash
This step can also be done using the automated tool `secretmgr.py` in the app folder. Pour mettre en place l'accès nécessaire à cette nouvelle application, nous avons besoin de :
## 2. Connect to postgres with the admin users - créer un utisateur pour que l'application puisse se connecter à PostgreSQL
- générer un mot de passe associé
- créer une ou plusieurs bases de données dans PostgreSQL
Ces trois éléments seront ensuite utilisés dans la configuration de l'application.
## Comment ça marche
- **utilisateur et mot de passe :** PostgreSQL est configuré pour
authentifier les connexions via le LDAP de Deuxfleurs, géré par Bottin.
Il faut donc créer un nouvel "utilisateur de service" dans le LDAP
Deuxfleurs (avec un mot de passe associé).
- **base de données :** On crée une base de données pour chaque
application, et seul l'utilisateur associé a le droit d'accéder à cette
base. Cela sépare bien les différentes applications.
- **nom de la base de données :** Cas simple où l'application a besoin
d'une seule base de données : on lui donne le nom de l'application. Cas
complexe avec plusieurs bases : on préfixe par le nom de l'application.
- **configuration de l'application :** On veut passer quatre éléments à
l'application : l'adresse/port du service PostgreSQL, le nom
d'utilisateur, le mot de passe, et le nom de la base de données. Les
applications se configurent généralement soit via des variables
d'environnement, soit via un fichier de configuration. Chez Deuxfleurs,
on stocke les secrets dans Consul, et on utilise des templates pour
injecter ces secrets dans la configuration de l'application. Voir dépôt
nixcfg pour des exemples, ou ici un exemple simple :
```
DATABASE_URL=postgres://monapplication:{{ key "secrets/monapplication/postgres_pwd" | trimSpace }}@{{ env "meta.site" }}.psql-proxy.service.prod.consul:5432/monapplication
```
## Etapes de création de l'utilisateur et base de données
### 1. Création de l'utilisateur dans LDAP (méthode automatisée à privilégier)
Voir la page de [secretmgr](@/operations/secretmgr.md)
Gros avantage : le script va également copier les secrets dans Consul, ce qui facilitera la configuration de l'application.
### 1.bis Création de l'utilisateur dans LDAP (méthode manuelle au cas où)
Si la méthode automatique ne convient pas, commencer par générer un mot de passe (sur votre laptop, ou depuis une machine Deuxfleurs, peu importe) :
1. Générer un mot de passe aléatoire avec la commande `openssl rand -base64 32`
2. Hasher ce mot de passe avec la commande `slappasswd`
Puis aller sur https://guichet.deuxfleurs.fr :
1. Il est nécessaire d'être admin Guichet
2. Trouver l'arbre LDAP des utilisateurs de service `ou=services,ou=users,dc=deuxfleurs,dc=fr`
3. Créer un nouvel utilisateur dans cet arbre, par exemple `monapplication` (nom de l'application)
4. Ajouter un champ `userpassword` avec le hash du mot de passe obtenu précédemment
### 2. Se connecter en admin au PostgreSQL de production
Installer le client postgresql (paquet `postgresql-client` sous Debian).
Se connecter en SSH sur une machine de prod en faisant un tunnel vers
`psql-proxy.service.prod.consul:5432` (c'est automatique avec [la
configuration SSH recommandée]
(https://git.deuxfleurs.fr/Deuxfleurs/nixcfg/src/branch/main/doc/onboarding.md))
On peut alors se connecter au serveur PostgreSQL de production :
```bash ```bash
# 1. Launch ssh tunnel given in the README
# 2. Make sure you have postregsql client installed locally
psql -h localhost -U postgres -W postgres psql -h localhost -U postgres -W postgres
``` ```
## 3. Create the binded users with LDAP in postgres + the database TODO : demande un mot de passe, où est-il stocké ?
### 3. Créer l'utilisateur et la base de données dans PostgreSQL
Dans le client `psql`, lancer les commandes SQL suivantes. Il faut adapter le nom de l'application et le nom de la base de données.
```sql ```sql
CREATE USER sogo; CREATE USER monapplication;
Create database sogodb with owner sogo encoding 'utf8' LC_COLLATE = 'C' LC_CTYPE = 'C' TEMPLATE template0; CREATE DATABASE monapplication WITH OWNER monapplication ENCODING 'utf8' LC_COLLATE = 'C' LC_CTYPE = 'C' TEMPLATE template0;
``` ```

View file

@ -1,6 +1,6 @@
--- ---
title: "Déployer du logiciel" title: "Déployer du logiciel"
description: "Déploiement du logiciel" description: "Déploiement d'un logiciel"
sort_by: "weight" sort_by: "weight"
date: 2022-12-22 date: 2022-12-22
weight: 30 weight: 30
@ -11,25 +11,33 @@ extra:
# Empaqueter # Empaqueter
Packager avec nix un conteneur Docker, le publier Packager avec nix un conteneur Docker, le publier.
# Secrets # Secrets
Créer les secrets avec `secretmgr` Créer les secrets avec [secretmgr](@/operations/secretmgr.md)
# Service # Base de données SQL
Si besoin, [créer une base de données PostgreSQL](@/operations/create_database.md)
# Service Nomad
Créer un service Nomad Créer un service Nomad
Voir les différentes déclarations : Voir les différentes déclarations dans [nixcfg cluster/prod](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg/src/branch/main/cluster/prod/app) :
- diplonat - `core/deploy/diplonat.hcl`
- tricot - `core/deploy/tricot.hcl`
- `guichet/deploy/guichet.hcl`
Voir la [documentation nixcfg](https://git.deuxfleurs.fr/Deuxfleurs/nixcfg/src/branch/main/doc/architecture.md#deploying-stuff-on-nomad) pour utiliser la ligne de commande Nomad.
# Sauvegardes # Sauvegardes
Voir la section appropriée Voir la section appropriée : [Sauvegardes](@/operations/sauvegardes.md)
# Surveillance # Supervision
Voir la section appropriée : [Supervision](@/operations/supervision.md)
Voir la section appropriée

View file

@ -0,0 +1,19 @@
---
title: "Gestion des secrets"
description: "Gestion des secrets pour les applications"
date: 2025-02-25
dateCreated: 2025-02-25
weight: 11
extra:
parent: 'operations/deployer.md'
---
Cette page documente l'usage du script `secretmgr` dans le dépôt nixcfg.
- écrire un fichier `cluster/prod/app/<monapplication>/secrets.toml` qui décrit les secrets nécessaires à l'application
- TODO expliquer les différents types de secrets disponibles
- établir un tunnel SSH et lancer le script `tlsproxy` pour avoir accès à LDAP et Consul (voir `doc/onboarding.md` pour la conf SSH recommandée)
- utiliser `secretmgr` pour générer les secrets, les copier dans Consul, et créer un utilisateur de service dans LDAP
- TODO mot de passe admin LDAP
Attention, le script nécessite Nix (sinon, il faut installer les dépendances Python soi-même)

View file

@ -1,13 +1,32 @@
--- ---
title: "Stolon" title: "Déployer stolon"
description: "Comment déployer Stolon" description: "Comment déployer Stolon"
date: 2022-12-22 date: 2025-02-25
dateCreated: 2022-12-22 dateCreated: 2022-12-22
weight: 11 weight: 15
extra: extra:
parent: 'operations/deployer.md' parent: 'operations/deployer.md'
--- ---
## Le besoin
Stolon est utilisé pour gérer un cluster PostgreSQL, afin de stocker une copie des données sur chaque site géographique de Deuxfleurs.
Cette documentation explique comment Stolon a été déployé initialement, et comment mettre à jour sa configuration.
## Comment ça marche
Ca a l'air un peu compliqué...
Stolon va récupérer sa configuration dans Consul. C'est un fichier JSON.
Le champ `pgHBA` est utilisé par Stolon pour aller configurer le fichier
`pg_hba.conf` de PostgreSQL. Ici, on explique donc à PostgreSQL qu'il
doit utiliser le LDAP de Deuxfleurs pour authentifier les connexions
postgresql.
## Déploiement initial
Spawn container: Spawn container:
```bash ```bash
@ -61,7 +80,7 @@ Moreover it would enable the usage of the user namespace that shift the UIDs.
alias stolonctl='stolonctl --cluster-name chelidoine --store-backend consul --store-endpoints https://consul.service.prod.consul:8501 --store-ca-file /certs/consul-ca.crt --store-cert-file /certs/consul-client.crt --store-key /certs/consul-client.key' alias stolonctl='stolonctl --cluster-name chelidoine --store-backend consul --store-endpoints https://consul.service.prod.consul:8501 --store-ca-file /certs/consul-ca.crt --store-cert-file /certs/consul-client.crt --store-key /certs/consul-client.key'
``` ```
## Upgrading the cluster ## Mise à jour du cluster
To retrieve the current stolon config: To retrieve the current stolon config: