在腾讯云 Ubuntu Server 上用 Docker、nginx 安装 PhotoPrism

前言与环境准备

如果你的服务器所在地区是中国大陆,请先做好服务器的 ICP 备案和公安联网备案之后,再来参考本文进行服务器的搭建调试,否则网站服务很容易会被阻断!

由于网站最近才开始使用 B2 PRO 主题和自己开发的基于 Shiki 的代码高亮插件 NodeCode 插件,可能会存在少量的代码显示不全或者异常,如果你发现了,也欢迎反馈给我,谢谢!

本文提到的使用 Docker 来安装 PhotoPrism 是官方推荐的安装方式,如果你用非 Docker 容器方式来安装的话,各种服务组件依赖的安装配置会非常的麻烦。

选择腾讯云 Ubuntu Server 搭建 PhotoPrism

为什么选择腾讯云?

一来我的网站主要的目标用户还是来自中国大陆,因此必须得选择一个方便进行 ICP 备案和公安联网备案的云服务提供商,也只有腾讯云和阿里云体量相对较大和靠谱;二来我个人还是比较喜欢腾讯云的 UI 交互和配合 QQ/微信的方便快捷的管理体系,所以对于我来说腾讯云成了目前唯一的选择。

为什么选择 Ubuntu Server?

从 2014 年 7 月到 2026 年 5 月,我的网站服务器一直都是采用的 CentOS/RockyLinux 系的操作系统,一直觉得 CentOS/RockyLinux 才是正宗的适合运维的服务器操作系统,但是自从使用 B2 Pro 这种付费主题,主题开发者使用了 Swoole Loader 来加解密自己的主题源码,而对应的 loader82.so/loader83.so/loader84.so 文件(82/83/84 对应 PHP 的 8.2/8.3/8.4 版本) 在 RockyLinux 系统上的兼容性好像有问题,始终无法正确的加载,而我也不太想用 PHP 8.1 这样比较低的版本,所以只能转向 B2 Pro 主题开发者春哥建议的 Ubuntu Server 系统。

后来经过调研和评估,其实采用 Ubuntu Server 在将来可能比 CentOS/RockyLinux 更为适合,尤其是在 AI 时代,在 AI 开发、深度学习以及大模型(LLM)领域,Ubuntu 拥有压倒性的优势;另外 Ubuntu 有 Ubuntu Server 和 Ubuntu Desktop,非常适合个人在服务端和桌面端同时用起来,命令行与软件包管理、进程守护与服务管理、Docker 容器生态等,都可以互相平移相关经验,所以 Ubuntu Server 变成了我个人网站的首选服务端操作系统。

为什么选择 PhotoPrism?

PhotoPrism 是一个相册管理系统,市面上有这么多可以公开托管相册的社交网站,诸如小红书、Instagram 等,为什么还要自己搭建一个 PhotoPrism 相册管理系统呢?一来我觉得市面上真的没有几个仅仅用来公开托管个人相册社交网络;二来相对合适的诸如小红书、Instagram 在 PC Web 端的访问有潜在的阻塞:小红书只能访问部分内容、Instagram 网络访问受限等;而且我觉得这些公开托管相册的社交网站不太符合我的审美,而且数据的安全性也得不到保证,自己托管 PhotoPrism 相册管理系统,可以完美解决此类问题。

技术栈概览

技术栈清单

  • 操作系统:腾讯云 Ubuntu Server 24.04 LTS 64 位
  • Docker: 29.4.3
  • PhotoPrism: 260523
  • nginx: 1.24.0

为什么选择 Ubuntu Server 24.04 LTS 64 位?

Ubuntu Server 对 WordPress 的整体兼容性和易用性要比其他 Linux 服务器操作系统要好;优先选择当前最新版本:腾讯云上目前 Ubuntu Server 的最新长期支持版本是 Ubuntu 24.04 LTS 64 位。

为什么选择 Docker 29.4.3?

Docker 容器安装 PhotoPrism 是官方最推荐的方式,没有之一;Docker 可以极大的简化 PhotoPrism 的安装;当前 Docker 官方软件源中 Docker 最新版本为 29.4.3。

为什么选择 nginx 1.24.0?

nginx 是最常见的 Web 服务组件,用来反向代理实现域名访问 PhotoPrism;优先选择当前最新版本:Ubuntu Server 24.04 官方软件源中 nginx 中最新版本为 nginx 1.24.0。

为什么选择 PhotoPrism 260523?

PhotoPrism 目前是最适合我的个人公开相册管理程序,官方的最新 Docker 版本的 PhotoPrism 是 260523。

腾讯云域名与 Ubuntu Server 服务器购买

关于这部分内容,可以参考 《腾讯云域名与 Ubuntu Server 服务器购买》 中的【腾讯云域名与 Ubuntu Server 服务器购买】;而且你可以直接与自 WordPress 共用这台服务器。

服务器登录与系统基础配置

关于这部分内容,也可以参考 《腾讯云域名与 Ubuntu Server 服务器购买》 中的【服务器登录与系统基础配置】。

PhotoPrism 安装调试

PhotoPrism 的安装顺序

在 Ubuntu Server 上推荐的 PhotoPrism 安装顺序是:Docker、PhotoPrism。

更新软件列表

在安装服务组件和应用软件之前,先更新下软件列表,短期内执行一次就好:

# 更新软件列表
ubuntu@server:~$ sudo apt update 
Hit:1 http://mirrors.tencentyun.com/ubuntu noble InRelease
Get:2 http://mirrors.tencentyun.com/ubuntu noble-updates InRelease [126 kB]
Hit:3 http://mirrors.tencentyun.com/ubuntu noble-backports InRelease
Hit:4 http://mirrors.tencentyun.com/ubuntu noble-security InRelease
Get:5 http://mirrors.tencentyun.com/ubuntu noble-updates/main amd64 Packages [2,064 kB]
Fetched 2,190 kB in 1s (4,372 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

Docker 安装与配置

我们先通过以下命令行进行 Docker 安装前的基础准备:

# 安装 CA 证书管理工具和 curl(用于确保后续下载过程中的 HTTPS 安全验证,并提供下载指令)
ubuntu@server:~$ sudo apt install -y ca-certificates curl
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
ca-certificates is already the newest version (20240203).
ca-certificates set to manually installed.
curl is already the newest version (8.5.0-2ubuntu10.9).
0 upgraded, 0 newly installed, 0 to remove and 30 not upgraded.

# 创建 /etc/apt/keyrings 目录,赋予 0755 权限(所有者可读写执行,其他人可读执行,符合 Debian/Ubuntu 安全规范)
ubuntu@server:~$ sudo install -m 0755 -d /etc/apt/keyrings

# 从清华大学镜像源站下载 Docker 的 GPG 公钥并存为 docker.asc 文件(用于验证下载的包是否来自 Docker 官方,防止中间人篡改)
ubuntu@server:~$ sudo curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

# 修改密钥文件权限为所有人可读,确保 APT 进程在安装软件时可以读取该密钥进行验证
ubuntu@server:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc

# echo 命令配合管道符输出仓库配置到 docker.list 文件中
ubuntu@server:~$ echo 
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] 
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu 
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | 
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 查看 Docker 软件源是否正常写入
ubuntu@server:~$ sudo cat /etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu   noble stable

接下来正式安装 Docker:

# 再次更新软件包缓存,确保安装的是最新版本的 Docker
ubuntu@server:~$ sudo apt update

# 安装 Docker 引擎的核心组件:
# docker-ce:Docker 社区版核心引擎
# docker-ce-cli:Docker 命令行接口工具
# containerd.io:Docker 底层容器运行时
# docker-buildx-plugin:构建容器镜像的加速插件
# docker-compose-plugin:Docker Compose V2 插件(支持 docker compose 命令)
ubuntu@server:~$ sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 配置国内腾讯云镜像源加速(解决网络延迟的关键)
ubuntu@server:~$ sudo vi /etc/docker/daemon.json

# 在 /etc/docker/daemon.json 写入以下内容:
{ 
  "registry-mirrors": [ 
    "https://mirror.ccs.tencentyun.com"
  ] 
} 

通知系统守护进程管理器(systemd)配置项已变更,重新加载配置文件
ubuntu@server:~$ sudo systemctl daemon-reload

重启 Docker 服务,使得 daemon.json 中的镜像加速配置正式生效
ubuntu@server:~$ sudo systemctl restart docker

# 验证配置是否成功:查看 Docker 详细状态,检查 Registry Mirrors 字段是否包含腾讯云镜像源加速地址
ubuntu@server:~$ sudo docker info | grep -A 5 "Registry Mirrors"
Registry Mirrors:
 https://mirror.ccs.tencentyun.com/
Live Restore Enabled: false
Firewall Backend: iptables
 EnableUserlandProxy: true
 UserlandProxyPath: /usr/bin/docker-proxy

# 查询 Docker 运行状态:已运行、已设置开机自启
ubuntu@server:~$ sudo systemctl status docker
 docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)
     Active: active (running) since Thu 2026-06-11 18:13:06 CST; 18s ago
TriggeredBy: docker.socket
       Docs: https://docs.docker.com
   Main PID: 2313978 (dockerd)
      Tasks: 8
     Memory: 23.7M (peak: 26.1M)
        CPU: 300ms
     CGroup: /system.slice/docker.service
             └─2313978 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jun 11 18:13:06 server dockerd[2313978]: time="2026-06-11T18:13:06.123900427+08:00" level=info msg="Res>
Jun 11 18:13:06 server dockerd[2313978]: time="2026-06-11T18:13:06.135319647+08:00" level=info msg="Del>
Jun 11 18:13:06 server dockerd[2313978]: time="2026-06-11T18:13:06.499743171+08:00" level=info msg="API>
Jun 11 18:13:06 server systemd[1]: Started docker.service - Docker Application Container Engine.

从上面结果可以看出来,Docker 已经正常安装并运行。

我们上面有提到两个镜像源:清华大学镜像源和腾讯云镜像源,两者的区别如下:

  • 清华大学镜像源 (sources.list.d/docker.list) — “安装包供应商”
    • 作用:运行 sudo apt install docker-ce 时,系统会通过这个配置文件去清华源下载 Docker 的安装程序
    • 目的:保证你把 Docker 引擎本体安装到 Linux 系统里时,速度快、不超时
  • 腾讯云镜像源 (/etc/docker/daemon.json) — “镜像搬运工”
    • 作用:当你运行 docker pull photoprism/photoprism 时,Docker 引擎会去寻找镜像文件,这时它会通过 daemon.json 里配置的加速器去连接腾讯云,拉取镜像 Image
    • 目的:保证你拉取 Docker Hub 上的第三方应用(如 PhotoPrism)时,速度快、不失败

nginx 的安装与配置

下一步我们来安装 nginx:

# 安装 nginx
ubuntu@server:~$ sudo apt install -y nginx
... 中间省略 N ...

查看下当前 nginx 版本和服务运行状态:我们看到 nginx 已经安装好且服务已经启动,也设置了开机自启。

# 查看 nginx 版本
ubuntu@server:~$ nginx -v
nginx version: nginx/1.24.0 (Ubuntu)
# 查看 nginx 状态
ubuntu@server:~$ sudo systemctl status nginx
 nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-06-08 17:37:51 CST; 1min 59s ago
       Docs: man:nginx(8)
    Process: 1299427 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, >
    Process: 1299429 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/>
   Main PID: 1299459 (nginx)
      Tasks: 3 (limit: 2263)
     Memory: 2.4M (peak: 5.2M)
        CPU: 22ms
     CGroup: /system.slice/nginx.service
             ├─1299459 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─1299460 "nginx: worker process"
             └─1299461 "nginx: worker process"

Jun 08 17:37:51 server systemd[1]: Starting nginx.service - A high performance web server and a reverse>
Jun 08 17:37:51 server systemd[1]: Started nginx.service - A high performance web server and a reverse >
lines 1-17/17 (END)

我们需要针对 PhotoPrism 搭建的特定网站进行 nginx 配置:创建 /etc/nginx/conf.d/photo.flygoly.com.conf,并写入以下配置内容:

# 监听80端口,实现HTTP全站跳转HTTPS
server {
    # 绑定HTTP访问端口80
    listen        80;
    # 绑定域名photo.flygoly.com
    server_name   photo.flygoly.com;
    # 全部HTTP请求301永久重定向至HTTPS同路径
    rewrite       ^(.*)$ https://$host$1 permanent;
}

# 监听443端口,HTTPS加密反向代理Photoprism服务
server {
    # 监听443端口并开启SSL加密功能
    listen 443 ssl;
    # 绑定HTTPS访问域名
    server_name photo.flygoly.com;

    # SSL完整证书链文件路径
    ssl_certificate          /etc/nginx/ssl/photo.flygoly.com/photo.flygoly.com.bundle.crt;
    # SSL证书私钥文件路径
    ssl_certificate_key      /etc/nginx/ssl/photo.flygoly.com/photo.flygoly.com.key;
    # DH密钥协商文件,提升TLS握手安全性
    ssl_dhparam              /etc/nginx/ssl/photo.flygoly.com/flygoly.com.dhparam.pem;

    # 定义安全加密套件,剔除所有弱加密算法
    ssl_ciphers              'EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4';
    # 强制优先使用服务器端加密套件,拒绝客户端弱套件
    ssl_prefer_server_ciphers  on;
    # 仅启用高安全TLS 1.2/1.3,废弃老旧不安全协议
    ssl_protocols            TLSv1.3 TLSv1.2;
    # 分配10M共享内存缓存SSL会话,减少重复握手耗时
    ssl_session_cache        shared:SSL:10m;
    # SSL会话缓存有效时长10分钟
    ssl_session_timeout      10m;
    # HSTS头部,浏览器一年内强制仅用HTTPS访问本站
    add_header               Strict-Transport-Security max-age=31536000;
    # 禁止浏览器MIME嗅探,防范类型解析漏洞
    add_header               X-Content-Type-Options nosniff;
    
    # 匹配除上述路径外所有其余请求
    location / {
        # 全站剩余流量转发至本地2342端口Photoprism主程序
        proxy_pass http://127.0.0.1:2342/;
        # 透传原始访问域名
        proxy_set_header Host $host;
        # 透传访客真实IP
        proxy_set_header X-Real-IP $remote_addr;
        # 透传多层代理IP列表
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 向后端标识前端HTTPS协议
        proxy_set_header X-Forwarded-Proto $scheme;
        # 关闭后端自动重定向适配
        proxy_redirect off;
    }
}

网站域名解析配置

为了能够将 PhotoPrism 指向网站域名:https://photo.flygoly.com,第一步先要做域名解析:

主机记录 记录类型 线路类型 记录值 权重 优先级 TTL
photo A 默认 公网 IP 600

上面第一条解析是将 photo.flygoly.com 指向公网服务器 IP,点击保存即可。

网站 SSL 证书申请与配置

创建好针对 photo.flygoly.com 网站的 nginx 配置文件之后,不用急着校验配置文件和平滑重启 nginx 服务,我们还要继续获取和配置 SSL 证书和域名解析到服务器。

要想你的网站更安全,一定要启用 https 访问,需要拥有 SSL 证书,腾讯云管理后台是可以提供免费的 SSL 证书的,虽然每次有效时长为 90 天,依然是当下最具性价比的选择。我们访问腾讯云管理后台的 SSL 证书控制台申请免费的 SSL 证书:https://console.cloud.tencent.com/ssl/dsc/apply

  • 证书额度:已用 0 张 / 共 50 张
  • 证书绑定域名:photo.flygoly.com
    • 注:填写主域名(如 tencent.com)仅赠送其 www 子域名(如 www.tencent.com),不包含其他子域(如 ssl.tencent.com),其他子域需单独申请。
    • 如需绑定泛域名(例如 *.tencent.com)或者绑定 IP,需购买付费证书。
  • 域名验证方式:自动 DNS 验证
    • 注:因为我的域名是托管在腾讯云上的,所以可以直接采用自动 DNS 验证,如果域名不在腾讯云,或者不在这个账号,就要选择手动 DNS 验证或者文件验证,按照相关指引操作即可。
  • 自动删除验证:开启
    • 注:开启后,证书签发成功后系统会自动删除域名验证记录(不影响证书)。
  • 证书有效期:90 天
  • 根证书信息:DigiCert Global Root G2

提交申请,进行域名验证,然后几分钟以内就可以通过,获得免费的 90 天的 SSL 证书。注意:在证书签发后的下载页面,我们选择对应的服务器类型 – 【Nginx(适用大部分场景)(pem文件、crt文件、key文件)】,下载解压之后,我们只需要拿出 .crt 和 .key 文件,.pem 文件不要用里面的,我们自己来生成。

我们将 .crt 和 .key 文件重命名成 photo.flygoly.com.bundle.crt 和 photo.flygoly.com.key,通过 SFTP 的方式上传到文件夹 /etc/nginx/ssl/photo.flygoly.com/ 下:

ubuntu@server:/etc/nginx/ssl/photo.flygoly.com$ ls
photo.flygoly.com.bundle.crt photo.flygoly.com.key

在文件夹 /etc/nginx/ssl/photo.flygoly.com/ 下,我们用命令行 sudo openssl dhparam -out flygoly.com.dhparam.pem 2048 生成 dhparam.pem 文件:

ubuntu@server:/etc/nginx/ssl/photo.flygoly.com$ sudo openssl dhparam -out flygoly.com.dhparam.pem 2048
Generating DH parameters, 2048 bit long safe prime
.......................................................................................+................................................................................................................................++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*
ubuntu@server:/etc/nginx/ssl/photo.flygoly.com$ ls
photo.flygoly.com.bundle.crt photo.flygoly.com.key  flygoly.com.dhparam.pem

检查下校验 nginx 配置文件和平滑重启 nginx 服务:

ubuntu@server:/etc/nginx/ssl/photo.flygoly.com$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ubuntu@server:/etc/nginx/ssl/photo.flygoly.com$ sudo nginx -s reload
2026/06/09 12:21:03 [notice] 914383#914383: signal process started

用 Docker 安装 PhotoPrism

我们先做好 PhotoPrism 相关配置:

# -p 创建缓存/缩略图存储目录
ubuntu@server:~$ sudo mkdir -p /opt/photoprism/storage
# 存放原始上传照片、原图文件的目录
ubuntu@server:~$ sudo mkdir -p /opt/photoprism/originals
# 存放Photoprism数据库文件(SQLite)的目录
ubuntu@server:~$ sudo mkdir -p /opt/photoprism/database

# 查询文件夹权限
ubuntu@server:~$ ls -l /opt/photoprism/
total 12
drwxr-xr-x 2 root root 4096 Jun 11 19:36 database
drwxr-xr-x 2 root root 4096 Jun 11 19:36 originals
drwxr-xr-x 2 root root 4096 Jun 11 19:36 storage

# 递归把整个 PhotoPrism 目录归属权改成 UID=1000、GID=1000
# PhotoPrism 容器内部运行用户 uid 固定 1000,权限一致才能读写宿主机挂载文件
ubuntu@server:~$ sudo chown -R 1000:1000 /opt/photoprism

# 再次查询文件夹权限
ubuntu@server:~$ ls -l /opt/photoprism/
total 12
drwxr-xr-x 2 ubuntu netdev 4096 Jun 11 19:36 database
drwxr-xr-x 2 ubuntu netdev 4096 Jun 11 19:36 originals
drwxr-xr-x 2 ubuntu netdev 4096 Jun 11 19:36 storage

进一步创建针对 PhotoPrism 的 Docker Compose 配置文件:/opt/photoprism/docker-compose.yml,然后写入以下配置内容,注意将 PHOTOPRISM_ADMIN_PASSWORD 改成你自己的管理密码,不需要带英文双引号:

services: # 定义容器服务列表
  photoprism: # 定义 photoprism 服务名称
    image: photoprism/photoprism:latest # 指定使用的容器镜像,latest 表示获取官方最新版本
    container_name: photoprism # 为容器命名,方便后续使用 docker ps 或 logs 命令管理
    depends_on:
      - mariadb # 依赖项:启动 photoprism 前必须先启动 mariadb 容器
    ports:
      - "127.0.0.1:2342:2342" # 端口映射,将容器内 2342 端口映射到宿主机 127.0.0.1:2342,仅允许本机访问,确保安全
    environment: # 容器运行时的环境变量配置
      - PHOTOPRISM_ADMIN_PASSWORD= 你的管理员密码 # 设置网页管理后台的初始登录密码
      - PHOTOPRISM_SITE_URL=https://photo.flygoly.com # 定义外部访问的完整域名,用于生成分享链接
      - PHOTOPRISM_ORIGINALS_LIMIT=5000 # 限制单次索引文件的数量,避免内存压力过大
      - PHOTOPRISM_HTTP_COMPRESSION=gzip # 开启 Gzip 压缩,优化网页访问加载速度
      - PHOTOPRISM_DEBUG=false # 关闭 Debug 模式,生产环境推荐关闭以节省性能并提升安全
      - PHOTOPRISM_PUBLIC=false # 设置为私有模式,即必须登录才能访问相册
      - PHOTOPRISM_READONLY=false # 允许用户进行修改或上传操作,而非仅读模式
      - PHOTOPRISM_UPLOAD_NSFW=false # 禁止自动上传 NSFW(不雅内容)标记的照片
      - PHOTOPRISM_DATABASE_DRIVER=mysql # 设置数据库驱动为 MySQL/MariaDB
      - PHOTOPRISM_DATABASE_SERVER=mariadb:3306 # 指定数据库连接地址,使用容器名而非 IP,Docker 会自动解析
      - PHOTOPRISM_DATABASE_NAME=photoprism # 数据库名称
      - PHOTOPRISM_DATABASE_USER=photoprism # 数据库连接用户名
      - PHOTOPRISM_DATABASE_PASSWORD=photoprism # 数据库连接密码
    volumes: # 目录映射,将宿主机目录挂载到容器内,保证数据持久化
      - "/opt/photoprism/storage:/photoprism/storage" # 挂载缓存、索引数据库等存储目录
      - "/opt/photoprism/originals:/photoprism/originals" # 挂载照片原始文件存放目录
    restart: unless-stopped # 重启策略:除非手动停止容器,否则服务异常崩溃时会自动重启

  mariadb: # 定义 mariadb 数据库服务
    image: mariadb:10.6 # 指定使用 MariaDB 10.6 版本
    container_name: mariadb # 设置数据库容器名称
    command: mysqld --innodb-buffer-pool-size=256M --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120 # 数据库调优参数,调整内存池大小和字符编码,适配相册高并发索引任务
    environment: # 数据库初始化环境变量
      - MYSQL_ROOT_PASSWORD=root # 设置 root 超级用户密码
      - MYSQL_DATABASE=photoprism # 初始化数据库名称
      - MYSQL_USER=photoprism # 初始化数据库专用用户
      - MYSQL_PASSWORD=photoprism # 初始化数据库专用密码
    volumes: # 数据持久化映射
      - "./database:/var/lib/mysql" # 将数据库存储目录映射到宿主机当前路径下的 database 目录
    restart: unless-stopped # 数据库重启策略

Docker 安装 PhotoPrism 的准备工作都已做好,我们来通过 Docker 来启动 PhotoPrism:

# 进入到 /opt/photoprism 文件夹
ubuntu@server:~$ cd /opt/photoprism
# 通过 Docker Compose 来启动 PhotoPrism,如果是首次启动比较慢,会从网上下载镜像
ubuntu@server:/opt/photoprism$ sudo docker compose up -d
[+] up 2/2
 Container mariadb    Started                                                                     0.2s
 Container photoprism Started                                                                     0.3s

通过访问 https://photo.flygoly.com,就可以看到 PhotoPrism 管理后台,说明 PhotoPrism 已经完整安装运行了。

PhotoPrism 配置

通过访问 https://photo.flygoly.com,可以看到 PhotoPrism 管理后台,用 admin 和上述 docker-compose.yml 文件中配置的密码来登录 PhotoPrism,确认是否正常登录进去。

PhotoPrism 免费版本其实不是很适合对外展示不同的相册,也无法较好的设置游客和查看者这两种角色,所以我想了一个办法,就是将一个相册对外永久分享,得到一个永久分享链接,当访问者访问 https://photo.flygoly.com 的时候,就跳转到那个对外永久分享的链接,这样就一定程度实现对外展示类似 Instagram 的个人相册。

登录进入到 PhotoPrism 管理后台后,我们创建一个相册,先将相册名改成 flygoly,然后点击分享相册,我们得到一个分享链接:https://photo.flygoly.com/s/u7fm1axaoh/flygoly,用户只有访问这个特定的链接,才能看到我“对外”共享的相册,那么我们就把 https://photo.flygoly.com 直接绑定跳转到 https://photo.flygoly.com/s/12troewbxf/flygoly 这个链接就可以正常对外公开访问了。

我们在下面的 nginx 配置文件中追加:【# 精确匹配网站根路径】 和 【# 匹配专属相册分享访问路径】,保存重启之后,你就会发现访问https://photo.flygoly.com 直接跳转到 https://photo.flygoly.com/s/12troewbxf/flygoly 这个看起来像是一个公开的相册地址。

# 监听80端口,实现HTTP全站跳转HTTPS
server {
    # 绑定HTTP访问端口80
    listen        80;
    # 绑定域名photo.flygoly.com
    server_name   photo.flygoly.com;
    # 全部HTTP请求301永久重定向至HTTPS同路径
    rewrite       ^(.*)$ https://$host$1 permanent;
}

# 监听443端口,HTTPS加密反向代理Photoprism服务
server {
    # 监听443端口并开启SSL加密功能
    listen 443 ssl;
    # 绑定HTTPS访问域名
    server_name photo.flygoly.com;

    # SSL完整证书链文件路径
    ssl_certificate          /etc/nginx/ssl/photo.flygoly.com/photo.flygoly.com.bundle.crt;
    # SSL证书私钥文件路径
    ssl_certificate_key      /etc/nginx/ssl/photo.flygoly.com/photo.flygoly.com.key;
    # DH密钥协商文件,提升TLS握手安全性
    ssl_dhparam              /etc/nginx/ssl/photo.flygoly.com/flygoly.com.dhparam.pem;

    # 定义安全加密套件,剔除所有弱加密算法
    ssl_ciphers              'EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4';
    # 强制优先使用服务器端加密套件,拒绝客户端弱套件
    ssl_prefer_server_ciphers  on;
    # 仅启用高安全TLS 1.2/1.3,废弃老旧不安全协议
    ssl_protocols            TLSv1.3 TLSv1.2;
    # 分配10M共享内存缓存SSL会话,减少重复握手耗时
    ssl_session_cache        shared:SSL:10m;
    # SSL会话缓存有效时长10分钟
    ssl_session_timeout      10m;
    # HSTS头部,浏览器一年内强制仅用HTTPS访问本站
    add_header               Strict-Transport-Security max-age=31536000;
    # 禁止浏览器MIME嗅探,防范类型解析漏洞
    add_header               X-Content-Type-Options nosniff;
    
    # 精确匹配网站根路径
    location = / { 
        # 访问首页时301跳转到指定相册分享页面 
        return 301 https://$host/s/12troewbxf/flygoly; 
    } 

    # 匹配专属相册分享访问路径
    location /s/12troewbxf/flygoly { 
        # 将该路径请求转发至本地Photoprism对应地址 
        proxy_pass http://localhost:2342/s/12troewbxf/flygoly; 
        # 向后端透传原始访问域名 
        proxy_set_header Host $host; 
        # 向后端透传访客真实公网IP 
        proxy_set_header X-Real-IP $remote_addr; 
        # 向后端透传完整代理转发IP链路 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        # 告知后端当前前端使用HTTPS协议 
        proxy_set_header X-Forwarded-Proto $scheme;
        # 关闭后端自动重定向改写,由Nginx统一处理跳转 
        proxy_redirect off; 
    }

    # 匹配除上述路径外所有其余请求
    location / {
        # 全站剩余流量转发至本地2342端口Photoprism主程序
        proxy_pass http://127.0.0.1:2342/;
        # 透传原始访问域名
        proxy_set_header Host $host;
        # 透传访客真实IP
        proxy_set_header X-Real-IP $remote_addr;
        # 透传多层代理IP列表
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 向后端标识前端HTTPS协议
        proxy_set_header X-Forwarded-Proto $scheme;
        # 关闭后端自动重定向适配
        proxy_redirect off;
    }
}

后续如果想要登录管理后台,可以直接访问:https://photo.flygoly.com/library/login。

如果觉得文章对你有帮助,欢迎赞赏支持

如果觉得文章对你有帮助,欢迎赞赏支持
博客

在腾讯云 Ubuntu Server 上用 MariaDB、PHP、nginx 安装 WordPress 和 B2 PRO 主题

2026-6-10 21:42:13

博客

极简主义的思考与实践

2026-6-12 20:26:55

搜索