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/web remplace 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 · interne http://localhost:9093/health

Structure du projet

bash
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
Note

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

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"]

Installation et premier lancement

Craft s'installe via sa console, qui réside dans le même conteneur :

bash
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-US

Notes sur OxPHP

Note
  • 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 retourne 200, 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

bash
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 # 200

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

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

Une erreur ? Signalez-la →