PostgreSQL, MySQL, Redis, Meilisearch, Mailpit, Adminer, Dozzle, RabbitMQ et Node tournent dans une stack centrale.
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.
Modèle mental
Un hub. Des branches. Rien a bricoler.
Chaque projet ajoute uniquement son runtime applicatif via un override Compose local.
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
| Service | Container | Ports | Profil |
|---|---|---|---|
| PostgreSQL 16 | infra-postgres | 5432 | core |
| MySQL 8 | infra-mysql | 3306 | core |
| Redis 7 | infra-redis | 6379 | core |
| Meilisearch | infra-meilisearch | 7700 | core |
| Mailpit | infra-mailpit | 1025, 8025 | core |
| Adminer | infra-adminer | 9080 | core |
| Dozzle | infra-dozzle | 8888 | core |
| RabbitMQ | infra-rabbitmq | 5672, 15672 | async |
| Node.js 22 | infra-node | 3002, 5173 | node |
Référence CLI
Toutes les commandes devhub
Services
- devhub up [--with profile]
- Démarre les services partagés.
coreest lancé par défaut,asyncajoute 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.shouDEVHUB_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
.envou.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.