别再问PhotoPrism怎么多用户了!用Docker Compose一键部署全家桶(保姆级教程)
用Docker Compose构建多用户PhotoPrism集群:从零到生产级部署
在个人照片管理领域,PhotoPrism凭借其出色的AI识别能力和简洁的界面设计,逐渐成为许多摄影爱好者和家庭用户的首选。但官方尚未提供多账户支持这一事实,让不少团队用户和家庭共享场景下的使用者感到困扰。今天我们将彻底解决这个问题——不是通过笨拙的手动操作,而是采用现代DevOps实践中推崇的基础设施即代码方式,用Docker Compose实现一套可维护、易扩展的多实例解决方案。
与网上常见的docker run命令堆砌方案不同,我们的方法具有三大核心优势:版本控制友好的配置文件管理、一键启停的完整环境控制,以及Nginx反向代理实现的统一域名访问。下面让我们从环境准备开始,逐步构建这个生产级的多用户PhotoPrism系统。
1. 环境准备与架构设计
在开始部署前,我们需要明确整个系统的技术架构。与传统单实例部署相比,多用户方案需要考虑实例隔离、资源分配和统一访问三个核心问题。我们的解决方案采用Docker Compose作为编排工具,为每个用户创建独立容器,并通过差异化配置实现完全隔离。
1.1 硬件与系统要求
建议部署主机满足以下最低配置:
- CPU:4核及以上(AI识别功能较耗资源)
- 内存:8GB起步,每增加一个实例建议追加2GB
- 存储:SSD硬盘,容量根据照片库大小决定
- 操作系统:Ubuntu 22.04 LTS或CentOS 8+
# 检查系统资源情况 $ free -h total used free shared buff/cache available Mem: 15Gi 1.2Gi 12Gi 0.0Ki 1.8Gi 13Gi Swap: 2.0Gi 0.0Ki 2.0Gi $ df -h / Filesystem Size Used Avail Use% Mounted on /dev/nvme0n1p1 500G 28G 473G 6% /1.2 Docker环境配置
确保已安装最新版Docker和Docker Compose插件:
# Ubuntu安装示例 $ sudo apt update $ sudo apt install -y docker.io docker-compose-plugin $ sudo systemctl enable --now docker # 验证安装 $ docker --version Docker version 24.0.5, build 24.0.5-0ubuntu1~22.04.1 $ docker compose version Docker Compose version v2.20.3提示:生产环境建议配置Docker镜像加速器和日志轮转,避免长期运行产生过大日志文件。
2. 编写多实例Compose文件
我们将使用单个docker-compose.yml文件管理所有PhotoPrism实例,这是本方案的核心创新点。相比手动运行多个docker run命令,这种方法具有配置集中、依赖清晰和版本可控的优势。
2.1 基础服务定义
创建项目目录并编写Compose文件:
version: '3.8' services: photoprism-user1: image: photoprism/photoprism:latest container_name: photoprism-user1 ports: - "2342:2342" volumes: - "./data/user1:/photoprism/storage" - "./import/user1:/photoprism/import" environment: PHOTOPRISM_ADMIN_PASSWORD: "securePassword1" PHOTOPRISM_SITE_URL: "http://localhost:2342/" restart: unless-stopped photoprism-user2: image: photoprism/photoprism:latest container_name: photoprism-user2 ports: - "2343:2342" volumes: - "./data/user2:/photoprism/storage" - "./import/user2:/photoprism/import" environment: PHOTOPRISM_ADMIN_PASSWORD: "securePassword2" PHOTOPRISM_SITE_URL: "http://localhost:2343/" restart: unless-stopped2.2 高级配置参数
针对生产环境,我们需要添加更多优化配置:
environment: PHOTOPRISM_DEBUG: "false" PHOTOPRISM_READONLY: "false" PHOTOPRISM_WORKERS: "2" # 每个实例的AI处理线程数 PHOTOPRISM_DISABLE_CHOWN: "true" PHOTOPRISM_DISABLE_WEBDAV: "false"2.3 资源限制与隔离
为避免多个实例间资源争用,建议为每个容器设置资源限制:
deploy: resources: limits: cpus: '1.5' memory: 4G reservations: cpus: '0.5' memory: 1G3. 使用Nginx实现统一访问入口
直接通过不同端口访问各实例既不优雅也不安全。我们将配置Nginx作为反向代理,实现基于子域名的访问方式。
3.1 Nginx服务配置
在Compose文件中添加Nginx服务:
services: nginx: image: nginx:alpine ports: - "80:80" - "443:443" volumes: - "./nginx/conf.d:/etc/nginx/conf.d" - "./nginx/certs:/etc/nginx/certs" depends_on: - photoprism-user1 - photoprism-user23.2 子域名配置示例
创建nginx/conf.d/photoprism.conf文件:
server { listen 80; server_name user1.photos.example.com; location / { proxy_pass http://photoprism-user1:2342; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name user2.photos.example.com; location / { proxy_pass http://photoprism-user2:2342; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }3.3 HTTPS安全加固
使用Let's Encrypt免费证书启用HTTPS:
# 获取证书(需提前配置好DNS解析) $ sudo apt install certbot $ sudo certbot certonly --manual --preferred-challenges dns然后在Nginx配置中添加SSL支持:
server { listen 443 ssl; server_name user1.photos.example.com; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; # 其他SSL优化参数... }4. 系统运维与扩展技巧
部署完成后,日常维护和灵活扩展同样重要。下面分享几个实战中总结的关键技巧。
4.1 常用运维命令
# 一键启动所有服务 $ docker compose up -d # 查看服务状态 $ docker compose ps # 查看特定实例日志 $ docker compose logs -f photoprism-user1 # 执行备份(需先安装zip) $ docker compose exec photoprism-user1 photoprism backup -a -i --zip4.2 自动化备份方案
创建backup.sh脚本实现定期备份:
#!/bin/bash BACKUP_DIR="/backups/photoprism/$(date +%Y%m%d)" mkdir -p $BACKUP_DIR docker compose exec -T photoprism-user1 photoprism backup -a -i --zip > "$BACKUP_DIR/user1.zip" docker compose exec -T photoprism-user2 photoprism backup -a -i --zip > "$BACKUP_DIR/user2.zip" # 上传到云存储 rclone copy $BACKUP_DIR remote:backups/photoprism4.3 横向扩展策略
当需要新增用户时,只需在Compose文件中添加新服务定义:
photoprism-user3: image: photoprism/photoprism:latest container_name: photoprism-user3 ports: - "2344:2342" volumes: - "./data/user3:/photoprism/storage" - "./import/user3:/photoprism/import" environment: PHOTOPRISM_ADMIN_PASSWORD: "securePassword3" deploy: resources: limits: memory: 4G然后在Nginx配置中添加对应的server块即可。这种模块化设计使得系统扩展变得异常简单。
