Craft CMS sur OxPHP
Craft CMS utilise web/index.php comme contrôleur frontal et sert les ressources du panneau de contrôle depuis web/cpresources/. Il s'exécute dans le mode de routage framework d'OxPHP : les fichiers statiques existants, y compris les assets du panneau de contrôle, sont servis depuis le disque, et tout le reste est dispatché vers index.php.
La stack en un coup d'œil
- Image OxPHP :
ghcr.io/oxphp/oxphp:0.13.0(PHP 8.5) - Mode de routage : Framework (
ENTRY_FILE=index.php;DOCUMENT_ROOT=/var/www/html/webremplace la valeur par défaut…/public) - Extensions ajoutées :
bcmath,gd,intl,pdo_mysql,mbstring,zip - Services : OxPHP + MySQL (8.4 LTS)
- URL :
http://localhost:8092· panneau de contrôle/admin· internehttp://localhost:9093/health
Structure du projet
mkdir -p craft-oxphp/src
docker run --rm -v "$PWD/craft-oxphp/src":/app -w /app \
composer:2 create-project craftcms/craft . \
--ignore-platform-reqs --no-scripts --no-interaction --prefer-dist--ignore-platform-reqs --no-scripts est nécessaire parce que l'image composer:2 standard ne dispose pas de bcmath/gd/intl ; ces extensions ne sont requises qu'au moment de l'exécution, et l'assistant de configuration post-création de Craft s'exécute plus tard, à l'intérieur du conteneur construit.
Craft lit sa connexion à la base de données depuis l'environnement, donc aucune modification de .env n'est requise au-delà des clés que la console écrit.
Dockerfile et Compose
Les deux fichiers ci-dessous sont présentés ; le Dockerfile se trouve dans src/Dockerfile.
ARG OXPHP_VERSION=0.13.0
ARG PHP_VERSION=8.5
ARG ALPINE_VERSION=3.23
# ── PHP base: Craft runtime extensions ────────────────────────
FROM php:${PHP_VERSION}-zts-alpine${ALPINE_VERSION} AS php-base
RUN apk add --no-cache \
icu-libs libpng libjpeg-turbo freetype oniguruma libzip \
&& apk add --no-cache --virtual .build-deps \
icu-dev libpng-dev libjpeg-turbo-dev freetype-dev oniguruma-dev libzip-dev \
&& docker-php-ext-configure gd --with-jpeg --with-freetype \
&& docker-php-ext-install -j"$(nproc)" bcmath gd intl pdo_mysql mbstring zip \
&& apk del .build-deps
# ── Composer ──────────────────────────────────────────────────
FROM composer:2 AS composer
# ── OxPHP artifacts ───────────────────────────────────────────
FROM ghcr.io/oxphp/oxphp:${OXPHP_VERSION} AS oxphp
# ── dev: OxPHP server + PHP CLI + Composer + Craft extensions ──
FROM php-base AS dev
RUN apk add --no-cache libgcc
COPY --from=composer /usr/bin/composer /usr/local/bin/composer
COPY --from=oxphp /usr/local/bin/oxphp /usr/local/bin/oxphp
COPY --from=oxphp /usr/local/lib/liboxphp_bridge.so /usr/local/lib/
COPY --from=oxphp /usr/local/lib/php/extensions/ /tmp/oxphp-ext/
RUN cp /tmp/oxphp-ext/*/oxphp_sapi.so "$(php -r 'echo ini_get("extension_dir");')/" \
&& rm -rf /tmp/oxphp-ext \
&& echo "extension=oxphp_sapi.so" > /usr/local/etc/php/conf.d/oxphp-ext.ini
RUN { \
echo "[opcache]"; echo "opcache.enable=1"; echo "opcache.enable_cli=1"; \
echo "opcache.validate_timestamps=1"; echo "opcache.revalidate_freq=0"; \
} > /usr/local/etc/php/conf.d/opcache-dev.ini
RUN { \
echo "memory_limit=256M"; echo "upload_max_filesize=64M"; \
echo "post_max_size=64M"; echo "max_execution_time=120"; \
} > /usr/local/etc/php/conf.d/craft.ini
RUN getent passwd www-data >/dev/null \
|| adduser -D -H -u 82 -G www-data -s /sbin/nologin www-data
RUN mkdir -p /var/www/html/web && chown -R www-data:www-data /var/www/html
ENV LD_LIBRARY_PATH=/usr/local/lib
WORKDIR /var/www/html
COPY --chown=www-data:www-data . /var/www/html
EXPOSE 80 9090
CMD ["oxphp"]services:
app:
build:
context: ./src
target: dev
image: craft-oxphp/app:dev
container_name: craft-oxphp
ports:
- "8092:80"
- "9093:9090"
volumes:
- ./src:/var/www/html
environment:
# LISTEN_ADDR defaults to 0.0.0.0:80, so it is omitted.
DOCUMENT_ROOT: /var/www/html/web # overrides the default /var/www/html/public
ENTRY_FILE: index.php # framework mode
INTERNAL_ADDR: 0.0.0.0:9090
ACCESS_LOG: all
CRAFT_DB_DRIVER: mysql
CRAFT_DB_SERVER: db
CRAFT_DB_PORT: "3306"
CRAFT_DB_DATABASE: craft
CRAFT_DB_USER: craft
CRAFT_DB_PASSWORD: craft
PRIMARY_SITE_URL: http://localhost:8092
depends_on:
db:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://0.0.0.0:9090/health"]
interval: 10s
timeout: 3s
retries: 5
start_period: 5s
db:
image: mysql:8.4
container_name: craft-oxphp-db
ports:
- "3309:3306"
environment:
MYSQL_DATABASE: craft
MYSQL_USER: craft
MYSQL_PASSWORD: craft
MYSQL_ROOT_PASSWORD: root
volumes:
- db_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-proot"]
interval: 5s
timeout: 5s
retries: 20
start_period: 15s
restart: unless-stopped
volumes:
db_data:Installation et premier lancement
Craft s'installe via sa console, qui réside dans le même conteneur :
docker compose up -d --build
docker compose exec app php craft setup/security-key # writes CRAFT_SECURITY_KEY
docker compose exec app php craft setup/app-id # writes CRAFT_APP_ID
docker compose exec app php craft install/craft \
--username=admin --email=admin@example.com --password=password \
--site-name="Craft OxPHP" --site-url='http://localhost:8092' --language=en-USNotes sur OxPHP
- Les ressources du panneau de contrôle sont des fichiers statiques.
web/cpresources/<hash>/…existe sur le disque et est servi par le mode framework — vérifiez qu'il retourne200, sinon le panneau de contrôle s'afficherait sans styles. - Utilisez MySQL 8.4 LTS, pas MySQL 9. Craft est vérifié avec MySQL 8.x ; l'image 8.4 LTS est le choix sûr. (MySQL 8.4 a supprimé le drapeau serveur
--default-authentication-plugin— ne le passez pas.) - Les paramètres de base de données proviennent de l'environnement du conteneur (
CRAFT_DB_*), ils vivent donc dans Compose.
Vérification
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8092/ # 200
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8092/admin # 302 → login
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:9093/health # 200Prompts pour votre agent
Ces prompts supposent un agent connecté au serveur MCP de la documentation OxPHP — il lira lui-même les pages dont il a besoin.
Fais tourner mon projet Craft CMS sur OxPHP en local. Lis la page `examples/cms/craft` via le serveur MCP de la documentation OxPHP.
Écris le Dockerfile et le fichier Compose pour ce dépôt, avec les extensions dont mes plugins installés ont besoin en plus de celles de Craft, et donne-moi la séquence de commandes console qui l'installe contre une base de données neuve.Mon installation de Craft sur OxPHP échoue sur la base de données — elle ne se connecte pas, ou MySQL refuse de démarrer. Lis la page `examples/cms/craft` via le serveur MCP de la documentation OxPHP.
Confronte le tag d'image MySQL et les drapeaux serveur de mon fichier Compose ainsi que mes variables `CRAFT_DB_*` à ce que mon `.env` définit encore, et dis-moi lesquelles Craft lit réellement.Voir aussi
- Routage · Guide Docker
- Drupal et October CMS — les autres recettes de CMS en mode framework