142 lines
4.6 KiB
Markdown
142 lines
4.6 KiB
Markdown
# Deployment
|
|
|
|
This repository uses a Bash-based production deploy flow.
|
|
|
|
## Normal deploy
|
|
|
|
Run the existing entrypoint:
|
|
|
|
```bash
|
|
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
|
|
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
|
|
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:
|
|
|
|
```bash
|
|
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
|
|
bash sync.sh --skip-build
|
|
bash sync.sh --skip-migrate
|
|
bash sync.sh --no-maintenance
|
|
bash sync.sh --mode=full-upgrade
|
|
```
|
|
|
|
Environment overrides:
|
|
|
|
```bash
|
|
REMOTE_SERVER=user@example.com REMOTE_FOLDER=/var/www/app bash sync.sh
|
|
```
|
|
|
|
You can also override the local build command explicitly:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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
|
|
bash scripts/push-db-to-prod.sh --force
|
|
```
|
|
|
|
Or combine it with deploy:
|
|
|
|
```bash
|
|
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
|
|
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
|
|
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:
|
|
|
|
```bash
|
|
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. |