Files
SkinbaseNova/docs/deployment.md

4.6 KiB

Deployment

This repository uses a Bash-based production deploy flow.

Normal deploy

Run the existing entrypoint:

bash sync.sh

If you launch bash sync.sh from WSL against this Windows checkout, the script will automatically run the frontend build with npm.cmd on Windows so Rollup/Vite use the correct optional native package set.

This will:

  • build frontend assets locally with npm run build
  • rsync the application files to production
  • run composer install --no-dev on the server before entering maintenance mode
  • bring the app down only for the short critical section that runs php artisan migrate --force, php artisan optimize:clear, and php artisan optimize
  • bring the app back up immediately after that critical section finishes
  • warm the guest homepage cache with php artisan homepage:warm-guest-cache
  • warm the post trending cache with php artisan posts:warm-trending
  • restart queue workers with php artisan queue:restart
  • gracefully restart Horizon with php artisan horizon:terminate

This is now the low-downtime default path for normal code and feature deploys.

Full upgrade

Use a full upgrade when the release also needs broad Meilisearch work or non-code service operations.

bash sync.sh --full-upgrade

Full-upgrade mode:

  • keeps the normal deploy steps
  • forces a full Meilisearch import for all searchable models unless you explicitly pass --skip-meilisearch
  • allows optional remote upgrade hooks for service-level work

Example with service hooks:

bash sync.sh --full-upgrade \
	--upgrade-pre-hook='sudo systemctl stop reverb' \
	--upgrade-post-hook='sudo systemctl restart reverb meilisearch'

You can also provide those hooks through environment variables instead of CLI flags:

FULL_UPGRADE_PRE_HOOK='sudo systemctl stop reverb' \
FULL_UPGRADE_POST_HOOK='sudo systemctl restart reverb meilisearch' \
bash sync.sh --full-upgrade

Deploy options

bash sync.sh --skip-build
bash sync.sh --skip-migrate
bash sync.sh --no-maintenance
bash sync.sh --mode=full-upgrade

Environment overrides:

REMOTE_SERVER=user@example.com REMOTE_FOLDER=/var/www/app bash sync.sh

You can also override the local build command explicitly:

LOCAL_BUILD_COMMAND='npm run build' bash sync.sh
LOCAL_BUILD_COMMAND='pnpm build' bash sync.sh

Upgrade hooks can also be supplied via environment variables:

FULL_UPGRADE_PRE_HOOK='sudo systemctl stop reverb' bash sync.sh --full-upgrade
FULL_UPGRADE_POST_HOOK='sudo systemctl restart reverb meilisearch' bash sync.sh --full-upgrade

Replace production database from local

This is intentionally separate from a normal deploy because it overwrites production data.

bash scripts/push-db-to-prod.sh --force

Or combine it with deploy:

bash sync.sh --with-db-from=local

When run interactively, the deploy script will ask you to confirm the exact remote server and type a confirmation phrase before replacing production data.

For non-interactive use, pass both confirmations explicitly:

bash sync.sh --with-db-from=local \
	--confirm-db-sync-target=klevze@server3.klevze.si \
	--confirm-db-sync-phrase='replace production db from local'

Legacy compatibility still exists for:

bash sync.sh --with-db --force-db-sync

But the safer --with-db-from=local flow should be preferred.

The database sync script will:

  • read local DB credentials from the local .env
  • create a local mysqldump export
  • upload the dump to the production server
  • create a backup of the current production database under storage/app/deploy-backups
  • import the local dump into the production database
  • run php artisan migrate --force unless --skip-migrate is passed

If you run the deploy from WSL while your local MySQL server is running on Windows with DB_HOST=127.0.0.1 or localhost, the DB sync script will automatically use Windows mysqldump.exe so it can still reach the local database.

You can override the dump command explicitly if needed:

LOCAL_MYSQLDUMP_COMMAND='mysqldump --host=10.0.0.5 --port=3306 --user=app dbname' bash scripts/push-db-to-prod.sh --force

Safety notes

  • Normal deployments should use bash sync.sh without --with-db.
  • Use bash sync.sh --full-upgrade only when the release also includes Meilisearch-wide refreshes or remote service changes.
  • Use database replacement only for first-time bootstrap, staging, or an intentional full production reset.
  • Route caching now runs through php artisan optimize in deploy automation; if that starts failing again, fix the route definitions instead of dropping route caching from deploy.