ResourceSpace 11.0 Docker Compose 部署指南

在 Docker Compose 中部署 ResourceSpace 11.0(PHP 8.3 + MariaDB 11.8)的完整实操指南,覆盖镜像构建、Compose 编排、安装向导、持久化挂载、定时任务、备份恢复与排障实录,全部步骤在本机实测验证。

ResourceSpace数字资产管理文件管理PHPDocker Compose2026/11/01

ResourceSpace 11.0 Docker Compose 部署指南

目标:从零开始在一台 Ubuntu 24.04 服务器上,用 Docker Compose 部署一套可用的 ResourceSpace 11.0 数字资产管理平台,完成官方安装向导、管理员登录、后台任务调度与数据持久化配置。本文全部命令与回显均在下述环境中实测通过。

一、环境信息

本文实测环境与关键版本信息如下(版本均于 2026-11-01 实查或实测):

  • 操作系统:Ubuntu 24.04.5 LTS(x86_64)
  • Docker Engine:29.9.2
  • Docker Compose:v5.6.1
  • ResourceSpace:11.0(官方稳定发布线,SVN releases/11.0 分支 revision 30001,包内 include/version.php 值为 $productversion = "SVN 11.0")
  • 应用基础镜像:php:8.3-apache(bookworm,实际 PHP 版本 8.3.36)
  • 数据库:mariadb:11.8 镜像(实测版本 11.8.9-MariaDB)
  • 对外端口:8132(映射到 Web 服务 80 端口)
  • 部署目录:/opt/resourcespace/
  • 示例站点访问地址:http://192.168.1.172:8132
  • 示例管理员账号:admin / q1w2e3r4

关键软件实测版本回显:

$ docker --version
Docker version 29.9.2, build a82e528
$ docker compose version
Docker Compose version v5.6.1

部署完成后进入应用环境实测的组件版本:

$ php -v | head -1
PHP 8.3.36 (cli) (built: Oct 28 2026 01:27:36) (NTS)
$ mariadb --version
mariadb from 11.8.9-MariaDB, client 15.2 for debian-linux-gnu (x86_64) using  EditLine wrapper

二、镜像选型说明

ResourceSpace 官方提供的部署材料有三条路径(官方 Get 页,2026-11-01 查询):

  1. 官方 Docker 仓库:https://github.com/resourcespace/docker,克隆后在构建机上现场执行 docker compose up --build -d;
  2. SVN 源码检出:稳定版走 svn co https://svn.resourcespace.com/svn/rs/releases/[版本];
  3. GitHub 镜像仓库:https://github.com/resourcespace/resourcespace,官方声明仍处于迁移过程中,release 分支目前只在 SVN 上存在。

官方 Docker 仓库的构建方式是在构建机上现场从 SVN 检出源码再打包,构建产物随检出时点浮动,且对构建环境的 SVN 出网连通性有硬要求。为了让部署版本可锁定、可复现,本文采用官方稳定发布源码 + 自定义 Dockerfile 构建的方案:

  • 源码来源:SVN 官方稳定分支 releases/11.0(revision 30001)导出打包,与官方分发源码包逐文件一致(实测 diff -r 全量比对无差异,include/version.php 校验值相同);
  • 基础镜像:php:8.3-apache(官方 PHP 镜像,Debian bookworm 底座),在其上安装 GD、mysqli、exif、zip、intl、bcmath、opcache 等扩展与 ImageMagick、Ghostscript、FFmpeg、Exiftool、poppler-utils 等外部处理工具——这些正是 ResourceSpace 预览转码流水线的全部依赖;
  • 数据库镜像:mariadb:11.8 官方镜像(ResourceSpace 官方 Docker 方案同样选用 MariaDB)。

💡 技术拓展:DAM 类 PHP 应用的容器化有两条主流做法——发行版底座(如直接用带全套 LAMP 的 Linux 镜像,包全但体积大、版本旧)与官方语言镜像自建(php:x-apache 之上按需装扩展与工具,可控且贴合官方系统要求)。本文实际采用后者:ResourceSpace 对 PHP 扩展(GD/mysqli/exif/intl 等)与外部二进制(ImageMagick/FFmpeg/Ghostscript/Exiftool)有明确清单,按清单自建既满足 11.0 的 PHP 8.1+ 要求,也避免发行版仓库带来的版本漂移。

三、前置条件

  1. 服务器已安装 Docker Engine 与 Docker Compose 插件(安装方法见 Docker 官方文档);
  2. 服务器具备外网访问能力(下载 SVN 源码与基础镜像);若访问国外资源缓慢,可为 wget/svn 配置 HTTP 代理(export http_proxy=http://<代理地址>:<端口>,SVN 走 HTTPS 时读取同名环境变量);
  3. 规划端口未被占用(本文用 8132),可用 ss -ltn | grep 8132 确认无输出;
  4. 磁盘空间预留:应用镜像约 2.2 GB,源码包约 55 MB,数据库与文件存储按资产量增长另计;
  5. 若服务器启用了防火墙,放行规划的对外端口。

四、部署步骤

4.1 目录规划

在服务器上创建部署目录,整体结构如下:

mkdir -p /opt/resourcespace && cd /opt/resourcespace
/opt/resourcespace/
├── docker-compose.yml      # 编排文件
├── Dockerfile              # 应用镜像构建文件
├── rs-11.0.tar.gz          # 官方 11.0 稳定版源码包(构建上下文)
├── config.php              # 安装向导生成的配置(持久化挂载,见 4.5)
├── filestore/              # 资产文件与预览存储(持久化挂载)
└── dbdata/                 # MariaDB 数据目录(持久化挂载)

4.2 获取官方 11.0 稳定版源码

官方推荐用 SVN 从稳定分支检出(来源:官方 SVN 页 https://www.resourcespace.com/svn)。在部署目录内导出 releases/11.0 并打包(以下为实测回显):

$ svn export --trust-server-cert --non-interactive \
    https://svn.resourcespace.com/svn/rs/releases/11.0 rs-11.0
A    rs-11.0/iccprofiles/sRGB_IEC61966-2-1_black_scaled.icc
Exported revision 30001.

⚠️ 若 SVN 客户端报 Server SSL certificate verification failed: issuer is not trusted,说明系统未安装 CA 证书包,可先执行 apt-get install -y ca-certificates,或如上例加 --trust-server-cert 参数跳过交互确认。

导出完成后打包为 Docker 构建上下文使用的 tar 包,并核对版本标识:

$ tar -czf rs-11.0.tar.gz rs-11.0
$ ls -l rs-11.0.tar.gz
-rw-r--r-- 1 root root 54588590 Nov  1 10:15 rs-11.0.tar.gz
$ grep productversion rs-11.0/include/version.php
$productversion = "SVN 11.0";

4.3 编写 Dockerfile

在 /opt/resourcespace/Dockerfile 写入以下内容(在官方 PHP 8.3 Apache 镜像上补齐 ResourceSpace 11.0 所需的 PHP 扩展与外部工具):

FROM php:8.3-apache-bookworm

RUN apt-get update && apt-get install -y --no-install-recommends \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
        libzip-dev \
        libicu-dev \
        zip unzip \
        imagemagick \
        ghostscript \
        ffmpeg \
        libimage-exiftool-perl \
        poppler-utils \
        default-mysql-client \
        cron \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j"$(nproc)" gd mysqli exif zip intl bcmath opcache \
    && a2enmod rewrite headers \
    && { \
        echo 'memory_limit = 512M'; \
        echo 'upload_max_filesize = 1024M'; \
        echo 'post_max_size = 1024M'; \
        echo 'max_execution_time = 300'; \
        echo 'exif.encode_unicode = UTF-8'; \
    } > /usr/local/etc/php/conf.d/resourcespace.ini \
    && { \
        echo '<Directory /var/www/html>'; \
        echo '    AllowOverride All'; \
        echo '</Directory>'; \
    } > /etc/apache2/conf-available/resourcespace.conf \
    && a2enconf resourcespace \
    && rm -rf /var/lib/apt/lists/*

ADD rs-11.0.tar.gz /var/www/html.tmp/
RUN cp -a /var/www/html.tmp/rs-11.0/. /var/www/html/ \
    && rm -rf /var/www/html.tmp \
    && chown -R www-data:www-data /var/www/html \
    && mkdir -p /var/www/html/filestore \
    && chown www-data:www-data /var/www/html/filestore

EXPOSE 80

要点逐项说明:

  • PHP 扩展:gd(缩略图/图片处理,需 freetype/jpeg 支持)、mysqli(数据库连接)、exif(照片元数据提取)、zip(集合打包下载)、intl(国际化排序与转写)、bcmath、opcache(PHP 字节码缓存);
  • 外部工具:imagemagick(图片预览)、ghostscript(PDF 渲染)、ffmpeg(视频音频转码)、libimage-exiftool-perl(EXIF/IPTC 提取)、poppler-utils(PDF 文本提取)、default-mysql-client(命令行管理用)、cron(后台任务调度);
  • PHP 运行参数:memory_limit=512M、上传上限 upload_max_filesize/post_max_size 提到 1024M(DAM 场景常见大文件上传,默认 2M 会直接上传失败)、max_execution_time=300(大文件预览生成耗时较长);
  • Apache:开启 rewrite/headers 模块并放行 .htaccess 覆盖(ResourceSpace 的 URL 处理需要);
  • 源码落位:解包到 /var/www/html 并将属主交给 Apache 运行用户 www-data。

4.4 编写 docker-compose.yml

在 /opt/resourcespace/docker-compose.yml 写入以下编排(含 Web 应用与 MariaDB 两个服务、一张内部网络、三处持久化挂载):

name: resourcespace-11.0-stack

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: resourcespace-11.0-web
    container_name: resourcespace-11.0-app
    ports:
      - "8132:80"
    volumes:
      - ./filestore:/var/www/html/filestore
      - ./config.php:/var/www/html/include/config.php
    depends_on:
      db:
        condition: service_healthy
    networks:
      - rsnet

  db:
    image: mariadb:11.8
    container_name: resourcespace-11.0-db
    environment:
      MYSQL_ROOT_PASSWORD: q1w2e3r4
      MYSQL_DATABASE: resourcespace
      MYSQL_USER: resourcespace
      MYSQL_PASSWORD: q1w2e3r4
    volumes:
      - ./dbdata:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 12
    networks:
      - rsnet

networks:
  rsnet:
    name: resourcespace-11.0-net
    driver: bridge

编排要点:

  • depends_on 配合 condition: service_healthy,确保 Web 应用在数据库真正可连后才启动,避免首启时安装向导连不上库;
  • db 服务用 MariaDB 官方镜像自带的 healthcheck.sh 做就绪探活;
  • app 服务挂载两处:资产文件目录 filestore 与配置文件 config.php(必须在首次 up 前创建空文件,原因见 4.5 与"十一、常见问题");
  • 生产环境请将 MYSQL_ROOT_PASSWORD/MYSQL_PASSWORD 换成强口令,并与 4.6 步向导中填写的数据库口令保持一致。

先创建持久化目录与空配置文件占位:

cd /opt/resourcespace
mkdir -p filestore dbdata
touch config.php

4.5 构建镜像并启动

构建应用镜像(首次构建需拉取基础镜像并安装依赖,耗时较长;以下为二次构建的实测回显,全部命中缓存):

$ docker compose build
#7 [2/4] RUN apt-get update && apt-get install -y --no-install-recommends ...
#7 CACHED
#8 [3/4] ADD rs-11.0.tar.gz /var/www/html.tmp/
#8 CACHED
#9 [4/4] RUN cp -a /var/www/html.tmp/rs-11.0/. /var/www/html/ ...
#9 CACHED
#10 exporting to image
#10 naming to docker.io/library/resourcespace-11.0-web:latest done
 Image resourcespace-11.0-web Built

启动整套服务(db 先起并通过健康检查,app 随后启动):

$ docker compose up -d
 Container resourcespace-11.0-db Starting
 Container resourcespace-11.0-db Started
 Container resourcespace-11.0-db Waiting
 Container resourcespace-11.0-db Healthy
 Container resourcespace-11.0-app Starting
 Container resourcespace-11.0-app Started

确认两个服务都在运行且端口已监听:

$ docker compose ps
NAME                     IMAGE                  SERVICE   STATUS                    PORTS
resourcespace-11.0-app   resourcespace-11.0-web app       Up 15 minutes             0.0.0.0:8132->80/tcp, [::]:8132->80/tcp
resourcespace-11.0-db    mariadb:11.8           db        Up 15 minutes (healthy)   3306/tcp
$ ss -ltn | grep 8132
LISTEN 0      4096         0.0.0.0:8132       0.0.0.0:*
LISTEN 0      4096            [::]:8132          [::]:*

4.6 执行官方安装向导

浏览器访问 http://<服务器IP>:8132/,ResourceSpace 检测到尚未安装会自动跳转到 pages/setup.php(Initial Configuration 页面,实测 HTTP 200)。向导为单页表单,自上而下依次为六个区块(区块名称与字段取自 11.0 源码 pages/setup.php):

  1. Installation check:自动检测 PHP 版本、扩展与外部工具是否就绪,本文镜像已内置全部依赖,逐项通过;
  2. Database settings:填写数据库连接——
    • Database server:填 db(compose 网络内的数据库服务名,不要填 localhost,应用与数据库不在同一网络命名空间);
    • Username / Password:resourcespace / q1w2e3r4(与 4.4 中 MYSQL_USER/MYSQL_PASSWORD 一致);
    • MySQL binary path:留空即可;
  3. General settings:应用名称(本文填 ResourceSpace)、站点基础 URL(Base URL,填实际访问地址 http://192.168.1.172:8132,向导会用该地址回探 license.txt 校验连通性)、管理员账号(Username 填 admin、Email 填管理员邮箱并设置管理口令,本文演示口令为 q1w2e3r4);
  4. Paths:ImageMagick、Ghostscript、FFmpeg、Exiftool、pdftotext 等工具路径,自动探测已填好(本文镜像内均为 /usr/bin);
  5. SMTP Settings:通知发件邮箱(本文演示填 admin@example.com,无 SMTP 服务器时站内功能可用,仅邮件通知不可达);
  6. Plugins:勾选初始插件(本文勾选 brand_guidelines)。

提交后向导把以上配置写入 include/config.php 并初始化数据库结构。由于 compose 已把宿主 ./config.php 挂载到该路径,配置文件实际落在宿主部署目录中,容器重建不会丢失。安装向导生成的配置文件关键内容如下(实测,敏感散列值请以自己实例生成值为准):

# MySQL database settings
$mysql_server = 'db';
$mysql_username = 'resourcespace';
$mysql_password = 'q1w2e3r4';
$mysql_db = 'resourcespace';

# Base URL of the installation
$baseurl = 'http://192.168.1.172:8132';

# Secure keys
$scramble_key = '720edec7005c283c7b1f01abb9cdcc04f55f304e54a9148cc88cebbf1641407c';
$api_scramble_key = '070147602f0038f487645ac82186c134ad0adb55fd74a606de30c3e0fd8777df';

# Paths
$imagemagick_path = '/usr/bin';
$ghostscript_path = '/usr/bin';
$ffmpeg_path = '/usr/bin';
$exiftool_path = '/usr/bin';
$pdftotext_path = '/usr/bin';
  • $mysql_*:数据库连接四要素,来自向导第二步;
  • $baseurl:站点访问基准地址,登录态 Cookie 与站内链接都基于它生成,必须与用户实际访问地址一致;
  • $scramble_key:应用级加密散列键(口令哈希 pepper、分享链接签名等),由向导随机生成;
  • $api_scramble_key:REST API 签名密钥,详见本专栏《ResourceSpace 11.0 API 使用详解》;
  • 五个 $*_path:外部工具二进制所在目录。

4.7 首次登录与功能验证

用向导中创建的管理员账号登录:访问 http://192.168.1.172:8132/login.php,输入 admin / q1w2e3r4,登录成功后进入首页(实测状态码与页面标识):

$ curl -sS -o /dev/null -w '%{http_code}\n' http://192.168.1.172:8132/login.php
200

登录后依次验证三类核心功能:

  • 上传资产:首页菜单 Create → Upload resources,拖入一张图片提交,等待预览生成完成后在搜索页可见该资源缩略图;
  • 后台任务:预览生成依赖后台批处理,可手动触发一次并观察回显(详见"十、常用运维命令"第 4 条);
  • 数据落盘:确认资产文件写入了宿主挂载目录(见"五、数据持久化说明")。

五、数据持久化说明

本方案的三类持久化数据全部落在宿主部署目录 /opt/resourcespace/ 下,容器重建、镜像升级均不丢失:

宿主路径容器内路径内容
./dbdata/var/lib/mysqlMariaDB 全部业务数据(资源记录、元数据、用户、集合、日志)
./filestore/var/www/html/filestore原始资产文件、多尺寸预览图、替代文件、系统文件
./config.php/var/www/html/include/config.php安装向导生成的配置文件

实测挂载关系(docker inspect 回显):

$ docker inspect resourcespace-11.0-app --format '{{range .Mounts}}{{.Type}} {{.Source}} -> {{.Destination}}{{"\n"}}{{end}}'
bind /opt/resourcespace/filestore -> /var/www/html/filestore
bind /opt/resourcespace/config.php -> /var/www/html/include/config.php

新装系统资产量少时 filestore 下只有系统目录,上传资产后会按资源编号生成打散分布的子目录($filestore_evenspread 默认开启):

$ ls filestore/
system  tmp

⚠️ 备份策略:数据库与 filestore 必须成对备份(资源记录在库里,文件在 filestore 中,缺一不可),常用命令见"十、常用运维命令"第 5 条。

六、环境变量表

本方案中只有 db 服务使用环境变量(应用侧配置全部通过安装向导写入 config.php):

环境变量示例值说明
MYSQL_ROOT_PASSWORDq1w2e3r4MariaDB root 口令(生产环境务必换强口令)
MYSQL_DATABASEresourcespace启动时自动创建的库名(与向导中库名一致)
MYSQL_USERresourcespace自动创建的业务账号(与向导中用户名一致)
MYSQL_PASSWORDq1w2e3r4业务账号口令(与向导中口令一致)

⚠️ MYSQL_USER 账号由 MariaDB 镜像启动时自动授权到 MYSQL_DATABASE 库;若向导里填写了与这里不一致的用户/口令,会出现"安装检查通过但连接被拒"。

七、配置参数说明

除安装向导外,ResourceSpace 的行为参数几乎都来自两级配置文件:

  1. include/config.default.php:随源码分发的全量默认参数(11.0 中约 2700 余项),覆盖搜索、上传、预览、权限、界面等所有子系统;
  2. include/config.php:站点自有配置,安装向导生成初始内容,后续手工追加或通过管理界面"System configuration"页修改(改动会合并写入 config.php)。

部署后最常调整的启动级参数如下(在 config.php 中追加):

# 上传与预览相关
$ffmpeg_preview_force = true;          # 视频一律转码生成 mp4 预览
$ffmpeg_preview_extension = 'mp4';
$purge_temp_folder_age = 90;           # 临时文件保留天数
$filestore_evenspread = true;          # filestore 子目录打散分布,防单目录文件过多

# 搜索相关
$stemming = true;                      # 关键词词干化(英文检索召回更好)
$daterange_search = true;              # 启用日期范围搜索

# 安全相关
$hide_real_filepath = true;            # 对外隐藏真实文件路径
$file_checksums = true;                # 计算文件校验和(去重与完整性核对)

逐项语义与更多生产参数(内存、并发、上传上限等)的取值建议,见本专栏《ResourceSpace 11.0 配置参数详解》。

八、配置文件挂载

config.php 采用单文件 bind mount(./config.php:/var/www/html/include/config.php),这是本方案的关键设计,也最容易踩坑:

  • 先创建文件,再启动服务:docker compose up 之前必须 touch config.php。若宿主文件不存在,Docker 会把该路径自动创建为目录挂进容器;而 ResourceSpace 启动检查逻辑是"文件存在且大小大于 0"(include/boot.php),4096 字节的目录信息会骗过该检查,随后加载配置失败,站点表现为打开任意页面都弹回 setup.php 或报错——已实测踩中,恢复方法见"十一、常见问题"第 2 条;
  • 配置修改即时生效:PHP 每次请求都会重新读取 config.php,宿主上编辑后无需重启容器;
  • 权限:确保容器内 www-data(UID 33)可读该文件;若需要通过管理界面在线改配置(System configuration 页写回 config.php),宿主文件还需对容器内该用户可写。

九、等价 docker run

不用 Compose 时,以下两条命令与本文 compose 等价(先建网络,再起库,最后起应用):

# 1. 创建内部网络
docker network create resourcespace-11.0-net

# 2. 启动 MariaDB(数据落 /opt/resourcespace/dbdata)
docker run -d --name resourcespace-11.0-db \
  --network resourcespace-11.0-net \
  -e MYSQL_ROOT_PASSWORD=q1w2e3r4 \
  -e MYSQL_DATABASE=resourcespace \
  -e MYSQL_USER=resourcespace \
  -e MYSQL_PASSWORD=q1w2e3r4 \
  -v /opt/resourcespace/dbdata:/var/lib/mysql \
  mariadb:11.8

# 3. 等数据库就绪后启动 Web 应用(端口 8132,filestore 与 config.php 挂载)
docker run -d --name resourcespace-11.0-app \
  --network resourcespace-11.0-net \
  -p 8132:80 \
  -v /opt/resourcespace/filestore:/var/www/html/filestore \
  -v /opt/resourcespace/config.php:/var/www/html/include/config.php \
  resourcespace-11.0-web

⚠️ 等价命令没有 compose 的健康检查等待逻辑,第 3 步前需自行确认数据库就绪(例如 docker logs resourcespace-11.0-db 出现 "mariadbd: ready for connections")。

十、常用运维命令

1. 服务状态与日志

cd /opt/resourcespace
docker compose ps                      # 查看两服务运行状态与健康检查
docker compose logs -f app             # 跟踪 Web 应用日志(Apache/PHP)
docker compose logs -f db              # 跟踪数据库日志

2. 重启与停止

docker compose restart app             # 仅重启 Web 应用(改 PHP 配置后无需,PHP 每请求读配置)
docker compose down                    # 停止并移除容器与网络(dbdata/filestore/config.php 保留)
docker compose up -d                   # 再次启动

down 后 up -d 的实测回显(数据均在,服务自动恢复):

$ docker compose down
 Container resourcespace-11.0-db Stopped
 Container resourcespace-11.0-db Removed
 Network resourcespace-11.0-net Removed
$ docker compose up -d
 Container resourcespace-11.0-db Healthy
 Container resourcespace-11.0-app Started

3. 修改配置后强制重建容器

调整 compose 挂载项等编排级改动后,普通 up -d 会提示容器仍在运行而不重建,需加 --force-recreate(实测回显):

$ docker compose up -d --force-recreate app
 Container resourcespace-11.0-db Healthy
 Container resourcespace-11.0-app Started

4. 后台批处理任务(cron)

ResourceSpace 的预览生成、临时文件清理、统计汇总等任务依赖周期性批处理,入口为应用目录下的 batch/cron.php。为容器配置宿主 crontab,每 5 分钟触发一次:

# crontab -e 追加一行(服务器 PHP 未直装时经容器执行):
*/5 * * * * docker exec resourcespace-11.0-app php /var/www/html/batch/cron.php >> /opt/resourcespace/cron.log 2>&1

手动执行一次的实测回显(节选):

2026-11-01 03:05:47 http://192.168.1.172:8132 Starting cron process...
2026-11-01 03:05:47 http://192.168.1.172:8132 Executing job: 002_copy_hitcount.php
2026-11-01 03:05:47 http://192.168.1.172:8132 Executing job: 004_send_periodic_reports.php
2026-11-01 03:05:47 http://192.168.1.172:8132 Executing job: 005_geo_set_coords_from_country.php
2026-11-01 03:05:47 http://192.168.1.172:8132 Executing job: 006_update_disk_usage.php
2026-11-01 03:05:47 http://192.168.1.172:8132 Executing job: 011_delete_tmp_files.php
 - deleting file sitetext_f439fd8e665d8863d05335d0937ff5b9_2413e1ccf7a994da6e725cb1f079ba2b.json - SUCCESS
...

cron 会依次执行 batch/cron_jobs/ 下的任务脚本(点击计数落库、周期报告、磁盘用量更新、临时文件清理等),并用系统内 last_cron 时间戳防重入(is_process_lock 进程锁)。

5. 备份与恢复

# 备份数据库(业务库导出)
docker exec resourcespace-11.0-db mariadb-dump -uroot -pq1w2e3r4 resourcespace > /opt/resourcespace/backup/rs-$(date +%F).sql

# 备份文件存储(与数据库成对)
tar -czf /opt/resourcespace/backup/filestore-$(date +%F).tar.gz -C /opt/resourcespace filestore

数据库导出实测回显(文件头):

-- MariaDB dump 10.20-11.8.9-MariaDB, for debian-linux-gnu (x86_64)
--
-- Host: localhost    Database: resourcespace
-- ------------------------------------------------------
-- Server version	11.8.9-MariaDB-ubu2404

恢复时先建空库再导入 SQL,并用备份的 filestore 原位还原:

docker exec -i resourcespace-11.0-db mariadb -uroot -pq1w2e3r4 resourcespace < /opt/resourcespace/backup/rs-2026-11-01.sql
tar -xzf /opt/resourcespace/backup/filestore-2026-11-01.tar.gz -C /opt/resourcespace

6. 升级版本

升级 = 换源码包重建镜像 + 跟随官方升级流程:

  1. 备份 dbdata、filestore、config.php;
  2. 用新版本号重复 4.2 步(如 releases/11.1)得到新源码包,改 Dockerfile 中 ADD 的包名后 docker compose build、docker compose up -d;
  3. 首次访问时会自动触发数据库结构升级(ResourceSpace 升级机制按 dbstruct/ 中的结构定义逐版本迁移,无需手工执行 SQL);
  4. 回滚:恢复镜像旧 tag 并用备份还原数据。

十一、常见问题

Q1:登录成功后访问任何页面都弹回登录页,地址栏带 nocookies=true?

实测踩中。根因是 $baseurl 与实际访问地址不一致:Cookie 按访问主机签发,而站内跳转全部拼接到 $baseurl,主机不匹配时请求不带 Cookie,服务端判为"未启用 Cookie"无限弹回。解决:把 config.php 中 $baseurl 改成用户实际访问地址(本文为 http://192.168.1.172:8132),改完即生效,无需重启;后续若站点改域名/端口,同步修改该项。

Q2:页面全部弹回 setup.php 或报错,容器内 /var/www/html/include/config.php 是个目录?

实测踩中,单文件挂载的经典陷阱。宿主侧 ./config.php 文件不存在时执行了 docker compose up,Docker 会自动创建同名目录挂载进去;ResourceSpace 启动检查只判断"文件存在且大小 > 0",目录大小 4096 字节恰好骗过检查,随后配置加载失败。恢复步骤(实测):

# 1. 宿主上删除自动生成的空目录,放入正确的 config.php(从安装完成的实例复制或重新执行向导)
rm -rf /opt/resourcespace/config.php      # 若已是目录则删除
touch /opt/resourcespace/config.php       # 重新留出空文件占位(或直接放置已生成的配置)

# 2. 强制重建 app 容器,让挂载从"目录"切换回"文件"
cd /opt/resourcespace && docker compose up -d --force-recreate app

# 3. 核实容器内已是普通文件
$ docker exec resourcespace-11.0-app stat -c '%F %s' /var/www/html/include/config.php
regular file 2313

若实例尚未完成过安装向导,重建后再访问一次 setup.php 完成配置即可。

Q3:管理员口令遗忘,如何重置?

ResourceSpace 的口令存储不是裸 bcrypt:校验公式为 password_hash(hash_hmac('sha256', "RS{用户名}{口令}", $scramble_key))($scramble_key 在 config.php 中)。重置时按同公式生成哈希后写入 user.password 字段(实测命令):

# 1. 生成新口令哈希(口令以 q1w2e3r4 为例,scramble_key 取自己 config.php 中的值)
$ docker exec resourcespace-11.0-app php -r \
  "echo password_hash(hash_hmac('sha256','RSadminq1w2e3r4','720edec7005c283c7b1f01abb9cdcc04f55f304e54a9148cc88cebbf1641407c'),PASSWORD_BCRYPT,['cost'=>12]),PHP_EOL;"
$2y$10$H8A5hAPYGSGWfLp162fuF.RdmqeoYRQD7kSCDn74rvRBSsYhIuVEq

# 2. 写入数据库
$ docker exec resourcespace-11.0-db mariadb -uroot -pq1w2e3r4 resourcespace \
  -e "update user set password='<上一步输出的哈希>' where username='admin';"

随后清除旧会话(update user set session='' where username='admin';)并用新口令登录。

Q4:安装向导提交后报数据库连接失败?

两处高频原因:一是 Database server 填了 localhost——应用与数据库分属两个服务,必须填 compose 服务名 db(官方 Docker 指南同样强调这一点);二是口令与 compose 中 MYSQL_PASSWORD 不一致。核对 4.4 与 4.6 两处的值即可。

Q5:上传大文件(如数百 MB 视频)失败或卡住?

检查三层上传上限:PHP 层 upload_max_filesize/post_max_size(本文镜像已设 1024M,自建环境默认 2M 会直接失败)、max_execution_time(预览转码耗时)、以及反向代理层(若有 Nginx,需同步 client_max_body_size)。

Q6:缩略图/视频预览迟迟不出现?

预览生成由后台批处理完成,若未配置 cron(见"十、常用运维命令"第 4 条),任务会一直排队。手动执行 docker exec resourcespace-11.0-app php /var/www/html/batch/cron.php 可立即触发;生产环境务必配置周期执行。

十二、参考链接

  • 官方 Docker 安装指南:https://www.resourcespace.com/knowledge-base/systemadmin/install_docker
  • 官方源码仓库说明(SVN/Git):https://www.resourcespace.com/svn
  • 官方 LAMP 安装总览:https://www.resourcespace.com/knowledge-base/systemadmin/install_overview
  • 官方下载页(云服务/源码/Docker 三路径):https://www.resourcespace.com/get
  • 官方升级指南:https://www.resourcespace.com/knowledge-base/systemadmin/upgrading
  • 官方 Docker 仓库:https://github.com/resourcespace/docker
  • 本专栏系列:《ResourceSpace 11.0 介绍与选型指南》、《ResourceSpace 11.0 配置参数详解》、《ResourceSpace 11.0 API 使用详解》
ResourceSpace 11.0 Docker Compose 部署指南 - Quzuo