docker / 群晖 · 2023年6月24日 0

群晖docker部署gitea并且配置ssh直通

安装步骤

  1. 确认群晖版本
  2. 安装docker
  3. 开启ssh
  4. 创建git用户
  5. 拉取gitea镜像
  6. 开启ssh端口共享

首先确定一下群辉版本

6.x的去套件中心安装 docker

7.x版本安装Container Manager

开启群辉的ssh服务

并使用ssh工具连接到群辉上

创建gitea用户

如果创建用户时候提示 【出于安全原因,请使用“git”以外的账户名称】,可以先随便起一个名字

用户组这里就保持不变就可以了

共享文件夹权限,只保留一个必要的目录,也就是gitea的工作目录,其他目录权限一律不给

这里的应用程序权限全都拒绝,也就是这个账号不允许使用任何dsm的功能,这样的话可以把风险降到最低

账号创建好了以后,用ssh登录群辉并切换到root用户,通过该命令行修改创建的用户【gitea】为【git

synouser --rename gitea git

然后使用 id git 命令来获取git用户的 uidgid,这里获取到的uid为1033gid100,把这两个值填写到下面的docker-compose.yml

修改账号名称的目的是让gitea的运行用户为git

这样git clone的地址就是 git clone git@doman.com:/username/repo.git

如果不修改的话 上面的这个地址就是 git clone gitea@doman.com:/username/repo.git

部署gitea

这里使用docker-compose部署,compose.yml文件如下

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.20.0-rc1
    container_name: gitea
    environment:
      - USER=git
      - USER_UID=1033 # id git 命令获取到的 uid和gid
      - USER_GID=100 # id git 命令获取到的 uid和gid
      - GITEA_CUSTOM=/data/gitea
      - GITEA__database__DB_TYPE=mysql
      - GITEA__database__HOST=gitea-mysql:3306
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
    restart: always
    networks:
      - gitea
    ports:
      - "3000:3000"
      - "2222:22"
    volumes:
      - /volume1/homes/git/.ssh:/data/git/.ssh
      - /volume1/docker/gitea/gitea:/data
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      - gitea-mysql

  gitea-mysql:
    image: mysql:8
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
      - MYSQL_DATABASE=gitea
    networks:
      - gitea
    volumes:
      - /volume1/docker/gitea/mysql:/var/lib/mysql

手动创建一下如下的几个目录

# ssh 认证目录
mkdir -p /volume1/homes/git/.ssh
# gitea工作目录
mkdir -p /volume1/docker/gitea/gitea
# 数据库工作目录
mkdir -p /volume1/docker/gitea/mysql

注意:配置文件中映射了几个目录 这几个目录一定要提前创建否则启动失败

然后使用 docker-compose -f /path/to/compose.yml up 启动gitea

启动完成后 可以通过 http://【群晖的ip地址,ddns域名】:3000 来打开gitea的初始化页面,进行初始化配置

开启ssh端口共享

下面命令直接一步一步执行就可以,针对群辉的目录结构做了路径修改

# 生成用来验证的密钥对
sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"

# 把出来的密钥对的公钥放到免密登录的认证文件中
sudo -u git cat /volume1/homes/git/.ssh/id_rsa.pub | sudo -u git tee -a /volume1/homes/git/.ssh/authorized_keys

# 修改免密登录认证文件的权限,该权限是固定的如果不是该权限就会直接走密码认证
sudo -u git chmod 600 /volume1/home/git/.ssh/authorized_keys

# 增加ssh透传到容器的脚本,该脚本名称和路径都是固定的不能动
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 777 /usr/local/bin/gitea

这时候 使用 ssh git@localhost 去连接 会提示一个错误

root@nap:/volume1# ssh git@localhost
PTY allocation request failed on channel 0
Permission denied, please try again.
Connection to localhost closed.

这个错误是由于git用户就没有登录系统的权限,而群辉非管理员账户都不允许使用类似telnet、ssh之类的工具连接,所以需要手动修改配置文件让git用户可以有登录系统的权限,有了登录系统的权限,ssh就自然能连接上了。

解决权限问题直接采用群辉计划任务

新建一个开机启动的脚本,脚本内容如下

#!/bin/bash

filePath="/etc/passwd"

function backupPasswd() {
#    if [ ! -f "$filePath.bak" ]; then
        echo "backup passwd files to: $filePath.bak";
        cp $filePath $filePath.bak;
        chmod a+r $filePath.bak;
#    fi;
}

function modifyLogin () {
    echo "modify login permission";
    backupPasswd;
    sed -i -e 's/\/var\/services\/homes\/git:\/sbin\/nologin/\/var\/services\/homes\/git:\/bin\/sh/' $filePath;
    checkGitLogin;
}


function checkGitLogin() {
    checkNoLogin=$(grep /var/services/homes/git:/sbin/nologin $filePath);
    if [ ${#checkNoLogin} -ne 0 ]; then
        echo "git login is not allowed";
        return 1;
    else 
        echo "git login is allowed not need change";
        return 0;
    fi;
}

checkGitLogin;

if [ $? -eq 1 ]; then
    modifyLogin;
fi;




新增任务,写一个任务名称,用户账号选择root

把上面的脚本粘贴到自定义脚本中

创建好任务以后 手动运行一下

点击运行以后 查看运行结果,如下图所示就是成功了

测试一下是否有效,连接成功以后输出如下图就是成功了