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

10 KiB
Raw Permalink Blame History

docker部署gitea服务器完整过程

本文目标:

  • 仓库、数据库等用户产生数据保存在数据盘中
  • 使用postgresql数据库
  • 数据库和gitea服务以docker方式启动
  • 主机和容器使用22端口实现SSH直通
  • 使用域名访问通过nginx反向代理实现通过80端口访问web UI

为了方便文档中的操作都是在root用户下执行建议在生产环境中使用普通用户执行操作在命令前加sudo

准备域名

提前准备一个公网域名指向到下面即将要操作的服务器IP上后面的操作完成了域名解析也差不多该生效了。

假设我们用的是gitea.wukezhenzhu.com,后面配置是用以它为例。

准备Debian11服务器

安装系统

挂载数据盘

通过df -hlsblkfdisk -l等命令确认当前磁盘和分区状态,下面是结果示例:

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目录下:

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目录下,但是如果现在重启系统后,数据盘还不能自动完成挂载,需要执行下面的操作:

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 EngineDocker Compose

# 卸载原有旧版本的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配置几个加速源是必要的操作阿里云容器镜像服务-镜像加速器

除了阿里云,也可以试试下面的加速源:

部署gitea和postgresql服务

配置nginx实现反向代理

我们希望实现的是通过网址http://gitea.wukezhenzhu.com直接访问gitea的web UI而gitea服务默认使用的http端口是3000为了不过多更改服务配置我们只要用nginx做一层指向127.0.0.1:3000端口的反向代理即可具体如何操作本文不展开。

创建git专用的系统账号和分组

# 创建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的可执行文件,文件内容:

ssh -p 2222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"

/usr/local/bin/gitea文件添加可执行权限:

chmod +x /usr/local/bin/gitea

把git用户的ssh公钥添加到/home/git/.ssh/authorized_keys中(因为主机的/home/git/.ssh/会映射到容器中)

echo "$(cat /home/git/.ssh/id_rsa.pub)" >> /home/git/.ssh/authorized_keys

准备docker-compose.yml文件

创建/data/docker-compose.yml文件,内容如下(随着时间推移,可以试着改变镜像的版本),注意修改USER_UIDUSER_GID为实际值:

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目录下执行

docker-compose up

如果在编排期间没有提示错误的话说明我们在服务器端的部署工作基本完成了下面进入web安装与配置阶段。

通过Web UI完成服务安装与配置

假设最开始做的域名解析已经生效了接下来打开浏览器访问gitea.wukezhenzhu.com如果找不开页面检查检查域名解析、服务器防火墙、nginx代理

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。

docker-compose up -d

好了,大功告成!