最近想在家里搭建一台服务器,这台服务器主要用来运行 gitlab,但是同时也要运行其它的 web 服务。

所以呢,我们需要在这台服务器上部署一个 nginx,用于将不同的请求转发到不同的服务上。

因为在安装 gitlab 的过程当中遇到了一些麻烦,所以特此记录。

# 1.环境前提

在我这里主要是两台设备,一台旧mac-mini用来做服务器(192.168.1.2),一台新mac-mini用来做我的日常工作电脑(192.168.1.3)

mac-mini

由于一台服务器只能够暴露出一个 便于浏览器访问 的 80 端口,但是我又要用它来访问多个服务。因此我们还需要进行一些 host 映射。

比如说,在我的工作电脑上找到计算机的 hosts 文件。添加以下内容:

192.168.1.2 gitlab.tricky.local
192.168.1.2 web.tricky.local

也就是说,我们打算在服务器上跑两个 web 服务,其中一个是 gitlab。一个是 whatever 咯~

# 2.安装 docker

这一个小节不想赘述,docker的官方文档的说明已经很给力了。

下面的内容会使用到 docker-compose ,请一并进行安装。

# 3.编写 dockerfile 之前的说明

我打算利用 docker-compose 的方式来安装基于 docker 的 gitlab。同时,也想让我的 nginx 基于 docker 来运行。在上文中提及的 第二个 web 服务 在本文中将用一种非常简单的形式来表现。

# 4.nginx 部分的安装

我在服务器上任意地方建立一个 nginx 的文件夹。在其中准备几个文件,如下:

├── docker-compose.yml
├── dockerfile
├── logs                     # 这是一个文件夹啦
└── nginx.conf

# 4.1 编辑 nginx.conf

这是一份完整的 nginx.conf ,重点请看 server 的那两块。





























 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 




user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    server_names_hash_bucket_size 128;

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    client_max_body_size 20m;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    upstream gitlab{
        # 注意这里的端口,我们在下文会讲到
        server gitlab.tricky.local:30080;
    }

    server {

        listen       80;
        # 监听本地80端口,如果用户通过该域名访问,则执行这一块
        # 还记得吗,这个域名和前文说的域名是同一回事了,您需要自己进行相应的调整
        server_name  gitlab.tricky.local;
        
        include /etc/nginx/default.d/*.conf;
        
        # 所有的请求都转发到 upstream gitlab 指定的 server
        location / {
            proxy_pass http://gitlab;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Real-Port $remote_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Port  $server_port;
            proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
        }
        
    }
    
    server {
        listen       80;
        # 监听本地80端口,如果用户通过该域名访问,则执行这一块
        # 这里就用一种最简单的方式来模拟第二个 web 服务器
        server_name  web.tricky.local;
        
        location / {
            return 200 "this is web"
        }
    }

}

# 4.2 dockerfile 的编写

dockerfile 的编写就十分简单了

FROM nginx
LABEL maintainer='trickyedecay@qq.com'
ENV REFRESHED_AT 2021-04-08

# 把刚刚写好的 nginx.conf 在构建镜像时拷贝到 nginx 容器当中
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

如果你愿意的话,也可以直接一句命令来吧 nginx 镜像跑起来,但是我是为了后期的方便,所以才采取了这种看起来十分不便利的方式

# 4.3 docker-compose.yml 的编写

version: "3"

services: 
    main-nginx:
        build: 
            # 使用 context 指令来告诉 docker-compose 构建时使用哪个 dockerfile
            context: ./
        ports:
            # 把 80 和 443 端口暴露出来。
            - "80:80"
            - "443:443"
        volumes: 
            # 将 nginx 内部产生的日志文件挂载到物理硬盘上
            - ./logs:/var/log/nginx
        # 如果要开启 nginx 的 debug 模式,取消注释下面这一行
        # command: [nginx-debug, '-g', 'daemon off;']

# 4.4 运行

在这个 nginx 文件夹下执行以下命令,nginx 就跑起来啦。

docker-compose up

# 5.gitlab 部分

gitlab 的安装可以直接参考官方文档的操作。

# 5.1 gitlab 安装

所以,形同上文,我又创建了一个 gitlab 的文件夹,在里面创建了相应的文件:

.
├── gitlab              # 这是一个文件夹啦
└── docker-compose.yml  # 嗯,只有一个文件

所以这个文件的完整内容如下:

version: "3"

services: 
  gitlab:
      image: 'gitlab/gitlab-ce:latest'
      restart: always
      # 哟吼,又是我前文提及的域名
      hostname: 'gitlab.tricky.local'
      environment:
        GITLAB_OMNIBUS_CONFIG: |
          # 这些配置将在下文进行说明
          external_url 'http://gitlab.tricky.home'
          gitlab_rails['gitlab_ssh_host'] = 'gitlab.tricky.home'
          nginx['redirect_http_to_https'] = false
          nginx['listen_https'] = false
          gitlab_rails['gitlab_shell_ssh_port'] = 30022
          nginx['listen_port'] = 30080
      ports:
        # 左侧为主机端口:右侧为容器内的端口
        # 30080 是基于上面设置的,gitlab的web界面的访问端口
        - '30080:30080'
        # 30022 也是基于上面设置的,在进行git pull/push/clone 时所使用的端口
        - '30022:30022'
      volumes:
        # 根据官方文档,我将几个必要的内容从容器中挂载了出来
        - '.gitlab/config:/etc/gitlab'
        - '.gitlab/logs:/var/log/gitlab'
        - '.gitlab/data:/var/opt/gitlab'

gitlab 程序有一堆属于它自己本身的配置,这些配置项我们可以通过在 docker-compose.yml 中的 environment 指令下的 GITLAB_OMNIBUS_CONFIG 来设置。我们基于上面的这份配置来解释每一项的含义:

  • external_url 'http://gitlab.tricky.home' 这个属性设置的是最终我们将在浏览器通过上面链接访问我们的 gitlab。在这里我的设置值是前文提及到的我自己家里面虚拟出来的域名。

这个属性不会影响 gitlab 内置的 nginx 的域名监听。

这个属性会使得最终的 gitlab 项目的 http 方式的 clone 链接比较漂亮! gitlab-clone-http

  • gitlab_rails['gitlab_ssh_host'] = 'gitlab.tricky.home' 和上面的配置项很类似了,就是设置了 clone 时的链接样式。

  • nginx['redirect_http_to_https'] = false 使得当我们以 http 访问 gitlab 时,它不会自动跳转到 https 。

由于我是在家里搭建一个服务器,对安全系数的要求不会很高,所以才采取了此项。

  • nginx['listen_https'] = false 不监听 https 协议的请求。

  • gitlab_rails['gitlab_shell_ssh_port'] = 30022 设置 gitlab 容器内部的 ssh 端口,注意,这里的端口一定不要和你外部的 ssh 端口一致。ssh 默认端口都是占用 22.

eg. 我的 mac-mini 服务器本身有 ssh 服务。占用了22端口,因此我将 gitlab 容器内部的 ssh 端口设置为 30022.

❗️❗️❗️该设定只是修改了 clone 时的链接样式,gitlab内部并不会真正去监听该端口。需要由我们后续来设置。所以当你使用ssh来进行clone时,可能会出现 kex_exchange_identification: Connection closed by remote host 的错误。
gitlab-clone-ssh

  • nginx['listen_port'] = 30080 将 gitlab 的访问端口设置为30080,这一项设置并不会影响 clone 时的那个链接样式。只是使得 gitlab 内部的 nginx 真的去监听 30080.

# 5.2 gitlab 运行

gitlab 文件夹中运行以下指令,gitlab就跑起来啦。

docker-compose up

在我的环境当中,我可以在我的工作机上通过 http://gitlab.tricky.local 访问到服务器上的 gitlab 服务啦。

# 5.3 解决 gitlab + ssh 的问题

现如今,我们在 docker-compose.yml 中设置的 ssh 端口并不会真正用于监听。我们需要潜入到容器内部对 /assets/sshd_config 文件进行修改。

我所说的 潜入 就是执行 docker exec -it <容器id> bash 命令啦。

/assets/sshd_config 文件中的 Port 22 改为 Port 30022 即可。 port-setting

# 5.4 如果还想修改关于 gitlab 的配置

一旦我们的 gitlab 运行起来,我们可以在我们挂载的文件夹中找到 gitlab 的配置文件。 我们可以在 gitlab/config 文件夹中找到 gitlab.rb 文件。

直接改!改完保存!然后重启一下 gitlab 容器即可。

现最新版本是无需手动执行什么配置 gitlab 的命令的,直接重启就会自动重新配置 gitlab,无需担心这个操作会影响 docker-compose.yml 中的设定。

完事!

# 参考文献