first commit
This commit is contained in:
commit
bd086cca70
39
Dockerfile
Normal file
39
Dockerfile
Normal file
@ -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"]
|
118
script_creator.py
Normal file
118
script_creator.py
Normal file
@ -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)
|
Loading…
x
Reference in New Issue
Block a user