photoprism / photoprism

AI-Powered Photos App for the Decentralized Web 🌈💎✨
https://www.photoprism.app
Other
35.27k stars 1.94k forks source link

Gateway timeout when specifying Docker bind mount within /photoprism/import #663

Closed cwlls closed 3 years ago

cwlls commented 3 years ago

Greetings,

I'm just getting started with Photoprism (I love what I see so far, thank you!) and I appear to be having a problem with the app not responding when I specify a bind mount to a location within /photoprism/import. For clarification, I am running Photoprism using Docker (see attached docker-compose.yml file) and I have Traefik running a reverse proxy.

If I include the following line, Photoprism does not respond and I get a 'Gateway timeout' error in my browser from Traefik.

  # Mounting the import folder is optional (see docs):
      - "/tank/inbox/resilio/my_phone/Camera:/photoprism/import/my_phone"

If I do the following, everything works as expected (as far as I can tell at least):

  1. docker-compose down
  2. comment the line out of docker-compose.yml
  3. clean up docker environment (docker container/volume prune)
  4. remove created files in my bind mounts (/tank/app/photoprism/db, /tank/app/photoprism/data)
  5. docker-compose up

Thanks in advance, Chris

Involved systems

Server: Intel(R) Xeon(R) CPU E3-1220L, 16GB RAM Ubuntu 20.04.1 (kernel 5.4.0-54-generic) Docker version 19.03.13, build 4484c46d9d

Client: MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports), 16GB RAM macOS Catalina Version 10.15.6 (19G2021) Safari Version 14.0 (15610.1.28.1.9, 15610)

docker-compose.yml

version: '3.5'

# Example Docker Compose config file for PhotoPrism (Intel / AMD64)
#
# Documentation : https://docs.photoprism.org/getting-started/docker-compose/
# Docker Hub URL: https://hub.docker.com/r/photoprism/photoprism/
#
# Please run behind a reverse proxy like Caddy, Traefik or Nginx if you need HTTPS / SSL support
# e.g. when running PhotoPrism on a public server outside your home network.
#
# Usage: docker-compose up

services:
  photoprism:
    image: photoprism/photoprism:latest
    restart: unless-stopped
    # Uncomment and edit the following line to set a specific user / group id:
    # user: "1000:1000"
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    networks:
      - internal
      - traefik_network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.photoprism.rule=Host(`photo.ca.home`)"
      - "traefik.http.routers.photoprism.entrypoints=http"
    # ports:
    #   - 2342:2342 # [local port]:[container port]
    # Uncomment the following lines to enable regular health checks (causes automatic restarts):
    # healthcheck:
    #   test: ["CMD", "photoprism", "status"]
    #   interval: 60s
    #   timeout: 15s
    #   retries: 5
    #
    # Run "photoprism help" and "photoprism config" too see all config options and current values:
    environment: # Run "photoprism help" and "photoprism config" too see all config options and current values
      PHOTOPRISM_ADMIN_PASSWORD: "<SNIP />"         # Initial admin password: PLEASE CHANGE!
      PHOTOPRISM_DEBUG: "true"                      # Run in debug mode (shows additional log messages)
      PHOTOPRISM_PUBLIC: "true"                      # No authentication required (disables password protection)
      PHOTOPRISM_READONLY: "false"                   # Don't modify originals directory (reduced functionality)
      PHOTOPRISM_UPLOAD_NSFW: "true"                 # Allow uploads that MAY be offensive
      PHOTOPRISM_DETECT_NSFW: "false"                # Flag photos as private that MAY be offensive
      PHOTOPRISM_EXPERIMENTAL: "false"               # Enable experimental features
      PHOTOPRISM_SITE_URL: "http://localhost:2342/"  # Canonical / public site URL
      PHOTOPRISM_SITE_TITLE: "Family Photo Archive"
      PHOTOPRISM_SITE_CAPTION: "Memorable flashes of color and light"
      PHOTOPRISM_SITE_DESCRIPTION: ""
      PHOTOPRISM_SITE_AUTHOR: "Family"
      PHOTOPRISM_HTTP_HOST: "0.0.0.0"
      PHOTOPRISM_HTTP_PORT: 2342
      PHOTOPRISM_SETTINGS_HIDDEN: "false"            # Users can not view or change settings
      #PHOTOPRISM_DATABASE_DRIVER: "sqlite"           # SQLite is an embedded database that doesn't require a server
      PHOTOPRISM_DATABASE_DRIVER: "mysql"          # Use MariaDB (or MySQL) instead of SQLite for improved performance
      PHOTOPRISM_DATABASE_DSN: "photoprism:<SNIP />@tcp(mariadb:3306)/photoprism?charset=utf8mb4,utf8&parseTime=true"
      PHOTOPRISM_SIDECAR_JSON: "true"                # Automatically create JSON sidecar files using Exiftool
      PHOTOPRISM_SIDECAR_YAML: "true"                # Automatically backup metadata to YAML sidecar files
      PHOTOPRISM_THUMB_FILTER: "lanczos"             # Resample filter, best to worst: blackman, lanczos, cubic, linear
      PHOTOPRISM_THUMB_UNCACHED: "false"             # Enable on-demand thumbnail rendering (high memory and cpu usage)
      PHOTOPRISM_THUMB_SIZE: 2048                    # Pre-rendered thumbnail size limit (default 2048, min 720, max 7680)
      # PHOTOPRISM_THUMB_SIZE: 4096                  # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
      PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680           # On-demand rendering size limit (default 7680, min 720, max 7680)
      PHOTOPRISM_JPEG_SIZE: 7680                     # Size limit for converted image files in pixels (720-30000)
      PHOTOPRISM_JPEG_QUALITY: 92                    # Set to 95 for high-quality thumbnails (25-100)
      PHOTOPRISM_DARKTABLE_PRESETS: "false"          # Use darktable presets (disables concurrent raw to jpeg conversion)
      # You may optionally set user, group and/or file permissions using environment variables:
      UID: 995
      GID: 991
      UMASK: 0007
    volumes:
      # Storage folder for settings, index & sidecar files (DON'T REMOVE):
      - "/tank/app/photoprism/data:/photoprism/storage"
      # Your personal photo and video collection ([local path]:[container path]):
      - "/tank/ark/photo:/photoprism/originals"
      # Multiple folders can be indexed by mounting them as subfolders of /photoprism/originals:
      # - "~/Family:/photoprism/originals/Family"    # [folder_1]:/photoprism/originals/[folder_1]
      # - "~/Friends:/photoprism/originals/Friends"  # [folder_2]:/photoprism/originals/[folder_2]
      # Mounting the import folder is optional (see docs):
      - "/tank/inbox/resilio/my_phone/Camera:/photoprism/import/my_phone"

# Uncomment the following lines to use MariaDB instead of SQLite for improved performance & scalability:
#
  mariadb:
   image: mariadb:10.5
   restart: unless-stopped
   command: mysqld --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50
   networks:
    - internal
   volumes:
     - "/tank/app/photoprism/db:/var/lib/mysql"
   environment:
     MYSQL_ROOT_PASSWORD: <SNIP />
     MYSQL_USER: photoprism
     MYSQL_PASSWORD: <SNIP />
     MYSQL_DATABASE: photoprism

# Uncomment the following lines to upgrade automatically, whenever there is a new Docker image available:
#
#  watchtower:
#    image: containrrr/watchtower
#    restart: unless-stopped
#    volumes:
#      - "/var/run/docker.sock:/var/run/docker.sock"

networks:
  traefik_network:
    external: true
  internal:
cwlls commented 3 years ago

I'm not sure why it would intermittently work, but I have discovered the error was my own. When using multiple networks as show above it is important to create a label (traefik.docker.network in this case) on the Traefik exposed container to specify which network should be used by Traefik:

labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik_network"
      - "traefik.http.routers.photoprism.rule=Host(`photo.ca.home`)"
      - "traefik.http.routers.photoprism.entrypoints=http"

Thanks, Chris