[{"data":1,"prerenderedAt":154},["ShallowReactive",2],{"seo-verification":3,"blog-deployer-stack-ia-self-hosted-gitea-ollama-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-deployer-stack-ia-self-hosted-gitea-ollama-vps-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"category":21,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":32,"intro":34,"sections":35,"ctaTitle":96,"ctaBody":97,"ctaButton":98,"ctaUrl":99,"relatedPosts":100},335,"deployer-stack-ia-self-hosted-gitea-ollama-vps",{"fr":10,"en":12,"ar":13,"es":14},"self-hosted-ai-stack-gitea-runners-and-ollama-on-a-vps","مكدس-ذكاء-اصطناعي-ذاتي-gitea-وollama-على-خادم-vps","stack-de-ia-self-hosted-gitea-runners-y-ollama-en-un-vps","Stack IA self-hosted : Gitea, runners et Ollama sur VPS","Déployez un pipeline IA complet sur votre VPS : forge Git Gitea, runners CI et inférence LLM avec Ollama. Aucun code ni prompt ne quitte votre serveur.",9,0,false,"2026-09-06T00:00:00+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":26},1,"Intelligence Artificielle","intelligence-artificielle","bg-purple-500\u002F10 text-purple-400","ia",[28],{"id":22,"name":23,"slug":24,"color":25,"icon":26},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fdeployer-stack-ia-self-hosted-gitea-ollama-vps-poster.svg",{"categorySlug":26,"appSlug":33},"ollama","GitHub Actions facture le temps de calcul, les API LLM cloud transmettent votre code aux serveurs du fournisseur. Pour un développeur qui gère du code client confidentiel, ces deux dépendances externes ne sont pas une option. Ce guide explique comment assembler, sur un seul VPS, une forge Gitea avec son moteur d'actions, un runner en conteneur Docker et un serveur d'inférence Ollama — un pipeline complet où ni une ligne de code ni un prompt ne quitte votre infrastructure. Cette approche a rassemblé 119 points sur Hacker News le 21 août 2026 (discussion : https:\u002F\u002Fnews.ycombinator.com\u002Fitem?id=49390463), signal que l'appétit pour les pipelines IA souverains ne faiblit pas.",[36,40,50,53,61,86,90,93],{"type":37,"title":38,"body":39},"h2","Pourquoi assembler cette stack sur un VPS","GitHub Actions et les API LLM cloud partagent le même défaut : ils déportent le traitement. Dans le premier cas, c'est votre code source qui tourne sur des runners mutualisés ; dans le second, c'est le contexte de vos requêtes qui est envoyé à un tiers. Pour une agence ou un indépendant qui gère du code client sous NDA, l'un ne peut pas aller sans corriger l'autre.\n\nGitea intègre nativement un moteur d'actions compatible GitHub Actions depuis sa version 1.19. Ollama expose une API REST locale sur le réseau Docker interne. Un runner `act_runner` en conteneur lit vos workflows `.yml` comme GitHub les lirait — et appelle Ollama à la place d'une API cloud. La stack entière fonctionne avec `docker compose up -d` et ne génère aucun trafic sortant vers les API de grands modèles.",{"type":41,"title":42,"items":43},"ul","Bénéfices concrets de cette architecture",[44,45,46,47,48,49],"**Confidentialité totale du code** : les runners s'exécutent sur votre VPS, le code cloné ne quitte jamais votre réseau Docker interne.","**Zéro token envoyé à l'extérieur** : Ollama sert l'inférence localement ; aucune requête ne part vers openai.com ou anthropic.com.","**Coût fixe et prévisible** : pas de facturation à l'exécution de workflow, pas de facturation au token — une ligne de budget mensuelle, quelle que soit la charge.","**Workflows GitHub Actions réutilisables** : Gitea Actions est compatible avec la syntaxe `.github\u002Fworkflows\u002F` ; vos pipelines migrent sans réécriture.","**Modèles librement échangeables** : Qwen2.5-Coder, DeepSeek-Coder, Llama 3.1 ou Mistral — une commande `ollama pull` pour changer de modèle, sans toucher au pipeline.","**Audit et traçabilité complets** : logs de runners, historique des modèles chargés et journaux nginx restent sur votre infrastructure et vous appartiennent.",{"type":37,"title":51,"body":52},"Prérequis matériels et logiciels","La contrainte dimensionnante est la mémoire vive : le modèle doit tenir entièrement en RAM pour que l'inférence reste réactive. Un modèle 7B quantisé au format Q4_K_M demande environ 5 à 6 Go de RAM ; en ajoutant Gitea (moins de 100 Mo au repos) et le runner, comptez **8 Go minimum** pour un modèle 7B et **16 Go recommandés** pour un modèle 13B.\n\nPour le CPU, deux vCPU suffisent pour Gitea et les runners ; l'inférence CPU-only sur un modèle 7B prend quelques secondes par réponse, ce qui est acceptable pour une revue de code automatisée. Un GPU dédié réduit ce délai à moins d'une seconde, mais n'est pas requis pour un usage pipeline CI.\n\nLogiciels requis sur le VPS : **Docker Engine** et **Docker Compose v2**, un nom de domaine pointant vers votre serveur (pour les certificats TLS de Gitea), et les ports 3000 (Gitea) et 11434 (Ollama, réseau interne uniquement) disponibles.",{"type":41,"title":54,"items":55},"Modèles recommandés selon la RAM disponible",[56,57,58,59,60],"**Qwen2.5-Coder:7B** (format Q4_K_M, ~5 Go de RAM) — rapport qualité\u002Fressources équilibré pour les revues de code en 2026 ; compréhension du contexte étendu et des conventions de style.","**DeepSeek-Coder:6.7B** (format Q4, ~4,5 Go de RAM) — alternative compacte si la RAM est serrée ; précis sur le Python, le JavaScript et les diffs de moins de 200 lignes.","**Llama 3.1:8B** (format Q4_K_M, ~5,5 Go de RAM) — généraliste multilingue, utile si vos projets mélangent le code et de la documentation en plusieurs langues.","**Mistral:7B** (format Q4_K_M, ~4,5 Go de RAM) — réponses courtes et directes, idéal pour un résumé de diff plutôt qu'une analyse détaillée.","**Passage à un modèle 13B** — sur un VPS de 16 Go ou plus, `codellama:13b` ou `qwen2.5-coder:14b` améliorent les revues sur des diffs larges ; le temps d'inférence CPU passe de ~5 s à ~15 s par appel.",{"type":62,"title":63,"steps":64},"steps","Déployer la stack Gitea + Ollama + runner",[65,68,71,74,77,80,83],{"title":66,"body":67},"Créer la structure de fichiers","Créez un répertoire de projet et un fichier `docker-compose.yml` qui déclare trois services : `gitea`, `ollama` et `runner`. Placez tous les volumes dans un sous-dossier `data\u002F` pour faciliter les sauvegardes.\n\n```bash\nmkdir -p ~\u002Fgitea-stack\u002Fdata\u002F{gitea,ollama,runner}\ncd ~\u002Fgitea-stack\n```",{"title":69,"body":70},"Écrire le docker-compose.yml","Le fichier déclare un réseau interne `ai-net` sur lequel les trois services communiquent. Ollama n'est pas exposé sur l'hôte : seul le runner peut l'atteindre via le réseau Docker.\n\n```bash\ncat > docker-compose.yml \u003C\u003C 'EOF'\nversion: \"3.8\"\n\nnetworks:\n  ai-net:\n    driver: bridge\n\nvolumes:\n  gitea-data:\n  ollama-data:\n  runner-data:\n\nservices:\n  gitea:\n    image: gitea\u002Fgitea:latest\n    restart: unless-stopped\n    networks: [ai-net]\n    ports:\n      - \"3000:3000\"\n      - \"2222:22\"\n    volumes:\n      - gitea-data:\u002Fdata\n    environment:\n      - GITEA__server__DOMAIN=git.votredomaine.com\n      - GITEA__server__ROOT_URL=https:\u002F\u002Fgit.votredomaine.com\n      - GITEA__actions__ENABLED=true\n\n  ollama:\n    image: ollama\u002Follama:latest\n    restart: unless-stopped\n    networks: [ai-net]\n    volumes:\n      - ollama-data:\u002Froot\u002F.ollama\n\n  runner:\n    image: gitea\u002Fact_runner:latest\n    restart: unless-stopped\n    networks: [ai-net]\n    volumes:\n      - runner-data:\u002Fdata\n      - \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock\n    environment:\n      - GITEA_INSTANCE_URL=http:\u002F\u002Fgitea:3000\n      - GITEA_RUNNER_REGISTRATION_TOKEN=${RUNNER_TOKEN}\n      - GITEA_RUNNER_NAME=local-runner\n      - OLLAMA_URL=http:\u002F\u002Follama:11434\nEOF\n```",{"title":72,"body":73},"Démarrer Gitea et récupérer le token runner","Démarrez uniquement Gitea en premier pour terminer l'installation initiale et générer le token d'enregistrement du runner.\n\n```bash\ndocker compose up -d gitea\n```\n\nOuvrez `http:\u002F\u002F\u003Cip-du-vps>:3000` dans votre navigateur, terminez l'assistant d'installation, puis allez dans **Paramètres du site → Actions → Runners** pour créer un token d'enregistrement. Notez ce token — vous en aurez besoin à l'étape suivante.",{"title":75,"body":76},"Démarrer Ollama et télécharger un modèle","Démarrez Ollama et téléchargez votre modèle. Pour un pipeline de revue de code, `qwen2.5-coder:7b` ou `deepseek-coder:6.7b` offrent un bon rapport qualité\u002Fressources.\n\n```bash\ndocker compose up -d ollama\n# télécharger un modèle de code\ndocker exec gitea-stack-ollama-1 ollama pull qwen2.5-coder:7b\n# vérifier que l'API répond sur le réseau interne\ndocker run --rm --network gitea-stack_ai-net curlimages\u002Fcurl \\\n  http:\u002F\u002Follama:11434\u002Fapi\u002Ftags\n```\n\nLa réponse JSON liste les modèles disponibles — confirmation que l'API Ollama est accessible depuis le réseau Docker interne.",{"title":78,"body":79},"Enregistrer le runner et démarrer la stack complète","Créez un fichier `.env` avec le token récupéré à l'étape 3, puis démarrez le runner.\n\n```bash\necho \"RUNNER_TOKEN=votre_token_ici\" > .env\ndocker compose up -d runner\n# vérifier que le runner est bien enregistré\ndocker compose logs runner | tail -20\n```\n\nVérifiez dans **Paramètres du site → Actions → Runners** que votre runner apparaît avec le statut **Actif**.",{"title":81,"body":82},"Créer un workflow qui appelle Ollama","Dans un dépôt Gitea, créez `.gitea\u002Fworkflows\u002Freview.yml`. Le workflow clone le code, appelle l'endpoint `\u002Fapi\u002Fchat` d'Ollama via `curl` et poste le résultat en commentaire de la pull request.\n\n```bash\ncat > .gitea\u002Fworkflows\u002Freview.yml \u003C\u003C 'EOF'\nname: AI Code Review\non:\n  pull_request:\n    types: [opened, synchronize]\n\njobs:\n  review:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - name: Revue de code via Ollama\n        run: |\n          DIFF=$(git diff HEAD~1 --unified=5 | head -200)\n          curl -s ${OLLAMA_URL:-http:\u002F\u002Follama:11434}\u002Fapi\u002Fchat \\\n            -H 'Content-Type: application\u002Fjson' \\\n            -d \"{\\\"model\\\": \\\"qwen2.5-coder:7b\\\", \\\"stream\\\": false,\n                 \\\"messages\\\": [{\\\"role\\\": \\\"user\\\",\n                 \\\"content\\\": \\\"Revue ce diff Git en français : $DIFF\\\"}]}\" \\\n            | jq -r '.message.content'\nEOF\n```\n\nPoussez ce fichier sur votre forge Gitea — le runner le détecte et lance le job sur le réseau interne, sans aucun accès à Internet.",{"title":84,"body":85},"Mettre Gitea derrière un reverse proxy HTTPS","Placez Gitea derrière nginx ou Caddy avec un certificat Let's Encrypt pour exposer la forge sur `git.votredomaine.com`. Le port 3000 ne doit plus être accessible directement depuis l'extérieur.\n\n```bash\n# exemple nginx minimal\ncat > \u002Fetc\u002Fnginx\u002Fsites-available\u002Fgitea.conf \u003C\u003C 'EOF'\nserver {\n    listen 443 ssl;\n    server_name git.votredomaine.com;\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fgit.votredomaine.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fgit.votredomaine.com\u002Fprivkey.pem;\n\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:3000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}\nEOF\nnginx -t && systemctl reload nginx\n```\n\nOllama reste uniquement sur le réseau Docker interne et n'est jamais exposé sur Internet.",{"type":87,"title":88,"body":89},"tip","Vérifier qu'aucun token ne part vers l'extérieur","Pour confirmer que les appels LLM restent bien sur votre VPS, capturez le trafic réseau sortant pendant l'exécution d'un workflow : `tcpdump -i eth0 -n 'dst port 443 and dst host openai.com'`. Zéro paquet capturé valide l'isolation. Vous pouvez aussi inspecter les logs Ollama (`docker compose logs ollama`) : chaque requête d'inférence y est tracée avec l'adresse source — elle doit toujours être l'IP du réseau Docker interne, jamais une IP externe.",{"type":37,"title":91,"body":92},"Coût comparé : VPS self-hosted vs API cloud","Un modèle 7B traite environ 30 000 à 50 000 tokens par minute sur deux vCPU. Une revue de diff de 150 lignes consomme environ 800 tokens (prompt + réponse). Sur 1 000 revues mensuelles — un volume réaliste pour une équipe de cinq développeurs — cela représente 800 000 tokens.\n\nCôté cloud, gpt-4o-mini facture 0,15 $ pour 1 million de tokens en entrée et 0,60 $ en sortie (tarifs OpenAI de septembre 2026). Pour 800 000 tokens : environ 0,70 $ par mois. Claude Haiku est dans la même fourchette. L'argument financier est donc faible pour des volumes modérés.\n\nL'argument qui tient est la **confidentialité** : les diffs de code client, les clés d'API présentes dans les messages d'erreur, les noms de variables métier — tout cela sort du réseau avec chaque appel à une API externe. Sur un VPS ServOrbit à 8 Go de RAM (autour de 15 € par mois), l'inférence locale ne coûte rien de plus et aucun token ne part vers l'extérieur.",{"type":37,"title":94,"body":95},"Aller plus loin : observer et enrichir le pipeline","Une fois la stack de base opérationnelle, deux extensions sont naturelles. La première est d'ajouter **Langfuse** en cinquième service : il trace chaque appel LLM (modèle, durée, tokens consommés, résultat), ce qui permet de mesurer la qualité des revues, de détecter les régressions de modèle et de comparer les résultats sur votre corpus réel avant de changer de version. La seconde est de paralléliser les runners : un second `act_runner` avec un label différent (par exemple `gpu`) peut cibler un nœud avec accès GPU pour les jobs d'inférence lourds, tandis que les jobs légers (lint, tests unitaires) continuent sur le runner CPU de base.\n\nPour la sauvegarde, les volumes `gitea-data` et `ollama-data` contiennent respectivement les dépôts et les modèles téléchargés. Un snapshot quotidien de ces deux volumes suffit à restaurer la stack complète en moins de dix minutes. Les modèles Ollama pouvant être retéléchargés à la demande depuis le registre public, seul `gitea-data` est réellement critique pour la continuité de service et la préservation de l'historique Git.","Votre VPS pour cette stack IA","Un VPS ServOrbit avec accès root, Docker préinstallé et IPv4 dédiée est la base sur laquelle Gitea, les runners et Ollama tournent sans partage de ressources ni trafic sortant imposé.","Voir les VPS","\u002Fsolutions\u002Fdeveloppeurs",[101,124,139],{"id":102,"slug":103,"slugs":104,"title":108,"excerpt":109,"readTime":110,"views":18,"isPinned":19,"publishedAt":111,"category":112,"categories":118,"featuredImage":29,"bgImage":30,"posterImage":120,"relatedSolution":121},74,"heberger-gitea",{"fr":103,"en":105,"ar":106,"es":107},"host-gitea-on-your-own-vps","استضافة-gitea-على-خادم-vps-الخاص-بك","alojar-gitea-en-un-vps","Héberger Gitea sur votre propre VPS en 2026","Déployez Gitea sur un VPS avec Docker et SSL. Guide complet : installation, migration vers Forgejo v16 et comparatif gouvernance.",8,"2026-04-07T00:00:00+00:00",{"id":113,"name":114,"slug":115,"color":116,"icon":117},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[119],{"id":113,"name":114,"slug":115,"color":116,"icon":117},"\u002Fblog\u002Fcovers\u002Fheberger-gitea-poster.svg",{"categorySlug":122,"appSlug":123},"developpement","gitea",{"id":125,"slug":126,"slugs":127,"title":131,"excerpt":132,"readTime":17,"views":18,"isPinned":19,"publishedAt":133,"category":134,"categories":135,"featuredImage":29,"bgImage":30,"posterImage":137,"relatedSolution":138},11,"heberger-ollama-vps",{"fr":126,"en":128,"ar":129,"es":130},"how-to-host-ollama-on-a-vps","كيفية-استضافة-ollama-على-خادم-vps","como-alojar-ollama-en-un-vps","Héberger Ollama sur un VPS : guide opérationnel avancé","Configuration avancée d'Ollama sur VPS : gestion des modèles, reverse proxy nginx, sécurité API, quantisation Q4_K_M\u002FQ8, CVE-2026-45672 Open WebUI et couplage sécurisé.","2026-06-09T00:00:00+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":26},[136],{"id":22,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fheberger-ollama-vps-poster.svg",{"categorySlug":26,"appSlug":33},{"id":140,"slug":141,"slugs":142,"title":146,"excerpt":147,"readTime":110,"views":18,"isPinned":19,"publishedAt":148,"category":149,"categories":150,"featuredImage":29,"bgImage":30,"posterImage":152,"relatedSolution":153},271,"github-copilot-ai-credits-alternative-vps",{"fr":141,"en":143,"ar":144,"es":145},"github-copilot-ai-credits-take-back-control-with-a-vps","github-copilot-ai-credits-استعد-السيطرة-مع-خادم-vps","github-copilot-ai-credits-recuperar-control-con-un-vps","GitHub Copilot AI Credits : reprendre le contrôle sur un VPS","Depuis juin 2026, Copilot facture en AI Credits et la prévisibilité disparaît. Hébergez Ollama ou Tabby sur un VPS : coût fixe, invites privées.","2026-08-16T00:00:00+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":26},[151],{"id":22,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fgithub-copilot-ai-credits-alternative-vps-poster.svg",{"categorySlug":26,"appSlug":33},1789046108082]