部署私有git仓库,Gitea

前言

正好前几天程序部署了私有的 git 仓库,又恰逢群友有需要,写一篇如何在 ubuntu 上部署 Gitea 的教程。
内容包含 常规部署 Docker 部署 两种方式,同时配置 Runner 以便 Git Action 正常执行。

Ps:虽然教程中涉及其他系统的安装步骤,但主要以 Linux 系为主,Runner 配置部分在文末。

直接部署

选一个适合自己架构的版本下载(注:如果是 x86-32位,需下载源码后自行用 Go 编译)。

Linux (x86-64 位)

1
2
wget -O gitea https://dl.gitea.com/gitea/1.23.4/gitea-1.23.4-linux-amd64
chmod +x gitea

Linux (ARM 64)

1
2
wget -O gitea https://dl.gitea.com/gitea/1.23.4/gitea-1.23.4-linux-arm64
chmod +x gitea

Linux (ARMv6)

1
2
wget -O gitea https://dl.gitea.com/gitea/1.23.4/gitea-1.23.4-linux-arm-6
chmod +x gitea

Linux (ARMv5)

1
2
wget -O gitea https://dl.gitea.com/gitea/1.23.4/gitea-1.23.4-linux-arm-5
chmod +x gitea

Windows (x86-64 位)

1
wget -O gitea.exe https://dl.gitea.com/gitea/1.23.4/gitea-1.23.4-windows-4.0-amd64.exe

Windows (x86 位)

1
wget -O gitea.exe https://dl.gitea.com/gitea/1.23.4/gitea-1.23.4-windows-4.0-386.exe

MacOS (x86-64 位)

1
2
wget -O gitea https://dl.gitea.com/gitea/1.23.4/gitea-1.23.4-darwin-10.12-amd64
chmod +x gitea

MacOS (ARM 64)

1
2
wget -O gitea https://dl.gitea.com/gitea/1.23.4/gitea-1.23.4-darwin-10.12-arm64
chmod +x gitea

FreeBSD (x86-64 位)

1
2
wget -O gitea https://dl.gitea.com/gitea/1.23.4/gitea-1.23.4-freebsd13-amd64
chmod +x gitea

源代码

1
wget -O gitea-src.tar.gz https://dl.gitea.com/gitea/1.23.4/gitea-src-1.23.4.tar.gz

环境准备

安装 Git

首先需要确保目标机安装了 Git(版本需大于 2.0)。在大多数 Linux 发行版上可使用如下命令:

Ubuntu/Debian

1
2
sudo apt update
sudo apt install git

CentOS/RHEL

1
sudo yum install git

或者对于较新的版本:
1
sudo dnf install git

Fedora

1
sudo dnf install git

Arch Linux

1
sudo pacman -S git

openSUSE

1
sudo zypper install git

macOS
使用 Homebrew:

1
brew install git

或使用 MacPorts:
1
sudo port install git

Windows
Git for Windows 下载并安装。

验证安装

1
git --version


添加用户

为 Gitea 添加专用用户:

Ubuntu/Debian

1
2
3
4
5
6
7
8
adduser \
--system \
--shell /bin/bash \
--gecos 'Git Version Control' \
--group \
--disabled-password \
--home /home/git \
git

Fedora/RHEL/CentOS

1
2
3
4
5
6
7
8
9
groupadd --system git  
adduser \
--system \
--shell /bin/bash \
--comment 'Git Version Control' \
--gid git \
--home-dir /home/git \
--create-home \
git

创建工作路径

1
2
3
4
5
6
mkdir -p /var/lib/gitea/{custom,data,log}
chown -R git:git /var/lib/gitea/
chmod -R 750 /var/lib/gitea/
mkdir /etc/gitea
chown root:git /etc/gitea
chmod 770 /etc/gitea

设置 Git 用户权限

1
2
chmod 750 /etc/gitea
chmod 640 /etc/gitea/app.ini

配置环境变量

1
export GITEA_WORK_DIR=/var/lib/gitea/

将 Gitea 移动到系统路径:

1
cp gitea /usr/local/bin/gitea

启动与配置

命令行启动

如果以上步骤均正确,可以使用下面的命令启动 Gitea:

1
GITEA_WORK_DIR=/var/lib/gitea/ /usr/local/bin/gitea web -c /etc/gitea/app.ini

成功启动后,可将其配置为系统服务。编辑服务文件:

1
sudo vim /etc/systemd/system/gitea.service

并将以下配置内容复制进去(注意根据实际情况调整数据库依赖、 Git 安装路径等):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Gitea
After=network.target mysql.service

[Service]
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web -c /etc/gitea/app.ini
Restart=always
Environment=PATH=/usr/local/bin:/bin:/usr/bin

[Install]
WantedBy=multi-user.target

如使用 MySQL、MariaDB、PostgreSQL、Memcached 或 Redis,请取消相应的 WantsAfter 行的注释,确保 Gitea 在这些服务启动后再启动。

启动服务:

1
2
sudo systemctl enable gitea
sudo systemctl start gitea


以下图片来源于知乎

你需要配置的有 ssh端口和 http 端口,rootURL,站点名,mysql,管理员账号和密码,邮箱验证端口,邮箱。
其中注意的是,不同的邮箱配置不同,比如说网易是 25 端口,这邮箱端口和你开不开服务器端口无关,只和你能不能通网络,以及邮箱服务商端口设置成什么有关。
其中的邮箱密码是应用密码,需要到邮箱服务那边设置。

App. Ini

以上配置均会插入到 app.ini 中,如果需要改变的话,可以手动 vim /etc/gitea/app.ini
下面我给出我的配置,你们可以参考

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
WORK_PATH = /var/lib/gitea/
RUN_MODE = prod

[database]
DB_TYPE = mysql
HOST = 127.0.0.1:3306
NAME = gitea
USER = gitea
PASSWD = xxxxxx
SCHEMA =
SSL_MODE = disable
PATH = /var/lib/gitea/data/gitea.db
LOG_SQL = false

[repository]
ROOT = /var/lib/gitea/data/gitea-repositories

[server]
SSH_DOMAIN = free.huanxue.top
DOMAIN = git.huanxue.top
HTTP_PORT = 3000
ROOT_URL = http://git.huanxue.top:20815
APP_DATA_PATH = /var/lib/gitea/data
DISABLE_SSH = false
SSH_PORT = 22
LFS_START_SERVER = true
LFS_JWT_SECRET = zcWFascazPqW_haskdjhjwhisajoicjzjkz-Lx-x9awdawdT6RA
OFFLINE_MODE = true
[lfs]
PATH = /var/lib/gitea/data/lfs

[mailer]
ENABLED = true
SMTP_ADDR = smtp.163.com
SMTP_PORT = 25
FROM = huanxuetop@163.com
USER = huanxuetop@163.com
PASSWD = xxxxxxxxxxxx

[service]
REGISTER_EMAIL_CONFIRM = true
ENABLE_NOTIFY_MAIL = true
DISABLE_REGISTRATION = false
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
ENABLE_CAPTCHA = false
REQUIRE_SIGNIN_VIEW = false
DEFAULT_KEEP_EMAIL_PRIVATE = false
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
DEFAULT_ENABLE_TIMETRACKING = true
NO_REPLY_ADDRESS = noreply.localhost

[openid]
ENABLE_OPENID_SIGNIN = true
ENABLE_OPENID_SIGNUP = true

[cron.update_checker]
ENABLED = true

[session]
PROVIDER = file

[log]
MODE = console
LEVEL = info
ROOT_PATH = /var/lib/gitea/log

[repository.pull-request]
DEFAULT_MERGE_STYLE = merge

[repository.signing]
DEFAULT_TRUST_MODEL = committer

[security]
INSTALL_LOCK = true
INTERNAL_TOKEN = eyasdasdIJUcasIacsJOascIkpXVCJ9.eyJuYmYiOjE3NDA2NzYyNDh9.Pfs87wYxo9ADSC7asdaSAscaS98wjciPUMTQASDSKv5-OmnAD2342SZhs
PASSWORD_HASH_ALGO = pbSACdf2

[oauth2]
JWT_SECRET = K6FsM1pASDC21CsasdfcVHd4dsfHISXcHiRd30


测试

安装完以后你需要测试的有几个

  • 能不能通过管理员登录
  • 能不能注册新人
  • 能不能邮箱验证
  • 能不能创建新仓库
  • 能不能 ssh clone 代码(需要添加公钥到目标机)
    以上均可以说明 gitea 下载成功了

接下来就是安装 runner,让 gitea 可以运行 action

Docker 部署

如果不希望直接部署,也可使用 Docker 进行部署。

安装 Docker

在 Linux 上安装 Docker

  1. 更新系统包:
    1
    sudo apt update
  2. 安装依赖:
    1
    sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
  3. 添加 Docker 官方 GPG 密钥:
    1
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  4. 添加 Docker 仓库:
    1
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  5. 安装 Docker:
    1
    2
    sudo apt update
    sudo apt install -y docker-ce docker-ce-cli containerd.io
  6. 启动 Docker 服务并设置开机自启:
    1
    2
    sudo systemctl start docker
    sudo systemctl enable docker
  7. 验证安装:
    1
    docker --version

在 macOS 上安装 Docker

  1. 访问 Docker 官网 下载 Docker Desktop for Mac。
  2. 双击 .dmg 文件,将 Docker 图标拖入 Applications 文件夹。
  3. 启动 Docker Desktop 并验证:
    1
    docker --version

在 Windows 上安装 Docker

  1. 下载 Docker Desktop for Windows(参考 Docker 官网)。
  2. 安装后启动 Docker Desktop,并验证:
    1
    docker --version

安装 Docker Compose

在 Linux 上安装 Docker Compose

  1. 下载 Docker Compose:
    1
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. 赋予可执行权限:
    1
    sudo chmod +x /usr/local/bin/docker-compose
  3. 验证安装:
    1
    docker-compose --version

在 macOS 和 Windows 上
Docker Desktop 已包含 Docker Compose,可直接验证:

1
docker-compose --version


使用 Docker Compose 部署

将下面的 docker-compose.yml 文件保存至项目目录,然后运行:

1
docker-compose up -d

如需停止服务,运行:
1
docker-compose down

以下提供部分常见服务的示例配置:

MySQL + PHP + Nginx

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
34
35
36
37
38
39
40
41
42
version: '3.8'

services:
db:
image: mysql:5.7
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- mysql_data:/var/lib/mysql
networks:
- app-network

web:
image: nginx:latest
container_name: nginx_web
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- db
networks:
- app-network

app:
image: php:7.4-fpm
container_name: php_app
volumes:
- ./html:/var/www/html
networks:
- app-network

volumes:
mysql_data:

networks:
app-network:

PostgreSQL + Django + Gunicorn + Nginx

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
34
35
36
37
38
39
40
41
42
43
44
45
46
version: '3.8'

services:
db:
image: postgres:13
container_name: postgres_db
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app-network

web:
image: nginx:latest
container_name: nginx_web
ports:
- "80:80"
volumes:
- ./static:/usr/share/nginx/html/static
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- app-network

app:
image: my-django-app:latest
container_name: django_app
command: gunicorn myproject.wsgi:application --bind 0.0.0.0:8000
volumes:
- .:/app
environment:
- DATABASE_URL=postgres://user:password@db:5432/mydb
depends_on:
- db
networks:
- app-network

volumes:
postgres_data:

networks:
app-network:

Redis + Node.js + MongoDB

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
34
35
36
37
38
39
40
41
version: '3.8'

services:
redis:
image: redis:latest
container_name: redis_cache
ports:
- "6379:6379"
networks:
- app-network

db:
image: mongo:latest
container_name: mongo_db
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: password
volumes:
- mongo_data:/data/db
networks:
- app-network

app:
image: my-node-app:latest
container_name: node_app
ports:
- "3000:3000"
environment:
- REDIS_URL=redis://redis:6379
- MONGO_URL=mongodb://root:password@db:27017
depends_on:
- redis
- db
networks:
- app-network

volumes:
mongo_data:

networks:
app-network:

WordPress + MySQL

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
34
35
36
37
38
39
version: '3.8'

services:
db:
image: mysql:5.7
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
volumes:
- mysql_data:/var/lib/mysql
networks:
- app-network

wordpress:
image: wordpress:latest
container_name: wordpress_app
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
depends_on:
- db
networks:
- app-network

volumes:
mysql_data:
wordpress_data:

networks:
app-network:

Elasticsearch + Kibana

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: '3.8'

services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
container_name: elasticsearch
environment:
- discovery.type=single-node
ports:
- "9200:9200"
- "9300:9300"
volumes:
- es_data:/usr/share/elasticsearch/data
networks:
- app-network

kibana:
image: docker.elastic.co/kibana/kibana:7.10.0
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
networks:
- app-network

volumes:
es_data:

networks:
app-network:

配置 gitea

可以参考以下使用 Compose 文件部署 Gitea(注意 ssh 外部端口映射为 222,对应内部 22):

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
34
35
36
37
38
39
40
41
42
43
44
45
version: "3"

networks:
gitea:
external: false
volumes:
gitea:
driver: local
services:
server:
image: gitea/gitea:1.22.4
container_name: gitea
environment:
- USER_UID=1001
- USER_GID=1001
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks:
- gitea
volumes:
- gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "32768:3000"
- "222:22"
depends_on:
- db

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

可以参考gitea官网


如果以上的 docker 让你感觉部署困难,那么可以使用宝塔自带的 docker,并在 docker 中下载 gitea。

Runner 配置

Runner 是可以脱离目标机在其他的机器上运行的。所以通过 docker 部署也行,再任何一台可以 ping 得通的机器上运行都可以,以下以 Docker 部署为例,便于管理和配置。

如果不需要 docker 可以参考官方文档gitea官网

下载 Runner 镜像

夜间版本较新,若需要稳定版,请拉取 latest:

1
docker pull docker.io/gitea/act_runner:latest    # 最新稳定版本


1
docker pull docker.io/gitea/act_runner:nightly    # 最新夜间版

确保 Git 用户有 Docker 权限:

1
sudo usermod -aG docker git

生成配置文件

执行以下命令生成 Runner 配置:

1
docker run --entrypoint="" --rm -it docker.io/gitea/act_runner:latest act_runner generate-config > config.yaml

官方 Runner Compose 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

我个人的 Runner 部署示例

1
2
3
4
5
6
7
8
9
sudo docker run \
-v /opt/gitea/gitea-act-runner/config.yaml:/config.yaml \
-v /opt/gitea/gitea-act-runner/data:/data8 \
-v /var/run/docker.sock:/var/run/docker.sock \
-e CONFIG_FILE=/config.yaml \
-e GITEA_INSTANCE_URL=https://huanxue.top \
-e GITEA_RUNNER_REGISTRATION_TOKEN=MxZFnq9tbd32eh3H7NG \
--name gitea-runner-8 \
-d gitea/act_runner:latest

其中:

  • GITEA_RUNNER_REGISTRATION_TOKEN
  • GITEA_RUNNER_LABELS:指定 Runner 标签,用于匹配对应的 Action 任务,也就是 action 启动你可以指定哪一个标签类的 runner 启动
  • GITEA_INSTANCE_URL:这个也就是 runner 要访问的目标机网站
  • 如果是目标机运行 runner,用目标机自己的局域网 ip 也就是 192.168. Xx. Xx 加端口就可以了。
  • 如果是非目标机运行 runner,保证 runner 机可以 ping 通目标机,并访问 gitea 端口,就可以。

后话

如果在部署过程中遇到任何问题,请在评论区留言。
另外,Git Action 可通过在仓库根目录下创建 .gitea/workflows/分支名.yaml 文件实现自动触发运行。