安装步骤
- 确认群晖版本
- 安装docker
- 开启ssh
- 创建git用户
- 拉取gitea镜像
- 开启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用户的 uid和gid,这里获取到的uid为1033,gid为100,把这两个值填写到下面的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

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

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

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

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