La page d'accueil vivait sous home/ dans alpinux.site.2026, sans webhook : elle était déposée à la main sur le serveur. Le dépôt avait fini par diverger — la version en ligne portait quatre mois de modifications jamais revenues dans git. Ce dépôt suit la règle des autres domaines : un domaine, un dépôt. Le site est dans site/, la chaîne de déploiement dans deploiement/ — clone sur le serveur, service d'écoute du webhook, relais Apache, et l'ACL qui donne le droit d'écrire dans le DocumentRoot. installer.sh pose l'ensemble en une fois, et se relance sans rien casser. Le rsync est sans --delete, volontairement : le DocumentRoot contient aussi le .htaccess qui relaie /public-calendars vers Nextcloud et les pages d'erreur d'ISPConfig. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ae3qPEPRrNkEY5LwcTTKc1
102 lines
4.2 KiB
Bash
Executable file
102 lines
4.2 KiB
Bash
Executable file
#!/bin/bash
|
|
# Installe la chaîne de déploiement de www.alpinux.org sur owni. À lancer en root,
|
|
# une seule fois — relancer ne casse rien, chaque étape vérifie d'abord ce qui existe.
|
|
#
|
|
# sudo bash /chemin/vers/alpinux-www/deploiement/installer.sh
|
|
#
|
|
# Ce que ça met en place : un clone du dépôt dans /opt/www-alpinux, le service d'écoute
|
|
# du webhook sur 127.0.0.1:9877, le relais Apache /deploy, et le droit d'écriture de
|
|
# l'utilisateur du service sur le DocumentRoot.
|
|
set -euo pipefail
|
|
|
|
DEPOT_URL="https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-www.git"
|
|
BASE="/opt/www-alpinux"
|
|
REPO_DIR="$BASE/repo"
|
|
UTILISATEUR="abonnelc"
|
|
CIBLE="/var/www/clients/client1/web11/web"
|
|
SECRET_FICHIER="/etc/default/www-webhook"
|
|
JOURNAL="/var/log/www-deploy.log"
|
|
UNITE="/etc/systemd/system/www-webhook.service"
|
|
|
|
[ "$(id -u)" -eq 0 ] || { echo "À lancer en root : sudo bash $0" >&2; exit 1; }
|
|
|
|
echo "==> 1/6 Dépôt dans $REPO_DIR"
|
|
install -d -o "$UTILISATEUR" -g "$UTILISATEUR" "$BASE"
|
|
if [ -d "$REPO_DIR/.git" ]; then
|
|
sudo -u "$UTILISATEUR" git -C "$REPO_DIR" pull --ff-only origin main
|
|
else
|
|
sudo -u "$UTILISATEUR" git clone "$DEPOT_URL" "$REPO_DIR"
|
|
fi
|
|
|
|
echo "==> 2/6 Scripts et journal"
|
|
install -o "$UTILISATEUR" -g "$UTILISATEUR" -m 755 "$REPO_DIR/deploiement/deploy-www.sh" "$BASE/deploy-www.sh"
|
|
install -o "$UTILISATEUR" -g "$UTILISATEUR" -m 755 "$REPO_DIR/deploiement/webhook.py" "$BASE/webhook.py"
|
|
touch "$JOURNAL" && chown "$UTILISATEUR":"$UTILISATEUR" "$JOURNAL"
|
|
|
|
echo "==> 3/6 Droit d'écriture sur $CIBLE"
|
|
# Le DocumentRoot appartient à web11 (suexec) ; une ACL suffit à y laisser écrire le
|
|
# service, sans toucher au propriétaire ni aux droits qu'attend ISPConfig.
|
|
setfacl -m "u:$UTILISATEUR:rwx" "$CIBLE"
|
|
|
|
echo "==> 4/6 Secret du webhook"
|
|
if [ -f "$SECRET_FICHIER" ]; then
|
|
echo " (déjà là, inchangé)"
|
|
else
|
|
printf 'WWW_WEBHOOK_SECRET=%s\n' "$(openssl rand -hex 24)" > "$SECRET_FICHIER"
|
|
chmod 600 "$SECRET_FICHIER"
|
|
fi
|
|
|
|
echo "==> 5/6 Service systemd"
|
|
install -m 644 "$REPO_DIR/deploiement/www-webhook.service" "$UNITE"
|
|
systemctl daemon-reload
|
|
systemctl enable --now www-webhook
|
|
systemctl is-active --quiet www-webhook && echo " service actif"
|
|
|
|
echo "==> 6/6 Relais Apache /deploy"
|
|
patcher_vhost() {
|
|
local fichier="$1"
|
|
[ -f "$fichier" ] || return 0
|
|
if grep -q "127.0.0.1:9877" "$fichier"; then
|
|
echo " $fichier : déjà relayé"
|
|
return 0
|
|
fi
|
|
cp -a "$fichier" "$fichier.bak-$(date +%Y%m%d%H%M)"
|
|
# Inséré juste avant le premier Include letsencrypt, donc dans le VirtualHost *:443.
|
|
awk '
|
|
!fait && /Include \/etc\/letsencrypt\/options-ssl-apache\.conf/ {
|
|
print "\t\tProxyPass /deploy http://127.0.0.1:9877/deploy"
|
|
print "\t\tProxyPassReverse /deploy http://127.0.0.1:9877/deploy"
|
|
fait = 1
|
|
}
|
|
{ print }
|
|
' "$fichier" > "$fichier.tmp" && mv "$fichier.tmp" "$fichier"
|
|
grep -q "127.0.0.1:9877" "$fichier" || { echo " ÉCHEC sur $fichier" >&2; return 1; }
|
|
echo " $fichier : relais ajouté"
|
|
}
|
|
|
|
# Sur owni, sites-enabled contient des copies et non des liens : les deux sont à traiter.
|
|
for vhost in /etc/apache2/sites-enabled/100-alpinux.org.vhost \
|
|
/etc/apache2/sites-available/alpinux.org.vhost; do
|
|
patcher_vhost "$vhost"
|
|
done
|
|
|
|
if apache2ctl configtest; then
|
|
systemctl reload apache2
|
|
else
|
|
echo "Configuration Apache invalide : rien n'a été rechargé." >&2
|
|
echo "Les sauvegardes .bak-* sont à côté des vhosts." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo
|
|
echo "────────────────────────────────────────────────────────────"
|
|
echo "Reste à déclarer le webhook dans Gitea :"
|
|
echo " Paramètres du dépôt alpinux-www → Webhooks → Ajouter → Gitea"
|
|
echo " URL : https://alpinux.org/deploy"
|
|
echo " Méthode : POST, type de contenu : application/json"
|
|
echo " Secret : $(sed 's/^WWW_WEBHOOK_SECRET=//' "$SECRET_FICHIER")"
|
|
echo " Événement : Push seulement"
|
|
echo
|
|
echo "Puis, pour une première mise en ligne sans attendre un push :"
|
|
echo " sudo -u $UTILISATEUR $BASE/deploy-www.sh && tail -5 $JOURNAL"
|
|
echo "────────────────────────────────────────────────────────────"
|