PHP's __DIR__ follows symlinks, so an artisan symlink at
/var/lib/tide/app/artisan resolved back to the read only store
path. That made every Laravel file path ultimately resolve into
the store, including storage/logs/laravel.log and bootstrap/cache,
which Laravel must be able to write. The redirected symlinks for
those two subtrees never even got consulted because resolution
happened upstream of them.
Switch tide-prepare to copy the package contents into appRoot,
then mount /var/lib/tide/state over storage/ and bootstrap/cache/
via symlinks out of a writable parent. Now __DIR__ resolves to
the writable copy and Laravel can boot.
Laravel connects to the production postgres database through PDO,
so the runtime interpreter must include pdo_pgsql. Without it,
tide-migrate fails on activation with 'could not find driver' and
phpfpm-tide never starts.
Exposes the laravel backend behind phpfpm + nginx and the vue
frontend as a static vhost. Wires postgres, runtime tmpfiles for
laravel's writable storage/ and bootstrap/cache/, and a oneshot
tide-migrate service for migrations and config caching.