在 WSL2 Ubuntu 22.04 上部署 GitLab 并实现局域网访问
环境信息:
- 宿主机:Windows 11
- WSL 发行版:Ubuntu 22.04.5 LTS
- GitLab 版本:社区版(CE)
一、开启 WSL2 功能
在 Windows 11 上使用 WSL2 之前,需要先启用"适用于 Linux 的 Windows 子系统"功能。
方法一:图形界面
点击「开始」→「设置」→「应用」→ 右侧「程序和功能」→ 左侧「启用或关闭 Windows 功能」→ 找到 "适用于 Linux 的 Windows 子系统",勾选后确定,并重启电脑。
方法二:PowerShell(管理员)
以管理员身份打开 PowerShell,执行:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
根据提示重启电脑。
二、安装 Ubuntu 22.04 LTS
打开 Microsoft Store(微软应用商店),搜索 ubuntu。
选择 Ubuntu 22.04.5 LTS,点击"获取"并安装。
安装完成后,从开始菜单启动 Ubuntu。首次启动会提示创建用户名和密码,按向导完成即可。
三、在 WSL2 Ubuntu 中安装 GitLab
1. 更新系统并安装依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl openssh-server ca-certificates tzdata perl
2. 安装 GitLab CE(社区版)
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt install gitlab-ce
安装完成后,GitLab 会默认使用内置的 Nginx、PostgreSQL、Redis 等组件。
3. 配置 GitLab 的网络与端口
编辑主配置文件:
sudo nano /etc/gitlab/gitlab.rb
根据你的局域网环境进行修改。假设宿主机(Windows)的局域网 IP 为 192.168.1.36,我们希望 GitLab Web 界面监听 8765 端口,SSH 使用 2222 端口,并且只启用 HTTP(不启用 HTTPS)。
以下是推荐的核心配置(基于用户实践整理):
# 外部访问 URL(使用宿主机 IP + 端口)
external_url 'http://192.168.1.36:8765'
# Nginx 设置
nginx['listen_port'] = 8765
nginx['listen_https'] = false
nginx['listen_addresses'] = ['0.0.0.0']
# SSH 端口(可选,避免与宿主机 22 冲突)
gitlab_rails['gitlab_shell_ssh_port'] = 2222
# 使用内置 PostgreSQL(不依赖外部数据库)
postgresql['enable'] = true
gitlab_rails['db_adapter'] = 'postgresql'
# 禁用部分非必要服务以节省资源(WSL 资源有限)
prometheus['enable'] = false
注意:配置中 external_url 必须使用宿主机 IP 或域名,不能用 localhost 或 WSL 的内部 IP,否则局域网其他设备无法通过宿主机 IP 访问。
保存后执行重配:
sudo gitlab-ctl reconfigure
四、修复 PostgreSQL 权限问题(常见)
在初次运行或重配过程中,可能遇到 PostgreSQL 无法启动的问题,日志中显示类似:
down: postgresql: 0s, normally up, want up; run: log: (pid 483) 118
解决方法:修复 PostgreSQL 数据目录的权限,然后重配。
sudo gitlab-ctl stop
sudo chown -R gitlab-psql:gitlab-psql /var/opt/gitlab/postgresql
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
执行后 PostgreSQL 应该能正常启动。
五、设置 Windows 端口转发与防火墙
GitLab 运行在 WSL2 内部(例如 IP 为 172.26.25.30,端口 8765),需要让宿主机 Windows 将收到的局域网请求转发到 WSL 内部。
1. 查看 WSL2 的内部 IP
在 Ubuntu 终端中执行:
ip addr show eth0 | grep inet
输出类似:inet 172.26.25.30/20 ...,记下这个 IP(下文称 WSL_IP)。
2. 添加端口转发规则(以管理员身份运行 PowerShell)
# 转发规则:宿主机 8765 端口 → WSL 的 8765 端口
netsh interface portproxy add v4tov4 listenport=8765 listenaddress=0.0.0.0 connectport=8765 connectaddress=172.26.25.30
# 如果需要固定使用宿主机局域网 IP 192.168.1.36 监听,也可以再加一条
netsh interface portproxy add v4tov4 listenport=8765 listenaddress=192.168.1.36 connectport=8765 connectaddress=172.26.25.30
提示:若之前存在旧规则,可以先删除:
netsh interface portproxy delete v4tov4 listenport=8765 listenaddress=192.168.1.36
3. 配置 Windows 防火墙允许入站连接
New-NetFirewallRule -DisplayName "WSL2 GitLab 8765" -Direction Inbound -LocalPort 8765 -Protocol TCP -Action Allow -LocalAddress 192.168.1.36
4. 验证转发规则
netsh interface portproxy show all
应该能看到类似输出:
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
0.0.0.0 8765 172.26.25.30 8765
192.168.1.36 8765 172.26.25.30 8765
六、启动 GitLab 并验证
在 WSL Ubuntu 中:
sudo gitlab-ctl start
检查所有服务的运行状态:
sudo gitlab-ctl status
如果一切正常,你将看到类似以下的输出(所有主要服务均为 run 状态):
run: alertmanager: (pid 489) 20941s; run: log: (pid 480) 20941s
run: gitaly: (pid 493) 20941s; run: log: (pid 476) 20941s
run: gitlab-exporter: (pid 487) 20941s; run: log: (pid 469) 20941s
run: gitlab-kas: (pid 481) 20941s; run: log: (pid 473) 20941s
run: gitlab-workhorse: (pid 490) 20941s; run: log: (pid 486) 20941s
run: logrotate: (pid 5249) 2309s; run: log: (pid 472) 20941s
run: nginx: (pid 477) 20941s; run: log: (pid 468) 20941s
run: node-exporter: (pid 483) 20941s; run: log: (pid 466) 20941s
run: postgres-exporter: (pid 485) 20941s; run: log: (pid 474) 20941s
run: postgresql: (pid 479) 20941s; run: log: (pid 467) 20941s
run: puma: (pid 497) 20941s; run: log: (pid 488) 20941s
run: redis: (pid 494) 20941s; run: log: (pid 478) 20941s
run: redis-exporter: (pid 484) 20941s; run: log: (pid 475) 20941s
run: sidekiq: (pid 492) 20941s; run: log: (pid 470) 20941s
特别关注 nginx、postgresql、puma、sidekiq 等核心服务是否 run。如果有服务显示 down,请检查日志:sudo gitlab-ctl tail <服务名>。
七、局域网访问测试
在局域网内的另一台电脑(手机、平板或其他 PC)上,打开浏览器,访问:
http://192.168.1.36:8765
应该能看到 GitLab 的欢迎页面。首次访问会提示设置管理员密码(默认用户名 root)。设置完成后即可开始使用。
八、常见问题与排错
Q1:局域网无法访问,但本机可以访问?
- 检查 Windows 防火墙是否允许了 8765 端口(上述 PowerShell 命令已添加)。
- 检查端口转发规则是否生效(
netsh interface portproxy show all)。 - 确认 WSL 内部 GitLab 确实在监听
0.0.0.0:8765:sudo netstat -tulpn | grep 8765。
Q2:GitLab 页面加载极慢或无法启动?
WSL2 默认分配的内存较小,可以创建 %UserProfile%\.wslconfig 文件,设置:
[wsl2]
memory=4GB
processors=2
然后重启 WSL:wsl --shutdown,再启动 Ubuntu。
禁用更多非必要服务以降低资源占用(在 /etc/gitlab/gitlab.rb 中添加):
prometheus['enable'] = false
grafana['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
Q3:SSH 克隆代码无法使用?
配置了 gitlab_rails['gitlab_shell_ssh_port'] = 2222 后,需要在 Windows 上也添加 2222 端口的转发规则,并将 GitLab 显示的克隆地址中的端口改为 2222。建议先使用 HTTP/HTTPS 方式克隆,SSH 按需配置。
九、总结
通过以上步骤,我们在 WSL2 Ubuntu 22.04 中成功部署了 GitLab,并通过 Windows 端口转发和防火墙配置,使局域网内的其他设备可以无障碍访问。该方法充分利用了 WSL2 的轻量特性,适合开发测试环境或小团队内部使用。
关键点回顾:
- 开启 WSL 功能并安装 Ubuntu 22.04。
- 修改
gitlab.rb绑定宿主机 IP 和自定义端口。 - 修复 PostgreSQL 权限问题。
- 在 Windows 中配置 netsh portproxy 转发和防火墙规则。
- 启动 GitLab 后使用
sudo gitlab-ctl status确认所有服务正常。 - 访问
http://宿主机IP:8765完成初始化。
如果有更高性能或生产环境需求,建议将 GitLab 部署在原生 Linux 服务器或使用 Docker 方式运行。但在 WSL2 中运行对于个人学习和小型团队来说,已经足够便捷高效。
参考资料:
- GitLab 官方安装文档:https://docs.gitlab.com/ee/install/
- WSL2 网络转发:https://learn.microsoft.com/en-us/windows/wsl/networking