踩了太多坑,最终发现还是官方文档最靠谱,在这⇒ https://docs.gitea.com/installation/install-with-docker

关键步骤整理如下:

  1. 先构建一个 docker-compose.yml 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1026 # 这里的UID和GID必须是NAS主机上的用户,并且是拥有data目录权限的用户
      - USER_GID=100
    restart: always
    networks:
      - gitea
    volumes:
      - /volume1/docker/gitea:/data
      - /volume1/homes/raykr/.ssh:/data/git/.ssh # 这一步很关键,是为了实现主机和容器之间的ssh透传
    ports:
      - "3000:3000"
      - "2222:22" # 主机使用非22端口,映射到容器的22端口
  1. 在主机上的操作步骤比较复杂:
1
2
3
4
5
6
7
8
# 现在需要在主机上创建一个SSH密钥对。这个密钥对将用于将用户在主机上的身份验证到容器中。
# 作为主机上的管理员用户运行:(通过管理员用户,我们指的是可以sudo到root的用户)
ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"

# 将publickey复制到authorized_keys中
cd /volume1/homes/raykr/.ssh
cat id_rsa.pub | tee -a authorized_keys
chmod 600 authorized_keys
重要提示

需要将 git 用户的公钥“原样”添加,而通过Gitea网页界面添加的其他公钥将以 command="/usr […] 为前缀。

1
2
3
4
5
# SSH pubkey from git user
ssh-rsa <Gitea Host Key>

# other keys from users
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-1",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty <user pubkey>
  1. 下一步是创建一个假主机 gitea 命令,该命令将把主机的命令转发到容器中。这个文件的名称取决于您使用的 Gitea 版本。
1
2
3
4
5
6
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