Interactive Deployment Studio

Download & Deploy Photo-Backend

Get an instant, customized deployment script tuned to your host’s memory and CPU resources in three quick steps.

1

Choose Deployment Platform

Select where you plan to host your Nomidocloud Photo Vault instance.

2

Hardware Tuner & AI Allocation

Allocates CPU worker threads and optimizes InsightFace detection models.

AI Model: buffalo_m

Deploy & Launch Configuration

Hardware: Medium (4 GB RAM) • Model: buffalo_m • Threads: 2

Customized One-Line Terminal Command
curl -sL https://photobackend.app/install.sh | FACE_MODEL=buffalo_m WORKER_THREADS=2 bash
Step 1: Run the Installer Command

Open your terminal and paste the curl command above. The installer will verify Docker and docker-compose availability.

Step 2: Wait for Container Initialization

Pre-built multi-arch images will be pulled from GitHub Container Registry (GHCR) and started automatically.

Step 3: Access the Web App

Open http://localhost:8080 (or your server's IP) to set up your admin account and start uploading photos.

Looking for Synology volume mounts, TrueNAS dataset settings, or Windows WSL2 walkthroughs?Visit Complete Documentation →
Mobile Companion

Nomido for iOS & Android

Stream your photos, view face clusters, and auto-backup memories directly to your personal NAS with zero cloud intermediaries.

Nomido for iOS

Requires iOS 16.0+
TestFlight / App Store
  • Background background photo sync & Live Photos playback
  • End-to-end encrypted WebRTC remote connection
  • Local offline album caching & facial cluster browser
Scan to Install
App Store

Nomido for Android

Android 10.0+ (ARM64 / x86_64)
Google Play / APK
  • Fast camera roll auto-sync with Wi-Fi only option
  • Direct P2P streaming without open router ports
  • Full map view with offline reverse geocoded cities
Scan to Install
Google Play
Next Steps

Post-Installation Verification

Follow these 4 quick steps after your containers are healthy to ensure production security and mobile sync readiness.

1. Create Administrator Account

Open http://localhost:8080 or your NAS IP address in your browser. Complete the initial registration wizard to establish the primary admin user.

2. Configure HTTPS / Reverse Proxy

For secure remote access, place Caddy, Nginx Proxy Manager, or Traefik in front of port 8080 to provide automatic Let's Encrypt SSL certificates.

Caddy one-liner: photo.yourdomain.com { reverse_proxy 127.0.0.1:8080 }

3. Connect Central Hub API Key (Free)

In Admin Console > Settings > Hub Setup, enter your free HUB_API_KEY to activate STUN NAT traversal for remote mobile sync without open ports.

4. Pair Mobile Devices

Download the Photo-Backend app from Apple App Store or Google Play Store. On first launch, connect to your server to start your 7-day free trial.

PRO / ADVANCED100% Local-Only Capable

Advanced Configuration & .env Reference

Complete environment variable manual for homelab administrators, custom reverse proxies, and isolated air-gapped deployments.

No Cloud Account Required (Local-Only Architecture)

Photo-Backend never phones home by default. If you prefer to expose your instance using your own domain, reverse proxy (Nginx, Traefik, Caddy), or a private VPN (WireGuard, Tailscale), simply omit HUB_API_KEY. The mobile app features a dedicated "Skip website configuration (Direct Register)" option to connect straight to your local IP or reverse proxy domain without creating a commercial account.

Environment Variables Directory

VariableCategoryDefault ValueDescription
DATABASE_URLDatabasepostgres://photo_user:secret@db:5432/photo_dbPostgreSQL connection string with pgvector extension enabled.
SERVER_PORTCore8080HTTP port where the Rust Actix-Web backend listens for requests.
STORAGE_PATHCore/app/storageRoot directory path on disk where original media, thumbnails, and cache are saved.
JWT_SECRETSecuritychange_to_a_random_32_char_secret_keyCryptographic secret used to sign and verify user authentication JWT tokens.
FACE_MODELAI & Performancebuffalo_mInsightFace model tier: buffalo_s (Low/2GB), buffalo_m (Medium/4GB), or buffalo_l (Pro/8GB).
AI_SERVICE_URLAI & Performancehttp://ai-service:8000Internal network URL used by the backend to communicate with the Python AI sidecar.
APP_URLNetworkinghttp://localhost:8080Public URL of the backend instance, used for CORS headers and public sharing links.
HUB_API_KEYoptionalNetworking—Encrypted P2P relay connection key. Omit entirely for 100% offline or local-only operation.
TOTAL_THREAD_NUMBERoptionalAI & Performance4CPU thread pool allocation for backend HTTP workers and async task pipelines.
LOG_LEVELoptionalCoreinfoLogging verbosity level (trace, debug, info, warn, error).

Complete Sample .env File

# ==============================================================
# Photo-Backend Configuration (.env)
# ==============================================================

# Database (PostgreSQL with pgvector)
DATABASE_URL=postgres://photo_user:secure_password_here@db:5432/photo_db

# Security & Authentication (Generate with: openssl rand -hex 32)
JWT_SECRET=please_generate_a_random_secret_at_least_32_chars_long

# Storage & Paths
STORAGE_PATH=./data/storage
LOG_PATH=./data/logs
LOG_LEVEL=info

# Network & Server Port
SERVER_PORT=8080
APP_URL=https://photos.yourdomain.com

# AI Microservice (Sidecar)
AI_SERVICE_URL=http://ai-service:8000
FACE_MODEL=buffalo_m
TOTAL_THREAD_NUMBER=4

# --------------------------------------------------------------
# Local-Only / Air-Gapped Mode:
# Leave HUB_API_KEY empty to disable all external cloud relay.
# --------------------------------------------------------------
# HUB_API_KEY=

Custom Reverse Proxy Setup (Nginx Example)

server {
    listen 443 ssl http2;
    server_name photos.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/photos.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/photos.yourdomain.com/privkey.pem;

    client_max_body_size 500M; # Support large camera video uploads

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}