Deploy: add pull, the verb a first install from a registry needed

`up` only builds images that are missing locally, and `update` refuses to
run without an existing database to back up — so a fresh install that is
meant to fetch prebuilt images had no command that did it. `pull` fills the
gap and fails loudly if REGISTRY_PREFIX is still the local default.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SqJYt7jD7oUEkoY68sBZo
This commit is contained in:
2026-09-16 20:35:29 +02:00
co-authored by Claude Opus 5
parent 8fce86559e
commit 64ef3893d3
2 changed files with 25 additions and 4 deletions
+16
View File
@@ -2,6 +2,7 @@
# Webmail operator control script. One command per thing you might need to do. # Webmail operator control script. One command per thing you might need to do.
# #
# ./deploy/webmail.sh init create data dirs + a filled-in .env.prod # ./deploy/webmail.sh init create data dirs + a filled-in .env.prod
# ./deploy/webmail.sh pull [tag] fetch prebuilt images from your registry
# ./deploy/webmail.sh up [--meili] start (builds images if missing) # ./deploy/webmail.sh up [--meili] start (builds images if missing)
# ./deploy/webmail.sh down stop (data is untouched) # ./deploy/webmail.sh down stop (data is untouched)
# ./deploy/webmail.sh status what is running, and which version # ./deploy/webmail.sh status what is running, and which version
@@ -370,6 +371,20 @@ then re-run this command."
echo " admin: http://<this-host>:${ADMIN_PORT:-8089}/ — restrict this port to your LAN" echo " admin: http://<this-host>:${ADMIN_PORT:-8089}/ — restrict this port to your LAN"
} }
# First install from a registry: `up` only builds what is missing locally, and
# `update` refuses to run without an existing database to back up. This is the
# gap between them — fetch the images, then `up` starts them instead of building.
cmd_pull() {
require_env
local tag="${1:-${IMAGE_TAG:-local}}"
[ "${REGISTRY_PREFIX:-webmail}" = "webmail" ] && die \
"REGISTRY_PREFIX is still the local default — nothing to pull from.
Set REGISTRY_PREFIX and IMAGE_TAG in ${ENV_FILE}, or use: webmail.sh up --build"
detect_compose
IMAGE_TAG="$tag" compose pull || die "pull failed — is the registry reachable and logged in?"
grn "pulled ${REGISTRY_PREFIX}/{backend,web}:${tag}. Next: ./deploy/webmail.sh up"
}
cmd_down() { require_env; compose --profile meili down; grn "stopped (data kept in ${DATA_ROOT})"; } cmd_down() { require_env; compose --profile meili down; grn "stopped (data kept in ${DATA_ROOT})"; }
cmd_restart() { require_env; compose restart "${@:-}"; } cmd_restart() { require_env; compose restart "${@:-}"; }
@@ -559,6 +574,7 @@ SUBCOMMAND="$cmd"
case "$cmd" in case "$cmd" in
init) cmd_init "$@" ;; init) cmd_init "$@" ;;
doctor) cmd_doctor "$@" ;; doctor) cmd_doctor "$@" ;;
pull) cmd_pull "$@" ;;
up) cmd_up "$@" ;; up) cmd_up "$@" ;;
down) cmd_down "$@" ;; down) cmd_down "$@" ;;
restart) cmd_restart "$@" ;; restart) cmd_restart "$@" ;;
+9 -4
View File
@@ -290,15 +290,20 @@ docker login 192.168.1.185:8418
From then on, on your PC: From then on, on your PC:
```bash ```bash
REGISTRY_PREFIX=192.168.1.185:8418/claude/webmail ./deploy/build-push.sh v1.0.0 REGISTRY_PREFIX=192.168.1.185:8418/<you>/webmail ./deploy/build-push.sh v1.0.0
``` ```
and on the NAS, with `REGISTRY_PREFIX` and `IMAGE_TAG` set in `.env`: and on the NAS, with `REGISTRY_PREFIX` and `IMAGE_TAG` set in `.env`:
```bash ```bash
bash deploy/webmail.sh update v1.0.0 bash deploy/webmail.sh pull v1.0.0 # first install
bash deploy/webmail.sh update v1.0.0 # every time after
``` ```
`pull` exists because the other two don't cover a first install from a
registry: `up` only builds what is missing locally, and `update` refuses to run
without an existing database to back up.
> If you would rather not loosen the daemon, `./deploy/build-push.sh v1.0.0 > If you would rather not loosen the daemon, `./deploy/build-push.sh v1.0.0
> --save` writes a tar you copy over and `docker load` — no registry, no > --save` writes a tar you copy over and `docker load` — no registry, no
> insecure flag, but a manual copy each time. > insecure flag, but a manual copy each time.
@@ -404,8 +409,8 @@ the dump that `update` took in step 1.
Building on the NAS is simple but slow and RAM-hungry. Two alternatives: Building on the NAS is simple but slow and RAM-hungry. Two alternatives:
```bash ```bash
# On your PC — push to your Gitea registry: # On your PC — push to your Gitea registry (the namespace is your Gitea user):
REGISTRY_PREFIX=192.168.1.185:8418/claude/webmail ./deploy/build-push.sh v1.0.0 REGISTRY_PREFIX=192.168.1.185:8418/<you>/webmail ./deploy/build-push.sh v1.0.0
# then on the NAS, set REGISTRY_PREFIX + IMAGE_TAG in .env and: # then on the NAS, set REGISTRY_PREFIX + IMAGE_TAG in .env and:
./deploy/webmail.sh update v1.0.0 ./deploy/webmail.sh update v1.0.0