PostgreSQL + pgAdmin + Rallly
- 2026.01.18
- docker PostgreSQL
- user
確認目前系統佔用的 Port
sudo ss -ltnp | grep LISTEN | sed -E 's/.*:([0-9]+).*users:\(\("([^"]+).*/\1 \2/' | sort -n | uniq- 可能使用的 Port
- 5432 (PostgreSQL)
- 80 / 443 (pgAdmin)
- 3000 (Rallly)
PostgreSQL
安裝 PostgreSQL
sudo apt updatesudo apt install postgresql
建立資料庫與帳號
- sudo -u postgres psql
-
CREATE DATABASE rallly; CREATE USER rallly WITH PASSWORD 'ralllypass'; GRANT ALL PRIVILEGES ON DATABASE rallly TO rallly;
- ⚠️
目前 PostgreSQL 和 防火牆 皆未對外開放 Port 5432 (PostgreSQL 預設 Port)
若有,請記得自訂使用者名稱與密碼
-
exit或Ctrl+Q
安裝 pgAdmin
於 Ubuntu 本地安裝
加入官方 repo
curl -fsS https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /usr/share/keyrings/packages-pgadmin-org.gpgcurl:此處是用於下載 pgAdmin 官方 GPG 公鑰 (https://www.pgadmin.org/static/packages_pgadmin_org.pub)-
-f(fail):如果 HTTP 回傳錯誤(404、500),直接失敗,不輸出內容 -
-s(silent):不顯示進度條及下載百分比 -
-S(show error):出錯時顯示錯誤訊息
-
|(pipe)gpg(GNU Privacy Guard,加密與驗證工具):
把 pgAdmin 官方公鑰 (ASCII armored 格式) 轉成 apt 能使用的 binary 格式1Ubuntu security documentation: Ubuntu image integrity verification2GnuPrivacyGuardHowto – Community Help Wiki3SecureApt – Community Help Wiki4GnuPG – Support5Ubuntu Manpage: gpg – OpenPGP encryption and signing tool-
--dearmor:ASCII armored 格式→ binary 格式 -o:output;把轉換後的金鑰存到/usr/share/keyrings/packages-pgadmin-org.gpg
-
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/packages-pgadmin-org.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list'- sudo sh ‘echo “…” > …’
- APT (Advanced Package Tool) 的 repo (repository) 定義
deb [options (選項)] <URL (套件來源)> <distro (發行版代號)> <component (分類)>signed-by=... .gpg:用以簽署之金鑰$(...):Bash 的命令替换 (command substitution) 語法lsb_release -c:Ubuntu/Debian 發行版代號 (codename)- Ubuntu 版本:20.04 →
focal - Ubuntu 版本:22.04 →
jammy - Ubuntu 版本:24.04 →
noble
- Ubuntu 版本:20.04 →
-s:僅輸出值- $
echo $(lsb_release -cs)→jammy - $
echo $(lsb_release -c)→Codename: jammy
- $
>:output redirection (STDOUT/STDERR > FILE)- 是一個 shell 語法/運算子 (所以需要
sh) - 寫入
/etc/...需要 root 權限(sudo)
- 是一個 shell 語法/運算子 (所以需要
- APT (Advanced Package Tool) 的 repo (repository) 定義
- sudo sh ‘echo “…” > …’
更新套件清單
sudo apt update
安裝 pgAdmin 4 (Web 版)
sudo apt install pgadmin4-web
初始化 Web 介面
sudo /usr/pgadmin4/bin/setup-web.sh
用 Docker 部署
docker run
docker run -d \ --name pgadmin \ --restart unless-stopped \ --network host \ -e PGADMIN_DEFAULT_EMAIL=admin@<domain_name> \ -e PGADMIN_DEFAULT_PASSWORD=<password> \ -e PGADMIN_LISTEN_PORT=5050 \ -v pgadmin_data:/var/lib/pgadmin dpage/pgadmin4
更新 /etc/ddclient.conf
- 編輯
sudo nano /etc/ddclient.conf - 在 Namecheap (domain name registrar) 新增對應的 Host Record
- 測試並設置
sudo ddclient -daemon=0 -debug -verbose -noquiet
設定 Nginx
sudo nano /etc/nginx/sites-available/<pgadmin_domain_name>-
server { server_name <pgadmin_domain_name>; location / { proxy_pass http://localhost:5050; # proxy_pass http://127.0.0.1:5050; # IPv4-only proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
-
sudo ln -s /etc/nginx/sites-available/<pgadmin_domain_name> /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl reload nginxsudo certbot --nginx -d <pgadmin_domain_name>
於
-
General
-
Name:
Rallly
-
-
Connection
-
Host name/Address:
127.0.0.1 -
Port:
5432 -
Maintenance Database:
rallly -
Username:
rallly -
Password:
ralllypass -
Save Password:
Yes
-
Rallly
用 Docker 部署
docker compose
- 建立存放此 container 相關檔案之資料夾:
sudo mkdir -p /opt/rallly - 移到該資料夾:
cd /opt/rallly - 創建
docker-compose.yml:sudo nano docker-compose.yml-
services: # PostgreSQL 資料庫 # db: # image: postgres:16-alpine # container_name: rallly-db # restart: unless-stopped # 資料庫初始化設定 # environment: # POSTGRES_DB: rallly # 資料庫名稱 # POSTGRES_USER: rallly # 使用者名稱 # POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} # 從 .env 讀取 # 資料持久化 : # volumes: # - rallly_db:/var/lib/postgresql/data # Rallly 主程式 app: image: lukevella/rallly:latest container_name: rallly-app restart: unless-stopped #user: "0:0" # command: ["sh", "-c", "sleep infinity"] # debug 用 # depends_on: # 確保資料庫先啟動 # - db # extra_hosts: # - "host.docker.internal:host-gateway" environment: NEXT_PUBLIC_BASE_URL: ${BASE_URL} # 對外 URL NEXTAUTH_URL: ${BASE_URL} # NextAuth 用的 base URL NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} # NextAuth session 加密用 secret DATABASE_URL: ${DATABASE_URL} # PostgreSQL 連線字串 SECRET_PASSWORD: ${SECRET_PASSWORD} SUPPORT_EMAIL: ${SUPPORT_EMAIL} network_mode: host # ports: # 綁定本機,避免外網直接連接容器 # - "127.0.0.1:3010:3000" # Ask docker to create/manage a persistent named volume # (stored on host; e.g. /var/lib/docker/volumes/... on Linux) # volumes: # rallly_db:
-
- 創建
.env檔案- 用
openssl rand -base64 48或openssl rand -base64 24產生隨機字串 sudo nano .env-
BASE_URL=https://<rollly_domain_name> # POSTGRES_PASSWORD=<postgres_pass> NEXTAUTH_SECRET=<long_random_str> DATABASE_URL=postgresql://rallly:<postgres_pass>@127.0.0.1:5432/rallly SECRET_PASSWORD=<another_long_random_str> SUPPORT_EMAIL=<mail_address>
-
- 用
- 執行:
docker compose up -d - 檢查 log 中是否有錯誤提示:
docker logs -f rallly-app
設定反代理
更新 /etc/ddclient.conf
- 編輯
sudo nano /etc/ddclient.conf - 在 Namecheap (domain name registrar) 新增對應的 Host Record
- 測試並設置
sudo ddclient -daemon=0 -debug -verbose -noquiet
設定 Nginx
sudo nano /etc/nginx/sites-available/<rollly_domain_name>-
server { server_name <rollly_domain_name>; location / { proxy_pass http://127.0.0.1:3000; # IPv4-only proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
-
sudo ln -s /etc/nginx/sites-available/<rollly_domain_name> /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl reload nginxsudo certbot --nginx -d <rollly_domain_name>
啟用 Google 登入
- 到 https://console.cloud.google.com/
- Select project: 開啟專案選擇器 (
Ctrl + O) - 新增專案 (New Project):Google OAuth (專案 ID 中 不可以有
google字眼) - API 和服務 (APIs & Services) → OAuth 同意畫面 (OAuth consent screen)
- 建立 OAuth 用戶端 ID
- 使用者類型 (User Type):外部 (External)
- 應用程式名稱 (App Name):A1go
- API 和服務 (APIs & Services) → 憑證 (Credentials)
→ 建立憑證 (Create Credentials) → OAuth 2.0 用戶端 ID (OAuth 2.0 Client ID)-
類型 (Application Type):網頁應用程式 (Web application)
-
名稱 (Name):Rallly
- 已授權的 JavaScript 來源 (Authorized JavaScript Origins):https://<rallly_domain_name>
- 已授權的重新導向 URI (Authorized Redirect URIs):https://<rallly_domain_name>/api/auth/callback/google
-
- 得到
<用戶端ID (Client ID)>和<用戶端密碼 (Client Secret)>
在sudo nano .env加入:-
GOOGLE_CLIENT_ID=<用戶端ID (Client ID)> GOOGLE_CLIENT_SECRET=<用戶端密碼 (Client Secret)>
-
sudo nano docker-compose.yml在environment:下加入:-
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID} GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
-
- 重啟 docker
docker compose downdocker compose up -d
關閉 Email 登入/註冊
sudo nano docker-compose.yml在environment:下加入:
EMAIL_LOGIN_ENABLED: "false"
REGISTRATION_ENABLED: "false"
Last Updated on 2026/01/19 by A1go