# 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
- run `php artisan migrate --force`
- run `php artisan optimize:clear`
- run `php artisan optimize` to rebuild config, events, routes, and views
- 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`

## Deploy options

```bash
bash sync.sh --skip-build
bash sync.sh --skip-migrate
bash sync.sh --no-maintenance
```

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
```

## 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 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.