Photoview

A simple and user-friendly Photo Gallery for personal servers. It is made for photographers and aims to provide an easy and fast way to navigate directories, with thousands of high resolution photos.

Directory Structure

    • .env
    • docker-compose.yml

docker-compose.yml

version: '3.9'
services:
  photoview:
    image: viktorstrate/photoview:2
    hostname: photoview
    container_name: photoview
    restart: unless-stopped
    stop_grace_period: 10s
    ports:
      - "8000:80" ## HTTP port (host:container)
    ## This ensures that DB is initialized and ready for connections.
    ## Comment out the entire `depends_on` section if PHOTOVIEW_DATABASE_DRIVER is set to `sqlite` in the .env
    depends_on:
      mariadb:
        condition: service_healthy
    ## Security options for some restricted systems
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    environment:
      PHOTOVIEW_DATABASE_DRIVER: ${PHOTOVIEW_DATABASE_DRIVER}
      ## Comment out the next variable in the case PHOTOVIEW_DATABASE_DRIVER is set to `sqlite` or `postgres` in the .env
      PHOTOVIEW_MYSQL_URL: "${MARIADB_USER}:${MARIADB_PASSWORD}@tcp(photoview-mariadb)/${MARIADB_DATABASE}"
      ## Uncomment the next line if PHOTOVIEW_DATABASE_DRIVER is set to `sqlite` in the .env
      # PHOTOVIEW_SQLITE_PATH: ${PHOTOVIEW_SQLITE_PATH}
      PHOTOVIEW_LISTEN_IP: "photoview"
      ## Optional: If you are using Samba/CIFS-Share and experience problems with "directory not found"
      ## Enable the following Godebug
      # - GODEBUG=asyncpreemptoff=1
      ## Optional: To enable map related features, you need to create a mapbox token.
      ## A token can be generated for free here https://account.mapbox.com/access-tokens/
      ## It's a good idea to limit the scope of the token to your own domain, to prevent others from using it.
      MAPBOX_TOKEN: ${MAPBOX_TOKEN}
    volumes:
      ## Example:
      ## - "/host/folder:/container/folder"
      - "/etc/localtime:/etc/localtime:ro" ## use local time from host
      - "/etc/timezone:/etc/timezone:ro"   ## use timezone from host
      ## Uncomment the next line if PHOTOVIEW_DATABASE_DRIVER is set to `sqlite` in the .env
      # - "${HOST_PHOTOVIEW_LOCATION}/database:/home/photoview/database"
      - "${HOST_PHOTOVIEW_LOCATION}/storage:/home/photoview/media-cache"
      ## Change This in the .env file: to the directory where your photos are located on your server.
      ## You can mount multiple paths if your photos are spread across multiple directories.
      ## The same path as the container path set here, you'll need to provide on the Photoview's init page (the one between the ':' chars).
      ## If you mount several folders, provide the path to the parent one on the init page.
      ## If you mount several folders, make sure that there are no direct mappings to the media root folder.
      ## This means that you need to also modify the container path of the HOST_PHOTOVIEW_MEDIA_ROOT
      ## to something like '/photos/main'. Note that this new name ('main' in this example) will become an album in Photoview.
      - "${HOST_PHOTOVIEW_MEDIA_ROOT}:/photos:ro"
      ## *Additional* media folders can be mounted like this (set the variable in .env file)
      ## Note that a mount cannot be located in a subfolder of another mount.
      # - "${HOST_PHOTOVIEW_MEDIA_FAMILY}:/photos/Family:ro"
 
  ## Comment out the `mariadb` service if PHOTOVIEW_DATABASE_DRIVER is set to `sqlite` or `postgres` in the .env
  mariadb:
    image: mariadb:lts
    hostname: photoview-mariadb
    container_name: photoview-mariadb
    restart: unless-stopped
    stop_grace_period: 5s
    ## Optimized MariaDB startup command for better performance and compatibility
    command: mariadbd --innodb-buffer-pool-size=512M --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=120
    security_opt: ## see https://github.com/MariaDB/mariadb-docker/issues/434#issuecomment-1136151239
      - seccomp:unconfined
      - apparmor:unconfined
    environment:
      MARIADB_AUTO_UPGRADE: "1"
      MARIADB_DATABASE: ${MARIADB_DATABASE}
      MARIADB_USER: ${MARIADB_USER}
      MARIADB_PASSWORD: ${MARIADB_PASSWORD}
      MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
    volumes:
      ## Example:
      ## - "/host/folder:/container/folder"
      - "/etc/localtime:/etc/localtime:ro" ## use local time from host
      - "/etc/timezone:/etc/timezone:ro"   ## use timezone from host
      - "${HOST_PHOTOVIEW_LOCATION}/database/mariadb:/var/lib/mysql" ## DO NOT REMOVE
    healthcheck:
      test: healthcheck.sh --connect --innodb_initialized
      interval: 1m
      timeout: 5s
      retries: 5
      start_period: 3m

Resources

Website: https://photoview.github.io/

GitHub: https://github.com/photoview/photoview

Docker Hub: https://hub.docker.com/r/viktorstrate/photoview

Configuration: https://photoview.github.io/en/docs/getting-started/