250901-BookStack跨服務器從Rootless-Docker到Rootful-Docker的備份遷移及服務啟動

在這里插入圖片描述

下面給你一套「可離線、最小停機」的遷移步驟,從 A(rootless)搬到 B(rootful)。思路是:停 A → 打包數據卷 → 傳到 B → 還原 → 用同版本鏡像啟動 → 驗證。整套操作不依賴公網,只用你已有的離線鏡像 tar 包即可。


1) 在服務器 A 上準備與備份

假設你的 docker-compose.yml/opt/bookstack/,并且里面的相對目錄 ./data/app./data/db 就在這個目錄下。

# 進入 compose 目錄
cd /opt/bookstack# 停止容器(確保數據一致)
docker compose down# ? 方法1:打包數據(含 app 與 db 兩個持久化目錄), 有權限問題
# tar -czf bookstack_backup_$(date +%F).tgz data# ? 方法2:從容器里面拷貝,繞開權限問題# 從容器里把 /config 拷到當前目錄
docker cp bookstack_db:/config ./db_copy
docker cp bookstack:/config ./app_copy# 再打包
tar -czf bookstack_data_$(date +%F).tgz app_copy db_copy# ? 可選:額外做一次數據庫邏輯備份(雙保險):
docker compose up -d bookstack_db
docker exec bookstack_db sh -c 'mysqldump -ubookstack -pbookstackpass --databases bookstackapp' > bookstackapp_dump_$(date +%F).sql
docker compose down

bookstack_backup_YYYY-MM-DD.tgz(以及可選的 bookstackapp_dump_YYYY-MM-DD.sql)拷到服務器 B,比如放到 /opt/bookstack/


2) 在服務器 B 上準備運行環境

(1) 放置目錄與文件

mkdir -p /opt/bookstack
cd /opt/bookstack# 拷貝 A 來的備份包
# scp/sftp/rsync 均可,這里假設已經放到了當前目錄
tar -xzf bookstack_backup_YYYY-MM-DD.tgz# 確保目錄結構如下:
# /opt/bookstack/
#   ├─ docker-compose.yml   (你會在下一步創建/粘貼)
#   └─ data/
#       ├─ app/             (BookStack 應用配置與上傳)
#       └─ db/              (MariaDB 數據)

(2) 離線導入鏡像(你已經有 tar 包)

docker load -i /path/to/ghcr.io_linuxserver_bookstack-amd64.tar
docker load -i /path/to/ghcr.io_linuxserver_mariadb-amd64.tar

導入后用 docker images | grep linuxserver 看看對應 tag,確保 compose 用的 image: 與本地 tag 一致(不帶 tag 默認拉 latest,離線環境建議顯式寫 tag,見下方示例)。

(3) SELinux 與權限(RHEL 關鍵點)

  • RHEL 通常 SELinux=Enforcing,建議在 卷掛載后綴:Z,或對目錄執行 chcon。我推薦在 compose 的 volumes 里直接用 :Z
  • linuxserver.io 鏡像用 PUID/PGID 控制容器內文件屬主。你用的是 1000:1000,那就確保宿主機目錄也是這個屬主,避免寫入報錯:
  • 恢復數據的腳本如下:
cd /opt/bookstack# 1) 先建目標目錄
mkdir -p data/app data/db# 2) 把 app_copy 的內容拷到 data/app
#   兼容兩種結構:app_copy/config/... 或 app_copy/直接就是內容
if [ -d app_copy/config ]; thencp -a app_copy/config/. data/app/
elsecp -a app_copy/.        data/app/
fi# 3) 把 db_copy 的內容拷到 data/db
#   同樣兼容 db_copy/config/... 或 db_copy/直接就是內容
if [ -d db_copy/config ]; thencp -a db_copy/config/. data/db/
elsecp -a db_copy/.        data/db/
fi# 4) 修正屬主(linuxserver 鏡像要求 1000:1000)
chown -R 1000:1000 data/app data/db# 如 RHEL/SELinux 處于 Enforcing,且你沒有在 compose 里用 :Z,
# 可以加上這行給目錄打上容器可讀寫的類型(兩者選其一即可):
# chcon -Rt svirt_sandbox_file_t data/app data/db# 5) 清理臨時目錄(可選)
rm -rf app_copy db_copy
  • 最終啟動并訪問http://<服務器B的IP>:6875
docker compose up -d

(4) 防火墻(RHEL)

如果要從外部訪問 6875/tcp

firewall-cmd --permanent --add-port=6875/tcp
firewall-cmd --reload

3) 在服務器 B 上的 docker-compose.yml(示例)

把下面內容保存為 /opt/bookstack/docker-compose.yml。和你在 A 上的幾乎一致,只是:

  • 更新了 APP_URL 為服務器 B 的地址(或你的域名、HTTPS);
  • 給兩個卷都加了 :Z 以適配 SELinux;
  • 可選:顯式寫鏡像 tag(把 <TAG> 換成你 docker images 里看到的實際 tag;如果你確認是 latest,也可保留 latest)。
services:bookstack:image: ghcr.io/linuxserver/bookstack:<TAG>container_name: bookstackenvironment:- PUID=1000- PGID=1000- APP_URL=http://<服務器B的IP或域名>:6875- APP_KEY=base64:w+nAsQLJ1Q/EPxIx5JXXnJ/USqOG/cR21vIGvyFLIeU=   # 保持不變- DB_HOST=bookstack_db- DB_PORT=3306- DB_USERNAME=bookstack- DB_PASSWORD=bookstackpass- DB_DATABASE=bookstackappvolumes:- ./data/app:/config:Zports:- "6875:80"restart: unless-stoppeddepends_on:- bookstack_dbbookstack_db:image: ghcr.io/linuxserver/mariadb:<TAG>container_name: bookstack_dbenvironment:- PUID=1000- PGID=1000- MYSQL_ROOT_PASSWORD=bookstackpass- TZ=Asia/Shanghai- MYSQL_DATABASE=bookstackapp- MYSQL_USER=bookstack- MYSQL_PASSWORD=bookstackpassvolumes:- ./data/db:/config:Zrestart: unless-stopped

說明:

  • APP_KEY 一定要沿用原值,這樣原有上傳、會話等不會失效。
  • 如果 B 上將來走反向代理/HTTPS,記得把 APP_URL 改成 https://你的域名,必要時添加 APP_TRUSTED_PROXIES=*

4) 啟動與驗證

cd /opt/bookstack
docker compose up -d# 先看數據庫是否健康
docker logs -f bookstack_db# 再看應用
docker logs -f bookstack

打開瀏覽器訪問:http://<服務器B的IP>:6875
確認歷史頁面、圖片/附件、用戶、權限等都在。


5) 常見坑與排查

  1. 權限被拒絕(Permission denied)

    • 大多是宿主目錄屬主不對或 SELinux。先 chown -R 1000:1000 /opt/bookstack/data/*,再確保卷掛載后綴 :Z,或用 chcon -Rt svirt_sandbox_file_t ...
  2. 容器一直重啟,App 連接不上 DB

    • depends_on 只保證順序不保證“可用”。再等等,或看 bookstack_db 日志;數據庫初始化首次啟動會花點時間。必要時重啟應用容器:docker restart bookstack
  3. 訪問 6875 不通

    • 檢查 docker ps 端口映射、firewall-cmd、以及宿主機上是否有別的服務占用 6875。
  4. 鏡像版本不匹配

    • 離線導入的鏡像 tag 最好與 compose 對齊;若不清楚,運行前 docker images 看清楚 tag。
  5. APP_URL 更換導致外鏈/回調異常

    • 換了 IP/域名就更新 APP_URL,否則某些重定向、文件 URL 可能不正確。

6) 可選:用 SQL 備份恢復(當你不想拷貝整個 db 卷時)

如果只想遷移應用卷 + 用 mysqldump 恢復:

# 在 B 上:啟動空庫
docker compose up -d bookstack_db# 導入 A 導出的 SQL
docker exec -i bookstack_db sh -c 'mysql -ubookstack -pbookstackpass bookstackapp' < bookstackapp_dump_YYYY-MM-DD.sql# 再啟動應用
docker compose up -d bookstack

一句話總結

  • 把 A 的 data/appdata/db 原樣帶到 B;
  • B 上用相同或兼容的鏡像、相同的 APP_KEY 與 DB 賬號;
  • RHEL 要注意 SELinux(:Z)目錄屬主(1000:1000)
  • 更新 APP_URL,放行端口,啟動即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95114.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95114.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(Redis)Redis 分布式鎖及改進策略詳解

一、為什么需要分布式鎖在單機應用中&#xff0c;synchronized 或 ReentrantLock 足以解決并發問題。但在 分布式系統 中&#xff0c;多臺服務器之間共享同一個資源時&#xff0c;如果沒有鎖&#xff0c;很可能出現 超賣、重復扣減、數據不一致 等問題。 因此&#xff0c;分布式…

Linux應用開發-windows,linux環境下相關工具

VS Code Remote - SSH 虛擬機部分的操作 sudo systemctl status sshsudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh # 設置開機自啟hostname -IVS Code部分的操作 安裝 Remote - SSH 插件 vscode右下角出現&#xff…

Java泛型通配符詳解:搞懂?/extends/super用法,避開集合操作踩坑點

上次跟你們聊了泛型的基礎用法&#xff0c;今天接著往下說 —— 泛型里還有個挺重要的概念叫 “通配符”&#xff0c;就是那個問號 “?”&#xff0c;很多人第一次見都懵&#xff1a;這玩意兒跟普通泛型有啥區別&#xff1f;為啥有時候非得用它不可&#xff1f;小索奇當初也卡…

EXCEL開發之路(二)跨表交互模擬—仙盟創夢IDE

在車輛租賃行業&#xff0c;數據的高效管理與分析對于企業的運營決策、資源調配及客戶服務優化至關重要。自建 Excel 實現多表統計交互&#xff0c;如同為行業裝上了效能驅動引擎&#xff0c;助力企業在復雜多變的市場環境中穩健前行。一、精準資源管理&#xff0c;優化車輛調配…

醫療AI時代的生物醫學Go編程:高性能計算與精準醫療的案例分析(八)

5.4 性能測試與結果分析 為了評估GoEHRStream的性能,我們設計測試模擬真實的醫院數據流場景,并測量關鍵指標。 5.4.1 實驗環境 硬件: CPU: Intel Xeon E-2288G (8 cores, 16 threads) RAM: 32 GB DDR4 Storage: 512 GB NVMe SSD (用于GoEHRStream和BadgerDB) Network: 1 G…

開關電源設計“反饋回路”部分器件分析

目錄 主要分析問題如下&#xff1a; 一、問題1 二、問題二 分析電路如下&#xff1a; 主要分析問題如下&#xff1a; 1、分析TL431芯片1、2兩引腳間并聯電阻和電容&#xff08;RC電路&#xff09;的作用&#xff1f; 2、PC817A光耦輸入兩個引腳間并聯電阻的作用&#xff1f;…

AI 編程新玩法:用 yunqi-saas-kit 框架制作小游戲,看廣告變現輕松賺錢?

AI 編程新玩法&#xff1a;用 yunqi-saas-kit 框架制作小游戲&#xff0c;看廣告變現輕松賺錢 在數字經濟快速發展的當下&#xff0c;AI 技術正不斷滲透到各個領域&#xff0c;其中 **#AI 編程憑借高效、便捷的優勢&#xff0c;成為不少開發者和創業者的新選擇。尤其是在小游戲…

Kafka 架構原理

一個kafka集群中包含一個或多個Producer、一個或多個broker、一個或多個ConsumerGrop以及一個Zookeeper集群。kafka通過Zookeeper管理kafka集群配置、leader副本的選舉、生產者的負載均衡等。Producer使用push模式將消息發布到broker,Consumer使用pull模式從broker訂閱并消費消…

用 PyTorch 搭建 CNN 實現 MNIST 手寫數字識別

在圖像識別領域&#xff0c;卷積神經網絡&#xff08;CNN&#xff09; 憑借其對空間特征的高效提取能力&#xff0c;成為手寫數字識別、人臉識別等任務的首選模型。而 MNIST&#xff08;手寫數字數據集&#xff09;作為入門級數據集&#xff0c;幾乎是每個深度學習學習者的 “第…

CTFshow系列——命令執行web61-68

本篇文章介紹了不同了方法進行題目的解析以及原因講解。 文章目錄Web61嘗試了一下&#xff0c;被過濾的payload如下&#xff1a;所以&#xff0c;根據上述思路&#xff0c;這里嘗試過的payload為&#xff1a;Web62&#xff08;同Web61&#xff09;Web63&#xff08;同Web62&…

.Net程序員就業現狀以及學習路線圖(二)

一、.NET程序員就業現狀分析 1. 市場需求與崗位分布 2025年.NET開發崗位全國招聘職位約1676個&#xff0c;占全國技術崗位的0.009%&#xff0c;主要集中在一線城市如深圳、上海等地。就業單位類型分布為&#xff1a;軟件公司占43.3%&#xff0c;研發機構占33.1%&#xff0c;物聯…

MTK Linux DRM分析(二十二)- MTK mtk_drm_crtc.c(Part1)

一、代碼分析 mtk_drm_crtc.c以mtk_crtc_comp_is_busy函數為界限進行拆分分析 static const struct drm_crtc_funcs mtk_crtc_funcs = {.set_config = drm_atomic_helper_set_config,.page_flip = drm_atomic_helper_page_flip,.destroy = mtk_drm_crtc_destroy,.reset = mtk…

stm32f103c8t6 led閃燈實驗

目錄 閃燈原理 2種接線方式控制閃燈 使用推挽接法 使用開漏接法 看原理圖 寫代碼 閃燈原理 LED燈有個2-10mA的電流就可以點亮 3.3/5100.006A6mA 2種接線方式控制閃燈 使用推挽接法 當設置推挽模式時&#xff0c;CPU控制寄存器寫0&#xff0c;IO引腳輸出低電壓&#xff0…

“我同意”按鈕別亂點——你的“職業EULA”漏洞掃描報告

尊敬的審核&#xff1a; 本人文章《“我同意”按鈕別亂點——你的“職業EULA”漏洞掃描報告》 1. 純屬技術交流&#xff0c;無任何違法內容 2. 所有法律引用均來自公開條文 3. 請依據《網絡安全法》第12條“不得無故刪除合法內容”處理 附&#xff1a;本文結構已通過區塊鏈存證…

Product Hunt 每日熱榜 | 2025-09-01

1. A01 標語&#xff1a;你個人的新聞助手 介紹&#xff1a;A01 是你的新聞助手&#xff0c;可以幫你關注你關心的任何話題。只需告訴它你想了解什么&#xff0c;它就能為你帶來最新的文章。 產品網站&#xff1a; 立即訪問 Product Hunt&#xff1a; View on Product Hunt…

【OpenFeign】基礎使用

【OpenFeign】基礎使用1. Feign介紹1.1 使用示例1.2 Feign與RPC對比1.3 SpringCloud Alibaba快速整合OpenFeign1.3.1 詳細代碼1. Feign介紹 1.什么是 Feign Feign 是 Netflix 開發的一個 聲明式的 HTTP 客戶端&#xff0c;在 Spring Cloud 中被廣泛使用。它的目標是&#xff…

訪問相同的url,相同入參的請求,Apifox/Postman可以正常響應結果,而本地調用不行(或結果不同)

文章目錄問題概述Apifox查看實際請求總結問題概述 開發中有一個需求需要去別的系統中拿數據&#xff0c;配置好相關參數后發起請求時發現響應結果和在Apifox上不同&#xff0c;Apifox上正常顯示數據&#xff0c;而本地調用后返回數據不存在。 這就很奇怪了&#xff0c;想了很多…

數據結構(C語言篇):(七)雙向鏈表

目錄 前言 一、概念與結構 二、雙向鏈表的實現 2.1 頭文件的準備 2.2 函數的實現 2.2.1 LTPushBack( )函數&#xff08;尾插&#xff09; &#xff08;1&#xff09;LTBuyNode( ) &#xff08;2&#xff09;LTInit( ) &#xff08;3&#xff09;LTPrint( ) &#x…

從拿起簡歷(resume)重新找工作開始聊起

經濟蕭條或經濟衰退在經濟相關學術上似乎有著嚴格的定義&#xff0c;我不知道我們的經濟是否已經走向了衰退或者蕭條&#xff0c;但有一點那是肯定的&#xff0c;那就現在我們的經濟肯定是不景氣的。經濟不景氣會怎么樣&#xff1f;是的&#xff0c;會有很多人失業&#xff0c;…

OS+MySQL+(其他)八股小記

魯迅先生曾經說過&#xff0c;每天進步一點點&#xff0c;媽媽夸我小天才。 依舊今日八股&#xff0c;這是我在多個文檔整合一起的&#xff0c;可能格式有些問題&#xff0c;請諒解。 操作系統 1.進程和線程的區別&#xff1f; 進程是代碼在數據集合的一次執行活動&#xff0c;…