From bd086cca7029e5eb5767287122607b2c8fbd2656 Mon Sep 17 00:00:00 2001 From: NicolasHorde Date: Fri, 28 Mar 2025 14:19:51 +0100 Subject: [PATCH] first commit --- Dockerfile | 39 +++++++++++++++ script_creator.py | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 Dockerfile create mode 100644 script_creator.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9df4ee4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +# Use Debian slim for a lightweight base image +FROM debian:bookworm-slim + +# Environment variables +ENV MKDOCS_VERSION=1.5.0 +ENV VENV_PATH=/opt/venv + +# Update & install dependencies +RUN apt update && apt install -y --no-install-recommends \ + ca-certificates bash git openssh-client python3 python3-venv python3-pip \ + build-essential libfuse3-dev libcurl4-openssl-dev libxml2-dev \ + pkg-config automake autoconf libtool s3fs \ + jq curl graphviz ghostscript fonts-dejavu && \ + rm -rf /var/lib/apt/lists/* + +# Create a virtual environment and activate it +RUN python3 -m venv $VENV_PATH && \ + $VENV_PATH/bin/pip install --upgrade pip + +# Install MkDocs & plugins inside the virtual environment +RUN $VENV_PATH/bin/pip install mkdocs==${MKDOCS_VERSION} && \ + $VENV_PATH/bin/pip install mkdocs-material fontawesome-markdown mkdocs-mermaid2-plugin \ + mkdocs-video mkdocs-include_dir_to_nav mkdocs-static-i18n mkdocs[i18n] \ + mkdocs-asciinema mkdocs-glightbox mkdocs-encryptcontent-plugin \ + mkdocs-redirects mkdocs-autolinks-plugin mkdocs-monorepo-plugin \ + mkdocs-exclude mkdocs-exclude-search mkdocs-pdf-export-plugin \ + mkdocs-graphviz mkdocs-charts-plugin mkdocs-diagrams + +# Cleanup +RUN apt autoremove -y && apt clean && rm -rf /tmp/* /var/tmp/* + +# Copy the script +COPY script_creator.py /usr/local/bin/script_creator.py + +# Set the virtual environment for Python execution +ENV PATH="$VENV_PATH/bin:$PATH" + +# Default command +CMD ["python3", "/usr/local/bin/script_creator.py"] diff --git a/script_creator.py b/script_creator.py new file mode 100644 index 0000000..ecd6e7d --- /dev/null +++ b/script_creator.py @@ -0,0 +1,118 @@ +from flask import Flask, request, jsonify +import os +import subprocess +import base64 +import requests + +app = Flask(__name__) + +# Configuration MinIO depuis les variables d'environnement +MINIO_BUCKET = os.getenv("MINIO_BUCKET", "nextcloud") +MINIO_HOST = os.getenv("MINIO_HOST", "minio.minio.svc.cluster.local:9000") +MINIO_REGION = os.getenv("MINIO_REGION", "us-east-1") +S3_ACCESS_KEY = os.getenv("S3_ACCESS_KEY") +S3_SECRET_KEY = os.getenv("S3_SECRET_KEY") +MINIO_MOUNT_PATH = "/mnt" +N8N_WEBHOOK_URL = os.getenv("N8N_WEBHOOK_URL", "https://n8n.n8n.svc.kube.ia86.cc/webhook/7950310f-e526-475a-82d1-63818da79339") + +# Mode Debug +DEBUG = bool(os.getenv("DEBUG")) + +def log_debug(message): + """Affiche un message uniquement si DEBUG est activé.""" + if DEBUG: + print(f"🔍 DEBUG: {message}") + +log_debug(f"🌍 Environnement chargé. MinIO: {MINIO_HOST}, Bucket: {MINIO_BUCKET}") + +# Vérifie si les identifiants sont bien définis +if not S3_ACCESS_KEY or not S3_SECRET_KEY: + raise ValueError("❌ ERREUR: Les variables S3_ACCESS_KEY et S3_SECRET_KEY ne sont pas définies.") + +log_debug("✅ Les identifiants S3 sont bien définis.") + +# Fonction pour monter le bucket MinIO (S3) +def mount_s3(): + log_debug("🛠 Vérification du montage S3...") + if not os.path.ismount(MINIO_MOUNT_PATH): + log_debug(f"📁 Création du répertoire {MINIO_MOUNT_PATH} si inexistant.") + os.makedirs(MINIO_MOUNT_PATH, exist_ok=True) + + # Écriture des credentials pour S3FS + credentials_file = "/etc/passwd-s3fs" + log_debug(f"🔐 Écriture des credentials dans {credentials_file}...") + with open(credentials_file, "w") as f: + f.write(f"{S3_ACCESS_KEY}:{S3_SECRET_KEY}\n") + os.chmod(credentials_file, 0o600) # Restreint les permissions + + # Commande pour monter le stockage MinIO avec S3FS + cmd = f"s3fs {MINIO_BUCKET} {MINIO_MOUNT_PATH} -o passwd_file={credentials_file} -o url=https://{MINIO_HOST} -o use_path_request_style -o allow_other" + log_debug(f"🚀 Exécution de la commande de montage: {cmd}") + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + + if result.returncode != 0: + log_debug(f"❌ Erreur lors du montage S3 : {result.stderr}") + else: + log_debug("✅ Montage S3 réussi.") + else: + log_debug("✅ S3 est déjà monté.") + +# Route pour déclencher la compilation MkDocs +@app.route("/build", methods=["POST"]) +def build_mkdocs(): + log_debug("📥 Requête reçue pour un build MkDocs.") + data = request.json + website = data.get("WEBSITE") + error_callback = data.get("ERROR_CALLBACK", N8N_WEBHOOK_URL) + + if not website: + log_debug("❌ Paramètre WEBSITE manquant.") + return jsonify({"error": "Paramètre WEBSITE manquant"}), 400 + + log_debug(f"🌐 SITE: {website}") + + # Vérifie et monte S3 si besoin + mount_s3() + + # Définition des chemins + src = f"/mnt/files/sites/@{website}/mkdocs.yml" + tmp = f"/srv/{website}" + + log_debug(f"📁 Fichier source: {src}") + log_debug(f"📂 Dossier temporaire: {tmp}") + + # Vérifie si le fichier mkdocs.yml existe + if not os.path.exists(src): + log_debug(f"❌ Le fichier de configuration {src} n'existe pas.") + return jsonify({"error": f"Le fichier de configuration {src} n'existe pas"}), 404 + + # Commande MkDocs + cmd = f"mkdocs build --quiet --no-strict --config-file {src} --site-dir {tmp}" + + log_debug(f"🚀 Exécution de la commande MkDocs: {cmd}") + + # Exécution de MkDocs + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + + if result.returncode != 0: + log_debug(f"❌ Erreur lors du build MkDocs : {result.stderr}") + + # Encodage de l'erreur en base64 + build_error = base64.b64encode(result.stderr.encode()).decode() + json_payload = { + "site": tmp, + "erreur": build_error + } + + # Envoi de l'erreur à n8n + log_debug(f"📡 Envoi de l'erreur à n8n: {N8N_WEBHOOK_URL}") + requests.post(error_callback, json=json_payload, headers={"Content-Type": "application/json"}) + + return jsonify({"status": "error", "message": "Build échouée", "error": result.stderr}), 500 + + log_debug("✅ Build MkDocs réussi.") + return jsonify({"status": "success", "message": "Build réussie"}), 200 + +if __name__ == "__main__": + log_debug("🚀 Lancement du serveur Flask...") + app.run(host="0.0.0.0", port=80)