photoview

photoview

高性能自托管照片管理工具 支持RAW和面部识别

Photoview是一款高性能的自托管照片管理工具,专为摄影师设计。它支持RAW格式和EXIF解析,自动扫描本地文件并生成缩略图,实现快速浏览。主要特点包括用户管理、相册共享、视频支持和面部识别。Photoview优化性能,支持按需加载高分辨率图像,并采用严格安全策略保护媒体资源,是理想的自托管照片管理解决方案。

Photoview照片管理自托管开源DockerGithub开源项目
<img src="./screenshots/photoview-logo.svg" height="92px" alt="photoview logo" />

License GitHub contributors Docker Pulls Docker builds codecov

screenshot

Photoview is a simple and user-friendly photo gallery that's made for photographers and aims to provide an easy and fast way to navigate directories, with thousands of high-resolution photos.

You configure Photoview to look for photos and videos within a directory on your file system. The scanner automatically picks up your media and starts to generate thumbnail images to make browsing super fast.

When your media has been scanned, they show up on the website, organised in the same way as on the filesystem.

If you have questions regarding setup or development, feel free to join the Discord server https://discord.gg/jQ392948u9

Demo site

Visit https://photos.qpqp.dk/

Username: demo Password: demo

Contents

Main features

  • Closely tied to the file system. The website presents the images found on the local filesystem of the server; directories are mapped to albums.
  • User management. Each user is created along with a path on the local filesystem, photos within that path can be accessed by that user.
  • Sharing. Albums, as well as individual media, can easily be shared with a public link, the link can optionally be password protected.
  • Made for photography. Photoview is built with photographers in mind, and thus supports RAW file formats, and EXIF parsing.
  • Video support. Many common video formats are supported. Videos will automatically be optimized for web.
  • Face recognition. Faces will automatically be detected in photos, and photos of the same person will be grouped together.
  • Performant. Thumbnails are automatically generated and photos first load when they are visible on the screen. In full screen, thumbnails are displayed until the high-resolution image has been fully loaded.
  • Secure. All media resources are protected with a cookie-token, all passwords are properly hashed, and the API uses a strict CORS policy.

Supported platforms

Why yet another self-hosted photo gallery

There exists a lot of open-source self-hosted photo galleries already. Here are some, just to mention a few.

So why another one? I love taking photos, and I store all of them on my local fileserver. This is great because I can organize my photos directly on the filesystem, so it's easy to move them or take backups. I want to be able to control where and how the photos are stored.

The problem is, however, that RAW images are extremely tedious to navigate from a fileserver, even over the local network.

My server holds a lot of old family pictures that I would like my family to have access to as well. And some of the pictures I would like to easily be able to share with other people without the hassle of them having to make an account first.

Thus, I need a solution that can do the following:

  • A scan-based approach that automatically organises my photos
  • Support RAW and EXIF parsing
  • Have support for multiple users and ways to share albums and photos also publicly
  • Be straightforward and fast to use

All the photo galleries can do a lot of what I need, but no single one can do it all.

Getting started — Setup with Docker

This section describes how to get Photoview up and running on your server with Docker. Make sure you have Docker and docker-compose installed and running on your server. make should be installed as well if you'd like to use provided Makefile, which is optional (see step 4 for more details). 7zz should be installed in case, you'd like to use it in scope of the backup scenario instead of the default .tar.xz format. Read the comment in the Makefile, located on top of the backup section for more details.

  1. Download the content of the docker-compose example folder to the folder on your server, where you expect to host the Photoview internal data (database and cache files).

    Please note that this folder contains 2 versions of the docker-compose file:

    • docker-compose.example.yml - the fully-functional and recommended for the most cases config
    • docker-compose.minimal.example.yml - the minimal and simple config for those, who find the previous one too complex and difficult to understand and manage

    When downloading files, you need to choose only one of them.

  2. Rename downloaded files and remove the example from their names (so, you need to have .env, docker-compose.yml, and Makefile files). If you choose the docker-compose.minimal.example.yml on previous step, make sure to rename it to the docker-compose.yml.

  3. Open these files in a text editor and read them. Modify where needed according to the documentation comments to properly match your setup. There are comments of 2 types: those, starting with ##, are explanations and examples, which should not be uncommented; those, starting with #, are optional or alternative configuration parts, which might be uncommented in certain circumstances, described in corresponding explanations. It is better to go through the files in the next order: .env, docker-compose.yml, and Makefile.

  4. Make sure that your media library's root folder and all the files and subfolders are readable and searchable by other users: run the next command (or corresponding sequence of commands from the Makefile):

    make readable

    If command(s) return Permission denied error, run them under the user, owning corresponding files and folders. Alternatively, run them adding sudo before the command: this will switch the execution context to root user and ask for the root password. You have to have permission to run sudo in the system.

    If you don't want to give required permissions to others group for your files, alternatively, you can:

    • create a group on your host with GID=999 and make all the files and folders inside volumes of the photoview service being owned by this group; then set the appropriate permissions to the group section.
    • create on your host a group with GID=999 and a user in this group with UID=999; then change the ownership of all the files and folders inside volumes of the photoview service to this user; then set the appropriate permissions to the user section.

    If you configured other mounts with media files from other locations on the host (like HOST_PHOTOVIEW_MEDIA_FAMILY or anything else), you need to run the same commands, as in the Makefile readable target, for each media root folder on your host manually: copy each command to your shell and replace the variable with the absolute path to an additional media root folder without the trailing /. Run both commands for each additional root folder.

  5. In case, you don't have make installed in your system or don't want to use it for the Photoview management activities, you could use the same commands from the Makefile and run them in your shell directly, or create your own scripts. Make sure to apply or replace the variables from your .env first in this case. Makefile is provided just for your convenience and simplicity, but is optional.

  6. Start the server by running the following command (or corresponding sequence of commands from the Makefile):

    make all

If the endpoint or the port hasn't been changed in the docker-compose.yml file, Photoview can now be accessed at http://localhost:8000

Initial Setup

If everything is set up correctly, you should be presented with an initial setup wizard when accessing the website the first time.

Initial setup

Enter a new username and password.

For the photo path, enter the path inside the docker container where your photos are located. This can be set from the docker-compose.yml file under photoview -> volumes. The default location is /photos.

A new admin user will be created, with access to the photos located at the path provided under the initial setup.

The photos will have to be scanned before they show up, you can start a scan manually, by navigating to Settings and clicking on Scan All

Advanced setup

We suggest securing the Photoview instance before exposing it outside your local network: even while it provides read-only access to your media gallery and has basic user authentication functionality, it is not enough to protect your private media from malicious actors on the Internet.

Possible ways of securing a self-hosted service might be (but not limited to):

  1. Configure a Firewall on your local network's gateway and allow only the intended type of incoming traffic to pass.
  2. Use VPN to provide external access to local services.
  3. Setting up a Reverse proxy in front of the service and forwarding all the traffic through it, exposing HTTPS port with strong certificate and cipher suites to the Internet. This could be one of the next products or something else that you prefer:
  4. Configure an external Multi-Factor Authentication service to manage authentication for your service (part of Cloudflare services, but you can choose anything else).
  5. Configure Web Application Firewall to protect from common web exploits like SQL injection, cross-site scripting, and cross-site forgery requests (part of Cloudflare services, but you can choose anything else).
  6. Use Content Delivery Network as an additional level of DDoS prevention: it can securely cache your media and let it be accessible from a wide list of servers on the Internet (part of Cloudflare services, but you can choose anything else).
  7. Configure a Rate Limit of allowed number of requests from a user during specified time range to protect against DDoS attacks.
  8. Set up an Intrusion Detection/Prevention System to monitor network traffic for suspicious activity and issue alerts when such activity is discovered.

Setting up and configuring of all these protections depends on and requires a lot of info about your local network and self-hosted services. Based on this info, the configuration flow and resulting services architecture might differ a lot between cases. That is why in the scope of this project, we can only provide you with this high-level list of possible ways of webservice protection. You'll need to investigate them, find the best combination and configuration for your case, and take responsibility to configure everything in the correct and consistent way. We cannot provide you support for such highly secured setups, as a lot of things might work differently because of security limitations.

Contributing

🎉 First off, thanks for your interest in contribution! 🎉

This project is a result of hard work, and it's great to see you interested in contributing. Contributions are not just about code — you can help in many ways!

Before you start, please take a moment to read our Contributing guide. It includes information on our code of conduct, the process for submitting pull requests, and more.

Remember, every contribution counts. Let's make this project better together! 💪

Set up Docker development environment

Docker development environment is easy to set up. It only requires Docker and Docker Compose Plugin locally. All dependencies are installed in a container but not in the host.

It also has some shortcomings. In macOS, Docker is running in a Linux VM. The fs notification doesn't work well in this case. You can't use reflex or nodemon to relaunch servers when code changes. The compiler runs pretty slow too.

We recommend to use Docker development environment. If Docker environment doesn't work well, like on macOS, please use local development environment.

Start API and UI server with Docker Compose

It may take a long time to build dependencies when launching servers first time.

$ docker compose -f dev-compose.yaml build # Build images for development $ docker compose -f dev-compose.yaml up # Launch API and UI servers

The graphql playground can now be accessed at localhost:4001. The site can now be accessed at localhost:1234. Both servers will be relaunched after the code is changed.

By default, it uses sqlite3 as database. To run servers with other database, please update PHOTOVIEW_DATABASE_DRIVER value in dev-compose.yaml file and run:

$ docker compose -f dev-compose.yaml --profile mysql up # Run with mysql database or $ docker compose -f dev-compose.yaml --profile postgres up # Run with postgresql database

Start API server with Docker

If you don't want to depend on Docker Compose but only Docker, you can launch server as below.

It may take a long time to build dependencies when launching servers first time.

$ docker build --target api -t photoview/api . # Build image for development $ docker run --rm -it -v `pwd`:/app --network host --env-file api/example.env photoview/api \ reflex -g '*.go' -s -- go run . # Monitor source code and (re)launch API server

The graphql playground can now be accessed at localhost:4001.

[!NOTE] The server runs on the host network as --network host flag. It's easy to communicate between API server and UI server. If you don't want to do that, please check Docker Network to create a new network to run servers.

Start UI server with Docker

It may take a long time to build dependencies when launching servers first time.

$ docker build --target ui -t photoview/ui . # Build image for development $ docker run --rm -it -v `pwd`:/app --network host --env-file ui/example.env photoview/ui \ npm run mon # Monitor source code and (re)launch UI server

The site can now be accessed at localhost:1234.

[!NOTE] The server runs on the host network as --network host flag. It's easy to communicate between API server and UI server. If you don't want to do that, please check Docker Network to create a new network to run servers.

Set up local development environment

Install dependencies

  • API
    • Required packages:
      • golang >= 1.22
      • g++
      • libc-dev
      • libheif >= 1.15.1
      • go-face Requirements
        • dlib
        • libjpeg
        • libblas
        • libcblas, recommended using libatlas-base
        • liblapack
    • Optional tools during developing:
      • reflex: a source code monitoring tool, which automatically rebuilds and restarts the server, running from the code in development.
      • sqlite: the SQLite DBMS, useful to interact with Photoview's SQLite DB directly if you use it in your development environment.
  • UI
    • Required packages:
      • node = 18

In Debian/Ubuntu, install dependencies:

$ sudo apt update # Update the package list $ sudo apt install golang g++ libc-dev libheif-dev libdlib-dev libjpeg-dev libblas-dev libatlas-base-dev liblapack-dev # For API requirement $ sudo apt install reflex sqlite3 # For

编辑推荐精选

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

下拉加载更多