#!/usr/bin/env bash # Build the two production images on THIS machine and either push them to a # registry or export them as a file you can copy to the NAS. # # Why you'd use this instead of building on the NAS: the frontend build (Vite + # tsc) wants ~2 GB of RAM and a lot of CPU. On a 2-4 GB NAS that is slow at best # and an OOM at worst, and it competes with everything else the box is doing. # # ./deploy/build-push.sh v1.0.0 # build + push to $REGISTRY_PREFIX # REGISTRY_PREFIX=192.168.1.185:8418/claude/webmail \ # ./deploy/build-push.sh v1.0.0 # ./deploy/build-push.sh v1.0.0 --save # build + write a .tar to load on the NAS # # On the NAS afterwards: # push mode: set REGISTRY_PREFIX and IMAGE_TAG in docker/.env.prod, then # ./deploy/webmail.sh update v1.0.0 # save mode: docker load -i webmail-v1.0.0.tar && ./deploy/webmail.sh update v1.0.0 set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" TAG="${1:-}" MODE="${2:-push}" REGISTRY_PREFIX="${REGISTRY_PREFIX:-webmail}" PLATFORM="${PLATFORM:-linux/amd64}" # Synology and QNAP Intel boxes [ -n "$TAG" ] || { echo "usage: $0 [--save]" >&2; exit 1; } GIT_SHA="$(git -C "$ROOT_DIR" rev-parse --short HEAD 2>/dev/null || echo unknown)" if ! git -C "$ROOT_DIR" diff --quiet 2>/dev/null; then echo "warning: working tree has uncommitted changes; tagging ${TAG} anyway" >&2 fi build() { local name="$1" dockerfile="$2" echo "== building ${REGISTRY_PREFIX}/${name}:${TAG}" docker build \ --platform "$PLATFORM" \ -f "${ROOT_DIR}/docker/${dockerfile}" \ --build-arg "APP_VERSION=${TAG}" \ --build-arg "GIT_SHA=${GIT_SHA}" \ -t "${REGISTRY_PREFIX}/${name}:${TAG}" \ -t "${REGISTRY_PREFIX}/${name}:latest" \ "$ROOT_DIR" } build backend Dockerfile.backend build web Dockerfile.frontend if [ "$MODE" = "--save" ]; then out="${ROOT_DIR}/webmail-${TAG}.tar" echo "== saving both images to ${out}" docker save -o "$out" \ "${REGISTRY_PREFIX}/backend:${TAG}" \ "${REGISTRY_PREFIX}/web:${TAG}" echo "done. Copy it to the NAS and run: docker load -i $(basename "$out")" exit 0 fi if [ "$REGISTRY_PREFIX" = "webmail" ]; then cat >&2 <<'MSG' REGISTRY_PREFIX is still the local default ("webmail"), so there is nothing to push to. Either set it to your registry path, e.g. REGISTRY_PREFIX=192.168.1.185:8418/claude/webmail ./deploy/build-push.sh v1.0.0 (run `docker login 192.168.1.185:8418` once first), or re-run with --save to produce a tar file instead. MSG exit 1 fi echo "== pushing" docker push "${REGISTRY_PREFIX}/backend:${TAG}" docker push "${REGISTRY_PREFIX}/web:${TAG}" docker push "${REGISTRY_PREFIX}/backend:latest" docker push "${REGISTRY_PREFIX}/web:latest" echo "pushed ${TAG}. On the NAS: ./deploy/webmail.sh update ${TAG}"