docker
安裝 docker 和 docker-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-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 鏈接顯示是沒有端口的,復制鏈接后還得自己加上端口號。
解決:
-
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 即完成。
- 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 郵件服務
[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。
注冊 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。
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)。
- 編寫
.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 }}."
- 每次
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