ResourceSpace 11.0 Docker Compose 部署指南
在 Docker Compose 中部署 ResourceSpace 11.0(PHP 8.3 + MariaDB 11.8)的完整实操指南,覆盖镜像构建、Compose 编排、安装向导、持久化挂载、定时任务、备份恢复与排障实录,全部步骤在本机实测验证。
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 查询):
- 官方 Docker 仓库:
https://github.com/resourcespace/docker,克隆后在构建机上现场执行docker compose up --build -d; - SVN 源码检出:稳定版走
svn co https://svn.resourcespace.com/svn/rs/releases/[版本]; - 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+ 要求,也避免发行版仓库带来的版本漂移。
三、前置条件
- 服务器已安装 Docker Engine 与 Docker Compose 插件(安装方法见 Docker 官方文档);
- 服务器具备外网访问能力(下载 SVN 源码与基础镜像);若访问国外资源缓慢,可为 wget/svn 配置 HTTP 代理(
export http_proxy=http://<代理地址>:<端口>,SVN 走 HTTPS 时读取同名环境变量); - 规划端口未被占用(本文用 8132),可用
ss -ltn | grep 8132确认无输出; - 磁盘空间预留:应用镜像约 2.2 GB,源码包约 55 MB,数据库与文件存储按资产量增长另计;
- 若服务器启用了防火墙,放行规划的对外端口。
四、部署步骤
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):
- Installation check:自动检测 PHP 版本、扩展与外部工具是否就绪,本文镜像已内置全部依赖,逐项通过;
- Database settings:填写数据库连接——
- Database server:填
db(compose 网络内的数据库服务名,不要填 localhost,应用与数据库不在同一网络命名空间); - Username / Password:
resourcespace/q1w2e3r4(与 4.4 中MYSQL_USER/MYSQL_PASSWORD一致); - MySQL binary path:留空即可;
- Database server:填
- General settings:应用名称(本文填
ResourceSpace)、站点基础 URL(Base URL,填实际访问地址http://192.168.1.172:8132,向导会用该地址回探license.txt校验连通性)、管理员账号(Username 填admin、Email 填管理员邮箱并设置管理口令,本文演示口令为q1w2e3r4); - Paths:ImageMagick、Ghostscript、FFmpeg、Exiftool、pdftotext 等工具路径,自动探测已填好(本文镜像内均为
/usr/bin); - SMTP Settings:通知发件邮箱(本文演示填
admin@example.com,无 SMTP 服务器时站内功能可用,仅邮件通知不可达); - 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/mysql | MariaDB 全部业务数据(资源记录、元数据、用户、集合、日志) |
./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_PASSWORD | q1w2e3r4 | MariaDB root 口令(生产环境务必换强口令) |
MYSQL_DATABASE | resourcespace | 启动时自动创建的库名(与向导中库名一致) |
MYSQL_USER | resourcespace | 自动创建的业务账号(与向导中用户名一致) |
MYSQL_PASSWORD | q1w2e3r4 | 业务账号口令(与向导中口令一致) |
⚠️
MYSQL_USER账号由 MariaDB 镜像启动时自动授权到MYSQL_DATABASE库;若向导里填写了与这里不一致的用户/口令,会出现"安装检查通过但连接被拒"。
七、配置参数说明
除安装向导外,ResourceSpace 的行为参数几乎都来自两级配置文件:
include/config.default.php:随源码分发的全量默认参数(11.0 中约 2700 余项),覆盖搜索、上传、预览、权限、界面等所有子系统;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. 升级版本
升级 = 换源码包重建镜像 + 跟随官方升级流程:
- 备份
dbdata、filestore、config.php; - 用新版本号重复 4.2 步(如
releases/11.1)得到新源码包,改 Dockerfile 中ADD的包名后docker compose build、docker compose up -d; - 首次访问时会自动触发数据库结构升级(ResourceSpace 升级机制按
dbstruct/中的结构定义逐版本迁移,无需手工执行 SQL); - 回滚:恢复镜像旧 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 使用详解》