前言
之前的 Ragflow-Plus 在服務器上穩定運行一段時間后,接到任務,要把服務遷移到一臺古老的,離線的windows臺式機上。
起初認為,下載離線安裝包,加載離線鏡像,遷移下數據就可以了。
結果坑多得意想不到,折騰了一晚上才搞定。
本文就來分享一下解決方式,Ragflow-Plus 用的是和 Ragflow 相同數據存儲方式,用 Ragflow 部署的系統可相同適用。
數據遷移準備
1. 數據導出
在做系統遷移前,需要先導出原有系統上的數據。
Docker 采用 Docker Volume 進行數據持久化和容器數據共享,在容器刪除后,數據不會丟失。
因此,不需要做容器導出,只需要導出數據和鏡像就可以了。
導出數據有兩種主要方式,一種是復制文件原始路徑,需要對路徑有充分了解,容錯率低;
另一種是通過一個臨時創建的最小容器掛載volume,對數據進行打包,容錯率高。
因此,采用后者的方式,具體命令如下:
docker run --rm -v docker_esdata01:/data -v $(pwd):/backup alpine tar czf /backup/docker_esdata01.tar.gz -C /data .
docker run --rm -v docker_minio_data:/data -v $(pwd):/backup alpine tar czf /backup/docker_minio_data.tar.gz -C /data .
docker run --rm -v docker_mysql_data:/data -v $(pwd):/backup alpine tar czf /backup/docker_mysql_data.tar.gz -C /data .
docker run --rm -v docker_redis_data:/data -v $(pwd):/backup alpine tar czf /backup/docker_redis_data.tar.gz -C /data .
上面的命令是用alpine
這個鏡像創建容器,首次運行會自動拉取該鏡像。
如果遷移的服務器是離線環境,可通過在線環境預先下載該鏡像,打包導出。
docker pull alpine
docker save alpine -o alpine.tar
再傳到離線服務器上,進行加載
docker load -i alpine.tar
打包完上面的es、minio、mysql、redis數據后,將其合并為一個大的壓縮包,方便拷貝傳輸。
tar czf all_volumes_backup.tar.gz *.tar.gz
2. 鏡像導出
和上面alpine
離線導出的方式類似,可用下面的命令將ragflowplus
所有的相關鏡像一并導出為ragflowplus-images.tar
docker save -o ragflowplus-images.tar zstar1003/ragflowplus-management-web:v0.4.3 zstar1003/ragflowplus-management-server:v0.4.3 zstar1003/ragflowplus:v0.4.3 valkey/valkey:8 quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z mysql:8.0.39 elasticsearch:8.11.3
遷移踩坑記錄
準備好鏡像和容器之后,再下載一些必要的安裝包,就可以開始遷移了。
這一節將記錄在 win10-1909 操作系統上失敗的遷移方案,該系統是18年的系統版本,導致很多軟件都無法兼容。
1. 奇怪的ollama
單機版本,用 ollama 部署模型非常方便,因此下載了 ollama 的最新版本。
此外要把模型遷移進去,在 ollama 中,模型的默認存儲地址在C:\Users\%Username%\.ollama
,遷移到 windows,只需將里面的models
文件夾復制進去即可。
然而,運行 ollama 時,發現獨顯沒有利用,模型只加載到CPU中,配置完相關環境變量,問題依舊。
解決方式是將ollama版本回退到更早期的版本,重新安裝,方才正常。
2. 異常的docker
下載了最新版本的 Docker Desktop,安裝就報錯,彈窗提示系統版本過老,無法安裝。
于是下載歷史版本的 Docker Desktop ,能夠安裝,但無法啟動 Docker engine。
主要原因是 Docker Desktop 默認使用 Hyper-V 虛擬化技術創建一個輕量級 Linux 虛擬機(VM),并在其中運行 Docker 守護進程和容器。
然而,該虛擬機沒有正常安裝上。
在一臺正常 windows 系統中,運行wsl --list
,可以看到 docker 安裝的 Linux 子系統:
適用于 Linux 的 Windows 子系統分發:
docker-desktop (默認)
然而,在這臺異常電腦上,輸出為空。
3. 失敗的Hyper-V
通過直接安裝 Docker 行不通之后,另外一個思路就是直接利用 Hyper-V 安裝一套 Linux 虛擬機系統。
在windows中,需要在設置中勾選啟動 Hyper-V、適合于Linux的Windows子系統、虛擬機平臺。
然后下載了unbuntu 20.04系統的iso,用Hyper-V
進行創建,然而遇到報錯:虛擬機監控程序未運行
。
查詢相關資料,需要在 bios 中,開啟虛擬化,將Advanced > CPU Configuration > Intel Virtualization Technology
選項設置為Enabled
。
重啟后,該報錯消失,但遇到新的報錯,和系統版本相關,基本宣告此方案不可行。
最終采用的方案
1. 方案分析
既然用系統自帶的Hyper-V
行不通,那就采用 VMware
虛擬機的方案。
然而,直接在 VMware 中運行 ubuntu 環境,再進行依賴安裝非常繁瑣。因為用于安裝的.deb
包為節省空間,通常是不完整的,比如,安裝docker的deb包,安裝時它除了安裝本體外,還需要聯網去下載其它依賴,以及依賴的依賴。
因此,更加簡單的方式就是在一臺聯網的設備中,先用 vmware 創建虛擬機,在里面直接聯網進行環境安裝和數據導入,做完之后,將整個系統文件進行復制遷移。
2. 虛擬系統準備
下面用 VMware 16,進行具體操作。
1.首先在VMware中新建虛擬機,裝好系統。
2.配置ssh
為了方便和宿主機進行文件傳輸,先配置好ssh。
sudo apt update
sudo apt install openssh-server
防火墻開放ssh端口
sudo ufw allow ssh
配置完后,就可以通過ip進行ssh連接。
3.安裝docker
設置 Docker 的 apt 存儲庫:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc# Add the repository to Apt sources:
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安裝 Docker 包:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
驗證 Docker 安裝:
docker --version
4.加載鏡像和數據
上傳之前準備的數據文件all_volumes_backup.tar.gz
和鏡像文件ragflowplus-images.tar
。
這里的鏡像文件也可以直接去網上pull,但考慮速度原因,直接載入更快。
加載鏡像
docker load -i ragflowplus-images.tar
解壓數據
tar -xzvf all_volumes_backup.tar.gz
創建數據卷
docker volume create docker_esdata01
docker volume create docker_minio_data
docker volume create docker_mysql_data
docker volume create docker_redis_data
導入數據
docker run --rm -v docker_esdata01:/data -v C:\Users\yourname\Desktop\docker_backup:/backup alpine sh -c "cd /data && tar xzf /backup/docker_esdata01.tar.gz"
docker run --rm -v docker_minio_data:/data -v C:\Users\yourname\Desktop\docker_backup:/backup alpine sh -c "cd /data && tar xzf /backup/docker_minio_data.tar.gz"
docker run --rm -v docker_mysql_data:/data -v C:\Users\yourname\Desktop\docker_backup:/backup alpine sh -c "cd /data && tar xzf /backup/docker_mysql_data.tar.gz"
docker run --rm -v docker_redis_data:/data -v C:\Users\yourname\Desktop\docker_backup:/backup alpine sh -c "cd /data && tar xzf /backup/docker_redis_data.tar.gz"
克隆項目代碼
git clone https://github.com/zstar1003/ragflow-plus.git
啟動系統
docker compose -f docker/docker-compose.yml up -d
這里需要注意,必須先導入完數據,再啟動系統,否則會造成數據不一致沖突,造成容器狀態異常。
如果正常啟動,直接用 ubuntu 內置的瀏覽器,訪問localhost
就能看到界面。
如果要在外部宿主機訪問,需要先查看虛擬機ip:
瀏覽器輸入該ip就能訪問,進去可以看到,數據已正常遷移成功。
5.復制系統文件
配置完后,右鍵->打開虛擬機目錄,找到虛擬機所在目錄,將整個虛擬機文件夾拷貝下來。
3. 離線環境遷移
有了環境之后,在離線系統中,安裝好VMware,就可以直接打開虛擬機,選擇上一步的系統文件。
進入之后,啟動環境方式和上面相同。
由于外部訪問需要訪問虛擬機ip,比較麻煩,因此,可以直接配置一個端口轉發,將本機localhost端口轉發到虛擬機的相應端口上。
選擇編輯->虛擬網絡編輯器
,配置需要管理員權限,點擊下面的更改設置
再次進入后,選擇 VMnet8 的 NAT 設置
在這里添加端口轉發規則,以80端口為例,8888和9000端口同理。
配置完后,就可以直接在外部瀏覽器訪問localhost
進入前臺首頁。
由于 ollama 是在外部進行部署的,因此,在虛擬機中進行模型配置時,需要通過外部的ip訪問到 ollama 的服務。
首先配置環境變量OLLAMA_HOST
,設定值為0.0.0.0:11434
,這將使ollama監聽所有的地址。
配置完后,重啟ollama,然后在網頁中就可以配置ollama的url為外部 VMnet8 的ip + 11434端口,就可以連通了。
至此,系統遷移部署完成。