Optimiser et sécuriser OpenCode avec Docker et greyproxy

TLDR
J’utilise Opencode (équivalent de claude code opensource) comme Outil d’IA dans mon terminal, mais ces outils peuvent faire tout et n’importe quoi donc j’avais le besoin de limiter et voir ce que font ces outils.
L’objectif est aussi d’isoler Opencode pour limiter son impact si il déraille.
Voici les mécanismes mis en place :
- L’isolation du filesystem se fait avec docker (et des volumes), opencode n’a accès qu’aux dossiers nécessaires (config, état, projet courant) et il ne peut pas passer root dans le container.
- L’isolation réseau se fait via :
- un réseau docker et des règles iptables qui bloquent tout le trafic sortant sauf vers greyproxy.
- Greyproxy permet de contrôler et d’observer tout le trafic HTTP/HTTPS d’OpenCode via a dashboard où l’on accepte les flux réseaux.
Greyproxy:

Le deuxième aspect est l’optimisation du nombre de token utilisé avec :
- rtk qui intercepte certaines commandes d’OpenCode (ls, cat, grep, git, …) pour réduire la sortie.
Optimiser et sécuriser OpenCode avec Docker et greyproxy
Contexte
OpenCode est un agent de coding IA qui s’exécute localement. Il appelle des LLM externes, lit et modifie des fichiers, exécute des commandes shell, il peut donc potentiellement appeler un site corrumpu ou installer un malwhare.
Les risques concrets :
- Exfiltration de données : OpenCode peut faire des requêtes HTTP vers l’extérieur. Sans contrôle, il pourrait envoyer du code source ou des données sensibles à un serveur malveillant.
- Alteration du système : OpenCode peut modifier des fichiers système ou exécuter des commandes dangereuses, compromettant la stabilité ou la sécurité de la machine hôte.
- Téléchargement de malwares : OpenCode peut télécharger et exécuter des binaires. Un prompt mal formulé pourrait conduire à l’installation d’un malware.
Architecture
L’architecture repose sur deux conteneurs et des règles réseau iptables sur l’hôte :
|
|
greyproxy joue le rôle de passerelle unique : tout le trafic HTTPS d’OpenCode passe par lui. C’est le seul point de sortie autorisé par les règles iptables.
Mise en pratique
1. Le conteneur greyproxy
Greyproxy est un proxy HTTP/HTTPS minimaliste de GreyhavenHQ.
Parmi les fonctionnalités de greyproxy, il y a :
- un dashboard web d’activité qui affiche toutes les requêtes interceptées en temps réel
- un dashboard avec les requêtes en attente.
- un jeu de règles persistentes (Allow or Deny)

J’ai fait le choix de le faire tourner dans un container Docker mais c’est purement optionnel, il peut aussi tourner directement sur l’hôte.
Son Dockerfile est volontairement minimal :
|
|
Pour construire et démarrer greyproxy :
|
|
2. Le réseau isolé et les règles iptables
On crée un réseau Docker isolé sans accès à l’internet, sans ce réseau et les règles iptables associées, OpenCode pourrait faire du trafic direct vers l’extérieur sans passer par greyproxy.
|
|
On ajoute ensuite deux règles iptables sur l’hôte :
|
|
3. Le conteneur OpenCode
Je fais tourner OpenCode dans un conteneur Docker pour bénéficier de l’isolation du filesystem.
Le Dockerfile OpenCode est plus fourni — c’est l’environnement de travail complet, le user s’appelle jhanos mais libre à vous de le changer:
|
|
Points de sécurité à noter :
Durcissement de l’utilisateur :
|
|
On supprime l’utilisateur ubuntu par défaut (présent dans l’image Ubuntu officielle) et on crée un utilisateur avec UID/GID fixe à 1000. Les seuils UID_MIN/GID_MIN sont explicitement fixés pour éviter toute création accidentelle d’utilisateur système avec un UID bas.
4. La commande de lancement
Voici la commande complète commentée :
|
|
Explication des options clés :
| Option | Rôle |
|---|---|
--net isolated_ai |
Connecte au réseau interne sans accès internet direct |
-v auth.json:ro |
Credentials montés en lecture seule — OpenCode lit les tokens mais ne peut pas les modifier |
-v ${PWD}:${PWD} |
Le projet est monté avec le même chemin absolu — les outils qui calculent des chemins relatifs fonctionnent correctement |
-u $(id -u):$(id -g) |
Injection de l’UID/GID de l’hôte au runtime — les fichiers créés appartiennent à l’utilisateur hôte, pas root |
-w $(pwd) |
Le répertoire de travail correspond au projet courant |
HTTP_PROXY / HTTPS_PROXY |
Tout le trafic HTTP(S) passe par greyproxy sur l’hôte |
-p 19876:19876 |
Port de l’interface web OpenCode |
Ajoutez cette commande en alias dans votre .bashrc ou .zshrc :
|
|
OpenCode:

5. Optimisation de token via rtk
rtk est l’outil pour optimiser le nombre de token.
rtk init -g --opencode configure OpenCode pour utiliser rtk via un plugin opencode.
Il intercepte certaines commandes (ls, cat, grep, git, …) pour réduire la sortie envoyée au LLM, ce qui permet d’économiser des tokens et d’accélérer les interactions.
Example:
|
|
Récapitulatif
| Couche | Mécanisme | Effet |
|---|---|---|
| Réseau | subnet dédié | Réseau dédié pour opencode |
| Pare-feu | iptables DROP + ACCEPT ciblé | Seul le trafic vers greyproxy passe |
| Proxy | greyproxy | Point de sortie unique, observable |
| Conteneur | Non-root uid 1000 dans les deux images | Pas d’escalade de privilèges |
| Credentials | auth.json monté :ro |
Tokens lisibles mais non modifiables |
| UID runtime | -u $(id -u):$(id -g) |
Fichiers créés appartiennent à l’utilisateur hôte |
| Optimisation | rtk | Réduction du nombre de tokens utilisés |
Conclusion
Cette architecture offre une isolation solide pour faire tourner un agent IA sur sa machine sans sacrifier l’ergonomie. OpenCode reste utilisable en mode interactif dans le terminal, avec accès au projet courant et aux credentials — mais dans un périmètre réseau strictement contrôlé.
Les prochaines étapes possibles pour aller plus loin :
- Calcul des tokens des LLMs : ajouter des outils de monitoring pour calculer la consommation de token.