Runtimes disponibles
12 façons de faire tourner du code, qui couvrent la quasi-totalité des cas. Le runtime se choisit à la création du site, et se lit ensuite sur sa fiche.
| Runtime | Techno | Port interne | Build 1er boot |
|---|---|---|---|
| static | nginx serving HTML/CSS/JS | 80 | ~15s |
| frontend-static | Astro/Vite/Svelte/Nuxt/Gatsby/CRA/Angular build → nginx | 80 | ~1-3 min |
| wordpress | PHP-FPM 8.3 + MariaDB embarquée | 80 | ~2 min |
| nextjs | Next.js SSR, standalone ou next start | 3000 | ~2-4 min |
| nextjs-ssg | next export → nginx | 80 | ~1-2 min |
| django | Python 3.12 + gunicorn | 8000 | ~2-3 min |
| rails | Ruby 3.3 + puma | 3000 | ~3-5 min |
| php-generic | PHP-FPM 8.3 + Apache | 80 | ~15s |
| node-generic | Node 22, gestionnaire du dépôt via corepack | 3000 | ~1-2 min |
| python-generic | Python 3.12 + gunicorn+uvicorn | 8000 | ~1-2 min |
| docker-image | Image DockerHub telle quelle | user-defined | temps de pull |
| custom | docker-compose.yml fourni | user-defined | dépend |
Détails par runtime
static
Site statique servi par nginx. HTML/CSS/JS/images pré-buildés. Aucun build côté Iridflow.
Structure attendue : ton code dans site/. index.html à la racine.
Use cases : landing pages, sites générés (Hugo/Jekyll/11ty) uploadés déjà buildés.
package.json avec un script build qui produit un dossier statique (Astro, Vite, Svelte, Nuxt, Gatsby, CRA, Angular) → utilise frontend-static, PAS static. Sinon nginx sert les sources brutes (<script src="/src/main.tsx">) que le navigateur ne peut pas exécuter.frontend-static
Runtime générique pour tous les frameworks JS build → static : Astro, Vite (React/Vue/Svelte), SvelteKit adapter-static, Nuxt generate, Gatsby, Create React App, Angular, Vue CLI.
Comportement : Dockerfile multi-stage détecte le lockfile (pnpm/yarn/npm), lance npm run build, puis nginx sert le dossier de sortie.
Détection auto du dossier de sortie (dans cet ordre) :
dist/(Astro, Vite, Vue)build/(CRA, SvelteKit adapter-static).output/public/(Nuxt generate)public/avecindex.html(Gatsby)dist/<app>/browser/(Angular 17+)dist/<app>/(Angular ≤ 16)
Override : env vars du site IRIDFLOW_BUILD_CMD et IRIDFLOW_OUTPUT_DIR.
nginx config auto : SPA fallback (try_files $uri /index.html), cache immutable sur les assets hashés, no-cache sur index.html.
wordpress
PHP-FPM 8.3 + MariaDB embarquée dans le compose. Volumes persistants pour wp-content/ et la DB.
Structure : le contenu WordPress vit dans wp_content/. Le core WP est monté auto.
Setup admin : après boot, visite https://<url>/wp-admin/install.php.
Credentials DB : dans .secrets.txt du site (chmod 600, admin only).
nextjs (SSR)
Next.js App Router, construction multi-étapes sur Node 22 alpine.
Rien n'est requis dans next.config. La sortie est détectée après la construction : si l'application produit .next/standalone, elle démarre sur node server.js ; sinon elle démarre sur next start avec ses dépendances. Next.js 16 produit cette sortie par défaut, les versions antérieures l'activent par output: "standalone", et les deux fonctionnent.
Le gestionnaire de paquets est celui de votre dépôt. Un pnpm-lock.yaml ou unyarn.lock est respecté, et corepack pose la version exacte épinglée par le champ packageManager de votre package.json.
nextjs et node-generic, IRIDFLOW_PREBUILD_CMD exécute une commande entre l'installation et la construction, et IRIDFLOW_BUILD_ENV fournit les variables dont la construction a besoin. Sur frontend-static, IRIDFLOW_BUILD_CMD remplace npm run build et IRIDFLOW_OUTPUT_DIR nomme le répertoire produit quand la détection ne le trouve pas. Le détail de chacune, ce qu'une valeur peut contenir et pourquoi il ne faut pas y mettre de vrai secret : Variables d'environnement.nextjs-ssg
Next.js avec output: "export". Génère un site statique, servi par nginx.
Idéal pour les sites Next.js sans SSR ni API routes dynamiques.
django
Python 3.12 + gunicorn. Multi-stage build avec pip install puis collectstatic + migrate.
Convention : ton settings module s'appelle config.settings ou settings. Adapte le Dockerfile sinon.
Admin : https://<url>/admin/ (crée un superuser via exec_site admin only).
rails
Ruby 3.3 + puma. bundle install au build. Rails 7.x supporté.
Starter : Rack minimaliste. Remplace Gemfile + config.ru par ton app Rails complète.
php-generic
PHP 8.3 + Apache image officielle. Ton code dans www/ monté sur /var/www/html.
Use cases : Symfony, Laravel, WordPress custom (non embarqué), PHP legacy.
node-generic
Node 22 alpine. Auto-detect npm/yarn/pnpm lockfile. Le script npm start doit bind 0.0.0.0:3000.
// package.json (minimum){ "name": "my-app", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.19.0" } }
Le build script (si présent) est exécuté après install (utile pour tsc / esbuild).
Use cases : Express, Fastify, Hono, Koa, Bun. Pour Next.js, utilise nextjs ou nextjs-ssg.
python-generic
Python 3.12 slim + gunicorn+uvicorn workers. Convention : callable app dans main.py.
// main.py (FastAPI)from fastapi import FastAPI app = FastAPI() @app.get("/") async def home(): return {"hello": "world"}
// main.py (Flask)from flask import Flask app = Flask(__name__) @app.route("/") def home(): return "Hello World"
requirements.txt à côté de main.py.
docker-image
Run une image Docker Hub telle quelle. Aucun build. Idéal pour outils open-source packagés.
Params requis :
// JSON create_site payload{ "name": "umami", "runtime": "docker-image", "docker_image": { "image": "ghcr.io/umami-software/umami:postgresql-latest", "internal_port": 3000, "env": { "DATABASE_URL": "postgresql://user:pass@db-host/umami", "APP_SECRET": "..." }, "with_volume": true } }
Use cases : Ghost, Umami, Metabase, n8n, Directus, Strapi, Plausible, Vaultwarden, Uptime Kuma...
create_database+ attach_db_to_site, ou pointe vers une DB existante via env.DATABASE_URL.custom
Pour les stacks multi-container ou tout ce que les runtimes ci-dessus ne couvrent pas.
Fournis un docker-compose.yml complet en input. Substitutions supportées :
${IRIDFLOW_PORT}→ port assigné par Iridflow (bind127.0.0.1:PORT)${IRIDFLOW_SLUG}→ slug complet du site
// Exemple compose_yamlservices: web: image: mon-image:latest ports: - "127.0.0.1:${IRIDFLOW_PORT}:8080" environment: APP_NAME: ${IRIDFLOW_SLUG}