knowledge/docs/docker/docker部署gitea服务.md

283 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## docker部署gitea服务器完整过程
本文目标:
- 仓库、数据库等用户产生数据保存在数据盘中
- 使用postgresql数据库
- 数据库和gitea服务以docker方式启动
- 主机和容器使用22端口实现SSH直通
- 使用域名访问通过nginx反向代理实现通过80端口访问web UI
> 为了方便文档中的操作都是在root用户下执行建议在生产环境中使用普通用户执行操作在命令前加`sudo`。
### 准备域名
提前准备一个公网域名指向到下面即将要操作的服务器IP上后面的操作完成了域名解析也差不多该生效了。
> 假设我们用的是`gitea.wukezhenzhu.com`,后面配置是用以它为例。
### 准备Debian11服务器
#### 安装系统
#### 挂载数据盘
通过`df -h`、`lsblk`、`fdisk -l`等命令确认当前磁盘和分区状态,下面是结果示例:
```sh
root@debian:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 394M 560K 393M 1% /run
/dev/sda1 491G 1.4G 464G 1% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 394M 0 394M 0% /run/user/0
root@debian:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 499G 0 part /
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 975M 0 part [SWAP]
sdb 8:16 0 4T 0 disk
sr0 11:0 1 1024M 0 rom
root@debian:~# fdisk -l
Disk /dev/sdb: 4 TiB, 4398046511104 bytes, 8589934592 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xac8bf5c9
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 1046575103 1046573056 499G 83 Linux
/dev/sda2 1046577150 1048573951 1996802 975M 5 Extended
/dev/sda5 1046577152 1048573951 1996800 975M 82 Linux swa
```
从上面的结果可以看到,系统中有一个名为`/dev/sdb`的4TB硬盘是空闲的下面我们要把它整个挂载到`/data`目录下:
```sh
root@debian:~# mkfs.ext4 /dev/sdb
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 1073741824 4k blocks and 134217728 inodes
Filesystem UUID: f081b706-f637-4b84-b70b-5521b7ad5b6b
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
root@debian:~# mkdir /data
root@debian:~# mount -t ext4 /dev/sdb /data
root@debian:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 394M 560K 393M 1% /run
/dev/sda1 491G 1.4G 464G 1% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 394M 0 394M 0% /run/user/0
/dev/sdb 4.0T 28K 3.8T 1% /data
```
经过上面的操作,已经把磁盘`/dev/sdb`格式化为ext4文件系统并成功挂载下`/data`目录下,但是如果现在重启系统后,数据盘还不能自动完成挂载,需要执行下面的操作:
```sh
root@debian:~# ll /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Apr 21 14:22 0bc1a76e-3457-4e2c-b708-a201e510f343 -> ../../sda1
lrwxrwxrwx 1 root root 9 Apr 21 14:30 f081b706-f637-4b84-b70b-5521b7ad5b6b -> ../../sdb
lrwxrwxrwx 1 root root 10 Apr 21 14:22 ff162b2a-5e9e-4661-854a-64ad11f22fa5 -> ../../sda5
root@debian:~# echo "UUID=f081b706-f637-4b84-b70b-5521b7ad5b6b /data ext4 defaults 0 0" >> /etc/fstab
```
> 上面写入`/etc/fstab`文件中的UUID是在`/dev/disk/by-uuid/`中查到的`sdb`对应的UUID。
可以试着`reboot`一下,重启后数据盘会自动完成挂载。
> 操作系统的准备工作已经完成,但是我们建议中国大陆用户要为系统配置一组高速的软件源,配置文件位置`/etc/apt/sources.list`,本文不对展开讲解。
### 准备docker环境
> 按照docker官方文档安装[Docker Engine](https://docs.docker.com/engine/install/debian/)和[Docker Compose](https://docs.docker.com/compose/install/other/)。
```sh
# 卸载原有旧版本的docker新系统可以跳过
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
# 安装ca支持
sudo apt-get update && sudo apt-get install ca-certificates curl gnupg
# 配置docker官方GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 配置docker官方软件源
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装docker engine
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 单独安装docker-compose不执行后面这步使用docker compose [command]也是可以的)
curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 查看docker版本
docker version
# 查看docker-compose版本
docker-compose version
```
对于国内服务器给docker hub配置几个加速源是必要的操作[阿里云容器镜像服务-镜像加速器](https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors)。
除了阿里云,也可以试试下面的加速源:
- https://registry.docker-cn.com
- https://hub-mirror.c.163.com
### 部署gitea和postgresql服务
#### 配置nginx实现反向代理
我们希望实现的是通过网址http://gitea.wukezhenzhu.com直接访问gitea的web UI而gitea服务默认使用的http端口是3000为了不过多更改服务配置我们只要用nginx做一层指向127.0.0.1:3000端口的反向代理即可具体如何操作本文不展开。
#### 创建git专用的系统账号和分组
```sh
# 创建git分组和git用户
adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
# 记录下返回结果中的UID和GID
Adding system user `git' (UID 112) ...
Adding new group `git' (GID 117) ...
Adding new user `git' (UID 112) with group `git' ...
# 为git用户生成ssh-key
sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"
```
#### 为主机和容器建立SSH直通
创建名为`/usr/local/bin/gitea`的可执行文件,文件内容:
```shell
ssh -p 2222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
```
为`/usr/local/bin/gitea`文件添加可执行权限:
```sh
chmod +x /usr/local/bin/gitea
```
把git用户的ssh公钥添加到`/home/git/.ssh/authorized_keys`中(因为主机的`/home/git/.ssh/`会映射到容器中)
```sh
echo "$(cat /home/git/.ssh/id_rsa.pub)" >> /home/git/.ssh/authorized_keys
```
#### 准备docker-compose.yml文件
创建`/data/docker-compose.yml`文件,内容如下(随着时间推移,可以试着改变镜像的版本),注意修改`USER_UID`和`USER_GID`为实际值:
```yml
version: "3"
networks:
gitea:
external: false
services:
gitea:
image: gitea/gitea:1.19
container_name: gitea
environment:
- USER_UID=112
- USER_GID=117
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=gitea_db:5432
- 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
- /home/git/.ssh/:/data/git/.ssh
ports:
- "3000:3000"
- "127.0.0.1:2222:22"
depends_on:
- gitea_db
gitea_db:
image: postgres:14
container_name: gitea_db
restart: always
environment:
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=gitea
- POSTGRES_DB=gitea
networks:
- gitea
volumes:
- ./postgres:/var/lib/postgresql/data
```
在/data目录下执行
```sh
docker-compose up
```
如果在编排期间没有提示错误的话说明我们在服务器端的部署工作基本完成了下面进入web安装与配置阶段。
#### 通过Web UI完成服务安装与配置
假设最开始做的域名解析已经生效了接下来打开浏览器访问gitea.wukezhenzhu.com如果找不开页面检查检查域名解析、服务器防火墙、nginx代理
```url
http://gitea.wukezhenzhu.com
```
- 数据库设置都使用默认值就行因为我们没有把pg的5432端口映射给主机所以基本也不需要给数据库设置强口令
- 站点名称会显示在Web首页和浏览器标题栏
- 仓库根目录:默认
- LFS根目录默认
- 以用户名运行默认git
- 服务器域名就是刚才解析的域名文本中是gitea.wukezhenzhu.com
- SSH服务端口22
- HTTP服务端口3000
- 基础URL如果这里是带:3000端口号的url我们就把端口号去掉就是http://gitea.wukezhenzhu.com/。
- 日志路径:默认
- 启用更新检查不勾选因为我们用的是docker即使在线更新了容器重启后也会把程序重置。
- 电子邮箱设置:建议配置并开启邮件确认注册和邮件通知提醒
- 第三方服务设置:根据情况
- 管理账号设置:根据情况
完成以上配置后直接点“立即安装”然后等待一小会页面会自动以管理员登录如果创建了管理员或者进入到gitea的登录页。
#### 以daemon方式重新启动服务
在服务器上按ctrl+c停止docker服务再重启执行一遍docker-compose命令这次后面加上-d。
```sh
docker-compose up -d
```
好了,大功告成!