把程式碼放在自己的 NAS,而不是別人的雲端。

Gitea 是輕量級的自架 Git 伺服器,比 GitLab 省資源。這篇用 Docker Compose 在 Synology NAS 安裝 Gitea,設定 HTTPS、SSH 推送,並建立第一個 repository。

在 Synology NAS 自架 Gitea:輕量 Git 伺服器教學

GitHub 很好用,但用久了你可能會想:那些半成品專案、私人筆記腳本、家裡的設定檔,真的都要放到別人的伺服器上嗎?免費的私有庫雖然夠用,但帳號哪天被鎖、服務政策一改,你的東西就受制於人。

如果你已經有一台 Synology NAS,其實可以自己架一套 Git 伺服器,把這些 repository 完全收回自己手上。我選的是 Gitea——它輕到一顆樹莓派都能跑,裝在 NAS 上幾乎感覺不到負擔,介面又跟 GitHub 像到不用重新學。

這篇帶你用 Docker Compose 把 Gitea 裝在 Synology NAS 上,設定好 HTTPS 對外、SSH 推送,然後實際 push 第一個 repository。其中 SSH port 的設定是最多人卡關的地方,我會特別講清楚。

Gitea 自架 Git 伺服器架構:NAS 上的 Gitea 提供 HTTPS 與 SSH 兩條推送路徑

為什麼選 Gitea(而不是 GitLab)

自架 Git 主流有兩個選擇:Gitea 和 GitLab。我兩個都碰過,最後留下 Gitea,理由很單純——資源消耗差太多

項目 Gitea GitLab CE
記憶體佔用 約 100–200 MB 至少 4 GB 起跳
啟動速度 數秒 數十秒到數分鐘
安裝複雜度 單一容器即可跑 需要多個元件,調校麻煩
介面 接近 GitHub,簡潔 功能多但繁重
內建 CI/CD Gitea Actions(相容 GitHub Actions) 完整 GitLab CI
適合 個人 / 小團隊 / NAS 中大型團隊、完整 DevOps

GitLab 功能確實更全,內建 CI/CD、議題看板、Wiki 一應俱全。但對家用 NAS 來說,光記憶體門檻就勸退——一台 DS923+ 預設 4GB RAM,光 GitLab 就吃光了。Gitea 開著幾乎不佔資源,這對 24 小時開機的 NAS 才合理。

如果你只是想存放程式碼、偶爾開個 issue,Gitea 綽綽有餘。真的需要完整 DevOps 流水線、多人協作管理,再考慮 GitLab。經驗法則:先從輕的開始,需求長出來再換重的。


前置需求

  • Synology NAS 已安裝 Container Manager(DSM 7.2+)
  • 已設定好對外域名(DDNS 或自訂域名),若只在內網用可略過
  • 已安裝 Nginx Proxy Manager 或其他反向代理(用於 HTTPS)

還沒設定反向代理?可以先看 Synology Nginx Proxy Manager 完整教學。對 Docker 還不熟的話,建議先讀 Synology NAS Docker 新手入門


Docker Compose 設定

建立資料夾

在 NAS 的 File Station 建立資料目錄:

/docker/gitea/

Gitea 所有的 repository、設定、資料庫都會放在這裡,之後備份只要顧這個目錄。

docker-compose.yml

透過 Container Manager → 專案 → 新增,貼入以下 Compose:

version: "3.8"

services:
  gitea:
    image: gitea/gitea:latest
    container_name: gitea
    restart: unless-stopped
    environment:
      - USER_UID=1026
      - USER_GID=100
      - GITEA__database__DB_TYPE=sqlite3
      - GITEA__server__DOMAIN=git.yourdomain.com
      - GITEA__server__ROOT_URL=https://git.yourdomain.com/
      - GITEA__server__SSH_DOMAIN=git.yourdomain.com
      - GITEA__server__SSH_PORT=2222
    volumes:
      - /docker/gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2222:22"

幾個關鍵設定要注意:

設定 說明
USER_UID / USER_GID 容器內 Gitea 跑的使用者。1026/100 是 DSM 常見的第一個使用者,若權限有問題,到 NAS 用 id 你的帳號 查正確數字
GITEA__server__DOMAIN 對外網域,沒有就填 NAS 內網 IP
GITEA__server__ROOT_URL Gitea 產生連結時的基底 URL,一定要跟實際存取網址一致,否則 clone 連結會錯
GITEA__server__SSH_PORT 給使用者看的 SSH port(顯示在 clone 連結上),要跟下面 ports 對外那個一致

Port 的眉角(最多人卡這裡)

Gitea 預設用兩個 port:

  • 3000:網頁介面(之後交給反向代理上 HTTPS)
  • 22:Git over SSH

問題來了:Synology NAS 自己的 SSH 就佔用 host 的 22。如果你直接把容器的 22 對應到 host 的 22,不是衝突就是被 DSM 搶走。所以上面 Compose 把容器內的 22 對應到 host 的 2222

ports:
  - "2222:22"

然後告訴 Gitea「對使用者顯示的 SSH port 是 2222」:

- GITEA__server__SSH_PORT=2222

這樣 Gitea 產生的 SSH clone 連結才會帶上正確的 :2222。少設這一行,你 clone 時就會卡在連不上、或連到 NAS 本身的 SSH 而不是 Gitea。


設定反向代理(HTTPS)

Gitea 網頁跑在 Port 3000、用 HTTP。透過 Nginx Proxy Manager 加上 HTTPS:

  1. 進入 NPM → Proxy Hosts → Add Proxy Host
  2. Domain Names:填入 git.yourdomain.com
  3. Forward Hostname:NAS 的 IP(例如 192.168.1.100
  4. Forward Port3000
  5. SSL 頁籤:選 Let's Encrypt 憑證,勾選 Force SSL

注意:反向代理只處理「網頁」和「HTTPS clone」這條路。SSH 推送(port 2222)不走反向代理,是直接連到 NAS 的 2222 port。如果要從外網用 SSH 推送,記得在路由器把 2222 port 轉發進來(或走 Tailscale 這種更安全的方式,不用對外開 port)。

設定完成後,打開 https://git.yourdomain.com 就能看到 Gitea 安裝畫面。


初次安裝設定

第一次開啟會進到安裝頁面,大部分維持預設即可,但有幾個欄位要確認:

  • 資料庫類型:選 SQLite3(個人用足夠,零維護)
  • 網站基礎 URL(Application URL):確認是 https://git.yourdomain.com/,跟前面 ROOT_URL 一致
  • SSH 伺服器埠(SSH Server Port):填 2222
  • 展開「管理員帳號設定」:直接在這裡把第一個管理員帳號建好(不建的話,第一個註冊的人會自動變管理員,安全上不建議放著)

重要安全步驟:安裝完成後,回到 /data/gitea/conf/app.ini,把 [service] 區段的 DISABLE_REGISTRATION 設成 true,關閉公開註冊。否則你的 Git 伺服器對全世界開放註冊,遲早被機器人灌爆。

設定完成後登入,看到儀表板就成功了。


建立第一個 Repository 並推送

建立 repo

右上角 + → New Repository,填好名稱、選 Private,建立。建好後 Gitea 會給你兩種 clone 連結:HTTPS 和 SSH。

方法一:HTTPS 推送

最簡單,不用設金鑰:

git clone https://git.yourdomain.com/myuser/my-repo.git
cd my-repo
echo "# My Repo" > README.md
git add .
git commit -m "first commit"
git push

推送時輸入 Gitea 帳號密碼。若帳號開了兩步驟驗證,密碼要改用 個人存取權杖(Settings → Applications → Generate Token),不能用登入密碼。

方法二:SSH 推送(推薦)

設定一次金鑰後就不用再打密碼,而且更安全。

先把你的公鑰加到 Gitea:Settings → SSH / GPG Keys → Add Key,貼上 ~/.ssh/id_ed25519.pub 的內容。

然後 clone 時注意連結帶著 :2222

git clone ssh://git@git.yourdomain.com:2222/myuser/my-repo.git

這個 :2222 就是前面 port 設定的成果。如果你看到的 clone 連結沒有 port、或是錯的 port,回頭檢查 SSH_PORTSSH_DOMAIN 兩個環境變數。


進階:開啟 Gitea Actions(CI/CD)

Gitea 內建 Actions,語法相容 GitHub Actions,可以自動跑測試、建置。要用的話分兩步:

  1. app.ini[actions] 區段設 ENABLED = true(新版預設已開)
  2. 另外跑一個 act_runner 容器,註冊到 Gitea 當執行器

對個人專案來說,Actions 不是必需品,建議先把基本的 Git 推送跑順,等真的有自動化需求再加。不要一開始就把所有功能塞上去,那只會讓除錯變複雜。


備份

Gitea 的所有東西——repository、資料庫、設定、使用者上傳——都在 /docker/gitea 這一個目錄。備份策略很單純:把這個目錄加進 Hyper Backup 的備份範圍即可。

如果你想要更乾淨的匯出,Gitea 也提供 gitea dump 指令,會把所有資料打包成一個壓縮檔:

docker exec -u git gitea gitea dump -c /data/gitea/conf/app.ini

產生的壓縮檔放在容器內工作目錄,記得撈出來一起備份。不過對大多數人來說,直接備份整個 /docker/gitea 目錄就夠了。


常見問題

Q:SSH clone 一直連不上? 九成是 port 問題。確認三件事:Compose 的 ports2222:22、環境變數 SSH_PORT=2222、clone 連結帶著 :2222。三者要一致。內網直連也可以用 NAS IP:ssh://git@192.168.1.100:2222/...

Q:可以不開對外網域,只在內網用嗎? 可以。DOMAINROOT_URL 填 NAS 內網 IP(如 http://192.168.1.100:3000/),跳過反向代理那段,直接用 IP + port 存取。SSH 一樣走 2222。

Q:SQLite 夠用嗎?要不要換 PostgreSQL? 個人到小團隊用 SQLite 完全沒問題,零維護。除非你有大量使用者同時操作,才需要像 n8n 那樣外接 PostgreSQL(做法可參考 n8n 教學 的資料庫段落)。

Q:怎麼更新 Gitea? 在 Container Manager 的專案裡「停止 → 拉取最新映像 → 啟動」。SQLite 版本通常會自動完成資料庫遷移,更新前還是先備份 /docker/gitea 比較保險。

Q:Gitea 和 GitHub 可以互相同步嗎? 可以。Gitea 支援「鏡像(Mirror)」功能,建立 repo 時選「從 URL 遷移」並勾選鏡像,就能定期從 GitHub 拉取,當作備援。


小結

把 Gitea 裝在 NAS 上之後,你就有了一個完全屬於自己的 Git 伺服器——程式碼不經過第三方、私有庫想開幾個就開幾個、帳號掌握在自己手裡。對於不想把所有東西都託管在雲端的人來說,這種「資料主權」的踏實感,是免費私有庫給不了的。

而且 Gitea 真的很輕,開著幾乎不佔 NAS 資源。我自己除了重要專案還是放 GitHub(為了協作和能見度),那些不想公開、又懶得整理的私人腳本和設定檔,全都丟進自家 Gitea。雲端歸雲端,自己的歸自己——這樣分工,剛剛好。


🔗 延伸閱讀

這篇有幫助嗎? 把程式碼放在自己的 NAS,而不是別人的雲端。