Files
ulicraft-server-v1/.claude/skills/deploy/SKILL.md
Oier Bravo Urtasun df8ffca53e feat(landing): self-serve registration page via Drasl API (B1)
Add a static /register page (en/es/eu) that calls the Drasl REST API v2
directly from the browser: register -> login -> optional skin upload, all
in the pixel design. Guests never touch Drasl's own web UI.

Drasl config gains the pieces this needs:
- CORSAllowOrigins scoped to the apex (the API has no CORS until set;
  never "*").
- [RateLimit] for the now public-facing anonymous POST /users.
- [RegistrationNewPlayer] with RequireInvite driven by a new
  REGISTRATION_MODE (invite|open) .env flag.

REGISTRATION_MODE has two consumers from one key: render-config.sh derives
the TOML boolean for Drasl (drasl is TOML-only, no env), and the landing
build reads it to show/hide the invite-code field. render-config.sh halts
on any value other than invite/open.

Security verified against drasl source: anonymous POST /users cannot set
privileged fields (isAdmin/isLocked/chosenUuid/maxPlayerCount are gated on
callerIsAdmin in CreateUser), so browser-direct registration is safe.

Docs: plan/16-landing-registration.md captures the design + the B1 vs fork
decision; build-order, deploy, and the deploy skill wire REGISTRATION_MODE
and the landing-rebuild requirement (www/ is gitignored, not updated by a
git pull).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:55:51 +02:00

3.7 KiB

name, description
name description
deploy Redeploy the Ulicraft Minecraft stack to the production host `cochi` — git pull on main then a hard restart (compose down + up). Use when the user says "deploy", "redeploy", "deploy to cochi", "push to prod", "ship it", or "restart the server" for this project. Causes brief Minecraft downtime.

Deploy Ulicraft to cochi

Redeploy the running stack on the production host. Full reference: plan/14-deploy.md.

Fixed parameters

  • Host: cochi (SSH alias)
  • Path: /home/ubuntu/mc/ulicraft-server-v1
  • Branch: main
  • Stack: single unified docker-compose.yml (drasl, minecraft, mc-backup, caddy, nmsr, uptime-kuma)
  • Auth: Drasl
  • Restart: hard (down → up) — players are disconnected for a few minutes

Procedure

This is an outward-facing, downtime-causing action on production. The user invoking this skill is the authorization to proceed, but:

  1. Pre-check (read-only). See what would change before tearing anything down:

    ssh cochi 'cd /home/ubuntu/mc/ulicraft-server-v1 && git fetch && git log --oneline HEAD..@{u}'
    

    Report the incoming commits. If the list is empty, tell the user the host is already up to date and ask whether to restart anyway (they may want a plain restart). If git fetch fails (host unreachable, auth), STOP and report.

  2. Pull + hard restart (single SSH session, halts on any error):

    ssh cochi 'set -e
      cd /home/ubuntu/mc/ulicraft-server-v1
      git pull --ff-only
      tooling/render-config.sh
      tooling/fetch-authlib.sh
      docker compose down --remove-orphans
      docker compose up -d --build'
    
    • --ff-only refuses to merge — if the pull is not a fast-forward, STOP and report (local changes on the host need manual resolution).
    • render-config.sh re-renders drasl/nmsr/packwiz configs from .env (needs .env complete: BASE_DOMAIN, RCON_PASSWORD, DISTRIBUTION_WEB_ROOT, CADDY_HTTP_*, REGISTRATION_MODE). It halts on an invalid REGISTRATION_MODE (must be invite or open).
    • fetch-authlib.sh ensures runtime/authlib-injector.jar exists (gitignored; skips if already valid). Missing jar = minecraft crashloops with "Error opening zip file or JAR manifest missing".

2b. Landing rebuild (only if needed). The static site www/ is gitignored — git pull does NOT update it. If the pulled commits (from the step-1 pre-check) touch landing/, or REGISTRATION_MODE changed, rebuild it; otherwise skip:

ssh cochi 'set -e
  cd /home/ubuntu/mc/ulicraft-server-v1
  cd landing && set -a && . ../.env && set +a && pnpm run build'

Sourcing .env bakes BASE_DOMAIN + REGISTRATION_MODE (invite-field on/off) into the output. A flag-only change just needs this rebuild + a drasl restart (already covered by step 2's up), not the world downtime.

  1. Verify.
    ssh cochi 'cd /home/ubuntu/mc/ulicraft-server-v1 && docker compose ps'
    
    Confirm caddy, drasl, minecraft, mc-backup, nmsr, uptime-kuma are Up. Tail the minecraft log briefly and confirm it reaches Done (server ready):
    ssh cochi 'cd /home/ubuntu/mc/ulicraft-server-v1 && timeout 120 docker compose logs -f minecraft' 2>/dev/null | grep -m1 "Done"
    

Guardrails

  • Never git reset --hard or discard changes on cochi without telling the user first — there may be host-local edits.
  • Volumes (mc_data, drasl_state, kuma_data) persist across down; the world and monitors are safe. Do NOT pass -v/--volumes to down.
  • If a step fails, STOP and surface the exact error + the failing command. Do not improvise recovery on production.