Featured image of post Gitea - 自己的 Git 自己架

Gitea - 自己的 Git 自己架

作為寫過程式的人,Git是必備工具 除非只是寫好玩的

常見的線上Git儲藏庫就是 GitHubGitlabBitbucket

如果對於這些公開平台不放心,或是程式碼不想外流,那就自己架私服吧!

常見的有 Giteagogs或是Gitlab

Gitlab裡面包含 CI/CD 工具等功能,十分肥大

想要一個安裝簡單、有完整git功能又有中文介面,那就選 Gitea 吧!

安裝

說明文件

Gitea 提供很多安裝方式,我這邊選則用 docker 手邊有現成的docker伺服器,不用白不用

docker-compose 安裝說明

選擇版本

Gitea 的官方映像可以在 Docker Hub 找到

版本 tag 與 Gitea 的 Github 上發布的版本號一樣

latest 則是最新的穩定版

選擇資料庫

Gitea 支援多種資料庫,例如 mysql mariadb PostgreSQL

安裝過程

使用 docker-compose 安裝

我這邊選用 mysql 資料庫

</> yaml 📄 docker-compose.yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: "2"

services:
  server:
    image: gitea/gitea:1.15.6-rootless
     environment:
       - GITEA__database__DB_TYPE=mysql
       - GITEA__database__HOST=db:3306
       - GITEA__database__NAME=gitea
       - GITEA__database__USER=gitea
       - GITEA__database__PASSWD=gitea
    restart: always
    volumes:
      - ./data:/var/lib/gitea
      - ./config:/etc/gitea  
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "10080:3000"
      - "10022:22"
     depends_on:
       - db

   db:
     image: mysql:8
     restart: always
     environment:
       - MYSQL_ROOT_PASSWORD=gitea
       - MYSQL_USER=gitea
       - MYSQL_PASSWORD=gitea
       - MYSQL_DATABASE=gitea
     volumes:
       - ./mysql:/var/lib/mysql

執行

>_ terminal
1
docker-compose up

完成後可以用 http://hostname:10080 連到你剛剛架的 gitea

SSH 要使用 10022 例如

>_ terminal
1
git clone ssh://git@hostname:10022/username/repo.git

如果想用預設 Port

</> yaml
1
2
3
4
5
6
7
8
9
#將這段
ports:
    - "10080:3000"
    - "10022:22"

#換成這段
ports:
    - "80:3000"
    - "22:22"      

到這邊自己用應該夠了,後續如果要在外網使用,建議還是設定網段 + SSl憑證 (弄成https) 會比較安全

設定 revers proxy

我自己是使用 traefik 做 revers proxy
由於之前是用 haproxy ,改用 traefik 之後還是習慣用檔案手動設定
後面的範例會以設定檔的方式為主,也可以參考官方文件改成 docker labels

https

我的 traefik 有設定監看資料夾的動態設定檔,service 跟 router 分別在不同檔案
如果沒有用動態設定檔的話,設定應該都在 traefik.toml 只不過改完後要重開

啟用動態設定檔

directory 可以自行更換

</> toml 📄 traefik.toml
1
2
3
4
[providers]
  [providers.file]
    directory = "/etc/traefik/dynamic_configs"
    watch = true

設定 let’s encrypt 自動申請憑證

驗證方式有幾種可以選,一般常用的是 http Challenge

我的網站有套用 cloudflare 保護,DNS 代理就轉過去 cloudflare 了
外加 cloudflare 有支援 dns Challenge,乾脆就用這種 DNS 驗證比較省事
如果你的網域租賃商有提供 dns Challenge,也可以用這種方式驗證比較簡單
只要設定一次,可以套用多個網域

resolvers 可以改成你的網域租賃商,我這邊寫的是 cloudflare 的 DNS
如果要套用 cloudflare 的防護,這邊不用改

</> toml 📄 traefik.toml
1
2
3
4
5
6
7
8
[certificatesResolvers.cloudflare-resolver.acme]
  email = "[email protected]"
  storage = "/etc/traefik/acme.json"

  [certificatesResolvers.cloudflare-resolver.acme.dnsChallenge]
    provider = "cloudflare"
    delayBeforeCheck = 0
    resolvers = ["1.1.1.1:53", "1.0.0.1:53"]

設定 entry point

</> toml 📄 traefik.toml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[entryPoints]
  [entryPoints.ssh]
    address = ":22"

  [entryPoints.web]
    address = ":80"

  [entryPoints.websecure]
    address = ":443"
      [entryPoints.websecure.http.tls]
        certResolver = "cloudflare-resolver"

添加後端跟路由

添加 http service

</> toml 📄 /etc/traefik/dynamic_configs/service.toml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[http.services]
  [http.services.gitea.loadBalancer]
    # healthCheck 是讓 traefik 檢查 gitea 伺服器是否還活著,不要可以去掉
    [http.services.gitea.loadBalancer.healthCheck]
      scheme = "http"
      path = "/"
      interval = "10s"
      timeout = "3s"
    [[http.services.gitea.loadBalancer.servers]]
      url = "http://gitea-ip:3000"

再來是添加 router

</> toml 📄 /etc/traefik/dynamic_configs/routre.toml
1
2
3
4
5
6
7
[http.routers]
  [http.routers.git]
    entryPoints = ["websecure"]
    rule = "Host(`git.your.domain`)"
    service = "gitea"
    [http.routers.git.tls]
      certResolver = "cloudflare-resolver"

這樣就完成了

ssh

git 使用 key 做身分認證時必須要走 ssh 的協定,如果要使用就必須做好轉發

在 revers proxy 設定連接 就直接轉到 gitea 伺服器

使用 Hugo 建立
主題 StackJimmy 設計