群晖 NAS 上搭建 Gitea 与 MySQL:从 Docker 到域名远程登录与 SSH 推送
本文最后更新于 30 天前,如有失效请评论区留言。

在群晖 NAS 中用 Docker 搭建 Gitea 和 MySQL 服务,配置数据库、容器映射、服务器实现反代与 SSH 通信,实现基于自定义域名的远程 Git 服务。

环境与前提条件

  • 群晖系统版本:DSM 7.2

  • 已安装套件:Container Manager(容器管理器)

  • 已有阿里云服务器和域名(远程访问,内网不需要)

  • 目标:

    • 使用 Docker 容器安装 MySQL + Gitea

    • 本地端口:MySQL,Gitea Web,SSH

    • 通过 example.cn 实现公网访问

    • 实现 SSH 推送代码

创建 MySQL 容器并配置数据库

创建文件夹

在 Docker 目录下创建:mysql 文件夹

mysql文件夹右键属性 → 权限 → 赋予 Everyone 读写权限。

下载 MySQL 镜像

打开 Container Manager – 镜像仓库 – 搜索 mysql – 右键选择下载此映像 – 默认下载即可,会自动跳转到映像里面下载,下载失败多试几次。(如果没有魔法工具,请参阅黑群晖常用设置与必装软件全攻略 的Container Manager 部分)

下载好mysql镜像之后,右键运行,进行配置。

容器配置

  • 自取名称 – 勾选自动重启 – 下一步
  • 端口设置 – 本地端口跟容器端口保持一致或者自己选择一个即可(前提是该端口没有被占用,且端口尽量应该选大一点的,避免被扫描到)ps: 设置常用的端口为 3306 
  • 存储空间设置 – 添加文件夹 – 左侧选中创建的 myaql 文件夹,如 /volume1/docker/mysql,右端填入 /var/lib/mysql
  • 环境设置 – 新增 –  MYSQL_ROOT_PASSWORD设置一个数据库管理员密码。确认无误后创建容器。
  • 网络选择 bridge 或者 host 都可。

登录 MySQL 并创建数据库

运行容器mysql之后,右键该容器,选择-打开终端机,输入以下命令创建一个gitea的数据库。

mysql -u root -p
SHOW DATABASES;
CREATE DATABASE gitea DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON gitea.* TO 'gitea'@'%';
FLUSH PRIVILEGES;

注意,若要删除gitea数据库,可以运行以下命令:

DROP DATABASE gitea;
SHOW DATABASES;

配置 Docker 用户组与权限

准备目录

在 Docker 目录下创建:gitea-data 文件夹

在你想要存放数据的目录创建(之后推送的数据和内容都存放在该位置,这样分离开即使容器出现问题,数据没出事):gitea文件夹,在gitea文件夹下创建repositories 文件夹

  • 创建用户组 docker – 选择成员可以跳过,分配目录权限,我们将系统自带的 docker 目录和刚才创建的 gitea 目录都分配给 docker 组,并且设置为可读写,之后的选择跳过即可。

  • 创建用户 gitea – 可以设置一个密码(后续其实不需要这个密码)- 加入 docker 组,只允许访问 docker 和 git 目录,之后的选择跳过即可。

  • SSH 终端获取 UID/GID(请查看自己的输出,后续需要用到gitea的UID和docker的GID):

id gitea
uid=1029(gitea) gid=101(users) groups=101(users),65538(docker)

创建 Gitea 容器与挂载目录

下载 Gitea 镜像

打开 Container Manager – 镜像仓库 –  搜索 gitea/gitea – 右键选择下载此映像 – 默认下载即可,会自动跳转到映像里面下载,下载失败多试几次。(如果没有魔法工具,请参阅黑群晖常用设置与必装软件全攻略 的Container Manager 部分)

下载好 gitea 镜像之后,右键运行,进行配置。

容器配置

  • 自取名称 – 勾选自动重启 – 下一步
  • 端口设置 – 本地端口跟容器端口保持一致或者自己选择一个即可(前提是该端口没有被占用,且端口尽量应该选大一点的,避免被扫描到)ps:  HTTP常用的容器端口为 3000, SSH常用的容器端口为 22。这是容器的端口,本地端口自己设定,后续web管理和ssh使用的都是本地端口而非容器端口。此处假设web端口是10000,ssh端口是10001。
  • 存储空间设置 – 添加文件夹 – 左侧选中创建的 gitea-data文件夹,如 /volume1/docker/gitea-data,右端填入 /data
  • 存储空间设置 – 添加文件夹 – 左侧选中创建的 repositories文件夹,如 /volume3/gitea/repositories,右端填入 /data/git/repositories
  • 环境设置 – 新增 –  USER_UID,对应刚才获取到的 gitea 用户的 UID。
  • 环境设置 – 新增 –  USER_GID,对应刚才获取到的docker 组的 GID。
  • 网络选择默认的 bridge 模式。

Gitea 初始化与数据库连接

浏览器访问:http://nas的内网ip地址:10000/  (端口为容器配置时对应于容器3000端口的本地端口)

数据库配置里面:

数据库类型:MySQL

数据库主机:nas的ip地址:3306 (端口设置为自己配置mysql数据库时的端口)

数据库用户:root

数据库用户密码:创建mysql容器时在环境设置处自己设置的密码

数据库名称:gitea  (自己创建的数据库名字)

应用基本设置:

域名:这里如果是localhost就改成nas的ip,如果需要实现远程访问,域名填入自己的域名,如 example.cn

应用URL:这里如果是localhost也要改成ip,如http://nas的内网ip地址

 

点击 立即安装 即可。

之后可以修改配置,我的路径为:/volume1/docker/gitea-data/gitea/conf/app.ini,具体路径修改为自己的路径。ps:不需要远程的话相应位置直接填入nas的内网地址即可

[server]
APP_DATA_PATH /data/gitea
DOMAIN example.cn  # 修改为自己的域名
SSH_DOMAIN example.cn  # 修改为自己的域名
HTTP_PORT 3000
ROOT_URL http://nas的内网ip地址  
DISABLESSH false
SSH_PORT 22
SSH_LISTEN_PORT 22

域名反向代理与 HTTPS 设置

在云服务器(或 NAS)中配置反代:

server {
    listen 80;
    server_name example.cn;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name example.cn;

    ssl_certificate /www/server/nginx/conf/example.cn.pem;
    ssl_certificate_key /www/server/nginx/conf/example.cn.key;

    location / {
        proxy_pass http://127.0.0.1:10000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
)

使用Synology的反向代理设置来配置HTTPS访问

群晖打开控制面板 – 登录门户- 高级 – 反向代理服务器 – 新增:

反向代理服务器名称:gitea

来源

  • 协议:HTTPS
  • 主机名:example.cn  # 修改为自己的域名
  • 端口:443
  • 勾选 启用HSTS

目的地

  • 协议:HTTP
  • 主机名:127.0.0.1
  • 端口:3000

该过程创建一个新的反向代理规则,将本地的HTTPS流量转发到gita容器运行的地址和端口(例如将来自域名

example.cn 的HTTPS流量转发到127.0.0.1:3000)。

验证 https://example.cn 能正常访问 Gitea Web 界面。

远程登录与 SSH 推送配置

确认 SSH 端口映射: NAS 外部端口 10001 → 容器端口 22。关于ssh的用法,请参阅 

在本地添加公钥(在内网的一台本地机)
本地执行(邮箱填写自己的邮箱):

ssh-keygen -t ed25519 -C "nas-$(date +%Y%m)"  # 一路回车,或设置更安全的密钥口令

 将~/.ssh/ed25519.pub 内容复制到 Gitea的ssh密钥(可以在网页端 – 设置 – SSH/GPG密钥 – 管理SSH密钥 – 增加密钥)。

群晖常见坑:家目录权限过宽 会导致公钥被拒,务必确保 ~755.ssh700authorized_keys600。相应路径改为自己的路径即可。

# 设置用户主目录权限
chmod 755 /volume1/homes/<用户名>

# 设置 .ssh 目录权限
chmod 700 /volume1/homes/<用户名>/.ssh

# 设置 authorized_keys 文件权限
chmod 600 /volume1/homes/<用户名>/.ssh/authorized_keys

# 确认属主与属组正确(非常关键)
chown -R gang:users /volume1/homes/<用户名>/.ssh

禁用口令登录

编辑 /etc/ssh/sshd_config

sudo sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd

这样只允许公钥,且禁止 root 直登,更安全。

在阿里云 frps 上开放一个 SSH 远端端口

  1. 在阿里云控制台放行 TCP/7000(frp 控制端口)TCP/60022(SSH 暴露端口)

FRP 的基本思路是:在 frps 公网机器上监听 remotePort(下文的 10001),把外部打到该端口的流量转发到内网 NAS 的 22 端口。

在 NAS 上配置 frpc(把容器gitea SSH 暴露出去)

在NAS 的 frpc只需新增一个代理条目

[[proxies]]
name       = "ssh_gitea"
type       = "tcp"
localIP    = "127.0.0.1"
localPort  = 10001  # 指向 gitea 的SSH
remotePort = 10001  # 在 frps 公网暴露的端口
transport.useEncryption = true
transport.useCompression = true

重启 frpc 后,example.cn:10001 即可直达你 NAS 的 gitea 的SSH。

说明:SSH 是纯 TCP 协议,不能像 HTTP/HTTPS 那样靠域名做七层反代;若用 Nginx,也必须用 stream(TCP) 反代 且仍然靠端口区分。不能在同一端口上按域名路由 SSH。

同时在 Gitea app.ini/管理后台里设置:(我的路径为:/volume1/docker/gitea-data/gitea/conf/app.ini

[server]
SSH_DOMAIN = example.cn
SSH_PORT   = 10001

然后在本地 ~/.ssh/config 再加一个别名(在windows系统内,在路径:C:\Users\你的用户名\.ssh\config, 填入以下内容(路径和密钥文件填写你自己的)):

Host gitea
HostName example.cn
Port 10001
User git
IdentityFile ~/.ssh/id_ed25519  # 修改为你的密钥文件名
IdentitiesOnly yes

此时在本地的命令行里面输出以下命令:

ssh -T gitea

出现以下结果,就说明成功了。

Hi there, gang! You’ve successfully authenticated with the key named gitea, but Gitea does not provide shell access.

If this is unexpected, please log in with password and setup Gitea under another user.

内网ssh登录(仅仅需要内网,不支持外网连接看此处)

这种方式不需要配置frpc和云服务器开放端口,只需要:

同时在 Gitea app.ini/管理后台里设置:(我的路径为:/volume1/docker/gitea-data/gitea/conf/app.ini

[server]
SSH_DOMAIN = 192.168.0.253  # 修改为你的nas的ip
SSH_PORT   = 10001

然后在本地 ~/.ssh/config 再加一个别名(在windows系统内,在路径:C:\Users\你的用户名\.ssh\config, 填入以下内容(路径和密钥文件填写你自己的)):

Host gitea
HostName 192.168.0.253  # 修改为nas的ip
Port 10001
User git
IdentityFile ~/.ssh/id_ed25519  # 修改为你的密钥文件名
IdentitiesOnly yes

此时在本地的命令行里面输出以下命令:

ssh -T gitea

出现以下结果,就说明成功了。(ps:真不容易)

Hi there, gang! You’ve successfully authenticated with the key named gitea, but Gitea does not provide shell access.

If this is unexpected, please log in with password and setup Gitea under another user.

— 完 —

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇