在 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:8765sudo 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 的轻量特性,适合开发测试环境或小团队内部使用。

关键点回顾:

  1. 开启 WSL 功能并安装 Ubuntu 22.04。
  2. 修改 gitlab.rb 绑定宿主机 IP 和自定义端口。
  3. 修复 PostgreSQL 权限问题。
  4. 在 Windows 中配置 netsh portproxy 转发和防火墙规则。
  5. 启动 GitLab 后使用 sudo gitlab-ctl status 确认所有服务正常。
  6. 访问 http://宿主机IP:8765 完成初始化。

如果有更高性能或生产环境需求,建议将 GitLab 部署在原生 Linux 服务器或使用 Docker 方式运行。但在 WSL2 中运行对于个人学习和小型团队来说,已经足够便捷高效。

参考资料: