Magasin de ressources d'un projet
Infrastructure

Installer DoInLab : une image Docker, trois volumes

De l'essai en une commande à la mise en production derrière un reverse-proxy : image publique, volumes indispensables, migration automatique et configuration entièrement pilotée depuis l'interface.

DoInLab est distribué sous forme d'image Docker publique. Une commande suffit pour l'essayer, un fichier de composition pour l'exploiter sérieusement. Voici les deux chemins, et les réglages à ne pas oublier.

Le dépôt d'images

L'image est publiée sur Docker Hub sous suntux57420/doinlabhub.docker.com/r/suntux57420/doinlab. Deux étiquettes : latest et la version datée au format AAAA-MM-RRR.

Caractéristiques de l'image : base python:3.12-slim, exécution sous un utilisateur non privilégié, contrôle de santé intégré, et un point d'entrée qui applique les migrations avant de démarrer le serveur.

Essayer en une commande

docker run -d \
  --name doinlab \
  -p 8000:8000 \
  -v doinlab_data:/app/data \
  -v doinlab_uploads:/app/uploads \
  -v doinlab_logs:/app/logs \
  -e SECRET_KEY=changez-cette-cle-secrete \
  suntux57420/doinlab:latest

L'application répond sur http://localhost:8000. Compte initial : admin / adminà changer immédiatement. Tant que ce n'est pas fait, une alerte de sécurité reste affichée dans l'interface, ce qui est une politesse dont il faut tenir compte.

Les trois volumes ne sont pas facultatifs : la base de données, les fichiers téléversés et les journaux vivent dedans. Sans eux, une mise à jour de l'image efface tout.

Installation de production

Un fichier d'environnement à la racine :

SECRET_KEY=une-cle-aleatoire-longue-et-unique
DATABASE_URL=sqlite:///./data/doinlab.db
LOG_LEVEL=INFO

La clé secrète signe les jetons de session : elle doit être longue, aléatoire et propre à l'installation. La changer déconnecte tout le monde — ce qui est justement l'effet recherché en cas de compromission.

Puis la composition, qui ajoute un moteur de recherche vectorielle utilisé pour la recherche sémantique :

services:
  doinlab:
    image: suntux57420/doinlab:latest
    container_name: doinlab-app
    restart: unless-stopped
    ports:
      - "8000:8000"
    volumes:
      - doinlab_data:/app/data
      - doinlab_uploads:/app/uploads
      - doinlab_logs:/app/logs
    env_file: [ .env ]
    environment:
      - ENVIRONMENT=production
      - LOG_LEVEL=INFO
    depends_on:
      qdrant:
        condition: service_started
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/"]
      interval: 30s
    networks: [ doinlab_net ]

  qdrant:
    image: qdrant/qdrant:latest
    container_name: doinlab-qdrant
    restart: unless-stopped
    expose: [ "6333", "6334" ]
    volumes:
      - qdrant_data:/qdrant/storage
    networks: [ doinlab_net ]

volumes:
  doinlab_data:
  doinlab_uploads:
  doinlab_logs:
  qdrant_data:

networks:
  doinlab_net:
    driver: bridge
docker compose up -d
docker compose ps
docker compose logs -f doinlab

Un point de conception à noter : le moteur vectoriel est exposé au seul réseau interne de la composition, pas à l'hôte. Il n'a aucune raison d'être joignable de l'extérieur, et cette précaution évite d'ouvrir un service sans authentification sur le réseau.

Derrière un reverse-proxy

Pour publier en HTTPS avec un vrai nom de domaine, on place l'application derrière un reverse-proxy — une configuration d'exemple est fournie dans le dépôt. Trois points d'attention :

  • transmettre les en-têtes d'origine (hôte, protocole, adresse du client), sans quoi les liens générés et la journalisation seront faux ;
  • relever la taille maximale des envois : on téléverse des photos et des documents ;
  • ne pas mettre en tampon les réponses du chat en flux — sinon le texte arrive d'un bloc à la fin, et tout l'intérêt du streaming disparaît.

Mettre à jour

docker compose pull
docker compose up -d

Au redémarrage, le point d'entrée exécute la migration de schéma : les tables manquantes sont créées, les existantes ne sont pas touchées. Aucune intervention manuelle n'est nécessaire.

La prudence élémentaire reste de mise : sauvegarder le volume de données avant une montée de version. La base étant un fichier, cela revient à le copier.

Tableau de bord après installation

Après le premier démarrage : le tableau de bord répond, et tout le reste se règle depuis l'administration — sans toucher au serveur.

Ce qui se configure ensuite, dans l'interface

L'installation ne demande rien d'autre. Tout le reste se règle dans l'administration :

  • l'IA — URL du serveur, clé éventuelle, modèle de texte, modèle de vision, température. Tout serveur compatible avec l'API OpenAI convient : un modèle local via Ollama, LM Studio, ou un service en ligne. Sans configuration, l'application fonctionne — simplement sans les enrichissements ;
  • la messagerie — serveur d'envoi et modèles de messages, avec un test de connexion qui n'envoie rien ;
  • l'authentification unique — n'importe quel fournisseur OpenID Connect, avec découverte automatique. L'adresse de retour à déclarer chez le fournisseur est https://votre-domaine/auth/oidc/callback ;
  • GitLab — pour créer un dépôt depuis un projet ; nécessite un jeton avec les droits d'écriture ;
  • les catégories d'inventaire, le nom de l'organisation, l'ouverture des inscriptions, et le mode maintenance.

Développement local

python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp env.example .env
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

Pas de base à installer, pas de service annexe obligatoire : SQLite est un fichier, et l'application crée ses répertoires au démarrage. C'est l'un des avantages pratiques du choix de pile — on est opérationnel en trois commandes.

Vérifications après installation

  1. l'application répond, et le contrôle de santé du conteneur est au vert ;
  2. le mot de passe administrateur a été changé — l'alerte a disparu ;
  3. un envoi de photo fonctionne : c'est ce qui valide les volumes et le traitement d'images ;
  4. si l'IA est configurée, une génération de description aboutit ;
  5. les journaux d'activité se remplissent.

Cinq minutes de contrôle qui évitent de découvrir un volume mal monté le jour où l'inventaire compte deux cents fiches.

La série DoInLab

  1. DoInLab : la solution en un coup d'œil
  2. Le parcours fonctionnel, écran par écran
  3. L'architecture technique
  4. Installer DoInLab avec Docker — vous y êtes

Image publique : suntux57420/doinlab sur Docker Hub — hub.docker.com/r/suntux57420/doinlab.

Retour au blog