Actualiser script_creator.py

fix: limit building by website
This commit is contained in:
administrateur 2025-03-29 13:36:42 +01:00
parent bd086cca70
commit 57ed76e50f

View File

@ -15,52 +15,24 @@ S3_SECRET_KEY = os.getenv("S3_SECRET_KEY")
MINIO_MOUNT_PATH = "/mnt" 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") 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")) DEBUG = bool(os.getenv("DEBUG"))
def log_debug(message): def log_debug(message):
"""Affiche un message uniquement si DEBUG est activé."""
if DEBUG: if DEBUG:
print(f"🔍 DEBUG: {message}") 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(): def mount_s3():
log_debug("🛠 Vérification du montage S3...")
if not os.path.ismount(MINIO_MOUNT_PATH): 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) os.makedirs(MINIO_MOUNT_PATH, exist_ok=True)
# Écriture des credentials pour S3FS
credentials_file = "/etc/passwd-s3fs" credentials_file = "/etc/passwd-s3fs"
log_debug(f"🔐 Écriture des credentials dans {credentials_file}...")
with open(credentials_file, "w") as f: with open(credentials_file, "w") as f:
f.write(f"{S3_ACCESS_KEY}:{S3_SECRET_KEY}\n") f.write(f"{S3_ACCESS_KEY}:{S3_SECRET_KEY}\n")
os.chmod(credentials_file, 0o600) # Restreint les permissions os.chmod(credentials_file, 0o600)
# 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" 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}") subprocess.run(cmd, shell=True, capture_output=True, text=True)
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"]) @app.route("/build", methods=["POST"])
def build_mkdocs(): def build_mkdocs():
log_debug("📥 Requête reçue pour un build MkDocs.")
data = request.json data = request.json
website = data.get("WEBSITE") website = data.get("WEBSITE")
error_callback = data.get("ERROR_CALLBACK", N8N_WEBHOOK_URL) error_callback = data.get("ERROR_CALLBACK", N8N_WEBHOOK_URL)
@ -69,50 +41,50 @@ def build_mkdocs():
log_debug("❌ Paramètre WEBSITE manquant.") log_debug("❌ Paramètre WEBSITE manquant.")
return jsonify({"error": "Paramètre WEBSITE manquant"}), 400 return jsonify({"error": "Paramètre WEBSITE manquant"}), 400
log_debug(f"🌐 SITE: {website}") lock_file = f"/tmp/build_{website}.lock"
# Vérifie et monte S3 si besoin if os.path.exists(lock_file):
mount_s3() log_debug(f"⚠️ Un build est déjà en cours pour {website}.")
return jsonify({
"status": "busy",
"message": f"Un build est déjà en cours pour {website}."
}), 429
# Définition des chemins # Création du verrou
src = f"/mnt/files/sites/@{website}/mkdocs.yml" open(lock_file, 'w').close()
tmp = f"/srv/{website}" log_debug(f"🔐 Verrou activé pour {website}.")
log_debug(f"📁 Fichier source: {src}") try:
log_debug(f"📂 Dossier temporaire: {tmp}") mount_s3()
# Vérifie si le fichier mkdocs.yml existe src = f"/mnt/files/sites/@{website}/mkdocs.yml"
if not os.path.exists(src): tmp = f"/srv/{website}"
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 if not os.path.exists(src):
cmd = f"mkdocs build --quiet --no-strict --config-file {src} --site-dir {tmp}" log_debug(f"❌ Le fichier de configuration {src} n'existe pas.")
return jsonify({"error": f"{src} introuvable"}), 404
log_debug(f"🚀 Exécution de la commande MkDocs: {cmd}") cmd = f"mkdocs build --quiet --no-strict --config-file {src} --site-dir {tmp}"
log_debug(f"🚀 Exécution: {cmd}")
# Exécution de MkDocs result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
if result.returncode != 0: if result.returncode != 0:
log_debug(f"❌ Erreur lors du build MkDocs : {result.stderr}") build_error = base64.b64encode(result.stderr.encode()).decode()
json_payload = {"site": tmp, "erreur": build_error}
requests.post(error_callback, json=json_payload, headers={"Content-Type": "application/json"})
# Encodage de l'erreur en base64 log_debug(f"❌ Échec du build {website}: {result.stderr}")
build_error = base64.b64encode(result.stderr.encode()).decode() return jsonify({"status": "error", "message": "Build échoué", "error": result.stderr}), 500
json_payload = {
"site": tmp,
"erreur": build_error
}
# Envoi de l'erreur à n8n log_debug(f"✅ Build réussi pour {website}.")
log_debug(f"📡 Envoi de l'erreur à n8n: {N8N_WEBHOOK_URL}") return jsonify({"status": "success", "message": "Build réussi"}), 200
requests.post(error_callback, json=json_payload, headers={"Content-Type": "application/json"})
return jsonify({"status": "error", "message": "Build échouée", "error": result.stderr}), 500 finally:
if os.path.exists(lock_file):
log_debug("✅ Build MkDocs réussi.") os.remove(lock_file)
return jsonify({"status": "success", "message": "Build réussie"}), 200 log_debug(f"🔓 Verrou supprimé pour {website}.")
if __name__ == "__main__": if __name__ == "__main__":
log_debug("🚀 Lancement du serveur Flask...") log_debug("🚀 Serveur Flask démarré.")
app.run(host="0.0.0.0", port=80) app.run(host="0.0.0.0", port=80)