diff --git a/Dockerfile b/Dockerfile index 653692f..f726e06 100644 --- a/Dockerfile +++ b/Dockerfile @@ -60,6 +60,7 @@ RUN mkdir -p /opt/flarum \ && composer clear-cache \ && addgroup -g ${PGID} flarum \ && adduser -D -h /opt/flarum -u ${PUID} -G flarum -s /bin/sh -D flarum \ + && composer show --working-dir /opt/flarum --direct --name-only | sort > /opt/flarum/.bundled-packages \ && chown -R flarum:flarum /opt/flarum \ && rm -rf /root/.composer /tmp/* diff --git a/rootfs/etc/cont-init.d/03-config.sh b/rootfs/etc/cont-init.d/03-config.sh index c990caa..a4e492e 100644 --- a/rootfs/etc/cont-init.d/03-config.sh +++ b/rootfs/etc/cont-init.d/03-config.sh @@ -220,5 +220,11 @@ if [ -s "/data/extensions/list" ]; then COMPOSER_CACHE_DIR="/data/extensions/.cache" gosu flarum:flarum composer require --working-dir /opt/flarum ${extensions} fi +# Register composer hook so that extensions installed via the admin UI +# (Extension Manager) are automatically persisted to /data/extensions/list +# (see https://github.com/crazy-max/docker-flarum/issues/103) +echo "Registering extension sync hook..." +gosu flarum:flarum composer config --working-dir /opt/flarum scripts.post-update-cmd extension-sync + gosu flarum:flarum php flarum migrate gosu flarum:flarum php flarum cache:clear diff --git a/rootfs/usr/local/bin/extension-sync b/rootfs/usr/local/bin/extension-sync new file mode 100755 index 0000000..c513243 --- /dev/null +++ b/rootfs/usr/local/bin/extension-sync @@ -0,0 +1,12 @@ +#!/bin/sh +# Sync /data/extensions/list with composer.json so that extensions +# installed via the admin UI (Extension Manager) persist across restarts. + +php -r ' +$bundled = file("/opt/flarum/.bundled-packages", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); +$composer = json_decode(file_get_contents("/opt/flarum/composer.json"), true); +$packages = array_filter(array_keys($composer["require"]), fn($p) => str_contains($p, "/")); +$extensions = array_diff($packages, $bundled); +sort($extensions); +file_put_contents("/data/extensions/list", implode("\n", $extensions) . "\n"); +'