#!/usr/bin/env bash # Fuji Photo Processor Deployment Script for Synology NAS # Deploys: photo-processor container (watches /incoming/ for JPEGs) # # This script runs from the LOCAL machine and SSHes into the NAS. # Docker compose is not available on this Synology, so we use docker run. set -euo pipefail # Configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SSH_KEY="$(cd "$SCRIPT_DIR/.." && pwd)/SynologyDocker/synology_ssh_key" NAS_HOST="ssh@192.168.175.141" NAS_DOCKER_DIR="/volume2/docker/photo-processor" CONTAINER_NAME="photo-processor" IMAGE_NAME="photo-processor" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # --------------------------------------------------------------------------- # Logging helpers # --------------------------------------------------------------------------- log_info() { echo -e "${GREEN}[INFO]${NC} $*"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } log_error() { echo -e "${RED}[ERROR]${NC} $*"; } # --------------------------------------------------------------------------- # SSH / Docker wrappers # --------------------------------------------------------------------------- ssh_cmd() { ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$NAS_HOST" "$@" } docker_cmd() { # Synology requires sudo for docker socket access ssh_cmd "sudo /usr/local/bin/docker $*" } # --------------------------------------------------------------------------- # Functions # --------------------------------------------------------------------------- create_directories() { log_info "Creating directories on NAS..." ssh_cmd "mkdir -p $NAS_DOCKER_DIR/data $NAS_DOCKER_DIR/build" # Photos dirs may need elevated permissions - check and warn if ! ssh_cmd "test -d /volume2/photos/incoming" 2>/dev/null; then log_warn "/volume2/photos/ directories not found!" log_warn "Create them via DSM File Station or as admin:" log_warn " sudo mkdir -p /volume2/photos/{incoming,originals,processed}" log_warn " sudo chown -R fujiftp:users /volume2/photos/incoming" log_warn " sudo chmod 755 /volume2/photos/{originals,processed}" exit 1 fi } build_image() { log_info "Transferring build files to NAS..." tar czf - -C "$SCRIPT_DIR" Dockerfile requirements.txt processor.py | \ ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$NAS_HOST" \ "cd $NAS_DOCKER_DIR/build && tar xzf -" log_info "Building $IMAGE_NAME image on NAS..." docker_cmd build -t "$IMAGE_NAME" "$NAS_DOCKER_DIR/build" } stop_existing() { log_info "Stopping existing container (if any)..." docker_cmd stop "$CONTAINER_NAME" 2>/dev/null || true docker_cmd rm "$CONTAINER_NAME" 2>/dev/null || true } start_container() { log_info "Starting $CONTAINER_NAME container..." docker_cmd run -d \ --name "$CONTAINER_NAME" \ --restart unless-stopped \ --memory=256m \ -e TZ=Europe/Amsterdam \ -v /volume2/photos/incoming:/incoming \ -v /volume2/photos/originals:/originals \ -v /volume2/photos/processed:/processed \ -v "$NAS_DOCKER_DIR/data:/data" \ "$IMAGE_NAME" } show_status() { echo "" log_info "=== Container Status ===" docker_cmd ps --filter "name=$CONTAINER_NAME" --format "'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" } # --------------------------------------------------------------------------- # Main # --------------------------------------------------------------------------- main() { log_info "=== Fuji Photo Processor Deployment ===" echo "" # Verify SSH key exists if [ ! -f "$SSH_KEY" ]; then log_error "SSH key not found: $SSH_KEY" log_error "Expected sibling repo at: $(cd "$SCRIPT_DIR/.." && pwd)/SynologyDocker/" exit 1 fi # Verify NAS connectivity log_info "Testing NAS connectivity..." if ! ssh_cmd "echo ok" >/dev/null 2>&1; then log_error "Cannot connect to NAS at $NAS_HOST" exit 1 fi create_directories build_image stop_existing start_container show_status echo "" log_info "=== Deployment Complete ===" log_info "Container: $CONTAINER_NAME" log_info "Incoming: /volume2/photos/incoming (FTP upload target)" log_info "Originals: /volume2/photos/originals/YYYY/MM/" log_info "Processed: /volume2/photos/processed/YYYY/MM/" echo "" log_info "Check logs: ssh -i $SSH_KEY $NAS_HOST 'sudo /usr/local/bin/docker logs -f $CONTAINER_NAME'" } main "$@"