6.0 KiB
6.0 KiB
Deployment Notes
This document records the explicit runtime requirements and server changes for Provider Exchange deployments.
Required Runtime
- Linux server.
- Nginx.
- PHP-FPM with PHP
^8.3; PHP 8.5 is acceptable for the current Laravel build. - PHP extensions required by Laravel and current dependencies:
ctypecurldomfileinfofilterhashmbstringopensslpdopdo_sqlitefor SQLite test deployments and the default automated test suitesqlite3for SQLite-backed local testsgdfor generated image upload fixtures and image handlingsessiontokenizerxml
- Composer for clean production installs, or an uploaded
vendor/tree for temporary live testing when Composer is unavailable. - Node.js/npm only on build machines. The server can receive prebuilt Vite assets in
public/build. - Writable Laravel directories:
storage/bootstrap/cache/- the SQLite database file for SQLite test deployments.
- Public attachment URLs require
php artisan storage:link; the update script now runs it idempotently. - Attachment policy environment variables:
TSE_ATTACHMENT_DISK, defaultpublic.TSE_ATTACHMENT_ROOT, defaultattachments.TSE_ATTACHMENT_MAX_KB, default10240.TSE_ATTACHMENT_MIME_TYPES, comma-separated allowlist.
Local Test Requirements
- The default PHPUnit configuration uses an in-memory SQLite database, so whichever PHP runtime executes
php artisan testmust includepdo_sqliteandsqlite3. - Upload tests also require
fileinfofor MIME detection andgdfor generated image fixtures. - On Windows,
php -mshould listPDO,pdo_sqlite,sqlite3,fileinfo, andgd; otherwise the feature tests fail before reaching app code or upload assertions. - WSL Ubuntu is acceptable for local verification when Windows PHP is missing extension support, as long as WSL PHP has the same extensions.
Recommended Production Runtime
- Nginx.
- PHP-FPM 8.5 or current supported PHP version satisfying Composer constraints.
- MariaDB/MySQL or PostgreSQL for production data.
- Redis for cache, session, and queue once traffic or notifications grow.
- Supervisor or systemd units for Laravel queue workers.
- Cron entry for
php artisan schedule:run. - Shared/object storage before multi-server deployment.
ChristIT Test Deployment
Target URL:
https://christit.com/tse
Chosen deployment shape:
- Subdirectory deployment under the existing
christit.comcertificate. - App code path:
/sites/provider-exchange. - Public web root exposed through Nginx should be
/sites/provider-exchange/publiconly. - Existing PHP-FPM socket should be reused:
/run/php/php8.5-fpm.sock. - Do not install or switch PHP 8.3 unless PHP 8.5 proves incompatible.
- Do not alter the existing generic PHP handling for the rest of
christit.com. - Add only a narrow
/tseNginx location and related PHP handler.
Initial test data/runtime:
- SQLite database at
/sites/provider-exchange/database/database.sqlite. APP_URL=https://christit.com.APP_BASE_PATH=for the current Nginx setup, because Nginx passesSCRIPT_NAME=/tse/index.phpand Laravel derives the request base from that.ASSET_URL=https://christit.com/tse.SESSION_PATH=/tse.SESSION_DRIVER=database.CACHE_STORE=database.QUEUE_CONNECTION=database.MAIL_MAILER=log.TSE_ATTACHMENT_DISK=public.TSE_ATTACHMENT_ROOT=attachments.TSE_ATTACHMENT_MAX_KB=10240.
ChristIT Deployment Log
2026-07-10:
- Confirmed remote server uses Nginx and PHP 8.5-FPM.
- Confirmed
/run/php/php8.5-fpm.sockexists. - Confirmed
tse.christit.comdoes not currently resolve and no certificate exists for it. - Chose
https://christit.com/tseas the first live test URL. - Uploaded app source to
/home/jbird/provider-exchange-release. - Installed app source into
/sites/provider-exchange. - Remote Composer was not available in noninteractive SSH; uploaded the local
vendor/tree for this temporary test deployment. - Installed
php8.5-sqlite3so the isolated SQLite test database can run under the existing PHP 8.5 runtime. - Added a narrow
/tseNginx block to/etc/nginx/sites-available/christit.com. - Nginx backups created by the helper include:
/etc/nginx/sites-available/christit.com.provider-exchange-tse-20260710-115810.bak/etc/nginx/sites-available/christit.com.provider-exchange-tse-20260710-120003.bak/etc/nginx/sites-available/christit.com.provider-exchange-tse-20260710-120209.bak/etc/nginx/sites-available/christit.com.provider-exchange-tse-20260710-121044.bak/etc/nginx/sites-available/christit.com.provider-exchange-tse-20260710-121151.bak
- Confirmed
nginx -tpasses after the/tseblock was applied. - Confirmed
https://christit.com/tse/redirects tohttps://christit.com/tse/jobs. - Confirmed
https://christit.com/tse/loginloads with a single-prefix form action. - Confirmed seeded admin login succeeds and redirects to
https://christit.com/tse/dashboard. - No PHP-FPM version changes have been made.
- No database server changes have been made.
- Installed Composer on the remote server through Ubuntu packages so future updates can install PHP dependencies from
composer.lock. - Converted
/sites/provider-exchangefrom the initial rsync test deployment into a Git checkout ofhttps://github.com/jasonybird/technical-services-exchange.git. - Preserved the previous rsync deployment at
/sites/provider-exchange.pre-git-20260710-125739. - Preserved the existing production
.env, SQLite database, and Laravelstorage/contents during the Git checkout conversion. - Confirmed remote Git checkout at commit
b45a9ec. - Confirmed
bash scripts/update.shworks from the remote Git checkout: Git pull, Composer install, npm install, Vite build, migrations, and Laravel cache rebuild completed successfully. - Confirmed remote working tree is clean after normalizing copied
storage/placeholder file modes. - Confirmed authenticated smoke login with
admin@example.comreacheshttps://christit.com/tse/dashboardand renders dashboard count content.