FileRise 3.38 Docker Compose 部署指南

FileRise v3.38.0 的 Docker Compose 实战部署:nginx+PHP-FPM 8.3 分离栈、应用与三数据目录持久化、管理员初始化,以及上传/重命名/删除/回收站/恢复/下载/WebDAV/重启持久化的逐项实测与排障沉淀。

FileRiseFileRisePHPDocker自托管2026/10/30

FileRise 3.38 Docker Compose 部署指南

目标:在 Ubuntu 服务器上以 Docker Compose 部署 FileRise v3.38.0(nginx 直出静态资源 + PHP-FPM 8.3 运行应用,应用代码与三个数据目录全部 bind mount 持久化),并实测管理员创建、登录、上传、重命名、删除/回收站、恢复、下载、WebDAV 与重启持久化。全部命令与回显均在 Ubuntu 22.04 + Docker Compose v2 环境实测通过。

一、环境信息

本文实测环境与版本基准如下(版本号均为部署当日实查值):

项目值获取方式
操作系统Ubuntu 22.04服务器实机
Docker29.9.2docker version 实查
Compose 编排Docker Compose v2(compose 插件)docker compose version 实查
FileRise 版本v3.38.0(官方 Release ZIP)GitHub Releases,查询日期 2026-10-30
PHP-FPM8.3.36(php:8.3-fpm 基础镜像 + zip 扩展)容器内 php -v 实查
nginx1.31.8(nginx:alpine 基础镜像)nginx -v 实查
对外端口8152(HTTP)部署前 ss -ltn 实查空闲
Compose 项目网络10.89.58.0/24部署前实查空闲网段后显式指定
演示管理员账号admin / q1w2e3r4首次启动初始化创建

⚠️ 网络说明:Release ZIP 的官方下载源 github.com 当时直连失败(curl: (7) Failed to connect to github.com port 443),实测改走代理渠道可稳定下载(代理用法见本机网络约定);部署时请按「官方源 → 代理」顺序尝试,当前代理渠道实测可用。Docker 基础镜像拉取(php:8.3-fpm、nginx:alpine)已由 Docker 守护进程代理配置覆盖,无需额外操作。

二、镜像选型说明

FileRise 官方提供两条容器化路径,部署前需先做选型:

方案说明适合场景
官方一体镜像 error311/filerise-docker:latest内置 Apache + PHP 8.3,入口脚本 start.sh 自动处理权限(PUID/PGID)、配置改写与目录扫描,开箱即用快速上手、单容器交付
nginx + PHP-FPM 分离组合(本文采用)nginx 直出静态资源并反代 fastcgi 到 PHP-FPM;应用代码与数据目录全部 bind mountWeb 层解耦、静态资源性能、与既有 nginx 体系一致

本文采用第二种:由 php:8.3-fpm 加装 zip 扩展构建应用镜像(官方要求扩展仅 json/curl/zip,前两者官方 PHP 镜像已内置),由 nginx:alpine 承担 Web 层。理由:静态资源(js/css/字体)由 nginx 直接服务、上传大文件时 client_max_body_size 独立可控、后续接反向代理/TLS 时只需动 nginx 层。

三、前置条件

  1. 服务器已安装 Docker 与 Docker Compose v2,且 Docker 守护进程可拉取镜像(国外网络环境需已配置代理);
  2. 对外端口空闲:部署前实查目标端口(本文实测选用 8152,选端口前先查占用):
ss -ltn | awk '{print $4}' | grep -oE '[0-9]+$' | sort -un | tr '\n' ' '

实测回显(当时 81xx 段已有服务占用 8147/8149/8150,故避开):

22 53 631 1935 8147 8149 8150 8554 8888 8889 8892 38443 40051 40973
  1. 自定义网络网段空闲:先查看既有网络已占用的 10.89.x.0/24 网段,从空闲槽位显式指定子网(避免与其他 Compose 项目网段冲突):
docker network ls --format '{{.Name}}' | while read n; do
  s=$(docker network inspect "$n" --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}' 2>/dev/null); echo "$n  $s"
done

实测回显(10.89.56.0/24、10.89.57.0/24 已被其他项目网络占用,本文取 10.89.58.0/24):

bridge  172.17.0.0/16
directory-lister-5.8.3-net  10.89.57.0/24
filegator-v7.16.8-net  10.89.56.0/24
host
none
  1. 服务器可下载 GitHub Release 件(官方源不通时代理,见环境信息中的网络说明)。

四、部署步骤

本章从零完成:目录规划 → 下载解压 → 数据目录授权 → 应用镜像构建 → nginx 配置 → Compose 编排 → 启动验证。约定部署根目录为 /opt/filerise/。

4.1 目录规划与下载应用

# 创建部署目录结构:compose/ 编排件、app/ 应用代码、data/ 三个数据目录
mkdir -p /opt/filerise/{compose,data/uploads,data/users,data/metadata} /opt/filerise/dl
cd /opt/filerise/dl
# 下载官方 Release ZIP(官方源不通时改走代理,本文实测直连失败后经代理取得)
curl -fsSL -o FileRise-v3.38.0.zip \
  "https://github.com/error311/FileRise/releases/download/v3.38.0/FileRise-v3.38.0.zip"

直连失败时的实测现象与降级后的下载回显:

curl: (7) Failed to connect to github.com port 443 after 21048 ms: Couldn't connect to server

代理渠道下载成功后核验文件(约 18 MB):

ls -la /opt/filerise/dl/
-rw-r--r-- 1 root root 18029874 Oct 30 14:11 FileRise-v3.38.0.zip

解压到应用目录并确认结构(发布件自带 vendor/ 全量依赖,无需 composer install):

cd /opt/filerise && mkdir -p app && cd app && unzip -qo ../dl/FileRise-v3.38.0.zip
ls
CHANGELOG.md      Dockerfile        LICENSE     README.md    SECURITY.md  config   docs    openapi.json.dist  phpcs.xml  scripts  start.sh  tests   THIRD_PARTY.md
codeql-config.yml  composer.json  composer.lock  custom-php.ini  docker-compose.yml  licenses  public  src  vendor

关键结构:public/(Web 根,含 index.php、api/、webdav.php)、config/config.php(应用配置)、src/(业务源码)、vendor/(依赖)、openapi.json.dist(REST API 规范)。

4.2 数据目录授权

FileRise 三个数据目录必须可被 PHP-FPM 进程用户(Debian/Ubuntu 下 www-data,UID/GID 33)写入:

chown -R www-data:www-data /opt/filerise/data

⚠️ 注意:bind mount 进 PHP 容器后,容器内 www-data 与宿主机 www-data 同为 UID 33,宿主机侧授权即可生效,无需进入容器操作。

4.3 构建 PHP-FPM 应用镜像(含 zip 扩展)

官方 PHP 镜像不含 zip 扩展,需要一个小 Dockerfile(保存为 /opt/filerise/compose/Dockerfile.php):

FROM php:8.3-fpm

RUN apt-get update \
    && apt-get install -y --no-install-recommends libzip-dev \
    && docker-php-ext-install zip \
    && rm -rf /var/lib/apt/lists/*

# 对齐官方 custom-php.ini 的上传与会话约束
RUN { \
    echo "upload_max_filesize=5G"; \
    echo "post_max_size=5G"; \
    echo "memory_limit=512M"; \
    echo "max_execution_time=300"; \
    echo "max_input_time=300"; \
    echo "max_file_uploads=20"; \
    echo "display_errors=Off"; \
    echo "log_errors=On"; \
    echo "session.upload_progress.enabled=Off"; \
  } > /usr/local/etc/php/conf.d/zz-filerise.ini

EXPOSE 9000
CMD ["php-fpm"]

配置块逐项说明:upload_max_filesize/post_max_size 提到 5G 对齐官方镜像默认的 TOTAL_UPLOAD_SIZE=5G(PHP 默认仅 2M/8M,不改则大文件上传必失败);memory_limit=512M、max_execution_time=300、max_input_time=300 沿用官方 custom-php.ini 的取值,保障大文件处理与长耗时请求;session.upload_progress.enabled=Off 与官方一致(FileRise 在浏览器侧跟踪上传进度,关闭 PHP 会话进度可规避已知漏洞面)。

构建:

cd /opt/filerise/compose && docker compose build php

实测回显(节选):

#9 resolving provenance for metadata file
#9 DONE 0.0s
 Image filerise-v3.38.0-php:8.3 Built

4.4 nginx 站点配置

保存为 /opt/filerise/compose/nginx.conf:

server {
    listen 80;
    server_name _;

    root /var/www/filerise/public;
    index index.php index.html;

    client_max_body_size 5G;
    client_body_timeout 300s;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www/filerise/public$fastcgi_script_name;
        fastcgi_param HTTP_AUTHORIZATION $http_authorization;
        fastcgi_read_timeout 300s;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 8 64k;
    }

    location ~* \.(css|js|ico|svg|woff2?|ttf|png|jpg|jpeg|gif|webmanifest)$ {
        expires 7d;
        access_log off;
        try_files $uri =404;
    }

    location ~ ^/(uploads|users|metadata)(/|$) {
        deny all;
    }
}

逐项说明:root 指向应用内 public/ 子目录(官方要求,源码与数据不可直接暴露);client_max_body_size 5G 必须与 PHP 的 post_max_size 同量级,否则 nginx 层先拒 413;fastcgi_pass php:9000 使用 Compose 服务名寻址 PHP-FPM;fastcgi_param SCRIPT_FILENAME 用容器内统一路径 /var/www/filerise/public;HTTP_AUTHORIZATION 透传是 WebDAV 的 HTTP Basic 认证可用前提(nginx 默认不传 Authorization 头);静态资源段给 7 天缓存;最后一段封禁三个数据目录的直接 HTTP 访问——数据必须经 API 读写。

4.5 Compose 编排文件

保存为 /opt/filerise/compose/docker-compose.yml(显式项目名 + 显式子网,避免与他项目冲突):

name: filerise-v3.38.0-stack

services:
  web:
    image: nginx:alpine
    container_name: filerise-v3.38.0-web
    restart: unless-stopped
    ports:
      - "8152:80"
    volumes:
      - ../app:/var/www/filerise:ro
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - php
    networks:
      - filerise-net

  php:
    build:
      context: .
      dockerfile: Dockerfile.php
    image: filerise-v3.38.0-php:8.3
    container_name: filerise-v3.38.0-php
    restart: unless-stopped
    environment:
      SECURE: "false"          # 有 TLS 反代时改为 "true"
      FR_TRUSTED_PROXIES: ""   # 反代场景填代理网段,如 10.89.58.0/24
    volumes:
      - ../app:/var/www/filerise
      - ../data/uploads:/var/www/uploads
      - ../data/users:/var/www/users
      - ../data/metadata:/var/www/metadata
    networks:
      - filerise-net

networks:
  filerise-net:
    driver: bridge
    ipam:
      config:
        - subnet: 10.89.58.0/24

逐项说明:name 固定项目名为 filerise-v3.38.0-stack(版本化命名,docker compose down 只影响本项目);web 以只读方式挂应用代码与 nginx 配置;php 侧应用目录保持可读写(应用要写站点自身需要的运行时文件),三个数据目录按官方默认容器内路径挂载;environment.SECURE=false 对应 HTTP 部署,上 TLS 反代后改 true(影响 Cookie 安全标记与跳转逻辑);网络显式 10.89.58.0/24。

4.6 启动与状态确认

cd /opt/filerise/compose && docker compose up -d

实测回显:

 Container filerise-v3.38.0-php Starting
 Container filerise-v3.38.0-php Started
 Container filerise-v3.38.0-web Starting
 Container filerise-v3.38.0-web Started
docker compose ps
NAME                   IMAGE                      COMMAND                  SERVICE   CREATED        STATUS                  PORTS
filerise-v3.38.0-php   filerise-v3.38.0-php:8.3   "docker-php-entrypoi…"   php       1 second ago   Up Less than a second   9000/tcp
filerise-v3.38.0-web   nginx:alpine               "/docker-entrypoint.…"   web       1 second ago   Up Less than a second   0.0.0.0:8152->80/tcp, [::]:8152->80/tcp

首启验证——访问首页应返回 200 与 FileRise 页面:

curl -sS -o /dev/null -w 'HTTP %{http_code}\n' http://localhost:8152/
curl -sS http://localhost:8152/ | head -c 300

实测回显:

HTTP 200
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>FileRise</title>
  <meta name="theme-color" content="#0b5ed7">

4.7 首次启动:创建管理员

全新实例(users 目录无用户)首次访问 Web 界面会进入管理员创建引导页;脚本化部署可用初始化接口直接建号(无用户状态下开放,建号后即关闭):

cd /opt/filerise
curl -sS -c cookies.txt -X POST 'http://localhost:8152/api/addUser.php?setup=1' \
  -H 'Content-Type: application/json' \
  -d '{"username":"admin","password":"q1w2e3r4"}' -w '\n[HTTP %{http_code}]\n'

实测回显:

{"ok":true,"data":{"success":"User added successfully"},"success":true,"message":"User added successfully"}
[HTTP 200]

⚠️ 注意:初始化窗口只在无用户时开放,首个管理员创建完成后该入口自动失效(用户目录会生成 .setup_complete 标记),务必在部署完成后立即建号。

登录并核验会话(HTTP 接口方式,浏览器登录等价):

curl -sS -c cookies.txt -b cookies.txt -X POST 'http://localhost:8152/api/auth/auth.php' \
  -H 'Content-Type: application/json' \
  -d '{"username":"admin","password":"q1w2e3r4"}' -w '\n[HTTP %{http_code}]\n'
curl -sS -b cookies.txt 'http://localhost:8152/api/auth/checkAuth.php' -w '\n[HTTP %{http_code}]\n'

实测回显:

{"status":"ok","success":"Login successful","isAdmin":true,"folderOnly":false,"readOnly":false,"disableUpload":false,"username":"admin"}
[HTTP 200]
{"authenticated":true,"isAdmin":true,"totp_enabled":false,"username":"admin","folderOnly":false,"readOnly":false,"disableUpload":false}
[HTTP 200]

五、功能实测:上传 / 重命名 / 删除 / 恢复 / 下载 / WebDAV

本章全部命令在 4.6 部署完成并登录后逐条实测。所有写操作接口受 CSRF 令牌保护,先按 5.1 取得令牌,再携带 X-CSRF-Token 头调用。

5.1 取得 CSRF 令牌(实测排障沉淀)

直接调用写接口会收到 403:

curl -sS -b cookies.txt -X POST 'http://localhost:8152/api/folder/createFolder.php' \
  -H 'Content-Type: application/json' -d '{"folderName":"reports","parent":"root"}'
{"error":"Invalid CSRF token"} [HTTP 403]

CSRF 令牌与登录会话绑定,实测最直接的取法:向任一写接口(如上传)不带令牌发一次请求,服务端会软失效并回发新令牌(响应同时已写入会话,下一次请求即可使用):

curl -sS -b cookies.txt -X POST 'http://localhost:8152/api/upload/upload.php' -F 'file=@/dev/null' -F 'folder=root'

实测回显(令牌为当时实测原值,每次会话不同):

{"csrf_expired":true,"csrf_token":"452fc4cb5b644aa4bac7ec74aa70cc0fae5d074f0bc4c3e7329f267afc468ae5"} [HTTP 200]

后续命令统一携带 -H "X-CSRF-Token: 452fc4cb5b644aa4bac7ec74aa70cc0fae5d074f0bc4c3e7329f267afc468ae5"(下文以 $T 指代该值)。

5.2 创建文件夹

curl -sS -b cookies.txt -X POST 'http://localhost:8152/api/folder/createFolder.php' \
  -H "X-CSRF-Token: $T" -H 'Content-Type: application/json' \
  -d '{"folderName":"reports","parent":"root"}' -w ' [HTTP %{http_code}]\n'

实测回显:

{"success":true,"folder":"reports"} [HTTP 200]

5.3 上传文件(含一次真实排障)

准备两个测试文件并上传(单发上传接口为 multipart 表单,文件字段名为 file):

printf 'FileRise upload test line 1\nline 2 你好\n' > upload-demo.txt
head -c 1048576 /dev/urandom > demo-1mb.bin
curl -sS -b cookies.txt -X POST 'http://localhost:8152/api/upload/upload.php' \
  -H "X-CSRF-Token: $T" -F 'file=@upload-demo.txt' -F 'folder=root' -w ' [HTTP %{http_code}]\n'
curl -sS -b cookies.txt -X POST 'http://localhost:8152/api/upload/upload.php' \
  -H "X-CSRF-Token: $T" -F 'file=@demo-1mb.bin' -F 'folder=root' -w ' [HTTP %{http_code}]\n'

实测回显:

{"success":"Files uploaded successfully","newFilename":null} [HTTP 200]
{"success":"Files uploaded successfully","newFilename":null} [HTTP 200]

⚠️ 排障实录:首次实测按 OpenAPI 文档描述使用字段名 fileToUpload,服务端返回 {"error":"No files received"} [HTTP 400];核对服务端实现后确认实际接受字段名为 file(分块续传与单发两条路径均如此),改用 file 后成功。遇同类报错先检查表单字段名与 CSRF 头。

上传后核验落盘(数据目录即真实服务器磁盘):

ls -la /opt/filerise/data/uploads/

实测回显:

-rw-r--r-- 1 www-data www-data 1048576 Oct 30 14:36 demo-1mb.bin
drwxr-xr-x 2 www-data www-data     4096 Oct 30 14:36 reports
drwxr-xr-x 2 www-data www-data     4096 Oct 30 14:37 trash
-rw-r--r-- 1 www-data www-data      42 Oct 30 14:36 演示文档.txt

5.4 文件列表与重命名

curl -sS -b cookies.txt 'http://localhost:8152/api/file/getFileList.php?folder=root'

实测回显(节选):

{"files":[{"name":"demo-1mb.bin","modified":"10/30/26  02:36AM","uploaded":"10/30/26  02:36AM","size":"1.0 MB","sizeBytes":1048576,"uploader":"admin","tags":[],"mime":"application/octet-stream","sourceId":"local","content":"","contentTruncated":false},{"name":"upload-demo.txt","modified":"10/30/26  02:36AM","uploaded":"10/30/26  02:36AM","size":"42 bytes","sizeBytes":42,"uploader":"admin","tags":[],"mime":"text/plain","sourceId":"local","content":"","contentTruncated":false}],"globalTags":[],"sourceId":"local"}

重命名(支持中文文件名):

curl -sS -b cookies.txt -X PUT 'http://localhost:8152/api/file/renameFile.php' \
  -H "X-CSRF-Token: $T" -H 'Content-Type: application/json' \
  -d '{"folder":"root","oldName":"upload-demo.txt","newName":"演示文档.txt"}' -w ' [HTTP %{http_code}]\n'

实测回显:

{"success":"File renamed successfully","newName":"演示文档.txt"} [HTTP 200]

再次拉列表确认改名生效:

['demo-1mb.bin', '演示文档.txt']

5.5 删除(进回收站)与恢复

curl -sS -b cookies.txt -X POST 'http://localhost:8152/api/file/deleteFiles.php' \
  -H "X-CSRF-Token: $T" -H 'Content-Type: application/json' \
  -d '{"folder":"root","files":["演示文档.txt"]}' -w ' [HTTP %{http_code}]\n'

实测回显:

{"success":"Files moved to Trash: 演示文档.txt"} [HTTP 200]

查看回收站(文件以「原名_时间戳_随机串」形式暂存):

curl -sS -b cookies.txt 'http://localhost:8152/api/file/getTrashItems.php'

实测回显:

[{"type":"file","originalFolder":"/var/www/uploads/","originalName":"演示文档.txt","trashName":"演示文档.txt_1793342223_21d315a7","trashedAt":1793342223,"uploaded":"10/30/26  02:36AM","uploader":"admin","deletedBy":"admin"}]

按回收站名恢复:

curl -sS -b cookies.txt -X POST 'http://localhost:8152/api/file/restoreFiles.php' \
  -H "X-CSRF-Token: $T" -H 'Content-Type: application/json' \
  -d '{"files":["演示文档.txt_1793342223_21d315a7"]}' -w ' [HTTP %{http_code}]\n'

实测回显:

{"success":"Items restored: 演示文档.txt","restored":["演示文档.txt"]} [HTTP 200]

5.6 下载验证

curl -sS -b cookies.txt 'http://localhost:8152/api/file/download.php?folder=root&file=%E6%BC%94%E7%A4%BA%E6%96%87%E6%A1%A3.txt' -w ' [HTTP %{http_code}]\n'

实测回显(内容逐字一致,中文未乱码):

FileRise upload test line 1
line 2 你好
 [HTTP 200]

⚠️ 排障实录:下载接口的文件参数名是 file(不是 filename)。实测用错参数名时返回 {"error":"Invalid file name."} [HTTP 400];另外若目标文件已在回收站中,返回 {"error":"Access forbidden."} [HTTP 404]——先恢复再下载。

5.7 WebDAV 开启与挂载验证

WebDAV 默认关闭(管理员配置项),实测未开启时访问返回:

[HTTP 403]
WebDAV access is currently disabled by administrator.

经管理接口开启(该配置落在 users 目录的加密管理配置中,详见《FileRise 3.38 配置参数详解》):

curl -sS -b cookies.txt -X POST 'http://localhost:8152/api/admin/updateConfig.php' \
  -H "X-CSRF-Token: $T" -H 'Content-Type: application/json' \
  -d '{"enableWebDAV":true}' -w ' [HTTP %{http_code}]\n'

实测回显:

{"success":"Configuration updated successfully."} [HTTP 200]

用 HTTP Basic 认证(WebDAV 独立于浏览器会话)列根目录:

curl -sS -u admin:q1w2e3r4 -X PROPFIND 'http://localhost:8152/webdav.php' -H 'Depth: 1' -w '[HTTP %{http_code}]\n' | head -c 500

实测回显(HTTP 207 Multi-Status,可看到 5.2 建的 reports 目录):

[HTTP 207]
<?xml version="1.0"?>
<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns"><d:response><d:href>/webdav.php/</d:href><d:propstat><d:prop><d:getlastmodified>Fri, 30 Oct 2026 06:37:56 GMT</d:getlastmodified><d:resourcetype><d:collection/></d:resourcetype></d:prop><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response><d:response><d:href>/webdav.php/reports/</d:href>…(节选)

⚠️ 注意:WebDAV 的 Basic 认证依赖 nginx 透传 Authorization 头(见 4.4 的 HTTP_AUTHORIZATION 行);若漏配,PROPFIND 会始终 403。

5.8 重启持久化验证

重启 PHP 服务后数据应完整保留:

cd /opt/filerise/compose && docker compose restart php
sleep 2
curl -sS -b ../cookies.txt 'http://localhost:8152/api/file/getFileList.php?folder=root' | python3 -c "import json,sys; d=json.load(sys.stdin); print('after restart files:', [f['name'] for f in d['files']])"

实测回显:

after restart files: ['demo-1mb.bin', '演示文档.txt']

六、数据持久化说明

FileRise 是零数据库应用,状态全部落在三个 bind mount 目录(宿主机 /opt/filerise/data/,容器内 /var/www/ 对应路径):

宿主机目录容器内路径内容实测产物举例
data/uploads/var/www/uploads上传文件、子目录、trash/ 回收站demo-1mb.bin、演示文档.txt、reports/
data/users/var/www/users用户清单 users.txt、管理配置 adminConfig.json(加密)、站点配置 siteConfig.json、初始化标记adminConfig.json、.setup_complete
data/metadata/var/www/metadata文件元数据 JSON、文件夹 ACL(folder_acl.json)、持久化令牌密钥(600 权限)root_metadata.json、persistent_tokens.key

实测注意三点:目录属主需为 www-data(4.2);persistent_tokens.key 为 0600 私有权限,备份时一并带走(丢失则「记住登录」令牌全部失效);adminConfig.json 在磁盘上是密文,读取请走管理接口 /api/admin/getConfig.php。备份策略:定时打包三个目录即可整体备份;迁移到新机 = 拷贝 app/(或重新解压同版本 ZIP)+ 三个数据目录。

七、环境变量表

本方案 PHP 服务读取的环境变量(compose environment: 注入):

变量本方案取值说明
SECURE"false"HTTPS 部署时置 true,影响安全 Cookie 与跳转
FR_TRUSTED_PROXIES""信任的反代网段列表;有反代时填如 10.89.58.0/24,配合 FR_IP_HEADER 取真实客户端 IP

作为对照,官方一体镜像(error311/filerise-docker)的完整变量集(实查自官方发布件 docker-compose.yml 与 start.sh,官方镜像在启动时把这些值写回应用配置):

变量官方默认说明
TIMEZONEUTC站点时区(写回 config.php 的 TIMEZONE 常量)
DATE_TIME_FORMATm/d/y h:iA列表时间格式
TOTAL_UPLOAD_SIZE5G上传总量上限(写回 config.php)
SECUREfalseHTTPS 标记
PERSISTENT_TOKENS_KEY空持久化令牌密钥;留空则首启自动生成并落 metadata/persistent_tokens.key
PUID / PGID1000 / 1000官方镜像将 www-data 重映射到该 UID/GID 后 chown 数据目录
CHOWN_ON_STARTtrue每次启动递归修正 uploads/metadata 属主(权限就绪后建议改 false)
SCAN_ON_STARTtrue启动时扫描上传目录建立元数据(一次性)
SHARE_URL空分享链接对外展示域名

⚠️ 注意:nginx+PHP-FPM 自组方案不经过官方 start.sh,时区与上传上限等常量直接在 config/config.php 中定义(详见《FileRise 3.38 配置参数详解》的三层配置体系);FR_* 系列环境变量则对两种方案同等生效。

八、配置参数说明与配置文件挂载

本方案的配置文件挂载清单:

文件挂载方式作用
compose/nginx.conf:ro 挂到 web 的 /etc/nginx/conf.d/default.conf站点路由、PHP 反代、上传体积、数据目录封禁
compose/Dockerfile.php构建期生效zip 扩展 + zz-filerise.ini(上传/超时/会话约束)
app/(应用代码)web 只读、php 可写官方 Release v3.38.0 解压件
data/{uploads,users,metadata}php 可写三目录数据模型

PHP 层关键参数与 nginx 层必须对齐:client_max_body_size(nginx)≥ post_max_size(PHP)≥ 单文件 upload_max_filesize(PHP);本方案统一 5G。运行时业务配置(管理员界面/管理接口管理的站点标题、登录方式、WebDAV 开关、分享上限、OnlyOffice、ClamAV、缩略图等)存于 users 目录,逐项解释见《FileRise 3.38 配置参数详解》。

九、等价 docker run(单命令对照)

与上述 Compose 等价的单命令形态(便于快速对照理解,实际交付仍建议用 4.5 的 compose 文件管理):

# PHP-FPM 应用服务(应用代码与三个数据目录 bind mount)
docker run -d --name filerise-v3.38.0-php \
  -e SECURE=false \
  -v /opt/filerise/app:/var/www/filerise \
  -v /opt/filerise/data/uploads:/var/www/uploads \
  -v /opt/filerise/data/users:/var/www/users \
  -v /opt/filerise/data/metadata:/var/www/metadata \
  --network filerise-v3380-stack_filerise-net \
  filerise-v3.38.0-php:8.3

# nginx Web 层(8152 对外,静态直出 + fastcgi 反代)
docker run -d --name filerise-v3.38.0-web \
  -p 8152:80 \
  -v /opt/filerise/app:/var/www/filerise:ro \
  -v /opt/filerise/compose/nginx.conf:/etc/nginx/conf.d/default.conf:ro \
  --network filerise-v3380-stack_filerise-net \
  nginx:alpine

十、常用运维命令

cd /opt/filerise/compose
docker compose ps                 # 服务状态
docker compose logs -f web        # Web 层日志(nginx 访问/错误)
docker compose logs -f php        # PHP-FPM 日志(应用 error_log 也落此处)
docker compose restart php        # 重启应用服务(数据不受影响,见 5.8 实测)
docker compose down               # 停止并移除本项目容器与网络(bind mount 数据保留)
docker compose up -d              # 再次拉起

升级流程(保持数据不动,只换应用代码):下载新版本 Release ZIP → 备份 data/ 三目录 → 清空 app/ 并解压新 ZIP(保留 data 不动)→ docker compose restart php web。若官方镜像路径有变(如 newlib 依赖变化),以官方升级说明为准。

十一、常见问题

Q1:docker compose up 报 invalid pool request: Pool overlaps with other one on this address space 自定义子网与既有网络冲突。实测本文最初指定 10.89.56.0/24 时命中已被占用的网段(错误回显如上),按第三章命令实查后改用空闲槽位(10.89.58.0/24)解决。选端口同理:8149 实查已被既有服务占用,改用 8152。

Q2:写操作一律 {"error":"Invalid CSRF token"} CSRF 令牌与会话绑定且登录后不自动下发到接口响应头。按 5.1:先对任一写接口空发一次拿回 csrf_token,再统一携带 X-CSRF-Token。

Q3:上传返回 {"error":"No files received"} multipart 文件字段名必须是 file(不是 OpenAPI 示例里的 fileToUpload),且请求需带 CSRF 头。

Q4:大文件上传 413 或中途失败 检查三层限制是否同量级对齐:nginx client_max_body_size、PHP post_max_size/upload_max_filesize、应用层 TOTAL_UPLOAD_SIZE(config.php);以及 client_body_timeout/max_input_time 是否足够。本文均按 5G / 300s 实测对齐。

Q5:WebDAV 一直 403 两种原因实测均出现:未开启(响应体为 WebDAV access is currently disabled by administrator.,经管理接口置 enableWebDAV=true);nginx 未透传 Authorization 头(漏配 fastcgi_param HTTP_AUTHORIZATION 时 Basic 认证永远失败)。

Q6:下载返回 Invalid file name. 或 Access forbidden. 参数名用 file;文件在回收站中时不可下载,先恢复(5.6)。

Q7:首页 200 但样式错乱 nginx 的 root 必须指向 public/ 子目录而非应用根;静态资源由 nginx 直出,若误把整站交给 PHP 处理会出现资源 404。

十二、参考链接