前言
前陣子用 Miniflux 搭建了一個 RSS 服務,其資料庫使用的是 PostgreSQL,但運行在 Docker 容器中。現在想把資料庫遷移到另一台伺服器上的 PostgreSQL 中,然後 Miniflux 使用 Database URL 來連接到遷移後的資料庫。
詳細步驟
1.使用 docker exec 指令進入容器
# 列出所有容器
docker ps -a
# 進入 postgresql 容器
docker exec -it 68b4 /bin/bash
# 注意:這裡的 68b4 是容器的 ID 的前幾位
2.使用 pg_dump 備份資料庫
# 備份資料庫
pg_dump --username=admin \
--host=0.0.0.0 --port=5432 \
--format=plain --file=/var/lib/postgresql/data/backup.sql db_name
# 注意:這裡的 admin 是資料庫的使用者名稱,db_name 是資料庫的名稱
# 查看備份檔案
cat /var/lib/postgresql/data/backup.sql
# 退出容器
exit
3.將備份檔案複製到主機
docker cp 68b4cbec5817:/var/lib/postgresql/data/backup.sql ~/
# 注意:這裡的 68b4cbec5817 是容器的 ID,~/ 是主機目前使用者的 home 目錄
4.在新的伺服器上建立資料庫
這裡假設 PostgreSQL 已經安裝好了,教學參考 How To Install and Use PostgreSQL on Ubuntu 24.04
# 切換到 postgres 使用者
sudo su postgres
# 進入 postgres CLI
psql
# 建立使用者
postgres=# CREATE USER username WITH PASSWORD '*****';
# 這裡 postgres=# 是 postgresql 的提示符號,不需要輸入
# 這裡 username 是資料庫的使用者名稱,***** 是資料庫的密碼
# 建立資料庫
postgres=# CREATE DATABASE dbname OWNER dbuser;
# 這裡 dbname 是資料庫的名稱,dbuser 是剛剛建立的使用者名稱
# 授權
postgres=# GRANT ALL PRIVILEGES ON DATABASE dbname TO dbuser;
# 這裡 dbname 是資料庫的名稱,dbuser 是剛剛建立的使用者名稱
# 查看資料庫
postgres=# \l
# 查看使用者
postgres=# \du
# 退出 postgres CLI
postgres=# \q
# 退出 postgres 使用者
exit
5.將備份檔案複製到新的伺服器
scp ~/backup.sql username@ip:/home/username/
# 注意:這裡的 username 是新伺服器的使用者名稱,ip 是新伺服器的 IP 位址,backup.sql 是備份檔案的名稱
6.在新的伺服器的 PostgreSQL 中匯入資料庫
# 切換到 postgres 使用者
sudo su postgres
# 匯入資料庫
psql --host=localhost --port=5432 \
--username=miniflux --dbname=minifluxdb \
--file=/home/unbuntu/backup.sql
# 注意:這裡的 miniflux 是資料庫的使用者名稱,minifluxdb 是資料庫的名稱,backup.sql 是備份檔案的名稱
7.設定新的伺服器的 PostgreSQL
# 切換到 postgres 使用者
sudo su postgres
# 進入 postgres CLI
psql
# 顯示 hba_file 檔案路徑
SHOW hba_file;
# 範例輸出
/etc/postgresql/14/main/pg_hba.conf
# 退出 postgres CLI
\q
# 編輯 hba_file 檔案
vim /etc/postgresql/14/main/pg_hba.conf
# 修改監聽埠
host all all 0.0.0.0/0 md5
host all all ::/0 md5
# 退出儲存
ESC + :wq
# 編輯 postgresql.conf 檔案
vim /etc/postgresql/14/main/postgresql.conf
# 修改監聽位址
將 listen_address = 'localhost'
修改為 listen_address = '*'
# 退出儲存
ESC + :wq
# 重新啟動 PostgreSQL 服務
systemctl restart postgresql
# 退出 postgres 使用者
exit
8.修改 Miniflux 的 Database URL 在 Miniflux 的 compose 檔案中修改資料庫的 URL
# 資料庫 URL Schema
postgres://DatabaseUserName:DatabasePassword@HostIP:5432/DatabaseName?sslmode=disable
9.重新啟動 Miniflux 服務
docker compose up -d