#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT_DIR" ENV_FILE="${ENV_FILE:-deploy_compose/.env}" APP_IMAGE="${APP_IMAGE:-videoroll:prod}" WEB_IMAGE="${WEB_IMAGE:-videoroll-web:prod}" INCLUDE_BASE_IMAGES="${INCLUDE_BASE_IMAGES:-1}" TIMESTAMP="$(date +%Y%m%d-%H%M%S)" OUTPUT_TAR="${OUTPUT_TAR:-$ROOT_DIR/videoroll-prod-bundle-${TIMESTAMP}.tar}" if [[ ! -f "$ENV_FILE" ]]; then echo "env file not found: $ENV_FILE" >&2 exit 1 fi set -a . "$ENV_FILE" set +a DOCKER_BIN="${DOCKER_BIN:-docker}" if ! "$DOCKER_BIN" info >/dev/null 2>&1; then if command -v sudo >/dev/null 2>&1; then DOCKER_BIN="sudo docker" fi fi docker_run() { # shellcheck disable=SC2086 $DOCKER_BIN "$@" } echo "Using env file: $ENV_FILE" echo "Building app image: $APP_IMAGE" docker_run build \ -t "$APP_IMAGE" \ --build-arg INSTALL_ASR="${INSTALL_ASR:-1}" \ --build-arg YTDLP_VERSION="${YTDLP_VERSION:-latest}" \ -f Dockerfile \ . echo "Building web image: $WEB_IMAGE" docker_run build \ -t "$WEB_IMAGE" \ --build-arg VITE_ORCHESTRATOR_URL="${VITE_ORCHESTRATOR_URL:-}" \ --build-arg VITE_SUBTITLE_SERVICE_URL="${VITE_SUBTITLE_SERVICE_URL:-}" \ --build-arg VITE_YOUTUBE_INGEST_URL="${VITE_YOUTUBE_INGEST_URL:-}" \ --build-arg VITE_BILIBILI_PUBLISHER_URL="${VITE_BILIBILI_PUBLISHER_URL:-}" \ -f src/web/Dockerfile \ src/web IMAGES=("$APP_IMAGE" "$WEB_IMAGE") if [[ "$INCLUDE_BASE_IMAGES" == "1" ]]; then echo "Pulling base service images" docker_run pull redis:7 docker_run pull minio/minio:latest docker_run pull minio/mc:latest IMAGES+=("redis:7" "minio/minio:latest" "minio/mc:latest") fi echo "Exporting images to: $OUTPUT_TAR" docker_run save -o "$OUTPUT_TAR" "${IMAGES[@]}" if command -v sha256sum >/dev/null 2>&1; then sha256sum "$OUTPUT_TAR" | tee "${OUTPUT_TAR}.sha256" fi echo echo "Done." echo "Bundle: $OUTPUT_TAR" if [[ -f "${OUTPUT_TAR}.sha256" ]]; then echo "SHA256: ${OUTPUT_TAR}.sha256" fi echo echo "Import on target machine:" echo " docker load -i $(basename "$OUTPUT_TAR")"