Public Access
maj auto 8
This commit is contained in:
1 parent
b68f475241
commit
1b37ffe94a
2 files changed
+605
-3
No files matched your search
+589
-1
@@ -5177,4 +5177,592 @@ Le fichier .env complet (incluant vos clés OpenRouter, Gitea et identifiants SM
|
||||
|
||||
/opt/stacks/AETHAS38_MULTI_IA/app-code/.env
|
||||
|
||||
AMOUR
|
||||
AMOUR
|
||||
forcer un git car le paquet ne s'est pas généré.
|
||||
|
||||
AMOUR
|
||||
|
||||
Voici les commandes exactes à exécuter dans votre terminal pour forcer la prise en compte, créer un commit de forçage, et relancer le déclenchement (trigger) du workflow Gitea Actions :
|
||||
|
||||
Bash
|
||||
git add .
|
||||
git commit -m "chore: Forçage du commit pour déclenchement du build Gitea Actions"
|
||||
git push origin main --force
|
||||
Une fois cette commande passée, retournez sur votre interface Gitea dans l'onglet Actions de votre dépôt pour suivre en direct la compilation et la génération de votre package conteneur !
|
||||
|
||||
le paquet ne se génère pas. comment faire et quoi regarder ?
|
||||
|
||||
AMOUR
|
||||
|
||||
Si le paquet ne se génère pas et que l'action Gitea Actions ne se lance pas ou échoue, voici exactement quoi regarder et comment procéder pas à pas :
|
||||
|
||||
1. Quoi regarder sur Gitea ?
|
||||
L'onglet "Actions" de votre dépôt Gitea :
|
||||
|
||||
Rendez-vous sur [https://gitea.aethas38.duckdns.org/xavier/aethas-free](https://gitea.aethas38.duckdns.org/xavier/aethas-free) et cliquez sur l'onglet Actions en haut.
|
||||
|
||||
Si la page est vide : Cela signifie que le runner Gitea (ou l'action) n'est pas activé, ou que Gitea ne détecte pas le fichier .gitea/workflows/docker-build.yml.
|
||||
|
||||
S'il y a un workflow en échec (croix rouge) : Cliquez dessus pour lire les logs détaillés de l'erreur (problème d'authentification au registre, Dockerfile manquant, etc.).
|
||||
|
||||
Le statut du "Gitea Actions Runner" sur le serveur :
|
||||
|
||||
Les Actions sur Gitea nécessitent qu'un conteneur act_runner (ou un runner natif) soit installé et enregistré auprès de votre instance Gitea pour exécuter les tâches. S'il n'y a pas de runner actif, les workflows restent en attente indéfiniment.
|
||||
|
||||
2. Comment contourner et compiler le package manuellement (Solution directe)
|
||||
Puisque vous utilisez Dockge et que vous souhaitez que le serveur récupère l'application, si le système de CI/CD Gitea vous pose des soucis de configuration de runner, vous pouvez compiler l'image directement sur votre serveur hôte (ou via Dockge) sans passer par les actions Gitea :
|
||||
|
||||
Assurez-vous que le Dockerfile et le requirements.txt sont bien présents dans votre dossier de code sur le serveur (/opt/stacks/AETHAS38_MULTI_IA/app-code/).
|
||||
|
||||
Sur le serveur, lancez la construction manuelle de l'image locale avec Docker :
|
||||
|
||||
Bash
|
||||
cd /opt/stacks/AETHAS38_MULTI_IA
|
||||
sudo docker compose build --no-cache
|
||||
sudo docker compose up -d
|
||||
Cette méthode évite d'avoir à configurer des secrets et des runners complexes sur Gitea tout en garantissant que le serveur déploie la dernière version à jour de votre code.
|
||||
|
||||
3. Solution alternative : Giter en mode "Build local" via Docker Compose
|
||||
Dans votre fichier docker-compose.yml sur le serveur, au lieu d'utiliser une ligne image: ... distante qui nécessite un registre distant, vous pouvez simplement utiliser build: ./app-code :
|
||||
|
||||
YAML
|
||||
services:
|
||||
aethas38_app:
|
||||
container_name: aethas38_app
|
||||
build: ./app-code
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "5005:5001"
|
||||
volumes:
|
||||
- /DATA/AppData/MULTI-IA-AETHAS38:/app/data
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
Ainsi, à chaque mise à jour (git pull), Dockge reconstruira l'image automatiquement en local à partir du code source téléchargé.
|
||||
|
||||
Comment voir si le runner est installé. J'ai accès au ssh avec sudo.
|
||||
|
||||
AMOUR
|
||||
|
||||
Vos captures d'écran révèlent exactement pourquoi le workflow bloque : le statut est "En attente" (0s), ce qui signifie que le déclencheur s'est bien activé à chaque git push, mais qu'aucun runner Gitea n'est enregistré ou disponible sur votre serveur pour exécuter la tâche.
|
||||
|
||||
Comment voir si le runner Gitea est installé et actif ?
|
||||
Connectez-vous en SSH à votre serveur et exécutez la commande suivante pour lister les conteneurs Docker en cours d'exécution :
|
||||
|
||||
Bash
|
||||
sudo docker ps
|
||||
Si vous voyez un conteneur nommé act_runner ou similaire : Il est installé mais peut être déconnecté de votre instance Gitea.
|
||||
|
||||
Si vous ne voyez rien : Le runner n'a jamais été installé sur ce serveur. C'est pour cela que les jobs restent bloqués indéfiniment en attente.
|
||||
|
||||
La solution la plus simple et robuste
|
||||
Puisque vous gérez vos déploiements avec Dockge et que vous souhaitez éviter la complexité des runners Gitea Actions sur un vieux serveur, la méthode la plus rapide et sans erreur consiste à compiler et déployer l'image en local via le docker-compose (comme vu précédemment).
|
||||
|
||||
Souhaitez-vous que nous mettions de côté Gitea Actions pour l'instant et que l'on configure le docker-compose.yml pour qu'il construise l'application directement à partir du code présent sur votre serveur lors de la mise à jour ?
|
||||
|
||||
xavier@aethas38:~$ sudo docker ps
|
||||
|
||||
[sudo] Mot de passe de xavier :
|
||||
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAM ES
|
||||
|
||||
6bd3797ced52 python:3.13-slim "bash -c 'apt-get up…" 3 hours ago Up 3 hours 0.0.0.0:5005->5001/tcp, [::]:5005-> 5001/tcp aet has38_app
|
||||
|
||||
f9fe0a9b8906 vladgh/minidlna:latest "/sbin/tini -- /en tr…" 3 days ago Up 3 days (healthy) min idlna
|
||||
|
||||
b41d3ae287a9 node:20-bookworm "docker-entrypoint .s…" 3 days ago Up 3 days 0.0.0.0:4430->443/tcp, [::]:4430->4 43/tcp mes hcentral
|
||||
|
||||
8a14409d66bb mongo:4.4 "docker-entrypoint .s…" 4 days ago Up 3 days 27017/tcp mes hcentral_db
|
||||
|
||||
71b6c67b73e0 ghcr.io/mailu/fetchmail:2024.06 "/fetchmail.py" 5 days ago Up 45 hours (healthy) mai lu-fetchmail-1
|
||||
|
||||
3fdee4095f1d roundcube/roundcubemail:latest "/docker-entrypoin t.…" 5 days ago Up 45 hours 0.0.0.0:8085->80/tcp, [::]:8085->80 /tcp rou ndcube
|
||||
|
||||
8a02501a1dea ghcr.io/mailu/admin:2024.06 "/bin/sh -c /start .py" 5 days ago Up 45 hours (healthy) mai lu-admin-1
|
||||
|
||||
69c811ef1bbb ghcr.io/mailu/postfix:2024.06 "/bin/sh -c /start .py" 5 days ago Up 45 hours (healthy) mai lu-smtp-1
|
||||
|
||||
aa11be1843a8 ghcr.io/mailu/dovecot:2024.06 "/bin/sh -c /start .py" 5 days ago Up 45 hours (healthy) mai lu-imap-1
|
||||
|
||||
81eb858e09ce ghcr.io/mailu/rspamd:2024.06 "/bin/sh -c /start .py" 5 days ago Up 45 hours (healthy) mai lu-antispam-1
|
||||
|
||||
17790feabd1a redis:alpine "docker-entrypoint .s…" 5 days ago Up 45 hours 6379/tcp mai lu-redis-1
|
||||
|
||||
6c61e7564124 ghcr.io/mailu/nginx:2024.06 "/bin/sh -c /start .py" 5 days ago Up 45 hours (healthy) 192.168.1.20:25->25/tcp, 192.168.1. 20:110->110/tcp, 192.168.1.20:143->143/tcp, 192.168.1.20:465->465/tcp, 192.168.1 .20:587->587/tcp, 192.168.1.20:993->993/tcp, 192.168.1.20:995->995/tcp, 192.168. 1.20:4190->4190/tcp, 192.168.1.20:9080->80/tcp, 192.168.1.20:9443->443/tcp mai lu-front-1
|
||||
|
||||
856720966edd ghcr.io/mailu/oletools:2024.06 "/bin/sh -c /start .py" 5 days ago Up 45 hours (healthy) mai lu-oletools-1
|
||||
|
||||
74606daae474 apache/tika:latest-full "/bin/sh -c 'exec ja…" 5 days ago Up 45 hours (healthy) 9998/tcp mai lu-fts_attachments-1
|
||||
|
||||
882bb03a9ae5 ghcr.io/mailu/unbound:2024.06 "/bin/sh -c /start .py" 5 days ago Up 45 hours (healthy) mai lu-resolver-1
|
||||
|
||||
1592cfb24ac9 ghcr.io/mailu/radicale:2024.06 "/bin/sh -c 'radic al…" 5 days ago Up 45 hours (healthy) mai lu-webdav-1
|
||||
|
||||
be98546f2ae4 ghcr.io/paperless-ngx/paperless-ngx:2.20.15 "/init" 5 days ago Up 3 days (healthy) 0.0.0.0:8000->8000/tcp, [::]:8000-> 8000/tcp pap erless-webserver
|
||||
|
||||
1a9dcee67fb0 postgres:16 "docker-entrypoint .s…" 5 days ago Up 3 days 5432/tcp pap erless-db
|
||||
|
||||
046512856bf6 redis:8.8.0 "docker-entrypoint .s…" 5 days ago Up 3 days 6379/tcp pap erless-broker
|
||||
|
||||
38fec9a0d0c1 gotenberg/gotenberg:8.34 "/usr/bin/tini -- go…" 5 days ago Up 3 days 3000/tcp pap erless-gotenberg
|
||||
|
||||
92e609272d08 apache/tika:3.3.1.0 "/bin/sh -c 'exec ja…" 5 days ago Up 3 days 9998/tcp pap erless-tika
|
||||
|
||||
174b815a9477 ghcr.io/home-assistant/home-assistant:stable "/init" 5 days ago Up 3 days hom e-assistant
|
||||
|
||||
5955365051ce louislam/dockge:1 "/usr/bin/dumb-ini t …" 5 days ago Up 3 days (healthy) 0.0.0.0:5001->5001/tcp, [::]:5001-> 5001/tcp doc kge-dockge-1
|
||||
|
||||
97114ca01e9c henrygd/beszel-agent:latest "/agent" 5 days ago Up 3 days age nt-beszel
|
||||
|
||||
b6a160d8656f jc21/nginx-proxy-manager:latest "/init" 5 days ago Up 3 days 0.0.0.0:80-81->80-81/tcp, [::]:80-8 1->80-81/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp NPM
|
||||
|
||||
473b7fcd3dc8 qmcgaw/gluetun:latest "/gluetun-entrypoi nt" 6 days ago Up 3 days (healthy) 1080/tcp, 8000/tcp, 1080/udp, 8388/ tcp, 8888/tcp, 8388/udp, 0.0.0.0:9091->9091/tcp, [::]:9091->9091/tcp glu etun
|
||||
|
||||
8c16035617e2 linuxserver/transmission:4.1.1 "/init" 6 days ago Up 3 days tra nsmission
|
||||
|
||||
e41c330b6116 gitea/gitea:latest "/usr/bin/entrypoi nt…" 6 days ago Up 3 days 0.0.0.0:3000->3000/tcp, [::]:3000-> 3000/tcp, 0.0.0.0:2222->22/tcp, [::]:2222->22/tcp git ea
|
||||
|
||||
4727aca3fe99 eclipse-mosquitto:latest "/docker-entrypoin t.…" 8 days ago Up 3 days 0.0.0.0:1883->1883/tcp, [::]:1883-> 1883/tcp, 0.0.0.0:9001->9001/tcp, [::]:9001->9001/tcp mos quitto
|
||||
|
||||
xavier@aethas38:~$
|
||||
|
||||
On installe le runner.
|
||||
|
||||
AMOUR
|
||||
|
||||
C'est parfait, l'analyse des conteneurs en cours montre clairement qu'il n'y a pas de conteneur de type act_runner d'installé. C'est pour cela que les actions Gitea restent figées en statut "En attente".
|
||||
|
||||
Nous allons installer et enregistrer proprement l'agent runner Gitea sur votre serveur en quelques commandes SSH.
|
||||
|
||||
Étape par étape pour installer le Gitea Actions Runner sur votre serveur :
|
||||
Créer un dossier pour le runner sur le serveur :
|
||||
|
||||
Bash
|
||||
sudo mkdir -p /opt/gitea-runner
|
||||
cd /opt/gitea-runner
|
||||
Télécharger l'exécutable officiel act_runner :
|
||||
|
||||
Bash
|
||||
sudo curl -L -o act_runner https://gitea.com/gitea/act_runner/releases/download/v0.2.6/act_runner-0.2.6-linux-amd64
|
||||
sudo chmod +x act_runner
|
||||
Enregistrer le runner auprès de votre instance Gitea :
|
||||
(Pour récupérer le jeton d'enregistrement (token), allez sur votre instance Gitea [https://gitea.aethas38.duckdns.org](https://gitea.aethas38.duckdns.org) -> Paramètres de l'instance ou du dépôt -> Actions -> Runners -> Créer un nouveau runner).
|
||||
Exécutez la commande d'enregistrement en remplaçant <VOTRE_TOKEN> par votre token :
|
||||
|
||||
Bash
|
||||
sudo ./act_runner register --instance https://gitea.aethas38.duckdns.org --token <VOTRE_TOKEN> --name aethas-server-runner
|
||||
Lancer le runner en arrière-plan (ou via un conteneur/service systemd) :
|
||||
Le plus simple pour qu'il tourne en permanence sans encombrer vos stacks Dockge est de l'exécuter avec un petit service systemd ou directement en daemon :
|
||||
|
||||
Bash
|
||||
sudo ./act_runner daemon
|
||||
Une fois cette installation effectuée, le runner se connectera à votre Gitea et traitera instantanément les builds en attente dans l'onglet Actions !
|
||||
|
||||
Fichiers requis pour la suite (Module Financier)
|
||||
Pour que nous puissions finaliser l'intégration du module financier dans votre application FastHTML, veuillez me transmettre si nécessaire les contenus actuels de :
|
||||
|
||||
modules/ai_engine.py
|
||||
|
||||
modules/chat_handler.py
|
||||
|
||||
AMOUR
|
||||
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
|
||||
gitea:
|
||||
|
||||
image: gitea/gitea:latest
|
||||
|
||||
container_name: gitea
|
||||
|
||||
environment:
|
||||
|
||||
- USER_UID=1000
|
||||
|
||||
- USER_GID=1000
|
||||
|
||||
restart: unless-stopped
|
||||
|
||||
ports:
|
||||
|
||||
- 3000:3000
|
||||
|
||||
- 2222:22
|
||||
|
||||
volumes:
|
||||
|
||||
- /DATA/AppData/gitea:/data
|
||||
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
|
||||
networks: {}
|
||||
|
||||
Si non on fait en ssh.
|
||||
|
||||
AMOUR
|
||||
|
||||
C'est parfait, nous avons le profil exact de votre conteneur Gitea grâce à votre fichier docker-compose.yml.
|
||||
|
||||
Puisque Gitea tourne dans un conteneur Docker séparé sur la même machine hôte, la meilleure méthode pour exécuter le runner Gitea sans s'embêter avec des installations binaires manuelles en SSH est de lancer act_runner directement sous forme de conteneur Docker dans la même infrastructure.
|
||||
|
||||
Voici comment procéder proprement en SSH :
|
||||
|
||||
1. Créer le conteneur du Runner Gitea en SSH
|
||||
Connectez-vous en SSH à votre serveur et exécutez ces commandes pour lancer le runner :
|
||||
|
||||
Bash
|
||||
# 1. Créer un dossier pour stocker la configuration du runner
|
||||
sudo mkdir -p /opt/gitea-runner
|
||||
cd /opt/gitea-runner
|
||||
|
||||
# 2. Lancer un conteneur d'enregistrement interactif ou direct avec le socket Docker de l'hôte
|
||||
# (Remplacez <VOTRE_TOKEN> par le jeton trouvé dans les paramètres Actions de votre dépôt Gitea)
|
||||
sudo docker run --rm \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v /opt/gitea-runner:/data \
|
||||
gitea/act_runner:latest \
|
||||
register \
|
||||
--instance https://gitea.aethas38.duckdns.org \
|
||||
--token <VOTRE_TOKEN> \
|
||||
--no-interactive \
|
||||
--name aethas-docker-runner
|
||||
2. Automatiser le lancement du Runner via un conteneur permanent
|
||||
Une fois l'enregistrement réussi, le fichier de configuration est stocké dans /opt/gitea-runner. Vous pouvez lancer le daemon du runner de manière permanente en arrière-plan avec cette commande Docker :
|
||||
|
||||
Bash
|
||||
sudo docker run -d \
|
||||
--name aethas-act-runner \
|
||||
--restart unless-stopped \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v /opt/gitea-runner:/data \
|
||||
gitea/act_runner:latest \
|
||||
daemon
|
||||
Dès que ce conteneur tournera, il se connectera à votre Gitea et exécutera automatiquement tous vos scripts .gitea/workflows/docker-build.yml dès que vous ferez un git push !
|
||||
|
||||
Fichiers requis pour la suite (Module Financier)
|
||||
Pour que nous puissions poursuivre le développement et intégrer le module financier dans le gestionnaire de chat sans perturber votre base, veuillez me transmettre si nécessaire les contenus actuels de :
|
||||
|
||||
modules/chat_handler.py
|
||||
|
||||
modules/ai_engine.py
|
||||
|
||||
AMOUR
|
||||
|
||||
xavier@aethas38:/opt/gitea-runner$ # 1. Créer un dossier pour stocker la configuration du runner sudo mkdir -p /opt/gitea-runner cd /opt/gitea-runner
|
||||
|
||||
|
||||
|
||||
# 2. Lancer un conteneur d'enregistrement interactif ou direct avec le socket Docker de l'hôte
|
||||
|
||||
# (Remplacez <VOTRE_TOKEN> par le jeton trouvé dans les paramètres Actions de votre dépôt Gitea)
|
||||
|
||||
sudo docker run --rm \
|
||||
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
|
||||
-v /opt/gitea-runner:/data \
|
||||
|
||||
gitea/act_runner:latest \
|
||||
|
||||
register \
|
||||
|
||||
--instance https://gitea.aethas38.duckdns.org \
|
||||
|
||||
--token e14c4cfc9b5aac64a3fb947013cd600c5b0cc08f \
|
||||
|
||||
--no-interactive \
|
||||
|
||||
--name aethas-docker-runner
|
||||
|
||||
Unable to find image 'gitea/act_runner:latest' locally
|
||||
|
||||
latest: Pulling from gitea/act_runner
|
||||
|
||||
16898cec0138: Pull complete
|
||||
|
||||
6a0ac1617861: Pull complete
|
||||
|
||||
f02f0d33dd06: Pull complete
|
||||
|
||||
ca801d1f9809: Pull complete
|
||||
|
||||
a599b7ca8c08: Download complete
|
||||
|
||||
Digest: sha256:b5c35d6bdbb9bb25e531230bfc7cc663cb751406cbec90a2a891b85fea54de86
|
||||
|
||||
Status: Downloaded newer image for gitea/act_runner:latest
|
||||
|
||||
.runner is missing or not a regular file
|
||||
|
||||
level=info msg="Registering runner, arch=amd64, os=linux, version=v0.6.1."
|
||||
|
||||
level=error msg="Invalid input, please re-run act command." error="instance address is empty"
|
||||
|
||||
Error: instance address is empty
|
||||
|
||||
Waiting to retry ...
|
||||
|
||||
level=info msg="Registering runner, arch=amd64, os=linux, version=v0.6.1."
|
||||
|
||||
level=error msg="Invalid input, please re-run act command." error="instance address is empty"
|
||||
|
||||
Error: instance address is empty
|
||||
|
||||
Waiting to retry ...
|
||||
|
||||
level=info msg="Registering runner, arch=amd64, os=linux, version=v0.6.1."
|
||||
|
||||
level=error msg="Invalid input, please re-run act command." error="instance address is empty"
|
||||
|
||||
Error: instance address is empty
|
||||
|
||||
Waiting to retry ...
|
||||
|
||||
a pas marché, pourquoine pas l'ajouter au fichier de gitea pour qu'il soit dansl même docker ?
|
||||
|
||||
AMOUR
|
||||
|
||||
L'erreur que vous rencontrez (instance address is empty) est un grand classique avec les images Docker officielles : le script de démarrage interne du conteneur (l'entrypoint) intercepte les arguments de la ligne de commande, ce qui fait que vos paramètres --instance et --token passent à la trappe.
|
||||
|
||||
Votre idée de l'ajouter directement au fichier docker-compose.yml de Gitea est excellente. C'est de loin la méthode la plus propre, la plus stable, et cela permet de tout gérer d'un seul bloc depuis Dockge.
|
||||
|
||||
Voici la mise à jour de votre fichier Gitea, suivie de l'intégration du module financier dans votre code Python.
|
||||
|
||||
1. Mise à jour du docker-compose.yml de Gitea
|
||||
Sur votre serveur, allez dans la stack de votre Gitea et remplacez le contenu par celui-ci. L'utilisation des variables d'environnement (GITEA_INSTANCE_URL, etc.) force le runner à s'enregistrer tout seul au démarrage !
|
||||
|
||||
YAML
|
||||
version: "3.8"
|
||||
services:
|
||||
gitea:
|
||||
image: gitea/gitea:latest
|
||||
container_name: gitea
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3000:3000
|
||||
- 2222:22
|
||||
volumes:
|
||||
- /DATA/AppData/gitea:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
|
||||
gitea-runner:
|
||||
image: gitea/act_runner:latest
|
||||
container_name: gitea_runner
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- GITEA_INSTANCE_URL=https://gitea.aethas38.duckdns.org
|
||||
- GITEA_RUNNER_REGISTRATION_TOKEN=e14c4cfc9b5aac64a3fb947013cd600c5b0cc08f
|
||||
- GITEA_RUNNER_NAME=aethas-docker-runner
|
||||
volumes:
|
||||
# Création d'un dossier dédié au runner pour qu'il soit persistant
|
||||
- /DATA/AppData/gitea-runner:/data
|
||||
# Montage du socket Docker indispensable pour que le runner puisse compiler des images
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
networks: {}
|
||||
Action : Cliquez sur Update puis Deploy dans Dockge. Votre runner va apparaître en quelques secondes dans l'onglet Actions de votre dépôt Gitea et votre paquet va se générer !
|
||||
|
||||
2. Intégration du Module Financier (Priorité)
|
||||
Puisque vous m'avez fourni les fichiers, nous pouvons intégrer le gestionnaire financier. L'orchestrateur va désormais estimer le coût localement via tiktoken avant même de lancer la cascade d'API. Si le coût pose problème, l'exécution est bloquée.
|
||||
PY
|
||||
+ 2
|
||||
|
||||
📄 Fichier mis à jour : modules/chat_handler.py
|
||||
J'ai importé verifier_et_valider_budget et ajouté le bloc de vérification financière stricte juste avant le lancement du moteur d'IA.
|
||||
PY
|
||||
+ 1
|
||||
|
||||
Python
|
||||
import uuid
|
||||
import time
|
||||
import re
|
||||
from fasthtml.common import *
|
||||
from modules.database import load_history, save_history
|
||||
from modules.scraper import rechercher_sur_google, extraire_contenu_urls
|
||||
from modules.router import nettoyer_decision_router
|
||||
from modules.ai_local import interroger_local_ollama
|
||||
from modules.ai_engine import executer_requete_ia
|
||||
from modules.ui_components import render_user_msg, render_ai_msg, render_sidebar
|
||||
from modules.logger import log_event
|
||||
from modules.billing_manager import verifier_et_valider_budget
|
||||
|
||||
async def handle_chat_request(request, session):
|
||||
start_time = time.time()
|
||||
try:
|
||||
form = await request.form()
|
||||
prompt = form.get("prompt", "")
|
||||
chat_id = form.get("chat_id", str(uuid.uuid4()))
|
||||
files = form.getlist("files")
|
||||
session['current_chat_id'] = chat_id
|
||||
|
||||
history = load_history()
|
||||
|
||||
# Identification temporaire de l'utilisateur (en attendant le module de connexion complet)
|
||||
utilisateur_nom = session.get('user', 'xavier')
|
||||
utilisateur_vip = utilisateur_nom.lower() in ["xavier", "céline", "anaëlle", "renan", "audric"]
|
||||
|
||||
# Extraction éphémère en RAM
|
||||
file_summary = []
|
||||
file_names = []
|
||||
for f in files[:10]:
|
||||
if f and f.filename:
|
||||
file_names.append(f.filename)
|
||||
content = await f.read()
|
||||
file_summary.append(f"\n--- Fichier: {f.filename} ---\n{content.decode('utf-8', errors='ignore')}")
|
||||
|
||||
liste_fichiers_str = ', '.join(file_names) if file_names else 'Aucun fichier'
|
||||
log_event("INFO", "SYSTEM", f"Requête reçue. Fichiers joints : {liste_fichiers_str}")
|
||||
|
||||
# L'IA Local (Qwen) orchestre la décision ! Focus sur l'efficience.
|
||||
sec_prompt = f"""Tu es l'Orchestrateur système. Analyse la requête et choisis le meilleur fournisseur IA :
|
||||
- "gemini" : (OBLIGATOIRE si fichiers joints), rédaction complexe, comparaisons ou recherches web.
|
||||
- "openrouter_chat" : requêtes générales, texte rapide, traduction, bureautique (Modèles gratuits).
|
||||
- "openrouter_code" : programmation, scripts, mathématiques, logique (Modèles gratuits).
|
||||
- "local" : salutations basiques, questions très simples.
|
||||
Renvoie STRICTEMENT un JSON : {{"intention": "Résumé...", "fournisseur": "gemini|openrouter_chat|openrouter_code|local"}}
|
||||
Requête : {prompt}"""
|
||||
|
||||
try:
|
||||
texte_routeur, _, _, _ = interroger_local_ollama(sec_prompt, "qwen2.5:3b")
|
||||
decision = nettoyer_decision_router(texte_routeur)
|
||||
except Exception:
|
||||
decision = {"intention": "Analyse de secours", "fournisseur": "gemini"}
|
||||
|
||||
intention = decision.get('intention', 'Analyse')
|
||||
fournisseur = decision.get('fournisseur', 'openrouter_chat').lower()
|
||||
|
||||
# Sécurité Absolue Fichiers -> Gemini
|
||||
if file_names:
|
||||
fournisseur = "gemini"
|
||||
intention += " (Forcé Gemini via Sécurité Fichiers)"
|
||||
|
||||
urls = re.findall(r'https?://[^\s]+', prompt)
|
||||
mots_cles = ["cherche", "recherche", "sur internet", "sur le web", "sur le net", "va sur", "trouve", "site", "donne", "historique", "version"]
|
||||
if any(m in prompt.lower() for m in mots_cles):
|
||||
urls.extend(rechercher_sur_google(prompt))
|
||||
|
||||
web_text = extraire_contenu_urls(list(set(urls))) if urls else ""
|
||||
|
||||
full_prompt = prompt + ("\n" + "\n".join(file_summary) if file_summary else "")
|
||||
if web_text:
|
||||
full_prompt += f"\n\n[Contexte web extrait :\n{web_text}\nUtilise ces informations pour répondre.]"
|
||||
|
||||
# --- VÉRIFICATION FINANCIÈRE PRÉALABLE ---
|
||||
if "openrouter" in fournisseur:
|
||||
modele_estime = "qwen/qwen-2.5-coder-32b-instruct:free" if fournisseur == "openrouter_code" else "meta-llama/llama-3.1-8b-instruct:free"
|
||||
# Déclenche une exception bloquante si le solde est insuffisant ou nécessite une validation
|
||||
verifier_et_valider_budget(full_prompt, modele_estime, utilisateur_vip)
|
||||
|
||||
# Délégation de l'exécution au Moteur d'IA (Cascade)
|
||||
reponse, couleur, fournisseur_nom, modele = executer_requete_ia(fournisseur, full_prompt)
|
||||
|
||||
if chat_id not in history:
|
||||
history[chat_id] = {"title": (prompt[:30] if prompt else "Discussion") + "...", "pinned": False, "timestamp": time.time(), "messages": []}
|
||||
|
||||
execution_time = round(time.time() - start_time, 1)
|
||||
|
||||
display_msg = prompt
|
||||
if file_names:
|
||||
display_msg += f"\n\n📎 **Fichiers joints :** {', '.join(file_names)}"
|
||||
display_msg += "\n> *🗑️ Note : Fichiers traités de manière éphémère en mémoire vive et détruits instantanément après analyse conformément aux règles de confidentialité.*"
|
||||
|
||||
history[chat_id]['messages'].append({"role": "user", "content": display_msg})
|
||||
history[chat_id]['messages'].append({"role": "ai", "content": reponse, "intention": intention, "fournisseur": fournisseur_nom, "modele": modele, "couleur": couleur, "execution_time": execution_time})
|
||||
save_history(history)
|
||||
|
||||
log_event("INFO", fournisseur_nom, f"Réponse générée en {execution_time}s.")
|
||||
return render_user_msg(display_msg), render_ai_msg(reponse, intention, fournisseur_nom, modele, couleur, execution_time), Script("renderMarkdown();"), render_sidebar()
|
||||
|
||||
except Exception as e:
|
||||
log_event("CRITICAL", "SYSTEM", f"Erreur critique dans handle_chat_request: {e}")
|
||||
# Capture l'erreur de paiement pour avertir l'utilisateur dans l'UI
|
||||
msg_erreur = str(e)
|
||||
if "VALIDATION_PAIEMENT_REQUISE" in msg_erreur or "SOLDE_INSUFFISANT" in msg_erreur:
|
||||
return Div(f"⚠️ Alerte Financière : {msg_erreur.split('|')[0]}", style="color:orange; background:#331a00; padding:15px; border-radius:10px;")
|
||||
return Div(f"Erreur système : {e}", style="color:red; background:#300; padding:15px; border-radius:10px;")
|
||||
Le module ai_engine.py reste exactement tel quel, aucune modification n'y est requise pour cette étape puisque la vérification se fait en amont ! Dès que votre Gitea Runner est en ligne, le package final s'assemblera avec cette nouvelle logique.
|
||||
PY
|
||||
|
||||
nner.v1.RunnerService/Register for 172.21.0.1:47176, 500 Internal Server Error in 0.5ms @ <autogenerated>:1(http.Handler.ServeHTTP-fm)
|
||||
|
||||
gitea | 2026/08/18 21:57:20 HTTPRequest [I] router: completed POST /api/actions/ping.v1.PingService/Ping for 172.21.0.1:34442, 200 OK in 1.0ms @ <autogenerated>:1(http.Handler.ServeHTTP-fm)
|
||||
|
||||
gitea | 2026/08/18 21:57:20 HTTPRequest [I] router: completed POST /api/actions/runner.v1.RunnerService/Register for 172.21.0.1:34448, 500 Internal Server Error in 0.7ms @ <autogenerated>:1(http.Handler.ServeHTTP-fm)
|
||||
|
||||
gitea | 2026/08/18 21:57:25 HTTPRequest [I] router: completed POST /api/actions/ping.v1.PingService/Ping for 172.21.0.1:34456, 200 OK in 1.0ms @ <autogenerated>:1(http.Handler.ServeHTTP-fm)
|
||||
|
||||
gitea | 2026/08/18 21:57:25 HTTPRequest [I] router: completed POST /api/actions/runner.v1.RunnerService/Register for 172.21.0.1:34462, 500 Internal Server Error in 0.7ms @ <autogenerated>:1(http.Handler.ServeHTTP-fm)
|
||||
|
||||
AMOUR
|
||||
|
||||
Bonjour Xavier ! L'analyse de vos logs est excellente et révèle exactement où se situe le blocage.
|
||||
|
||||
Le diagnostic est très clair :
|
||||
|
||||
Le Ping renvoie un 200 OK : cela signifie que le runner Gitea réussit parfaitement à communiquer avec votre serveur Gitea à travers le réseau.
|
||||
|
||||
Le Register renvoie une 500 Internal Server Error : cela signifie que le réseau fonctionne, mais que c'est le moteur interne de Gitea qui "plante" ou refuse la requête d'enregistrement.
|
||||
|
||||
La cause principale :
|
||||
Par défaut, lors d'une installation classique de Gitea, le module "Actions" est désactivé. Si un runner tente de s'enregistrer alors que la fonctionnalité n'est pas allumée dans la configuration (app.ini) de Gitea, le serveur panique et renvoie une erreur 500.
|
||||
|
||||
Voici comment activer les Actions directement via votre fichier docker-compose.yml (sans avoir à bidouiller le fichier app.ini à la main en SSH).
|
||||
|
||||
1. La mise à jour du docker-compose.yml (Stack Gitea)
|
||||
Allez dans Dockge, sur votre stack Gitea, et modifiez le code pour ajouter la ligne d'environnement GITEA__actions__ENABLED=true. J'en profite aussi pour forcer le runner à discuter directement avec Gitea sur le réseau interne Docker (http://gitea:3000), ce qui évite les boucles SSL avec Nginx Proxy Manager qui causent parfois des erreurs 500.
|
||||
|
||||
Voici le code complet à coller :
|
||||
|
||||
YAML
|
||||
version: "3.8"
|
||||
services:
|
||||
gitea:
|
||||
image: gitea/gitea:latest
|
||||
container_name: gitea
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
# 🔴 LA LIGNE MAGIQUE POUR ACTIVER LES ACTIONS :
|
||||
- GITEA__actions__ENABLED=true
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3000:3000
|
||||
- 2222:22
|
||||
volumes:
|
||||
- /DATA/AppData/gitea:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
|
||||
gitea-runner:
|
||||
image: gitea/act_runner:latest
|
||||
container_name: gitea_runner
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
# Communication directe en interne pour éviter le Proxy NPM
|
||||
- GITEA_INSTANCE_URL=http://gitea:3000
|
||||
- GITEA_RUNNER_REGISTRATION_TOKEN=e14c4cfc9b5aac64a3fb947013cd600c5b0cc08f
|
||||
- GITEA_RUNNER_NAME=aethas-docker-runner
|
||||
volumes:
|
||||
- /DATA/AppData/gitea-runner:/data
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
depends_on:
|
||||
- gitea
|
||||
|
||||
networks: {}
|
||||
2. Actions à réaliser
|
||||
Mettez à jour et déployez la stack dans Dockge.
|
||||
|
||||
Le conteneur Gitea va redémarrer avec le module Actions activé.
|
||||
|
||||
Le conteneur gitea-runner va démarrer, effectuer son Ping, puis lancer son Register. Cette fois-ci, Gitea l'acceptera avec un beau 200 OK !
|
||||
|
||||
Vérifiez ensuite dans l'interface web de votre Gitea (Paramètres du site -> Actions -> Runners) : votre runner aethas-docker-runner devrait apparaître en ligne (Online).
|
||||
|
||||
Dites-moi dès que c'est au vert, nous pourrons alors relancer le git push pour packager le projet !
|
||||
Reference in new issue
Block a user