iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
自我挑戰組

一路side project - 學習筆記系列 第 7

[Day 7] GU價格提醒系統 (2) - 專案的環境架設 ( Docker + n8n )

  • 分享至 

  • xImage
  •  

今天來講環境的建置。
使用 docker-compose 一鍵起環境:n8n + PostgreSQL + Scraper


為什麼用 Docker Compose?

當一個小專案同時需要多個服務(工作流排程器 n8n、資料庫 PostgreSQL、自訂爬蟲 Scraper),用「手動安裝+彼此接線」會很痛苦。
Docker Compose 做的事情:

  • 一次定義,多服務一起啟動:把 n8n、Postgres、Scraper 的image、port、環境變數、volumes 都寫在一個 YAML檔中。
  • 自動建網路與服務互通:container間可用服務名通訊(例如 n8n 連資料庫直接用 db:5432)。
  • 資料持久化:用 volumes 把 n8n 設定與 Postgres 資料保存到本地主機,container砍了資料還在。
  • 可重現的開發環境:其他人可拉下來同一份 Compose,在任何機器上都能跑起相同堆疊。

技術基底

  • Docker / Docker Compose:服務編排與持久化。
  • n8n:可視化自動化平台(Cron、HTTP、DB 節點…),負責排程抓價與寫入資料庫。
  • PostgreSQL 15:關聯式資料庫,保存每次抓到的價格點與之後的彙總。
  • Scraper(FastAPI 範例):提供 /scrape API,實際抓價或先回假資料做串接測試。

Step 1 | 環境建置

1) 安裝 Docker

Windows

  1. 安裝 Docker Desktop for Windows(官方安裝程式)。
  2. 安裝過程會同時設定 WSL2(Windows Subsystem for Linux)。若提示「需要啟用 WSL2」就按指示啟用並重開機。
  3. 安裝完成後啟動 Docker Desktop,左下角鯨魚圖示變成 Running。
    https://ithelp.ithome.com.tw/upload/images/20250920/20154764AYIxxp0Cjw.png

Linux

(因為本米現在是架在 Window s上,針對 Linux 就不講細節,網路有許多人分享下載方法可參照)

  1. 安裝官方 Docker Engine 與 Docker Compose plugin(可用 apt 方式安裝)。
  2. 將使用者加入 docker 群組

2)驗證 Docker 與 Compose 是否可用

打開 terminal :

docker --version
docker compose version
docker run hello-world
  • 有看到版本號、hello-world 有跑起來就 OK。
  • 若 docker compose 指令無法使用,升級 Docker Desktop(Compose 內建於新版)。
    https://ithelp.ithome.com.tw/upload/images/20250920/20154764dzKhQZdsxB.png

https://ithelp.ithome.com.tw/upload/images/20250920/20154764CTqFtCmW4A.png

https://ithelp.ithome.com.tw/upload/images/20250920/201547645JZZWZHjpZ.png


Step 2 | 建立專案資料夾與檔案

專案結構:

gu-n8n-starter/
├─ docker-compose.yml
├─ postgres/
│  └─ init.sql
└─ scraper/
   ├─ Dockerfile
   └─ app.py

docker-compose.yml

version: "3.8"
services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    ports:
      - "5678:5678"
    environment:
      - TZ=Asia/Taipei
      - N8N_HOST=localhost
      - N8N_PORT=5678
      - N8N_PROTOCOL=http
      - GENERIC_TIMEZONE=Asia/Taipei
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=db
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=gu
      - DB_POSTGRESDB_PASSWORD=gu
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      - db
      - scraper

  db:
    image: postgres:15-alpine
    container_name: pg
    environment:
      - POSTGRES_USER=gu
      - POSTGRES_PASSWORD=gu
      - POSTGRES_DB=n8n
      - TZ=Asia/Taipei
    ports:
      - "5432:5432"
    volumes:
      - pg_data:/var/lib/postgresql/data
      - ./postgres/init.sql:/docker-entrypoint-initdb.d/00-init.sql:ro

  scraper:
    build:
      context: ./scraper
      dockerfile: Dockerfile
    image: gu-scraper:latest
    container_name: gu_scraper
    environment:
      - TZ=Asia/Taipei
    ports:
      - "8000:8000"
    restart: unless-stopped

volumes:
  n8n_data:
  pg_data:

postgres/init.sql

(暫時 可能之後再n8n資料庫會用關聯式資料庫的特性建構資料庫)

CREATE TABLE IF NOT EXISTS prices (
  id BIGSERIAL PRIMARY KEY,
  category TEXT NOT NULL,
  product_code TEXT,
  name TEXT,
  price NUMERIC,
  original_price NUMERIC,
  in_stock TEXT,
  url TEXT,
  ts TIMESTAMPTZ DEFAULT NOW(),
  raw JSONB
);
CREATE INDEX IF NOT EXISTS idx_prices_product_ts ON prices(product_code, ts);
CREATE INDEX IF NOT EXISTS idx_prices_category_ts ON prices(category, ts);

scraper/Dockerfile

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 8000
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]

scraper/app.py

最重要的地方 要抓取商品價格
細節留後面講


Step 3 | 啟動服務

打開 terminal :

# Windows PowerShell
cd path\to\gu-n8n-starter
docker compose up -d --build

成功後會看到三個容器:n8n、pg(Postgres)、gu_scraper


Step 4 | 驗證是否成功架起來

  • 打開瀏覽器 → n8n:http://localhost:5678
  • Scraper 健康檢查:http://localhost:8000/health(應回 {"ok": true})
  • Scraper 假資料:http://localhost:8000/scrape?category=women_tshirtsweat

Step 5 | 在 n8n 建立你的第一條「抓價 → 存 DB」工作流

因為內容有點多 篇幅會過長 所以留到後面另外再說
[Day 9] GU價格提醒系統 (3) - 什麼是 n8n ?


今天就先到這 特別留 scraper 和 n8n 流程
我們後面幾天再來補 ~


上一篇
[Day 6] GU價格提醒系統 (1) - 需求拆解、資料源盤點
下一篇
[Day 8] SAS 活動心得感想
系列文
一路side project - 學習筆記10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言