fix storage link error on docker deploy

This commit is contained in:
2026-05-19 19:26:57 +03:30
parent 81dd742120
commit da19b6a8a2
3 changed files with 13 additions and 1 deletions

View File

@@ -41,6 +41,7 @@ Only publish HTTP and RTMP by default. Keep MediaMTX HLS behind Apache and keep
- When changing Laravel runtime behavior, update the shared `x-app-environment` block unless the value belongs to one role only. - When changing Laravel runtime behavior, update the shared `x-app-environment` block unless the value belongs to one role only.
- When changing queue behavior, prefer env-driven options on the `queue` service and `docker/app/entrypoint.sh`. - When changing queue behavior, prefer env-driven options on the `queue` service and `docker/app/entrypoint.sh`.
- Keep `npm run build` after PHP setup and Composer install in `docker/app/Dockerfile`; the Wayfinder Vite plugin invokes `php artisan wayfinder:generate` during the build. The asset stage must also provide safe build-time Laravel env values, create Laravel writable directories such as `storage/framework/views`, and run `php artisan wayfinder:generate --with-form --no-interaction` before `npm run build` so failures are visible in Docker logs. - Keep `npm run build` after PHP setup and Composer install in `docker/app/Dockerfile`; the Wayfinder Vite plugin invokes `php artisan wayfinder:generate` during the build. The asset stage must also provide safe build-time Laravel env values, create Laravel writable directories such as `storage/framework/views`, and run `php artisan wayfinder:generate --with-form --no-interaction` before `npm run build` so failures are visible in Docker logs.
- Do not call `php artisan storage:link --force` as `www-data` during container startup; `public/storage` lives in the root-owned image filesystem. Create the symlink as root in the entrypoint if it is missing.
- Keep deploy script behavior idempotent: repeat runs should update the Git checkout, rebuild, migrate, and restart services without deleting volumes. - Keep deploy script behavior idempotent: repeat runs should update the Git checkout, rebuild, migrate, and restart services without deleting volumes.
- Keep generated secrets in `.env`; do not bake secrets into images or templates. - Keep generated secrets in `.env`; do not bake secrets into images or templates.

View File

@@ -113,6 +113,7 @@ RUN composer dump-autoload --optimize --no-dev \
storage/framework/views \ storage/framework/views \
storage/logs \ storage/logs \
bootstrap/cache \ bootstrap/cache \
&& if [ ! -e public/storage ]; then ln -s ../storage/app/public public/storage; fi \
&& chown -R www-data:www-data storage bootstrap/cache \ && chown -R www-data:www-data storage bootstrap/cache \
&& chmod +x /usr/local/bin/nyone-entrypoint && chmod +x /usr/local/bin/nyone-entrypoint

View File

@@ -61,6 +61,16 @@ prepare_laravel_paths() {
chown -R www-data:www-data storage bootstrap/cache chown -R www-data:www-data storage bootstrap/cache
} }
ensure_public_storage_link() {
mkdir -p public storage/app/public
if [[ -L public/storage || -e public/storage ]]; then
return 0
fi
ln -s ../storage/app/public public/storage
}
cache_laravel_bootstrap() { cache_laravel_bootstrap() {
if [[ "${APP_OPTIMIZE_ON_BOOT:-true}" != "true" ]]; then if [[ "${APP_OPTIMIZE_ON_BOOT:-true}" != "true" ]]; then
return 0 return 0
@@ -93,7 +103,7 @@ if [[ "${WAIT_FOR_SERVICES:-true}" == "true" ]]; then
fi fi
prepare_laravel_paths prepare_laravel_paths
artisan storage:link --force >/dev/null || true ensure_public_storage_link
cache_laravel_bootstrap cache_laravel_bootstrap
case "$role" in case "$role" in