前言
作为 Misskey 实例服务器管理员,应该需要了解数据存放位置和备份方法,以防数据丢失。
本文接下来将介绍如何正确地备份 Misskey 服务器数据,并测试验证备份的数据是否可以完整地恢复 Misskey 实例。
此文章基于 Misskey 2025.10.2 编写,Misskey 部署方式是 Docker Compose。
数据备份
备份之前
在备份前,你需要知道要备份哪些文件。
如果你部署过 Misskey,应该会对 compose.yml 文件有印象,这个文件告诉 Docker 如何运行镜像。在这个文件中,需要特别注意那些 volumes 键对应的值,它指定了 Misskey 相关文件在本机的存放位置。
通过观察 compose.yml 的内容,可以发现数据保存在当前文件夹下的以下文件夹中:
.config\db\redis\files\加上 compose.yml 文件,这些就是我们需要备份的文件。
经过测试,
redis文件夹的数据备份是必要的,否则恢复后打开的网页将出现问题。
如果未启用过对象存储,所有媒体文件保存在
files文件夹中,其存储容量可能会很大,备份复制文件时可能会花费大量时间,需要注意。
另外,在备份之前,如果已启用 Bot 防御功能,需要临时禁用,以确保后续在本机 localhost 上可成功登录账号。
开始备份
备份需要遵循以下步骤:
- 停止容器运行(
docker compose down) - 复制数据文件
- 运行容器(
docker compose up -d)
经过测试,停止容器是必要的,否则无法复制某些数据文件。
这三个步骤非常简单,你可以手动做,需要注意的是 docker compose 的停止和启动命令需要在 Misskey 项目文件夹下运行。
如果是 Windows 平台,我借助 AI 写了一个备份 bat 脚本,用于一键备份需要的文件到 7z 压缩包中,并将其移动到 OneDrive 备份文件夹实现自动云端备份。脚本内容见下:
@echo offsetlocal enabledelayedexpansion
REM --- 用户配置 ---REM 1. 7-Zip 的安装路径。set "SEVENZIP_PATH=D:\Program Files\7-Zip\7z.exe"REM 2. 备份文件最终移动到的目标文件夹。set "BACKUP_DESTINATION=C:\Users\Administrator\OneDrive\Misskey_Backups"REM 3. 临时文件名,脚本会自动创建和删除。set "LIST_FILENAME=_backup_filelist.txt"
REM --- 脚本正文 ---
:initclsecho ==========================================================echo Misskey 备份脚本echo ==========================================================echo.
REM 检查依赖where docker >nul 2>nulif %errorlevel% neq 0 ( echo [严重错误] 未在系统中找到 "docker" 命令。 goto end_script)if not exist "%SEVENZIP_PATH%" ( echo [严重错误] 7z.exe 未在指定的路径找到: "%SEVENZIP_PATH%" goto end_script)if exist "%LIST_FILENAME%" ( del /f /q "%LIST_FILENAME%")
echo [重要提示] 此脚本将通过 "stop/start" 模式来确保数据备份的完整性和一致性。echo.choice /c yn /m "是否确认开始执行备份流程?"if errorlevel 2 ( echo [取消] 用户取消了备份操作。 goto end_script)echo.
REM --- 步骤 1: 停止 Docker 容器 ---echo [步骤 1/5] 正在停止 Docker 容器以释放文件...docker-compose stopif %errorlevel% neq 0 ( echo [严重错误] 停止 Docker 容器失败!请检查 Docker 是否正在运行。 goto end_script)echo [成功] 所有 Misskey 相关容器已停止。echo.
REM --- 步骤 2: 生成精确的文件列表 ---echo [步骤 2/5] 正在生成精确的备份文件列表...set "HAS_FILES=0"
REM 检查并将存在的文件/文件夹路径写入到 listfile 中if exist "compose.yml" ( echo compose.yml>>"%LIST_FILENAME%" echo [状态] 已添加: compose.yml set "HAS_FILES=1") else ( echo [状态] 跳过: compose.yml (未找到))
if exist ".\.config\default.yml" ( echo .config\default.yml>>"%LIST_FILENAME%" echo [状态] 已添加: .config\default.yml set "HAS_FILES=1") else ( echo [状态] 跳过: .config\default.yml (未找到))
if exist ".\.config\docker.env" ( echo .config\docker.env>>"%LIST_FILENAME%" echo [状态] 已添加: .config\docker.env set "HAS_FILES=1") else ( echo [状态] 跳过: .config\docker.env (未找到))
if exist ".\db\" ( echo db>>"%LIST_FILENAME%" echo [状态] 已添加: 整个 db\ 文件夹 set "HAS_FILES=1") else ( echo [状态] 跳过: db\ 文件夹 (未找到))
if exist ".\redis\" ( echo redis>>"%LIST_FILENAME%" echo [状态] 已添加: 整个 redis\ 文件夹 set "HAS_FILES=1") else ( echo [状态] 跳过: redis\ 文件夹 (未找到))
if exist ".\files\" ( echo files>>"%LIST_FILENAME%" echo [状态] 已添加: 整个 files\ 文件夹 set "HAS_FILES=1") else ( echo [状态] 跳过: files\ 文件夹 (未找到))echo.
if %HAS_FILES% equ 0 ( echo [错误] 未找到任何可备份的文件或文件夹!备份已中止。 goto restart_services)
REM --- 步骤 3: 使用文件列表执行备份 ---echo [步骤 3/5] 正在根据文件列表执行备份...for /f "tokens=1-4 delims=/ " %%a in ('date /t') do set "dt=%%b-%%c-%%d"for /f "tokens=1-2 delims=: " %%a in ('time /t') do set "tm=%%a-%%b"set "TIMESTAMP=%dt%_%tm%"set "BACKUP_FILENAME=misskey_files_backup_%TIMESTAMP%.7z"
echo - 备份目标文件: %BACKUP_FILENAME%echo - 正在压缩,请稍候...
"%SEVENZIP_PATH%" a -t7z -mx=9 -bso0 "%BACKUP_FILENAME%" @"%LIST_FILENAME%" > nul
if %errorlevel% neq 0 ( echo. echo [错误] 文件备份失败!7-Zip 返回了错误。 goto cleanup)
echo.echo [成功] 备份文件 "%BACKUP_FILENAME%" 已在当前目录下成功创建!echo.
REM --- 步骤 4: 移动备份文件 ---echo [步骤 4/5] 正在移动备份文件至目标文件夹...
REM 检查目标文件夹是否存在,如果不存在则创建if not exist "%BACKUP_DESTINATION%\" ( echo - 目标文件夹不存在,正在创建: echo "%BACKUP_DESTINATION%" mkdir "%BACKUP_DESTINATION%" if errorlevel 1 ( echo - [错误] 创建目标文件夹失败!文件将保留在当前目录。 goto cleanup ))
REM 移动文件move /Y "%BACKUP_FILENAME%" "%BACKUP_DESTINATION%\" > nul
if %errorlevel% neq 0 ( echo - [错误] 移动文件失败!文件将保留在当前目录。) else ( echo - [成功] 文件已移动至: "%BACKUP_DESTINATION%\")echo.
:cleanupREM --- 清理临时文件 ---if exist "%LIST_FILENAME%" ( del /f /q "%LIST_FILENAME%")
REM --- 步骤 5: 重启 Docker 容器 ---:restart_servicesecho [步骤 5/5] 正在恢复容器运行...docker-compose startif %errorlevel% neq 0 ( echo [严重错误] 恢复 Docker 容器失败!请手动执行 "docker-compose start" 命令。) else ( echo [成功] 所有容器已恢复运行。)echo.
:end_scriptecho ==========================================================echo 备份流程结束。echo ==========================================================pauseexit /b你可以修改脚本,将脚本中的路径改为实际可用的路径。
运行后,你将会看到类似以下输出:
========================================================== Misskey 备份脚本==========================================================
[重要提示] 此脚本将通过 "stop/start" 模式来确保数据备份的完整性和一致性。
是否确认开始执行备份流程? [Y,N]?Y
[步骤 1/5] 正在停止 Docker 容器以释放文件...[+] Stopping 3/3 ✔ Container misskey-web-1 Stopped 0.7s ✔ Container misskey-db-1 Stopped 1.2s ✔ Container misskey-redis-1 Stopped 1.3s[成功] 所有 Misskey 相关容器已停止。
[步骤 2/5] 正在生成精确的备份文件列表... [状态] 已添加: compose.yml [状态] 已添加: .config\default.yml [状态] 已添加: .config\docker.env [状态] 已添加: 整个 db\ 文件夹 [状态] 已添加: 整个 redis\ 文件夹 [状态] 已添加: 整个 files\ 文件夹
[步骤 3/5] 正在根据文件列表执行备份... - 备份目标文件: misskey_files_backup_2025-11-11_00-36.7z - 正在压缩,请稍候...
[成功] 备份文件 "misskey_files_backup_2025-11-11_00-36.7z" 已在当前目录下成功创建!
[步骤 4/5] 正在移动备份文件至目标文件夹... - [成功] 文件已移动至: "C:\Users\Administrator\OneDrive\Misskey_Backups\"
[步骤 5/5] 正在恢复容器运行...[+] Running 3/3 ✔ Container misskey-db-1 Healthy 5.9s ✔ Container misskey-redis-1 Healthy 5.9s ✔ Container misskey-web-1 Started 0.4s[成功] 所有容器已恢复运行。
==========================================================备份流程结束。==========================================================Press any key to continue . . .这样,数据备份即完成了。
如果不确定备份是否有效,接下来可进行备份恢复测试。
恢复测试
「未经测试的备份相当于没有备份」
我们应定期进行备份的有效性检查,下面将给出备份恢复测试的流程。
恢复流程
恢复流程大致如下:
- 克隆同版本 Misskey 到本地
- 将备份的文件移动至 Misskey 目录
- [可选] 修改
compose.yml文件,将网页映射端口(默认3000)修改到另外端口,以便本机测试,避免影响现实联邦宇宙 - 关闭正在运行的容器(如果有),启动测试容器,等待完全启动完成
- 打开本机浏览器,输入
http://localhost:<port>/以查看恢复效果 - 关闭测试容器,启动主要容器。
按照以上述程操作即可,具体操作细节不赘述。
结语
希望此篇文章可帮助你了解 Misskey 数据备份流程