技術筆記 / 系統

PostgreSQL docker-compos 更換版本到 pgvector

核心問題解答

  1. 可以直接改嗎?

    是的,您必須修改 docker-compose.yml 檔案來更換 PostgreSQL 的映像檔。

  2. 原本的資料還會在嗎?

    會的,您的資料是安全的,不會遺失。

    原因是您的 docker-compose.yml 中為 postgres 服務設定了 Docker Volume (儲存卷):

    YAML

    volumes: - db_storage:/var/lib/postgresql/data

    這行設定的意思是,將 Docker 容器內的 /var/lib/postgresql/data (PostgreSQL 儲存資料的預設路徑) 掛載到一個名為 db_storage 的 Docker 儲存卷上。

    Docker 儲存卷的生命週期是獨立於容器的。當您修改設定並重啟服務時 (docker-compose up),Docker 會:

    1. 刪除舊的 postgres 容器。

    2. 拉取您指定的新映像檔 (pgvector/pgvector:pg16)。

    3. 建立一個新的 postgres 容器。

    4. 將原本存在的 db_storage 儲存卷重新掛載到新容器的 /var/lib/postgresql/data 路徑。

    因此,您的所有資料庫資料、使用者、表格等都會被完整保留。


安全的操作步驟

為了確保萬無一失,請依照以下步驟操作:

步驟 0:(強烈建議) 備份您的資料庫

雖然這個過程是安全的,但在對生產環境做任何變更前,備份永遠是最好的習慣。

  1. 在您的 docker-compose.yml 檔案所在的目錄下,執行以下指令來備份整個資料庫:

    Bash

    ```

    這會將備份檔 my_backup.sql 存在您目前所在的目錄下

    docker-compose exec -T postgres pg_dump -U ${POSTGRES_USER} -d ${POSTGRES_DB} > my_backup.sql ```

    (請確保您的 .env 檔中有 POSTGRES_USER 和 POSTGRES_DB 的設定)

步驟 1:停止目前的 n8n 服務

Bash

docker-compose down

(這個指令會停止並移除容器,但不會刪除 db_storage 這些儲存卷)

步驟 2:修改 docker-compose.yml

將 postgres 服務的 image 從 postgres:16 更換為 pgvector/pgvector:pg16。

修改前:

YAML

services:
  postgres:
    image: postgres:16
    # ... 其他設定 ...

修改後:

YAML

services:
  postgres:
    image: pgvector/pgvector:pg16  # <-- 修改這一行
    # ... 其他設定 ...

步驟 3:重新啟動服務

在 docker-compose.yml 檔案所在的目錄下,執行:

Bash

docker-compose up -d

Docker 會發現 postgres 服務的映像檔發生了變化,自動去拉取 pgvector/pgvector:pg16 這個新映像檔,並用它來啟動新的容器,同時掛載舊的 db_storage 儲存卷。

步驟 4:進入資料庫啟用 vector 擴充套件

服務啟動後,pgvector 軟體已經存在於容器中,但您還需要在資料庫裡啟用它。

  1. 執行以下指令進入 PostgreSQL 容器內的 psql 命令列:

    Bash

    docker-compose exec postgres psql -U ${POSTGRES_USER} -d ${POSTGRES_DB}

  2. 在 psql 命令列中 (postgres=#),執行以下 SQL 指令:

    SQL

    CREATE EXTENSION IF NOT EXISTS vector;

  3. 您可以驗證一下是否成功:

    SQL

    \dx vector

    如果看到 vector 的相關資訊,就表示成功了。

  4. 輸入 \q 並按下 Enter 離開 psql。

現在,您的 PostgreSQL 資料庫已經成功啟用了 vector 擴充功能,並且所有舊資料都完好無損。您可以回到 n8n 介面,Postgres PGVector Store 節點應該就可以正常運作了。

在 GitHub 看原文