Merge pull request 'fix/correctif' (#14) from fix/correctif into develop
Reviewed-on: #14
This commit was merged in pull request #14.
This commit is contained in:
@@ -2,6 +2,9 @@
|
|||||||
# VAULTWARDEN BACKUP CONFIGURATION
|
# VAULTWARDEN BACKUP CONFIGURATION
|
||||||
#############################################
|
#############################################
|
||||||
|
|
||||||
|
# Webhook Discord pour notifications (optionnel)
|
||||||
|
DISCORD_WEBHOOK_URL=
|
||||||
|
|
||||||
# Répertoire contenant les données Vaultwarden
|
# Répertoire contenant les données Vaultwarden
|
||||||
DATA_DIR=
|
DATA_DIR=
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
markdown
|
|
||||||
# README — Mise en place du script de sauvegarde Vaultwarden
|
# README — Mise en place du script de sauvegarde Vaultwarden
|
||||||
|
|
||||||
Ce script permet d’automatiser la sauvegarde de Vaultwarden afin de conserver une copie du dossier `data`, de la transférer vers un serveur distant et d’envoyer une notification Discord en cas de succès ou d’échec.
|
Ce script permet d’automatiser la sauvegarde de Vaultwarden afin de conserver une copie du dossier `data`, de la transférer vers un serveur distant et d’envoyer une notification Discord en cas de succès ou d’échec.
|
||||||
@@ -67,8 +66,8 @@ Elles doivent être placées dans un fichier `.env`.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
WEBHOOK_URL=https://discord.com/api/webhooks/...
|
WEBHOOK_URL=https://discord.com/api/webhooks/...
|
||||||
REMOTE_USER=backup
|
REMOTE_USER=<USER>
|
||||||
REMOTE_HOST=192.168.1.50
|
REMOTE_HOST=<IP_SERVEUR>
|
||||||
SSH_KEY=/home/matt/.ssh/id_ed25519_vaultwarden_backup
|
SSH_KEY=/home/matt/.ssh/id_ed25519_vaultwarden_backup
|
||||||
DATA_DIR=/opt/vaultwarden/data
|
DATA_DIR=/opt/vaultwarden/data
|
||||||
REMOTE_DIR=/home/backup/backups/vaultwarden
|
REMOTE_DIR=/home/backup/backups/vaultwarden
|
||||||
@@ -89,24 +88,27 @@ REMOTE_DIR=/home/backup/backups/vaultwarden
|
|||||||
|
|
||||||
# 5. Chargement des variables dans le script
|
# 5. Chargement des variables dans le script
|
||||||
|
|
||||||
Le script récupère les variables du fichier `.env`.
|
Le script charge directement le fichier `.env` avec `source` et exporte automatiquement les variables pendant le chargement.
|
||||||
|
|
||||||
Exemple :
|
Mécanisme utilisé :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
REMOTE_USER=$(grep -E '^REMOTE_USER=' .env | cut -d '=' -f2-)
|
set -a
|
||||||
|
source "$ENV_FILE"
|
||||||
|
set +a
|
||||||
```
|
```
|
||||||
|
|
||||||
Explication :
|
Explication :
|
||||||
|
|
||||||
* `grep` recherche la variable dans `.env`
|
* `set -a` exporte automatiquement les variables définies ensuite
|
||||||
* `cut` récupère uniquement la valeur après `=`
|
* `source "$ENV_FILE"` lit et exécute le contenu du fichier `.env` dans le shell courant
|
||||||
* la variable shell reçoit la valeur correspondante
|
* `set +a` désactive ensuite l'export automatique
|
||||||
|
|
||||||
Cela permet :
|
Cela permet :
|
||||||
|
|
||||||
* d'améliorer la sécurité
|
* de charger toutes les variables du fichier `.env` en une seule fois
|
||||||
* de modifier la configuration sans toucher au script
|
* de conserver la configuration en dehors du script
|
||||||
|
* de rester aligné avec le comportement réel du script
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -125,7 +127,7 @@ ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_bitwarden
|
|||||||
#### 2. Copie de la clé vers le serveur distant
|
#### 2. Copie de la clé vers le serveur distant
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh-copy-id -i ~/.ssh/id_ed25519_bitwarden.pub backup@192.168.0.179
|
ssh-copy-id -i ~/.ssh/id_ed25519_bitwarden.pub <USER>@<IP_SERVEUR>
|
||||||
```
|
```
|
||||||
|
|
||||||
Cette commande ajoute la clé dans :
|
Cette commande ajoute la clé dans :
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ set +a
|
|||||||
#######################################
|
#######################################
|
||||||
# Variables obligatoires
|
# Variables obligatoires
|
||||||
#######################################
|
#######################################
|
||||||
: "${WEBHOOK_URL:=}"
|
: "${DISCORD_WEBHOOK_URL:=}"
|
||||||
: "${DATA_DIR:?Variable DATA_DIR manquante dans .env}"
|
: "${DATA_DIR:?Variable DATA_DIR manquante dans .env}"
|
||||||
: "${LOCAL_BACKUP:?Variable LOCAL_BACKUP manquante dans .env}"
|
: "${LOCAL_BACKUP:?Variable LOCAL_BACKUP manquante dans .env}"
|
||||||
: "${REMOTE_USER:?Variable REMOTE_USER manquante dans .env}"
|
: "${REMOTE_USER:?Variable REMOTE_USER manquante dans .env}"
|
||||||
@@ -47,13 +47,12 @@ set +a
|
|||||||
DATE="$(date +'%Y-%m-%d_%H-%M-%S')"
|
DATE="$(date +'%Y-%m-%d_%H-%M-%S')"
|
||||||
BACKUP_PREFIX="vaultwarden-backup"
|
BACKUP_PREFIX="vaultwarden-backup"
|
||||||
BACKUP_NAME="${BACKUP_PREFIX}-${DATE}.tar.gz"
|
BACKUP_NAME="${BACKUP_PREFIX}-${DATE}.tar.gz"
|
||||||
LOCAL_BACKUP_DIR="$LOCAL_BACKUP"
|
LOCAL_BACKUP_FILE="${LOCAL_BACKUP}/${BACKUP_NAME}"
|
||||||
LOCAL_BACKUP_FILE="${LOCAL_BACKUP_DIR}/${BACKUP_NAME}"
|
RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-10}"
|
||||||
RETENTION_DAYS=10
|
|
||||||
|
|
||||||
SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10)
|
SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10)
|
||||||
|
|
||||||
mkdir -p "$LOCAL_BACKUP_DIR"
|
mkdir -p "$LOCAL_BACKUP"
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
# Notification Discord
|
# Notification Discord
|
||||||
@@ -62,7 +61,7 @@ discord_ping() {
|
|||||||
local success="$1"
|
local success="$1"
|
||||||
local details="${2:-}"
|
local details="${2:-}"
|
||||||
|
|
||||||
[[ -z "$WEBHOOK_URL" ]] && return 0
|
[[ -z "$DISCORD_WEBHOOK_URL" ]] && return 0
|
||||||
|
|
||||||
local icon status_line
|
local icon status_line
|
||||||
if [[ "$success" == "true" ]]; then
|
if [[ "$success" == "true" ]]; then
|
||||||
@@ -81,10 +80,9 @@ discord_ping() {
|
|||||||
msg+="Data transfer: ${status_line}\n"
|
msg+="Data transfer: ${status_line}\n"
|
||||||
[[ -n "$details" ]] && msg+="Détails: ${details}"
|
[[ -n "$details" ]] && msg+="Détails: ${details}"
|
||||||
|
|
||||||
python3 - <<PY | curl -fsS -H "Content-Type: application/json" -d @- "$WEBHOOK_URL" >/dev/null || true
|
local payload
|
||||||
import json
|
payload="$(jq -n --arg content "$msg" '{content: $content}')"
|
||||||
print(json.dumps({"content": """$msg"""}))
|
curl -fsS -H "Content-Type: application/json" -d "$payload" "$DISCORD_WEBHOOK_URL" >/dev/null || true
|
||||||
PY
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
#############################################
|
#############################################
|
||||||
|
|
||||||
# Webhook Discord pour notifications
|
# Webhook Discord pour notifications
|
||||||
WEBHOOK_URL=
|
DISCORD_WEBHOOK_URL=
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ ssh-copy-id -i ~/.ssh/check_storage_key.pub user@serveur
|
|||||||
Tester la connexion sans mot de passe :
|
Tester la connexion sans mot de passe :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh -i ~/.ssh/id_backup_postgres backup@192.168.1.50
|
ssh -i ~/.ssh/check_storage_key <USER>@<HOST>
|
||||||
```
|
```
|
||||||
## Utilisation du script
|
## Utilisation du script
|
||||||
0. Copiez le fichier d'environnement exemple et modifiez les variables selon votre configuration :
|
0. Copiez le fichier d'environnement exemple et modifiez les variables selon votre configuration :
|
||||||
@@ -62,4 +62,4 @@ ssh -i ~/.ssh/id_backup_postgres backup@192.168.1.50
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Avertissement
|
## Avertissement
|
||||||
Assurez-vous de remplacer `/chemin/vers/le/script/check-storage.sh` par le chemin réel où se trouve le script sur votre système.
|
Assurez-vous de remplacer `/chemin/vers/le/script/check-storage.sh` par le chemin réel où se trouve le script sur votre système.
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ if [ "$usage" -ge "$limit" ]; then
|
|||||||
-H "Accept: application/json" \
|
-H "Accept: application/json" \
|
||||||
-H "Content-Type: application/json; charset=utf-8" \
|
-H "Content-Type: application/json; charset=utf-8" \
|
||||||
-d "$payload" \
|
-d "$payload" \
|
||||||
"$WEBHOOK_URL"
|
"$DISCORD_WEBHOOK_URL"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -66,4 +66,4 @@ fi
|
|||||||
|
|
||||||
echo "Espace disponible : ${avail_gb} GB"
|
echo "Espace disponible : ${avail_gb} GB"
|
||||||
echo "Espace utilise / espace total : ${used_gb} GB / ${total_gb} GB"
|
echo "Espace utilise / espace total : ${used_gb} GB / ${total_gb} GB"
|
||||||
echo "Name: ${HOSTNAME}"
|
echo "Name: ${HOSTNAME}"
|
||||||
|
|||||||
71
README.md
71
README.md
@@ -1,43 +1,56 @@
|
|||||||
# Malio-Ops MALIO
|
# Malio-Ops
|
||||||
Ce dépôt sert au **versionnement des scripts utilisés dans l’infrastructure du projet Ferme**.
|
|
||||||
|
|
||||||
L’objectif est de conserver un historique clair des scripts, suivre les évolutions et permettre leur amélioration progressive.
|
Ce depot centralise les scripts d'exploitation et de maintenance utilises pour l'infrastructure MALIO. Il sert de base de versionnement pour les sauvegardes, la supervision, les operations PostgreSQL et la reconstruction de bases.
|
||||||
|
|
||||||
## Contenu du dépôt
|
|
||||||
|
|
||||||
Le dépôt peut contenir différents types de scripts utilisés pour l’exploitation technique :
|
|
||||||
|
|
||||||
* scripts de **backup PostgreSQL**
|
|
||||||
* scripts de **monitoring des applications**
|
|
||||||
* scripts **d’automatisation système**
|
|
||||||
* scripts **d’administration ou de maintenance**
|
|
||||||
|
|
||||||
## Objectif
|
## Objectif
|
||||||
|
|
||||||
Ce dépôt permet de :
|
Le depot permet de :
|
||||||
|
|
||||||
* suivre les **modifications des scripts dans le temps**
|
* suivre les modifications des scripts dans le temps
|
||||||
* garder une **version stable et reproductible**
|
* conserver des versions stables et reproductibles
|
||||||
* faciliter la **maintenance et les corrections**
|
* mutualiser la configuration et les bonnes pratiques d'exploitation
|
||||||
* centraliser les scripts utilisés sur les serveurs
|
* centraliser la documentation technique associee
|
||||||
|
|
||||||
## Organisation
|
## Structure du depot
|
||||||
|
|
||||||
Les évolutions importantes sont documentées dans le fichier :
|
Le depot est organise par dossier fonctionnel :
|
||||||
|
|
||||||
```
|
* [CheckStorage](CheckStorage) : surveillance de l'espace disque et alertes Discord
|
||||||
CHANGELOG.md
|
* [BackupVaultWarden](BackupVaultWarden) : sauvegarde et transfert distant des donnees Vaultwarden
|
||||||
```
|
* [RecetteScripts](RecetteScripts) : scripts historiques de backup, monitoring et rebuild pour l'environnement de recette
|
||||||
|
* [RebuildBdd](RebuildBdd) : orchestration de reconstruction de bases PostgreSQL, bootstrap de cibles et checks de preparation
|
||||||
|
|
||||||
Ce fichier décrit les nouvelles fonctionnalités, corrections et modifications apportées aux scripts.
|
## Focus RebuildBdd
|
||||||
|
|
||||||
## Remarque
|
Le dossier [RebuildBdd](RebuildBdd) regroupe la nouvelle chaine de reconstruction de base. Il contient notamment :
|
||||||
|
|
||||||
Ce dépôt est dédié au **versionnement des scripts uniquement**.
|
* [run-rebuild-bdd.sh](/home/matte/Malio-ops/RebuildBdd/run-rebuild-bdd.sh) : point d'entree principal
|
||||||
Les configurations sensibles (mots de passe, clés, variables d’environnement) ne doivent pas être stockées directement dans le dépôt et doivent être placées dans des fichiers `.env` locaux.
|
* [rebuild-bdd-core.sh](/home/matte/Malio-ops/RebuildBdd/rebuild-bdd-core.sh) : logique de restauration
|
||||||
|
* [bootstrap-target-host.sh](/home/matte/Malio-ops/RebuildBdd/bootstrap-target-host.sh) : preparation de la machine cible
|
||||||
|
* [create-target-config.sh](/home/matte/Malio-ops/RebuildBdd/create-target-config.sh) : generation de configuration cible
|
||||||
|
* [Checkup](RebuildBdd/Checkup) : scripts de verification prealable
|
||||||
|
* [Config](RebuildBdd/Config) : fichiers d'exemple de configuration globale et par cible
|
||||||
|
|
||||||
Ce projet contient des scripts pour la gestion et la maintenance des serveurs de MALIO.
|
La documentation detaillee est disponible dans [RebuildBdd/README.md](/home/matte/Malio-ops/RebuildBdd/README.md).
|
||||||
|
|
||||||
|
## Prerequis
|
||||||
|
|
||||||
## Scripts disponibles
|
Les scripts du depot reposent principalement sur :
|
||||||
* [CheckStorage] : Script de vérification de l'espace de stockage
|
|
||||||
|
* `bash`
|
||||||
|
* `jq`
|
||||||
|
* `curl`
|
||||||
|
* `ssh`
|
||||||
|
* `scp`
|
||||||
|
|
||||||
|
Selon les scripts, d'autres outils peuvent etre necessaires, notamment PostgreSQL (`psql`, `pg_dump`, `pg_restore`) ou `tar`.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Un modele commun est disponible dans [global.env.exemple](global.env.exemple). Il sert de base pour les variables partagees entre plusieurs scripts.
|
||||||
|
|
||||||
|
Chaque dossier peut aussi contenir son propre fichier `.env.exemple` ou ses propres fichiers de configuration. Les secrets et webhooks ne doivent jamais etre versionnes dans git et doivent rester dans des fichiers locaux ignores.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Les evolutions importantes sont suivies dans [CHANGELOG.md](CHANGELOG.md).
|
||||||
|
|||||||
@@ -281,7 +281,12 @@ REMOTE_DIR="${IA_BASE_DIR}"
|
|||||||
|
|
||||||
log "Creating remote directories"
|
log "Creating remote directories"
|
||||||
|
|
||||||
if ! ssh "${SSH_OPTS[@]}" "$IA_SSH" "mkdir -p '${REMOTE_DIR}/ferme' '${REMOTE_DIR}/sirh' '${REMOTE_DIR}/inventory' '${REMOTE_DIR}/user'"; then
|
MKDIR_CMD="mkdir -p '${REMOTE_DIR}/user'"
|
||||||
|
for DB in "${DBS_ARRAY[@]}"; do
|
||||||
|
MKDIR_CMD+=" '${REMOTE_DIR}/${DB}'"
|
||||||
|
done
|
||||||
|
|
||||||
|
if ! ssh "${SSH_OPTS[@]}" "$IA_SSH" "$MKDIR_CMD"; then
|
||||||
log "ERROR: remote mkdir failed"
|
log "ERROR: remote mkdir failed"
|
||||||
discord_msg_users_error "" "" "Remote mkdir failed"
|
discord_msg_users_error "" "" "Remote mkdir failed"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
# -e omis volontairement : check_site retourne 1 pour les sites down
|
||||||
set -uo pipefail
|
set -uo pipefail
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@@ -200,6 +201,8 @@ check_site() {
|
|||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
|
trap '[[ -n "$STDERR_TMP" ]] && rm -f "$STDERR_TMP"' EXIT
|
||||||
|
|
||||||
local failures=0
|
local failures=0
|
||||||
|
|
||||||
for site in "${SITES[@]}"; do
|
for site in "${SITES[@]}"; do
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ APP_URLS="ferme.malio-dev.fr inventory.malio-dev.fr sirh.malio-dev.fr"
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
# Webhook Discord pour envoyer le résumé des vérifications
|
# Webhook Discord pour envoyer le résumé des vérifications
|
||||||
DISCORD_WEBHOOK_URL=https:
|
DISCORD_WEBHOOK_URL=
|
||||||
|
|
||||||
# Mention Discord en cas de problème
|
# Mention Discord en cas de problème
|
||||||
DISCORD_PING=@here
|
DISCORD_PING=@here
|
||||||
@@ -135,7 +135,7 @@ send_discord_message() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
payload="$(python3 -c 'import json,sys; print(json.dumps({"content": sys.argv[1]}))' "$message")" || {
|
payload="$(jq -n --arg content "$message" '{content: $content}')" || {
|
||||||
log "Impossible de construire le payload JSON Discord."
|
log "Impossible de construire le payload JSON Discord."
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@@ -376,6 +376,10 @@ if [[ -n "$LOCAL_ROLES_FILE" ]]; then
|
|||||||
if [[ -s "$ROLES_CREATE_LIST" ]]; then
|
if [[ -s "$ROLES_CREATE_LIST" ]]; then
|
||||||
while IFS= read -r role_name; do
|
while IFS= read -r role_name; do
|
||||||
[[ -z "$role_name" ]] && continue
|
[[ -z "$role_name" ]] && continue
|
||||||
|
if [[ ! "$role_name" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then
|
||||||
|
log "WARNING: nom de rôle suspect ignoré : ${role_name}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
ROLE_EXISTS="$(
|
ROLE_EXISTS="$(
|
||||||
psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d postgres -tAc \
|
psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d postgres -tAc \
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ ENV_NAME=RECETTE
|
|||||||
#############################################
|
#############################################
|
||||||
|
|
||||||
# Webhook Discord utilisé pour envoyer les notifications
|
# Webhook Discord utilisé pour envoyer les notifications
|
||||||
WEBHOOK_URL=
|
DISCORD_WEBHOOK_URL=
|
||||||
|
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
@@ -129,4 +129,4 @@ IA_SSH_HOST=
|
|||||||
IA_BASE_DIR=/home/.../backups/bdd-recette
|
IA_BASE_DIR=/home/.../backups/bdd-recette
|
||||||
|
|
||||||
# Dossier contenant les rôles PostgreSQL exportés
|
# Dossier contenant les rôles PostgreSQL exportés
|
||||||
REMOTE_ROLES_NAME=user
|
REMOTE_ROLES_NAME=user
|
||||||
|
|||||||
Reference in New Issue
Block a user