docs(deploy): document update-all.sh as the post-pull orchestrator
Rewrite the routine-redeploy section around update-all.sh (rolling vs --hard), list the steps it runs, note the python>=3.11 requirement for build-modlist on cochi (default python3 is 3.10), and that www/ + mods.json are generated every run. The deploy skill = pull + fetch-authlib + ./update-all.sh --hard. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -14,48 +14,55 @@ Production host for the Ulicraft stack.
|
|||||||
|
|
||||||
## Routine redeploy
|
## Routine redeploy
|
||||||
|
|
||||||
```bash
|
`update-all.sh` (repo root) is the **single source of truth** for the post-pull
|
||||||
ssh cochi
|
build + restart steps. Run it AFTER a `git pull` (it never pulls or pushes).
|
||||||
cd /home/ubuntu/mc/ulicraft-server-v1
|
Strict halt on any error — never a partial deploy.
|
||||||
git pull --ff-only
|
|
||||||
tooling/render-config.sh # re-render drasl/nmsr configs from .env
|
|
||||||
tooling/sync-server-mods.sh # sync ./server-mods from $DISTRIBUTION_WEB_ROOT
|
|
||||||
docker compose down --remove-orphans
|
|
||||||
docker compose up -d --build
|
|
||||||
```
|
|
||||||
|
|
||||||
Or as a one-shot from your workstation:
|
Two modes:
|
||||||
|
|
||||||
|
- `./update-all.sh` — **rolling**: `docker compose up -d --build`, then restart
|
||||||
|
ONLY the services whose mounted inputs changed since a pre-run snapshot
|
||||||
|
(drasl/nmsr on a config re-render, minecraft on a mod change). Minimal
|
||||||
|
downtime. Does **not** detect caddy static-conf (`caddy/conf.d/*.caddy`)
|
||||||
|
changes — use `--hard` for those.
|
||||||
|
- `./update-all.sh --hard` — `docker compose down --remove-orphans && up -d
|
||||||
|
--build`. Full restart (Minecraft world downtime); picks up everything.
|
||||||
|
|
||||||
|
One-shot full redeploy from your workstation (the `deploy` skill does exactly
|
||||||
|
this):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh cochi 'set -e
|
ssh cochi 'set -e
|
||||||
cd /home/ubuntu/mc/ulicraft-server-v1
|
cd /home/ubuntu/mc/ulicraft-server-v1
|
||||||
git pull --ff-only
|
git pull --ff-only
|
||||||
tooling/render-config.sh
|
tooling/fetch-authlib.sh # ensure authlib jar (rarely changes; NOT in update-all)
|
||||||
tooling/sync-server-mods.sh
|
./update-all.sh --hard'
|
||||||
docker compose down --remove-orphans
|
|
||||||
docker compose up -d --build'
|
|
||||||
```
|
```
|
||||||
|
|
||||||
`render-config.sh` re-renders the drasl/nmsr configs from `.env`;
|
Everyday landing/config tweak (no world downtime):
|
||||||
`sync-server-mods.sh` mirrors the `both`/`server` mod subset (from
|
|
||||||
`mods-sides.json`) out of `$DISTRIBUTION_WEB_ROOT` into `./server-mods` before
|
|
||||||
the stack comes back up. `$DISTRIBUTION_WEB_ROOT` must resolve on the host (it
|
|
||||||
also backs the caddy `distribution.` mount).
|
|
||||||
|
|
||||||
### Landing rebuild (not part of `compose`)
|
|
||||||
|
|
||||||
The landing site (incl. `/register`) is static `www/`, gitignored — a `git pull`
|
|
||||||
does **not** update it. Rebuild on the host whenever `landing/` changed or you
|
|
||||||
toggled `REGISTRATION_MODE` (it bakes the invite-field on/off at build, and Drasl's
|
|
||||||
`RequireInvite` is derived from the same key by `render-config.sh`):
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
( cd landing && set -a && . ../.env && set +a && pnpm run build ) # → www/
|
ssh cochi 'cd /home/ubuntu/mc/ulicraft-server-v1 && git pull --ff-only && ./update-all.sh'
|
||||||
docker compose restart drasl # apply CORS / RateLimit / RequireInvite
|
|
||||||
```
|
```
|
||||||
|
|
||||||
`down`/`up` is not needed for a landing-only or flag-only change — rebuild `www/`
|
Steps `update-all.sh` runs, in order: `render-config.sh` (drasl/nmsr from `.env`;
|
||||||
and restart `drasl`.
|
halts on a bad `REGISTRATION_MODE`) → `sync-server-mods.sh` (mirror the
|
||||||
|
`both`/`server` subset from `mods-sides.json` out of `$DISTRIBUTION_WEB_ROOT`
|
||||||
|
into `./server-mods`) → `build-modlist.py` (regen landing `mods.json` + logos;
|
||||||
|
**run under `python>=3.11`** — cochi's default `python3` is 3.10, but
|
||||||
|
`python3.11` is installed and the script auto-selects it) → landing `pnpm build`
|
||||||
|
(sources nvm + `.env`, never `npm`) → docker compose. `$DISTRIBUTION_WEB_ROOT`
|
||||||
|
must resolve on the host (it also backs the caddy `distribution.` mount).
|
||||||
|
|
||||||
|
### Landing site + mod list (generated, not in git)
|
||||||
|
|
||||||
|
Both the static site `www/` AND the landing `mods.json` are gitignored — a `git
|
||||||
|
pull` never updates them. `update-all.sh` regenerates both every run
|
||||||
|
(`mods.json` via `build-modlist.py`, `www/` via `pnpm build`). A flag-only
|
||||||
|
`REGISTRATION_MODE` change just needs a rolling `./update-all.sh`: it rebuilds
|
||||||
|
`www/` (bakes the invite-field on/off) and restarts `drasl` only if
|
||||||
|
`render-config.sh` changed its config (Drasl's `RequireInvite`/CORS/RateLimit) —
|
||||||
|
no world downtime.
|
||||||
|
|
||||||
## Known host-local divergence on `cochi` (uncommitted)
|
## Known host-local divergence on `cochi` (uncommitted)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user