dh DevHub Infra locale pour projets worktree

Docker Compose local. Git worktrees. Ports localhost.

DevHub

Une infra locale nette pour lancer plusieurs branches sans dupliquer Docker.

Les services communs tournent une fois. Chaque worktree garde son dossier, son port, son environnement et ses URLs servies a la racine.

devhub.local
active project
acme-api
Symfony, FrankenPHP, PostgreSQL
ready
main
8101
feat-payment
8102
fix-auth
8103
Shared network dev-shared-net
infra-postgres infra-redis infra-mailpit

Modèle mental

Un hub. Des branches. Rien a bricoler.

Services partagés

PostgreSQL, MySQL, Redis, Meilisearch, Mailpit, Adminer, Dozzle, RabbitMQ et Node tournent dans une stack centrale.

Runtimes projet

Chaque projet ajoute uniquement son runtime applicatif via un override Compose local.

Worktrees isolés

Chaque branche a son chemin, son port, sa base et son environnement local.

Installation

Installer DevHub

Installation sans sudo dans ~/.local/share/devhub, avec un lien devhub dans ~/.local/bin.

Installation distante

curl -fsSL https://raw.githubusercontent.com/dev-toolings/dev-infra/main/install-remote.sh | bash

Chemin personnalisé

DEVHUB_DIR=~/tools/devhub curl -fsSL https://raw.githubusercontent.com/dev-toolings/dev-infra/main/install-remote.sh | bash

Installation manuelle

git clone git@github.com:dev-toolings/dev-infra.git dev-infra
cd dev-infra
cp .env.example .env
make install

Quick start

Démarrer, vérifier, ouvrir.

devhub up
devhub ps
devhub doctor
devhub open adminer
devhub db create myapp
Services fournis par DevHub
Service Container Ports Profil
PostgreSQL 16infra-postgres5432core
MySQL 8infra-mysql3306core
Redis 7infra-redis6379core
Meilisearchinfra-meilisearch7700core
Mailpitinfra-mailpit1025, 8025core
Adminerinfra-adminer9080core
Dozzleinfra-dozzle8888core
RabbitMQinfra-rabbitmq5672, 15672async
Node.js 22infra-node3002, 5173node

Référence CLI

Toutes les commandes devhub

Services

devhub up [--with profile]
Démarre les services partagés. core est lancé par défaut, async ajoute RabbitMQ.
devhub down
Stoppe et supprime les containers de la stack DevHub, sans supprimer les volumes.
devhub restart
Redémarre les services core.
devhub ps
Affiche l'état Compose de tous les services.
devhub logs [service]
Suit les logs de toute la stack ou d'un service donné.

Outils et diagnostics

devhub open mailpit|adminer|dozzle|rabbitmq|meili
Ouvre une UI locale dans le navigateur.
devhub doctor
Contrôle le chemin DevHub, le réseau Docker, la santé des containers et les ports hôte.
devhub help
Affiche l'aide CLI embarquée.

Base de données

devhub db create <db> [user] [password]
Crée une base PostgreSQL et un rôle. Par défaut, user et password reprennent le nom de base.
devhub db list
Liste les bases non-template du container infra-postgres.
devhub db import [args]
Lance un script d'import custom via data/scripts/import-db.sh ou DEVHUB_IMPORT_SCRIPT.

Runtimes projet

devhub runtime <project>
Démarre l'override overrides/<project>-app.override.yml.
devhub down-runtime <project>
Stoppe uniquement les services projet, pas l'infra partagée.

Project registry

Créer un projet prêt pour les worktrees.

Un projet enregistré écrit un fichier local data/projects/<project>.env, un override Compose et les fichiers Docker runtime.

Projet Symfony existant

devhub project init acme-api \
  --stack symfony \
  --repo ~/projects/acme/api \
  --base develop

devhub wt add acme-api feat/payment develop
devhub runtime acme-api
devhub wt list acme-api

Nouveau projet FastAPI DDD

mkdir -p ~/dev
cd ~/dev
devhub project init billing-api --stack fastapi-ddd
devhub runtime billing-api

project init

--stack
Obligatoire. Valeurs: symfony, laravel, nextjs, tanstack-start, hono, fastapi-ddd.
--root
Optionnel. Sans cette option, DevHub crée ./<name> depuis le dossier courant.
--repo
Chemin Git existant, bare repo ou URL distante.
--base
Référence de base par défaut pour les nouveaux worktrees. Défaut: main.
--port-start, --port-end, --runtime-port
Contrôle les ports de worktrees et le port dashboard runtime.

wt

devhub wt add <project> <branch> [base]
Crée le worktree, choisit le premier port libre et génère .env ou .env.local.
devhub wt list <project>
Affiche les worktrees, branches et URLs localhost.
devhub wt rm <project> <slug>
Supprime le worktree via Git, retire les fichiers env locaux et recharge le runtime si besoin.

Templates

Comportement par stack

Symfony

FrankenPHP, Caddy multi-sites, public/, .env.local, PostgreSQL, Redis, Mailpit, Meilisearch.

Laravel

FrankenPHP, Caddy, .env, variables DB_*, Redis et Mailpit préconfigurés.

Next.js

Runtime Bun, bun install, bun run dev, port injecté via DEVHUB_PORT.

TanStack Start

Runtime Bun, host 0.0.0.0, port par worktree, DSN partagés disponibles.

Hono

Runtime Bun pour APIs TypeScript, variables PORT, DATABASE_URL, REDIS_URL.

FastAPI DDD

Runtime Python, Uvicorn reload, scaffold domain, application, infrastructure, interfaces.

Exemples

Recettes prêtes a copier

Laravel

devhub project init crm-api --stack laravel --repo git@github.com:org/crm-api.git
devhub wt add crm-api main origin/main
devhub runtime crm-api

Next.js

devhub project init webapp --stack nextjs --repo git@github.com:org/webapp.git
devhub wt add webapp feat/search origin/main
devhub runtime webapp

Hono

devhub project init edge-api --stack hono --repo git@github.com:org/edge-api.git
devhub wt add edge-api main origin/main
devhub runtime edge-api

Troubleshooting

Problèmes courants

Port déjà occupé

wt add saute les ports déjà en écoute si ss est disponible. Change la plage avec --port-start et --port-end si besoin.

Projet inconnu

Vérifie devhub project list. Le registre local vit dans data/projects/*.env et reste ignoré par Git.

Override manquant

Relance devhub project init ... ou vérifie overrides/<project>-app.override.yml.

Pages GitHub non publiée

Le site est publié par workflow GitHub Actions. Contrôle le dernier run Pages et l'URL Pages du repository.