自有服务器安装gitlab服务

现有一台服务器(非云服务器), 要在内网提供 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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据