使用 Docker 和 Traefik v2 搭建輕量代碼倉庫(Gitea)

本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或從新修改使用,但須要註明來源。 署名 4.0 國際 (CC BY 4.0)html

本文做者: 蘇洋mysql

建立時間: 2020年02月04日 統計字數: 5934字 閱讀時間: 12分鐘閱讀 本文連接: soulteary.com/2020/02/04/…git


使用 Docker 和 Traefik v2 搭建輕量代碼倉庫(Gitea)

使用 Docker 和 Traefik v1 搭建輕量代碼倉庫(Gogs) 一文中,提到了 Gogs。本文將介紹它的加強版本:Gitea 以及如何搭配 Traefik v2 一塊兒使用。web

若是你有了解過以前到文章,大概三分鐘左右能夠搭建完畢。redis

寫在前面

官方提供了一份表格,展現了Gitea 與其餘「代碼倉庫」的差別,有興趣能夠看看。sql

本文將使用到 Traefik 和 Docker,若是不太熟悉,能夠閱讀以往的文章以作了解:DockerTraefikdocker

Traefik v2 配置調整

咱們使用 SSH 和 HTTP 協議進行數據上傳下載(git clone / git push),因此須要讓 Traefik 提供 TCP 協議服務,這裏建議單獨新建一個入口點。數據庫

由於在 Traefik v2 中,每個用戶可以訪問到的服務都須要一個入口點(entrypoint),若是咱們不單獨指定入口點背後的服務類型,那麼入口點會先嚐試看看它背後對接的服務是不是 TCP,若是不是的話,再嘗試使用 HTTP 協議提供服務,因此若是不分離兩種協議的話,對總體服務的性能會有必定影響。編程

參考 Traefik 2 使用指南,愉悅的開發體驗 一文中的配置,在 traefik.toml 中添加一個新的入口點:json

[entryPoints]
  [entryPoints.http]
    address = ":80"
  [entryPoints.https]
    address = ":443"
  [entryPoints.git]
    address = ":22"
複製代碼

若是是使用 docker-compose 啓動的 Traefik 服務,那麼須要將對應的端口也進行開放:

traefik:
    container_name: traefik
    image: traefik:v2.1.3
    restart: always
    ports:
      - 80:80
      - 443:443
      - 22:22
複製代碼

最簡單的配置

在 Gogs 那篇文章中提到過,不推薦使用 SQLite 做爲數據庫,不過若是你備份比較勤快,以爲問題不大,那麼能夠試試下面的配置:

version: '3.6'

services:

  gitea:
    image: gitea/gitea:1.10.3
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - APP_NAME=Private
      - RUN_MODE=prod
      - RUN_USER=git
      - SSH_DOMAIN=gitea.lab.com
      - SSH_PORT=22
      - SSH_LISTEN_PORT=22
      # 若是不但願使用 SSH 協議
      #- DISABLE_SSH=true
      - HTTP_PORT=3000
      - ROOT_URL=https://gitea.lab.com
      - LFS_START_SERVER=false
      - DB_TYPE=sqlite3
      - INSTALL_LOCK=false
      - DISABLE_GRAVATAR=true
    networks:
      - traefik
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
      - "traefik.http.routers.giteaweb.middlewares=https-redirect@file"
      - "traefik.http.routers.giteaweb.entrypoints=http"
      - "traefik.http.routers.giteaweb.rule=Host(`gitea.lab.com`)"
      - "traefik.http.routers.giteassl.middlewares=content-compress@file"
      - "traefik.http.routers.giteassl.entrypoints=https"
      - "traefik.http.routers.giteassl.tls=true"
      - "traefik.http.routers.giteassl.rule=Host(`gitea.lab.com`)"
      - "traefik.http.services.giteabackend.loadbalancer.server.scheme=http"
      - "traefik.http.services.giteabackend.loadbalancer.server.port=3000"
      - "traefik.tcp.routers.giteassh.rule=HostSNI(`*`)"
      - "traefik.tcp.routers.giteassh.tls=true"
      - "traefik.tcp.routers.giteassh.entrypoints=git"
      - "traefik.tcp.routers.giteassh.service=gitea"
      - "traefik.tcp.services.gitea.loadbalancer.server.port=22"
    volumes:
      # 標準 Linux 系統下使用
      # - /etc/localtime:/etc/localtime:ro
      # - /etc/timezone:/etc/timezone:ro
      - ./repositories:/data/git/repositories
      - ./data:/data/gitea/
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
    extra_hosts:
      - "git.lab.com:127.0.0.1"
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:3000 || exit 1"]
      interval: 5s

networks:
  traefik:
    external: true
複製代碼

將內容保存爲 docker-compose.yml ,使用 docker-compose up -d 啓動服務,訪問上面配置的域名,會看到 Gitea 的歡迎界面。

Gitea 首次運行界面

打開頁面看到服務已經正確啓動起來了,點擊註冊/登錄按鈕,首次使用會被重定向到 /install 目錄。

Gitea 配置界面

若是你肯定要使用 SQLite ,能夠填寫下管理員帳號,而後點擊當即安裝便可。

Gitea 安裝完畢

接下來就是配置倉庫,正常推送數據啦。

使用數據庫

這裏推薦雲服務低配置數據庫實例,不過若是低頻率使用,使用 docker-compose 啓動一個實例也問題不大,以 MySQL 爲例。

version: '3.6'

services:
  
  gitea:
    image: gitea/gitea:1.10.3
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - APP_NAME=Private
      - RUN_MODE=prod
      - RUN_USER=git
      - SSH_DOMAIN=gitea.lab.com
      - SSH_PORT=22
      - SSH_LISTEN_PORT=22
      # 若是不但願使用 SSH 協議
      #- DISABLE_SSH=true
      - HTTP_PORT=3000
      - ROOT_URL=https://gitea.lab.com
      - LFS_START_SERVER=false
      - DB_TYPE=mysql
      - DB_HOST=db
      - DB_NAME=gitea
      - DB_USER=gitea
      - DB_PASSWD=gitea
      - DB_CHARSET=utf8
      - INSTALL_LOCK=false
      - DISABLE_GRAVATAR=true
    networks:
      - traefik
      - gitea
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
      - "traefik.http.routers.giteaweb.middlewares=https-redirect@file"
      - "traefik.http.routers.giteaweb.entrypoints=http"
      - "traefik.http.routers.giteaweb.rule=Host(`gitea.lab.com`)"
      - "traefik.http.routers.giteassl.middlewares=content-compress@file"
      - "traefik.http.routers.giteassl.entrypoints=https"
      - "traefik.http.routers.giteassl.tls=true"
      - "traefik.http.routers.giteassl.rule=Host(`gitea.lab.com`)"
      - "traefik.http.services.giteabackend.loadbalancer.server.scheme=http"
      - "traefik.http.services.giteabackend.loadbalancer.server.port=3000"
      - "traefik.tcp.routers.giteassh.rule=HostSNI(`*`)"
      - "traefik.tcp.routers.giteassh.tls=true"
      - "traefik.tcp.routers.giteassh.entrypoints=git"
      - "traefik.tcp.routers.giteassh.service=gitea"
      - "traefik.tcp.services.gitea.loadbalancer.server.port=22"
    volumes:
      # 標準 Linux 系統下使用
      # - /etc/localtime:/etc/localtime:ro
      # - /etc/timezone:/etc/timezone:ro
      - ./repositories:/data/git/repositories
      - ./data:/data/gitea/
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
    extra_hosts:
      - "git.lab.com:127.0.0.1"
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:3000 || exit 1"]
      interval: 5s

  db:
    image: mysql:5.7.16
    restart: always
    networks:
      - gitea
    expose:
      - 3306
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: gitea
      MYSQL_DATABASE: gitea
      MYSQL_USER: gitea
      MYSQL_PASSWORD: gitea
      TZ: Asia/Shanghai
    volumes:
      - ./mysql:/var/lib/mysql
      # 標準 Linux 系統下使用
      # - /etc/localtime:/etc/localtime:ro
      # - /etc/timezone:/etc/timezone:ro
    # healthcheck:
    # test: ["CMD-SHELL", "/etc/init.d/mysql status"]
    # interval: 30s

  cache:
    image: redis:5.0-alpine
    restart: always
    networks:
      - gitea
    expose:
      - 6379
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
    environment:
      TZ: Asia/Shanghai
    # volumes:
      # 標準 Linux 系統下使用
      # - /etc/localtime:/etc/localtime:ro
      # - /etc/timezone:/etc/timezone:ro

networks:
  gitea:
    internal: true
  traefik:
    external: true
複製代碼

一樣的,將內容保存爲 docker-compose.yml ,使用 docker-compose up -d 啓動服務,訪問上面配置的域名,而後參考上文進行配置安裝便可。

其餘

更多的配置變量能夠從這裏找到:config-cheat-sheet,不過並非每一個變量均可以直接使用,具體是否使用須要翻看代碼或者進行嘗試。

當服務完整啓動以後,在 Traefik 的控制面板中將看到 TCP 路由和服務的完整狀態,相似下面這樣:

Traefik 面板 TCP 狀態

最後

先寫到這裏,其實已經聊過很多軟件,後續有機會聊聊這類軟件的用戶集成,以及權限管理。

--EOF


我如今有一個小小的折騰羣,裏面彙集了一些喜歡折騰的小夥伴。

在不發廣告的狀況下,咱們在裏面會一塊兒聊聊軟件、HomeLab、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)

關於折騰羣入羣的那些事

相關文章
相關標籤/搜索