« Organigramme d'installation » : différence entre les versions
| Ligne 52 : | Ligne 52 : | ||
== Sécurisation == | == Sécurisation == | ||
Mises à jour automatiques | === Mises à jour automatiques === | ||
Installer vim-nox (coloration syntaxique), mailutils (pour l'envoi de mails). | Installer vim-nox (coloration syntaxique), mailutils (pour l'envoi de mails). | ||
| Ligne 58 : | Ligne 58 : | ||
Au niveau du système hôte, on ajoute le script '''/root/scripts/lxc_auto_update.sh''' avec : | Au niveau du système hôte, on ajoute le script '''/root/scripts/lxc_auto_update.sh''' avec : | ||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
Script : cliquer pour développer | |||
<div class="mw-collapsible-content"> | |||
#!/bin/bash | #!/bin/bash | ||
| Ligne 70 : | Ligne 73 : | ||
bavarder() { | bavarder() { | ||
local message="$1" | |||
echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> "$LOG_FILE" | |||
} | } | ||
# Ajouter un marqueur de début d'exécution | |||
bavarder "$RUN_START_MARKER" | bavarder "$RUN_START_MARKER" | ||
# Récupérer la liste des noms de conteneurs Alpine | |||
containers=$(lxc list --format csv | tail -n +2 | cut -d',' -f1) | containers=$(lxc list --format csv | tail -n +2 | cut -d',' -f1) | ||
bavarder "Liste des conteneurs récupérée : '$containers'" | bavarder "Liste des conteneurs récupérée : '$containers'" | ||
# Séparer les noms de conteneurs en un tableau | |||
IFS=$'\n' read -r -d <nowiki>''</nowiki> -a container_array <<< "$containers" | IFS=$'\n' read -r -d <nowiki>''</nowiki> -a container_array <<< "$containers" | ||
# Boucle pour lancer les mises à jour | |||
{ | { | ||
for container in "${container_array[@]}"; do | |||
bavarder "--- Début du traitement du conteneur : '$container' ---" | |||
config=$(lxc config show "$container") | |||
if echo "$config" | grep -iq "alpine"; then | |||
bavarder "Le conteneur '$container' semble être basé sur Alpine." | |||
is_running=$(lxc list --format csv | grep "^${container}," | grep ",RUNNING,") | |||
if [ -n "$is_running" ]; then | |||
bavarder "Le conteneur '$container' est en cours d'exécution, lancement de la mise à jour..." | |||
lxc exec "$container" -- sh -c "apk update && apk upgrade --available" | |||
result=$? | |||
if [ "$result" -ne 0 ]; then | |||
bavarder "Erreur lors de la mise à jour de '$container'." | |||
fi | |||
else | |||
bavarder "Le conteneur '$container' n'est pas en cours d'exécution, mise à jour ignorée." | |||
fi | |||
else | |||
bavarder "Le conteneur '$container' ne semble pas être basé sur Alpine, mise à jour ignorée." | |||
fi | |||
bavarder "--- Fin du traitement du conteneur : '$container' ---" | |||
done | |||
} >> "$LOG_FILE" 2>&1 | } >> "$LOG_FILE" 2>&1 | ||
bavarder "Fin de la tentative de mise à jour des conteneurs." | bavarder "Fin de la tentative de mise à jour des conteneurs." | ||
# --- Début du redémarrage des conteneurs Alpine (sauf le proxy) --- | |||
bavarder "--- Début du redémarrage des conteneurs Alpine (sauf $PROXY_CONTAINER) ---" | bavarder "--- Début du redémarrage des conteneurs Alpine (sauf $PROXY_CONTAINER) ---" | ||
for container in "${container_array[@]}"; do | for container in "${container_array[@]}"; do | ||
if [ "$container" != "$PROXY_CONTAINER" ]; then | |||
config=$(lxc config show "$container") | |||
if echo "$config" | grep -iq "alpine"; then | |||
is_running=$(lxc list --format csv | grep "^${container}," | grep ",RUNNING,") | |||
if [ -n "$is_running" ]; then | |||
bavarder "Redémarrage du conteneur '$container'..." | |||
lxc restart "$container" | |||
sleep "$SLEEP_AFTER_RESTART" | |||
# Vérifier l'état du service web pour les conteneurs web | |||
is_web_container=0 | |||
for web_container in "${WEB_CONTAINERS[@]}"; do | |||
if [ "$container" == "$web_container" ]; then | |||
is_web_container=1 | |||
break | |||
fi | |||
done | |||
if [ "$is_web_container" -eq 1 ]; then | if [ "$is_web_container" -eq 1 ]; then | ||
service_status=$(lxc exec "$container" -- rc-service "$WEB_SERVICE_NAME" status 2>&1) | |||
if ! echo "$service_status" | grep -q "started"; then | |||
bavarder "$WEB_SERVICE_NAME ne semble pas en cours d'exécution dans '$container', tentative de démarrage..." | |||
lxc exec "$container" -- rc-service "$WEB_SERVICE_NAME" start | |||
sleep 5 | |||
service_status_after_start=$(lxc exec "$container" -- rc-service "$WEB_SERVICE_NAME" status 2>&1) | |||
if ! echo "$service_status_after_start" | grep -q "started"; then | |||
bavarder "Échec du démarrage de $WEB_SERVICE_NAME dans '$container'." | |||
else | |||
bavarder "$WEB_SERVICE_NAME démarré avec succès dans '$container'." | |||
fi | |||
else | |||
bavarder "$WEB_SERVICE_NAME semble être en cours d'exécution dans '$container'." | |||
fi | |||
fi | |||
fi | |||
fi | |||
fi | |||
done | done | ||
bavarder "--- Fin du redémarrage des conteneurs Alpine (sauf $PROXY_CONTAINER) ---" | bavarder "--- Fin du redémarrage des conteneurs Alpine (sauf $PROXY_CONTAINER) ---" | ||
# --- Redémarrage du conteneur proxy en dernier --- | |||
bavarder "--- Début du redémarrage du conteneur proxy ($PROXY_CONTAINER) ---" | bavarder "--- Début du redémarrage du conteneur proxy ($PROXY_CONTAINER) ---" | ||
is_proxy_running=$(lxc list --format csv | grep "^${PROXY_CONTAINER}," | grep ",RUNNING,") | is_proxy_running=$(lxc list --format csv | grep "^${PROXY_CONTAINER}," | grep ",RUNNING,") | ||
if [ -n "$is_proxy_running" ]; then | if [ -n "$is_proxy_running" ]; then | ||
bavarder "Redémarrage du conteneur proxy '$PROXY_CONTAINER'..." | |||
lxc restart "$PROXY_CONTAINER" | |||
result=$? | |||
if [ "$result" -ne 0 ]; then | |||
bavarder "Erreur lors du redémarrage du conteneur proxy '$PROXY_CONTAINER'." | |||
fi | |||
else | else | ||
bavarder "Le conteneur proxy '$PROXY_CONTAINER' n'est pas en cours d'exécution, redémarrage ignoré." | |||
fi | fi | ||
bavarder "--- Fin du redémarrage du conteneur proxy ($PROXY_CONTAINER) ---" | bavarder "--- Fin du redémarrage du conteneur proxy ($PROXY_CONTAINER) ---" | ||
# Ajouter un marqueur de fin d'exécution | |||
bavarder "$RUN_END_MARKER" | bavarder "$RUN_END_MARKER" | ||
# --- Gestion de la rotation des logs --- | |||
if [ -f "$LOG_FILE" ]; then | if [ -f "$LOG_FILE" ]; then | ||
# Récupérer toutes les occurrences du marqueur de début d'exécution | |||
start_markers=$(grep -c "^$RUN_START_MARKER" "$LOG_FILE") | |||
# Calculer le nombre d'exécutions à supprimer | |||
runs_to_remove=$((start_markers - MAX_RUNS_TO_KEEP)) | |||
if [ "$runs_to_remove" -gt 0 ]; then | |||
# Utiliser awk pour ne conserver que les N dernières exécutions | |||
awk -v n="$MAX_RUNS_TO_KEEP" -v start_marker="$RUN_START_MARKER" -v end_marker="$RUN_END_MARKER" ' | |||
BEGIN { count = 0; in_run = 0; } | |||
$0 ~ start_marker { | |||
count++; | |||
if (count > (NR - RSTART) + 1 - (n * (RLENGTH ? 1 : 0))) { | |||
in_run = 1; | |||
} else { | |||
in_run = 0; | |||
print; | |||
} | |||
} | |||
$0 ~ end_marker { | |||
if (!in_run) { | |||
print; | |||
} | |||
} | |||
<nowiki>!($0 ~ start_marker) && !($0 ~ end_marker) { | |||
if (!in_run) { | if (!in_run) { | ||
print; | print; | ||
| Ligne 209 : | Ligne 212 : | ||
EMAIL_DESTINATAIRE="domi.drey@gmail.com" # Remplace par ton adresse e-mail | EMAIL_DESTINATAIRE="domi.drey@gmail.com" # Remplace par ton adresse e-mail | ||
# Vérifier s'il y a eu des erreurs et envoyer un e-mail si c'est le cas | |||
if grep -q "Erreur" "$LOG_FILE"; then | if grep -q "Erreur" "$LOG_FILE"; then | ||
cat "$LOG_FILE" | mail -s 'Rapport de mise à jour LXC - Erreurs détectées' "$EMAIL_DESTINATAIRE" | |||
fi | fi | ||
exit 0 | exit 0 | ||
</div> | |||
</div> | |||
====Envoi des E-mails==== | |||
L'envoi des mails nécessite l'installation de mailutils et ssmtp : | L'envoi des mails nécessite l'installation de mailutils et ssmtp : | ||
# apt-get install mailutils ssmtp | # apt-get install mailutils ssmtp | ||
Version du 11 mai 2025 à 12:01
Les outils
Conteneur proxy : cf nginx sur alpine léger
- Création du conteneur
- Installation et configuration de nginx
- Installation de certbot pour let's encrypt
- Voir pour installer des outils de sécurité (fail2ban,...)
Conteneur Mariadb : cf mariadb sur alpinele
- Création du conteneur
- Installation de mariadb
- Configuration
- Création d'un utilisateur
Conteneur PhpMyadmin : cf phpma sur alpineLe
- Création du conteneur
- Installation d'apache2 et de phpmyadmin
- Configuration d'apache2 et de phpmyadmin
Les applis
Conteneur tables : cf tables sur alpine léger & pmb sur alpine léger pour apache2
Conteneur pmb : cf pmb sur alpine léger (historique dans pmb sur alpine lourd)
Conteneur wiki : Cf wiki (mediawiki) sur alpine léger
- Création d'un utilisateur et d'une base de donnée vide pour le wiki
- Transfert de la base de données
- Création du conteneur
- Installation du serveur web
- Installation de la nouvelle version de mediawiki
- Initialisation de l'application
- Modification de LocalSettings.php
- Récupération du contenu sur l'ancien serveur et transfert des données
- Corrections
Conteneur wp : cf wordpress sur alpine léger
mais sauter à la fin. Mariadb et phpmyadmin dans d'autres conteneurs...
Stockage et sauvegardes
création d'un volume pour les sauvegardes :
# lxc storage volume create default sauvegarde-lxc size=50GB
Montage du volume dans chaque conteneur :
# lxc config device add <nom du conteneur> sauvegarde-mount disk source=sauvegarde-lxc pool=default path=/sauvegardes
logiciel : borg sauvegarde et rétention de données. Comte chez Kiki, à pousser en ssh.
Sécurisation
Mises à jour automatiques
Installer vim-nox (coloration syntaxique), mailutils (pour l'envoi de mails).
Au niveau du système hôte, on ajoute le script /root/scripts/lxc_auto_update.sh avec :
Script : cliquer pour développer
#!/bin/bash
LOG_FILE="/var/log/lxc_update.log"
MAX_RUNS_TO_KEEP=2
RUN_START_MARKER="--- Début de l'exécution du script ---"
RUN_END_MARKER="--- Fin de l'exécution du script ---"
PROXY_CONTAINER="proxy"
WEB_CONTAINERS=("wp" "pmb" "wiki" "tables") # Liste de tous les conteneurs web
WEB_SERVICE_NAME="apache2" # Nom du service web à vérifier (adapter si nécessaire)
SLEEP_AFTER_RESTART=10 # Délai après le redémarrage des conteneurs web
bavarder() {
local message="$1"
echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> "$LOG_FILE"
}
# Ajouter un marqueur de début d'exécution
bavarder "$RUN_START_MARKER"
# Récupérer la liste des noms de conteneurs Alpine
containers=$(lxc list --format csv | tail -n +2 | cut -d',' -f1)
bavarder "Liste des conteneurs récupérée : '$containers'"
# Séparer les noms de conteneurs en un tableau
IFS=$'\n' read -r -d '' -a container_array <<< "$containers"
# Boucle pour lancer les mises à jour
{
for container in "${container_array[@]}"; do
bavarder "--- Début du traitement du conteneur : '$container' ---"
config=$(lxc config show "$container")
if echo "$config" | grep -iq "alpine"; then
bavarder "Le conteneur '$container' semble être basé sur Alpine."
is_running=$(lxc list --format csv | grep "^${container}," | grep ",RUNNING,")
if [ -n "$is_running" ]; then
bavarder "Le conteneur '$container' est en cours d'exécution, lancement de la mise à jour..."
lxc exec "$container" -- sh -c "apk update && apk upgrade --available"
result=$?
if [ "$result" -ne 0 ]; then
bavarder "Erreur lors de la mise à jour de '$container'."
fi
else
bavarder "Le conteneur '$container' n'est pas en cours d'exécution, mise à jour ignorée."
fi
else
bavarder "Le conteneur '$container' ne semble pas être basé sur Alpine, mise à jour ignorée."
fi
bavarder "--- Fin du traitement du conteneur : '$container' ---"
done
} >> "$LOG_FILE" 2>&1
bavarder "Fin de la tentative de mise à jour des conteneurs."
# --- Début du redémarrage des conteneurs Alpine (sauf le proxy) ---
bavarder "--- Début du redémarrage des conteneurs Alpine (sauf $PROXY_CONTAINER) ---"
for container in "${container_array[@]}"; do
if [ "$container" != "$PROXY_CONTAINER" ]; then
config=$(lxc config show "$container")
if echo "$config" | grep -iq "alpine"; then
is_running=$(lxc list --format csv | grep "^${container}," | grep ",RUNNING,")
if [ -n "$is_running" ]; then
bavarder "Redémarrage du conteneur '$container'..."
lxc restart "$container"
sleep "$SLEEP_AFTER_RESTART"
# Vérifier l'état du service web pour les conteneurs web
is_web_container=0
for web_container in "${WEB_CONTAINERS[@]}"; do
if [ "$container" == "$web_container" ]; then
is_web_container=1
break
fi
done
if [ "$is_web_container" -eq 1 ]; then
service_status=$(lxc exec "$container" -- rc-service "$WEB_SERVICE_NAME" status 2>&1)
if ! echo "$service_status" | grep -q "started"; then
bavarder "$WEB_SERVICE_NAME ne semble pas en cours d'exécution dans '$container', tentative de démarrage..."
lxc exec "$container" -- rc-service "$WEB_SERVICE_NAME" start
sleep 5
service_status_after_start=$(lxc exec "$container" -- rc-service "$WEB_SERVICE_NAME" status 2>&1)
if ! echo "$service_status_after_start" | grep -q "started"; then
bavarder "Échec du démarrage de $WEB_SERVICE_NAME dans '$container'."
else
bavarder "$WEB_SERVICE_NAME démarré avec succès dans '$container'."
fi
else
bavarder "$WEB_SERVICE_NAME semble être en cours d'exécution dans '$container'."
fi
fi
fi
fi
fi
done
bavarder "--- Fin du redémarrage des conteneurs Alpine (sauf $PROXY_CONTAINER) ---"
# --- Redémarrage du conteneur proxy en dernier ---
bavarder "--- Début du redémarrage du conteneur proxy ($PROXY_CONTAINER) ---"
is_proxy_running=$(lxc list --format csv | grep "^${PROXY_CONTAINER}," | grep ",RUNNING,")
if [ -n "$is_proxy_running" ]; then
bavarder "Redémarrage du conteneur proxy '$PROXY_CONTAINER'..."
lxc restart "$PROXY_CONTAINER"
result=$?
if [ "$result" -ne 0 ]; then
bavarder "Erreur lors du redémarrage du conteneur proxy '$PROXY_CONTAINER'."
fi
else
bavarder "Le conteneur proxy '$PROXY_CONTAINER' n'est pas en cours d'exécution, redémarrage ignoré."
fi
bavarder "--- Fin du redémarrage du conteneur proxy ($PROXY_CONTAINER) ---"
# Ajouter un marqueur de fin d'exécution
bavarder "$RUN_END_MARKER"
# --- Gestion de la rotation des logs ---
if [ -f "$LOG_FILE" ]; then
# Récupérer toutes les occurrences du marqueur de début d'exécution
start_markers=$(grep -c "^$RUN_START_MARKER" "$LOG_FILE")
# Calculer le nombre d'exécutions à supprimer
runs_to_remove=$((start_markers - MAX_RUNS_TO_KEEP))
if [ "$runs_to_remove" -gt 0 ]; then
# Utiliser awk pour ne conserver que les N dernières exécutions
awk -v n="$MAX_RUNS_TO_KEEP" -v start_marker="$RUN_START_MARKER" -v end_marker="$RUN_END_MARKER" '
BEGIN { count = 0; in_run = 0; }
$0 ~ start_marker {
count++;
if (count > (NR - RSTART) + 1 - (n * (RLENGTH ? 1 : 0))) {
in_run = 1;
} else {
in_run = 0;
print;
}
}
$0 ~ end_marker {
if (!in_run) {
print;
}
}
!($0 ~ start_marker) && !($0 ~ end_marker) {
if (!in_run) {
print;
}
}
' "$LOG_FILE" > "$LOG_FILE.tmp" && mv "$LOG_FILE.tmp" "$LOG_FILE"
fi
fi
# Définir l'adresse e-mail pour les notifications
EMAIL_DESTINATAIRE="domi.drey@gmail.com" # Remplace par ton adresse e-mail
# Vérifier s'il y a eu des erreurs et envoyer un e-mail si c'est le cas
if grep -q "Erreur" "$LOG_FILE"; then
cat "$LOG_FILE" | mail -s 'Rapport de mise à jour LXC - Erreurs détectées' "$EMAIL_DESTINATAIRE"
fi
exit 0
Envoi des E-mails
L'envoi des mails nécessite l'installation de mailutils et ssmtp :
# apt-get install mailutils ssmtp
Configuration de ssmtp :
# vi /etc/ssmtp/ssmtp.conf
# # Config file for sSMTP sendmail # # The person who gets all mail for userids < 1000 # Make this empty to disable rewriting. root=toto@monmail.fr # The place where the mail goes. The actual machine name is required no # MX records are consulted. Commonly mailhosts are named mail.domain.com mailhub=smtp.gmail.com:587 (pour gmail) # Where will the mail seem to come from? # rewriteDomain= # The full hostname hostname=raspberrypi # Are users allowed to set their own From: address? # YES - Allow the user to specify their own From: address # NO - Use the system generated From: address FromLineOverride=YES UseTLS=YES UseSTARTTLS=YES AuthUser=toto@monfournisseur.com AuthPass=MonMotdePasseDeConnection
Remarques :
- Pour gmail, il faut créer un mot de passe d'application dans les paramètre du compte google et l'utiliser ici.
- Pour que la redirection de mails fonctionne, il faut que l'adresse de destination finale soit différente de l'adresse utilisée pour l'identification pour l'envoi des mails.
On automatise l'exécution (dimache à 2h du matin) :
# crontab -e 0 2 * * 7 /root/scripts/lxc_auto_update.sh