# Exemple Setup Postgres Container

Nous allons mettre en place le servie Postgres pour la première fois. Voici les démarches à suivre pour que le nouveau service fonctionne avec notre environnement :

#### Etape 1 : Création de la structure des volumes

```bash
sudo mkdir -p /mnt/volumes/postgres/{data,logs,conf,init}
sudo chown -R dockersvc:dockersvc /mnt/volumes/postgres
sudo setfacl -R -m u:dockersvc:rwx,g:dockersvc:rwx /mnt/volumes/postgres
sudo setfacl -R -d -m u:dockersvc:rwx,g:dockersvc:rwx /mnt/volumes/postgres

```

Cette arborescence permet :

- **data/** → stockage des bases
- **logs/** → logs PostgreSQL hors conteneur
- **conf/** → fichiers de configuration personnalisés (`postgresql.conf`, `pg_hba.conf`)
- **init/** → scripts SQL ou shell exécutés au premier lancement

#### Etape 2 : Création du `docker-compose.yml` PostgreSQL

```yaml
version: "3.9"
services:
  postgres:
    image: postgres:17-alpine
    container_name: postgres
    restart: unless-stopped
    user: ${PUID}:${PGID}
    networks:
      - bddnetwork
    ports:
      - 5432:5432
    volumes:
      - ${VOLROOT}/postgres/data:/var/lib/postgresql/data
      - ${VOLROOT}/postgres/logs:/var/log/postgresql
      - ${VOLROOT}/postgres/conf:/etc/postgresql/custom
      - ${VOLROOT}/postgres/init:/docker-entrypoint-initdb.d
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=OYsA4X8N0xC0AN
      - TZ=${TZ}
    healthcheck:
      test:
        - CMD-SHELL
        - pg_isready -U ${POSTGRES_USER}
      interval: 10s
      timeout: 5s
      retries: 5
volumes:
  postgres: null
networks:
  bddnetwork:
    external: true

```

#### Créer le network 

Notre stack docker compose utilise un network "bddnetwork" externe. Pour que l'exécution docker compose fonctionne il est nécessaire de créer le network avant de la démarrer :

```bash
sudo docker network create bddnetwork
```

#### Etape 3 : Démarrer et Vérifier les UID/GID

Pour vérifier les UID/GID après le premier démarrage :

```bash
docker exec -it postgres id
```

Résultat attendu :

```
uid=10050(dockersvc) gid=10050(dockersvc) groups=10050(dockersvc)
```

Si l’image officielle PostgreSQL refuse `user: "${PUID}:${PGID}"`, alors **on garde dockersvc propriétaire des volumes** mais **on lance le conteneur sous avec l'utilisateur par défaut mais on va ajouter des ACL spécifique.**

**Pour ajouter une ACL spécifique :**

```bash
sudo setfacl -R -m u:999:rwx /mnt/volumes/postgres
```

#### Tester la connexion à la base de donnée

Se connecter dans le conteneur :

```bash
sudo docker exec -it postgres bash
```

Puis se connecter à la BDD avec l'user et le nom de la base de donnée définit dans la stack docker compose :

```
psql -U <username> -d <dbname>
```