Runtimes disponibles

11 runtimes pré-configurés qui couvrent 95% des cas web. Pour le reste : customavec ton propre docker-compose.yml.

RuntimeTechnoPort interneBuild 1er boot
staticnginx serving HTML/CSS/JS80~15s
wordpressPHP-FPM 8.3 + MariaDB embarquée80~2 min
nextjsNode 22 standalone SSR3000~2-4 min
nextjs-ssgnext export → nginx80~1-2 min
djangoPython 3.12 + gunicorn8000~2-3 min
railsRuby 3.3 + puma3000~3-5 min
php-genericPHP-FPM 8.3 + Apache80~15s
node-genericNode 22 + npm/yarn/pnpm/bun3000~1-2 min
python-genericPython 3.12 + gunicorn+uvicorn8000~1-2 min
docker-imageImage DockerHub telle quelleuser-definedtemps de pull
customdocker-compose.yml fourniuser-defineddépend

Détails par runtime

static

Site statique servi par nginx. HTML/CSS/JS/images. Aucun build.

Structure attendue : ton code dans site/. index.html à la racine.

Use cases : landing pages, sites générés (Hugo/Jekyll/11ty en local puis upload du dist).

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 15+ App Router avec output: "standalone". Node 22 alpine multi-stage build.

Requis dans next.config.mjs :

// next.config.mjs
const nextConfig = { output: 'standalone', reactStrictMode: true, }; export default nextConfig;
Attention
Le Dockerfile fait COPY /app/public ./public. Un dossier public/(même vide avec un .gitkeep) est requis, sinon le build échoue.

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...

Astuce
Certaines images (Ghost, Umami…) requièrent une DB externe. Crée-en une via 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 (bind 127.0.0.1:PORT)
  • ${IRIDFLOW_SLUG} → slug complet du site
// Exemple compose_yaml
services: web: image: mon-image:latest ports: - "127.0.0.1:${IRIDFLOW_PORT}:8080" environment: APP_NAME: ${IRIDFLOW_SLUG}