#!/usr/bin/env bash set -euo pipefail echo "==================================================" echo " Photo-Backend Self-Hosted One-Line Installer" echo "==================================================" INSTALL_DIR="${HOME}/photo-backend" FACE_MODEL="${FACE_MODEL:-buffalo_m}" WORKER_THREADS="${WORKER_THREADS:-2}" mkdir -p "${INSTALL_DIR}" cd "${INSTALL_DIR}" echo "[1/4] Generating secure environment secrets (FACE_MODEL=${FACE_MODEL}, WORKER_THREADS=${WORKER_THREADS})..." JWT_SECRET=$(openssl rand -hex 32) DB_PASSWORD=$(openssl rand -hex 16) cat < .env POSTGRES_USER=photouser POSTGRES_PASSWORD=${DB_PASSWORD} POSTGRES_DB=photodb DATABASE_URL=postgres://photouser:${DB_PASSWORD}@db:5432/photodb JWT_SECRET=${JWT_SECRET} AI_SERVICE_URL=http://ai-service:8000 FACE_MODEL=${FACE_MODEL} WORKER_THREADS=${WORKER_THREADS} AI_MAX_THREADS=${WORKER_THREADS} TOTAL_THREAD_NUMBER=${WORKER_THREADS} HUB_URL=https://hub.photobackend.app HUB_API_KEY=${HUB_API_KEY:-} EOF echo "[2/4] Writing docker-compose.yml..." cat <<'EOF' > docker-compose.yml version: '3.8' services: db: image: pgvector/pgvector:pg15 restart: unless-stopped env_file: .env volumes: - pgdata:/var/lib/postgresql/data ai-service: image: ghcr.io/photobackend/photo-ai-service:latest restart: unless-stopped env_file: .env environment: - FACE_MODEL=${FACE_MODEL:-buffalo_m} - WORKER_THREADS=${WORKER_THREADS:-2} - AI_MAX_THREADS=${WORKER_THREADS:-2} backend: image: ghcr.io/photobackend/photo-backend:latest restart: unless-stopped env_file: .env environment: - TOTAL_THREAD_NUMBER=${WORKER_THREADS:-2} ports: - "8080:8080" volumes: - ./media:/app/media depends_on: - db - ai-service webapp: image: ghcr.io/photobackend/photo-webapp:latest restart: unless-stopped ports: - "3000:80" depends_on: - backend volumes: pgdata: EOF echo "[3/4] Pulling container images & starting services..." docker compose up -d echo "[4/4] Installation complete!" echo "-> Web Gallery: http://localhost:3000" echo "-> API Server: http://localhost:8080"