docker構建 gitlab、gitea

docker

安裝 dockerdocker-compose,最好參照官網 meet the prerequisites,先卸載干凈再安裝。

docker 安裝成功后,可能無法啟動服務,推薦下面幾個 debug 的指令,找到錯誤后針對性地上網找解決方法。

# `sudo` maybe needed
dockerd --debug
systemctl status docker
systemctl restart docker
journalctl -xe | grep docker
vi /etc/docker/daemon.json
systemctl daemon-reload
freee -h
df -h

確保 docker 是 active(running) 的。

docker-active

部署時最好不要在掛載盤上啟動docker-compose,我當時報了Error executing actionrunon resource 'ruby_block[directory resource: /data/GitLab]'這種錯,換到系統(tǒng)盤啟動docker-compose.yml就沒事了。數據文件可以放在掛載盤。


推薦使用 dockge管理docker。
可以看一下 Docker 項目分享 - dockge- 管理 docker 項目從未如此簡單 可視化面板管理項目 uptime kuma 同作者


gitlab

淺試了 gitlab,能夠成功搭建。gitlab比較吃資源,我的服務器性能不高,沒有繼續(xù)使用,轉用gitea了。

gitlab 的 docker-compose.yml

version: '3'

services:
  gitlab:
    image: 'gitlab/gitlab-ce'
    container_name: 'gitlab'
    restart: always
    hostname: '<host>'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://<host>:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '8929:8929'
      - '2224:22'
    volumes:
      - '/path/to/config:/etc/gitlab'
      - '/path/to/logs:/var/log/gitlab'
      - '/path/to/data:/var/opt/gitlab'
      - '/path/to/backups:/var/opt/gitlab/backups'
    cap_add:
      - SYS_ADMIN
      - DAC_READ_SEARCH
    shm_size: '256m'

gitea

Gitea 是一個輕量級的 DevOps 平臺軟件。從開發(fā)計劃到產品成型的整個軟件生命周期,他都能夠高效而輕松的幫助團隊和開發(fā)者。包括 Git 托管、代碼審查、團隊協作、軟件包注冊和 CI/CD。它與 GitHub、Bitbucket 和 GitLab 等比較類似。 Gitea 最初是從 Gogs 分支而來,幾乎所有代碼都已更改。

預先準備

參考小小樹莓派干大事 - 自部署 Git 庫(一)這篇文章。

先創(chuàng)建宿主操作系統(tǒng)上的一個新用戶 git 來運行 Gitea 的整個 Docker 鏡像程序。

sudo adduser git
#Adding user `git' ...
#Adding new group `git' (1003) ...
#Adding new user `git' (1002) with group `git' ...

記住上面自動創(chuàng)建的 user 和 group 的 id,1002 和 1003。

添加到docker組,不然報錯:permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.44/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.config-hash%22%3Atrue%2C%22com.docker.compose.project%3Dgitea%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied

sudo usermod -aG docker git
sudo usermod -aG docker $USER

應該是添加git來著,記不清了,都添加也行。

部署

gitea 的 docker-compose.yml

version: '3'

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1002
      - USER_GID=1003
      - GITEA__database__DB__TYPE=mysql
      - GITEA__database__HOST=db:3306
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
      - GITEA__database__NAME=gitea
    restart: always
    networks:
        - gitea
    ports:
      - '3000:3000'
      - '2222:22'
    volumes:
      - /home/git/.ssh:/data/git/.ssh
      - ./gitea-data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      - db

  db:
    image: mariadb:10
    container_name: mariadb
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=maria
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
      - MYSQL_DATABASE=gitea
      - MYSQL_LOG_CONSOLE=true
    ports:
      - 3307:3306
    networks:
      - gitea
    volumes:
      - ./maria/data:/var/lib/mysql
      - ./maria/conf:/etc/mysql/conf.d

運行docker-compose up -d,在瀏覽器打開http://<host>:3000,就能打開 gitea 初始化界面,數據庫類型選擇 mysql,第一個注冊的用戶將成為管理員。

數據庫使用 <host> 和端口號 3307,用戶、密碼和數據庫在 yml 文件中配置了,連接數據庫后可以新增用戶和數據庫。

修改配置

修改 gitea-data/gitea/conf/app.ini 文件,如注冊和權限等默認設置。

端口

問題:http 和 ssh 的端口暴露不夠優(yōu)雅,而且倉庫的 ssh 鏈接顯示是沒有端口的,復制鏈接后還得自己加上端口號。

解決

  1. ssh 端口問題

    使用 Gitea 官網的 SSHing Shim 方式。在宿主機上依次執(zhí)行:

    sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"
    sudo -u git cat /home/git/.ssh/id_rsa.pub | sudo -u git tee -a /home/git/.ssh/authorized_keys
    sudo -u git chmod 600 /home/git/.ssh/authorized_keys
    cat <<"EOF" | sudo tee /usr/local/bin/gitea
    #!/bin/sh
    ssh -p 2222 -o StrictHostKeyChecking=no git@127.0.0.1         
    "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
    EOF
    sudo chmod +x /usr/local/bin/gitea
    

配置完成后, 重新啟動 Docker 容器:docker-compose up --force-recreate --build -d 即完成。

  1. http 端口問題

官方是用 nginx 做的反向代理,因為我還需要部署一個靜態(tài)網頁,所以新增了些內容。

在 yml 文件中添加 nginx 容器:

nginx:
  image: nginx:latest
  container_name: nginx
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - ./nginx/www:/usr/share/nginx/html
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    - ./nginx/servers:/etc/nginx/servers:ro
  networks:
    - gitea
  depends_on:
    - server

nginx 的配置文件 nginx/nginx.conf

worker_processes 2;

events {
  worker_connections 1024;
}

http {
  include mime.types;
  default_type application/octet-stream;

  sendfile on;
  keepalive_timeout 65;

  server {
    listen 80;
    server_name <host>;
    access_log host.access.log;

    location / {
      proxy_pass http://server:3000;
      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;
  }
    location /<sub_site_name> {
      alias /usr/share/nginx/html;
      index index.html index.htm;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50.html {
      root /usr/share/nginx/html;
    }
  }
  # include servers/*.conf;
}

瀏覽器打開http://<host>就能打開 gitea,包括 http 傳輸都不用加端口號了。此時 gitea 的倉庫 http 鏈接還是有端口號的,修改 gitea-data/gitea/conf/app.ini 文件就行。

說明:只是代理了端口號,沒有禁止端口訪問,所以 http://<host>:3000 也能訪問。

瀏覽器打開http://<host>/<sub_site_name> 就能打開我構建在 nginx/www 里的網頁了。配合 自定義 Gitea 頁面,寫一個 gitea-data/gitea/templates/custom/extra_links.tmpl 文件就能在導航欄新增鏈接了。其內容是

<a class="item" href="{{AppSubUrl}}/<sub_site_name>">site name</a>

smtp 郵件服務

官方 smtp 說明

[mailer]
ENABLED        = true
FROM           = <email>
PROTOCOL    = smtps
SMTP_ADDR      = <smtp_address>
SMTP_PORT      = <smtp_port>
USER           = <email>
PASSWD         = `<passwd>`

<email>就是用來發(fā)郵件的郵箱地址,關于 <smtp_address><smtp_port>,需要給郵箱打開 smtp 服務,可以看一下QQ 郵箱 網易郵箱及企業(yè)郵箱開通 SMTP/POP3 及設置授權碼(客戶端專用密碼)的方法大全
密碼可以使用真實郵箱密碼(不推薦),也可使用開啟 smtp 服務后生成的授權碼,也叫第三方登錄密碼。

自動發(fā)的郵件有時候會被當做垃圾郵件拒發(fā),查看 email 郵箱,手動激活驗證碼就行?;蛘邠Q一個郵箱,我用 qq 郵箱沒問題,學校郵箱就被拒發(fā)了。

actions

官方 actions 說明

  1. 進入倉庫設置,打開 actions。

  2. 注冊 runner。

在 gitea 里獲取注冊用的 token,只能使用一次,并且不能用于注冊多個 Runner。 可以從以下位置獲取不同級別的 token, 從而創(chuàng)建出相應級別的 runner:

  • 實例級別:管理員設置頁面,例如 <your_gitea.com>/admin/actions/runners。
  • 組織級別:組織設置頁面,例如 <your_gitea.com>/<org>/settings/actions/runners。
  • 存儲庫級別:存儲庫設置頁面,例如 <your_gitea.com>/<owner>/<repo>/settings/actions/runners。

使用 Docker 注冊 Runner

version: "3.8"
services:
  runner:
    image: gitea/act_runner:nightly
    environment:
      CONFIG_FILE: /config.yaml
      GITEA_INSTANCE_URL: "${INSTANCE_URL}"
      GITEA_RUNNER_REGISTRATION_TOKEN: "${REGISTRATION_TOKEN}"
      GITEA_RUNNER_NAME: "${RUNNER_NAME}"
      GITEA_RUNNER_LABELS: "${RUNNER_LABELS}"
    volumes:
      - ./config.yaml:/config.yaml
      - ./data:/data
      - /var/run/docker.sock:/var/run/docker.sock

在 gitea 后臺查看 runner 是否注冊成功以及狀態(tài),如果是離線在宿主機執(zhí)行 docker restart runner,runner 是容器名稱,執(zhí)行docker ps可以查看容器運行狀態(tài)。

  1. 編寫 .gitea/workflows/demo.yaml,文件名可以不一樣。
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions ??
on: [push]

jobs:
  Explore-Gitea-Actions:
    runs-on: ubuntu-latest
    steps:
      - run: echo "?? The job was automatically triggered by a ${{ gitea.event_name }} event."
      - run: echo "?? This job is now running on a ${{ runner.os }} server hosted by Gitea!"
      - run: echo "?? The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v3
      - run: echo "?? The ${{ gitea.repository }} repository has been cloned to the runner."
      - run: echo "??? The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ gitea.workspace }}
      - run: echo "?? This job's status is ${{ job.status }}."
  1. 每次 git push 后都會自動執(zhí)行。

最終的 yml 文件

注意第一次執(zhí)行時不要帶上 act_runner,因為他需要 gitea 的 token。

version: '3'

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1002
      - USER_GID=1003
      - GITEA__database__DB__TYPE=mysql
      - GITEA__database__HOST=db:3306
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
      - GITEA__database__NAME=gitea
    restart: always
    networks:
        - gitea
    ports:
      - '3000:3000'
      - '2222:22'
    volumes:
      - /home/git/.ssh:/data/git/.ssh
      - ./gitea-data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      - db

  db:
    image: mariadb:10
    container_name: mariadb
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=maria
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
      - MYSQL_DATABASE=gitea
      - MYSQL_LOG_CONSOLE=true
    ports:
      - 3307:3306
    networks:
      - gitea
    volumes:
      - ./maria/data:/var/lib/mysql
      - ./maria/conf:/etc/mysql/conf.d

  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/www:/usr/share/nginx/html
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/servers:/etc/nginx/servers:ro
    networks:
      - gitea
    depends_on:
      - server

  runner:
    image: gitea/act_runner:nightly
    container_name: gitea_runner
    environment:
      CONFIG_FILE: /config.yaml
      GITEA_INSTANCE_URL: "http://<host>:3000"
      GITEA_RUNNER_REGISTRATION_TOKEN: "<token>"
      GITEA_RUNNER_NAME: "mkdocs"
    volumes:
      - ./runner-data/config.yaml:/config.yaml
      - ./runner-data:/data
      - /var/run/docker.sock:/var/run/docker.sock
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容