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.
cy.signupViaApi, cy.fetchLatestConfirmToken (parses the mailpit
inbox), cy.confirmViaApi, cy.loginViaApi, cy.logoutViaApi, plus
composed seedConfirmedUser/seedAdmin/seedPostAs/seedFeaturedPost
so each spec can build its own fixture without going through
the UI for setup.
Marks the user with the given email as an admin. Used by the
cypress harness to bootstrap an admin without a public promote
endpoint and is also useful for ops.
Switch from MAIL_MAILER=log to smtp pointing at mailpit on
:1025. From-address mirrors LaravelEmailFactory's confirmation
email format. phpunit.xml keeps MAIL_MAILER=array so unit and
feature tests do not touch mailpit.