在 Synology NAS 自架 Gitea:輕量 Git 伺服器教學
GitHub 很好用,但用久了你可能會想:那些半成品專案、私人筆記腳本、家裡的設定檔,真的都要放到別人的伺服器上嗎?免費的私有庫雖然夠用,但帳號哪天被鎖、服務政策一改,你的東西就受制於人。
如果你已經有一台 Synology NAS,其實可以自己架一套 Git 伺服器,把這些 repository 完全收回自己手上。我選的是 Gitea——它輕到一顆樹莓派都能跑,裝在 NAS 上幾乎感覺不到負擔,介面又跟 GitHub 像到不用重新學。
這篇帶你用 Docker Compose 把 Gitea 裝在 Synology NAS 上,設定好 HTTPS 對外、SSH 推送,然後實際 push 第一個 repository。其中 SSH port 的設定是最多人卡關的地方,我會特別講清楚。
為什麼選 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:
- 進入 NPM → Proxy Hosts → Add Proxy Host
- Domain Names:填入
git.yourdomain.com - Forward Hostname:NAS 的 IP(例如
192.168.1.100) - Forward Port:
3000 - 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_PORT 和 SSH_DOMAIN 兩個環境變數。
進階:開啟 Gitea Actions(CI/CD)
Gitea 內建 Actions,語法相容 GitHub Actions,可以自動跑測試、建置。要用的話分兩步:
- 在
app.ini的[actions]區段設ENABLED = true(新版預設已開) - 另外跑一個 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 的 ports 有 2222:22、環境變數 SSH_PORT=2222、clone 連結帶著 :2222。三者要一致。內網直連也可以用 NAS IP:ssh://git@192.168.1.100:2222/...。
Q:可以不開對外網域,只在內網用嗎?
可以。DOMAIN 和 ROOT_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。雲端歸雲端,自己的歸自己——這樣分工,剛剛好。
🔗 延伸閱讀
- Synology Container Manager 完整教學:用 GUI 管理 Docker
- Synology Nginx Proxy Manager 完整教學:反向代理 + HTTPS 一次搞定
- 在 Synology NAS 上架設 n8n:自動化工作流的開源解法
- Synology Hyper Backup 完整備份教學