现有一台服务器(非云服务器), 要在内网提供 Git 服务托管代码. 鉴于大家倾向用图形界面, 在服务器上搭建 GitLab 服务. 服务使用域名访问. 安全起见, 只提供 HTTPS/SSL 访问.
本文涉及: GitLab, Docker, NGINX 反向代理, Bind9 域名解析
系统: Ubuntu 20.04 LTS
域名 & 域名解析
域名
为了便于访问, 我们设计一个域名, 因为不需要外网访问, 所以可以是任意形式. 假设内网的拥有者是 h-xie
, 那么顶级域名是 .h-xie
, gitlab服务的域名是 gitlab.h-xie
域名解析
使用 bind9.server
做域名解析 — BIND 9.
sudo apt install bind9
配置 DNS 查询
配置文件在 /etc/bind/
路径下.
打开配置文件 /etc/bind/named.conf.options
, 加入公共 DNS 服务器. 也就是如果本机解析不到结果的时候, 向下述 DNS 服务器寻求结果.
forwarders {
114.114.114.114;
223.5.5.5;
};
第 1 条是中国著名的公共 DNS 服务商 114DNS; 第 2 条来自阿里DNS. 两者都是我认为可信可靠的服务. 平时路由器和PC都会配置到这两个DNS. 如果你需要更多选择, 请参见: 公共DNS哪个好,速度快,稳定?- 知乎
增加解析
GitLab 的域名: gitlab.h-xie
打开文件 /etc/bind/named.conf.local
加入这句:
zone "gitlab.h-xie" {
type master;
file "/etc/bind/db.gitlab.h-xie";
};
这是说, gitlab.h-xie
这个 zone (域) 的配置在 /etc/bind/db.gitlab.h-xie
这个文件.
打开 /etc/bind/db.gitlab.h-xie
写入
;
; BIND data file for example.com
;
$TTL 604800
@ IN SOA gitlab.h-xie. root.h-xie. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS gitlab.h-xie.
@ IN A 192.168.x.x
域名结尾的 .
不能去掉. root.h-xie.
是管理员邮箱地址.
生效
sudo systemctl restart bind9.service
然后可以用
sudo systemctl status bind9.service
查看服务的状态, 如果配置文件写错, 服务没有生效, 指令结果中会有提示.
在用户侧配置 DNS
现在内网的用户可以通过域名 gitlab.h-xie
来访问服务器了.
首先, 用户要在 PC 上将 DNS 服务器改为手动配置, 填写服务器的 IP 地址; 然后, ping gitlab.h-xie
可以解析到服务器的 IP 地址.
完成第一步. 服务器现在有了路由服务, 可以将特定域名解析到任意 IP 地址.
SSL 证书
要使用 HTTPS/SSL 方式访问, 需要有 SSL 证书. 连入公网的情况下, 可以用 Let’s Encrypt – Free SSL/TLS Certificates 但是现在是内网, let’s encrypt 无法授予证书.
好在 Linux 系统通常有 OpenSSL, 可以生成证书. 过程中会有三个文件 私钥.key
, 验证请求.csr
和 证书.crt
参: 使用OpenSSL生成自签名SSL证书
在用户目录下所需文件
生成私钥
cd ~
mkdir certs; cd certs
openssl genrsa -out server.key 2048
生成CSR(证书签名请求)
openssl req -new -key server.key -out server.csr
过程中要根据提示填写信息, 信息会在后续浏览器访问的时候呈现出来.
生成自签名SSL证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
完成第二步, 准备好了证书, 数据在内网飞驰的时候就不再是明文了.
Docker 安装 GitLab
我按照这个方式安装 GitLab Docker images
映射的语句改一下, 避免本机的端口被完全占用. 之后用反向代理转发端口.
GITLAB_HOME=/gitlab
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 55443:443 --publish 5580:80 --publish 5522:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
装好后, 进入容器 docker exec -it gitlab /bin/bash
编辑配置文件
external_url 'https://gitlab.h-xie' # 域名, 和协议 https
gitlab_rails['gitlab_ssh_host'] = 'gitlab.h-xie'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 5522 # 服务器的端口号, 映射到容器的 22 端口
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.h-xie.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.h-xie.key"
letsencrypt['enable'] = false
查找这几行, 把前面的#
去掉, 使配置生效.
在容器外, 把上一步生成的 SSL 证书放到 $GITLAB_HOME/config/gitlab/ssl
, 名称也改成配置文件中的形式
重载gitlab
gitlab-ctl restart
现在, 可以通过用户浏览器访问 https://gitlab.h-xie:55443
访问 GitLab
NGINX 反向代理
新增一个网站 sudo vim /etc/nginx/site-available/gitlab.h-xie
server {
listen 80;
server_name gitlab.h-xie;
access_log /var/log/nginx/gitlab.h-xie.access.log;
error_log /var/log/nginx/gitlab.h-xie.error.log;
# pass requests for dynamic content to rails/turbogears/zope, et al
location / {
proxy_pass http://192.168.x.x:5580;
}
}
server{
listen 443 ssl;
server_name gitlab.h-xie;
access_log /var/log/nginx/gitlab.h-xie.access.log;
error_log /var/log/nginx/gitlab.h-xie.error.log;
ssl_certificate /config/gitlab/ssl/gitlab.h-xie.crt;
ssl_certificate_key /config/gitlab/ssl/gitlab.h-xie.key;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass https://192.168.x.x:55443;
}
}
将这个域名的通讯全部代理到特定端口, 就是第2步配置的端口.
用软链接把网站激活
sudo ln -s /etc/nginx/site-available/gitlab.h-xie /etc/nginx/site-enable/gitlab.h-xie
重启 NGINX
sudo service nginx restart
现在可以通过 https://gitlab.h-xie
访问 GitLab 啦~
PS: GitLab 启动时间比较长. 启动前会出现 502 错误, 不要紧张, 等等就好.
END