PostgreSQL + pgAdmin + Rallly

確認目前系統佔用的 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 update
  • sudo 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)
      若有,請記得自訂使用者名稱與密碼
  • exitCtrl+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.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
          • -s:僅輸出值
            • $ echo $(lsb_release -cs)jammy
            • $ echo $(lsb_release -c)Codename: jammy
      • >:output redirection (STDOUT/STDERR > FILE)
        • 是一個 shell 語法/運算子 (所以需要sh)
        • 寫入/etc/...需要 root 權限(sudo)
更新套件清單

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 -t
  • sudo systemctl reload nginx
  • sudo 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.ymlsudo 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 48openssl 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 -t
  • sudo systemctl reload nginx
  • sudo certbot --nginx -d <rollly_domain_name>

啟用 Google 登入

  1. https://console.cloud.google.com/
  2. Select project: 開啟專案選擇器 (Ctrl + O)
  3. 新增專案 (New Project):Google OAuth (專案 ID 中 不可以有google字眼)
  4. API 和服務 (APIs & Services) → OAuth 同意畫面 (OAuth consent screen)
  5. 建立 OAuth 用戶端 ID
    1. 使用者類型 (User Type):外部 (External)
    2. 應用程式名稱 (App Name):A1go
  6. API 和服務 (APIs & Services) → 憑證 (Credentials)
    → 建立憑證 (Create Credentials) → OAuth 2.0 用戶端 ID (OAuth 2.0 Client ID)

    1. 類型 (Application Type):網頁應用程式 (Web application)

    2. 名稱 (Name):Rallly

    3. 已授權的 JavaScript 來源 (Authorized JavaScript Origins):https://<rallly_domain_name>
    4. 已授權的重新導向 URI (Authorized Redirect URIs):https://<rallly_domain_name>/api/auth/callback/google
  7. 得到<用戶端ID (Client ID)><用戶端密碼 (Client Secret)>
    sudo nano .env加入:

    1. GOOGLE_CLIENT_ID=<用戶端ID (Client ID)>
      GOOGLE_CLIENT_SECRET=<用戶端密碼 (Client Secret)>
  8. sudo nano docker-compose.ymlenvironment:下加入:
    1.       GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
            GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
  9. 重啟 docker
    1. docker compose down
    2. docker compose up -d

關閉 Email 登入/註冊

sudo nano docker-compose.ymlenvironment:下加入:

 

      EMAIL_LOGIN_ENABLED: "false"
      REGISTRATION_ENABLED: "false"

Last Updated on 2026/01/19 by A1go

References

目錄
Bitnami