Docker折腾记: (3)Docker Compose构建Gitlab,从配置(https,邮箱验证)到基本可用

前言

gitlab 11.1内置了CI/CD,这个特性从gitlab 8+就开始有了,不过配置比较琐碎html

通过几个大版本的迭代,如今已经简化了使用方式,也修复了一些坑,这个特性大大吸引了我;node

gitlab拥有的特性很齐全,包括了第三方登陆,二步验证,SSH,GPG签名等等nginx

因此对于好东西不拿来用太对不起本身,因而开始了漫漫的爬坑之路;git

因为东西是部署在公司内的,因此就不开放访问了,可是能够参考下个人大致配置;web

至于为何采用docker来部署,好迁移,升级也方便(由于数据和配置文件是独立的)sql

前置基础

基础环境

  • Debian Linux 9
  • Docker 18.06 , gitlab镜像用的gitlab官方提供的gitlab-ce,好处以下
    • 官方的,用的放心,更新频率高(能与时俱进) - 这个教程用的是当前最新的11.1
    • 一键安装(由于相似postgresql,ruby,nginx)这类的基础的环境都包括进去了
    • 只暴露主配置文件/数据库存放位置/还有日志,
      • 升级不用考虑数据的问题;对于业务不是很复杂的公司.能快速部署....

假若想至于从0到1的构建(这种能够更细致针对业务进行配置),但要考虑的东西比较多;docker

有专业的运维和公司不缺钱的大佬能够折腾shell

必备知识

Linux/Docker && Docker Compose / Nginx数据库

效果图

构建启动

这块的知识并非gitlab,仍是dockerapi

  • 官方教程的基本启动姿式:
    • detack: 容器在后台运行并输出容器ID
    • publish: 就是暴露端口,简写-p
    • name: 容器名
    • restart: 什么时机会触发容器重启,全部状况
    • volume: 映射卷的,基本用来持久化数据的
# 官方基本姿式,docker直接启动
sudo docker run --detach \
    --hostname gitlab.example.com \
    --publish 443:443 --publish 80:80 --publish 22:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

复制代码

三个volume就是暴露的位置

本地位置 容器位置 做用
/srv/gitlab/data /var/opt/gitlab gitlab的数据存放,包括nginx,postgresql这些
/srv/gitlab/logs /var/log/gitlab 日志存放
/srv/gitlab/config /etc/gitlab gitlab的主配置文件

传参启动

  • hostname:访问的域名
  • env: 这里面就是临时提权生效的
    • 这个就是能够给gitlab传入部分参数,让其构建过程读取你设置的值(gitlab.rb)而且生效
    • 官方说这个并不会写入gitlab.rb(就是gitlab的配置文件),只是临时生效(容器生存期间)
sudo docker run --detach \
    --hostname gitlab.example.com \
    --env GITLAB_OMNIBUS_CONFIG="external_url 'http://my.domain.com/'; gitlab_rails['lfs_enabled'] = true;" \
    --publish 443:443 --publish 80:80 --publish 22:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

复制代码

docker-compose启动

我偏向于这种,因此写个构建规则,以下

初版

version: '3.6'
services:
 gitlab:
 container_name: gitlab
 image: gitlab/gitlab-ce:latest
 restart: always
 environment:
 GITLAB_OMNIBUS_CONFIG: | external_url 'https://域名'  ports:
 - "80:80"
 - "443:443"
 - "2224:22"
 volumes:
 - "/srv/gitlab/config:/etc/gitlab"
 - "/srv/gitlab/logs:/var/log/gitlab"
 - "/srv/gitlab/data:/var/opt/gitlab"

复制代码

整个初始化的过程,我这边等了两分钟左右,由于服务器配置不是很高~~~~

对于Gitlab配置,你能够配置容器内的,也能够配置映射的区域

前者能够用gitlab-ctl reconfigure从新生效,后者须要重启容器

  • 容器内:/etc/gitlab
  • 映射: /srv/gitlab/config
邮箱配置

邮箱推送算是一个最基础的功能的,好比注册什么基本通常都会用到

这里用的是阿里云的邮箱了,固然是我的邮箱..够用就好

# https://mailhelp.aliyun.com/freemail/detail.vm?knoId=5869705

gitlab_rails['smtp_enable'] = true 
gitlab_rails['smtp_address'] = "smtpdm.aliyun.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "crperx@aliyun.com"
gitlab_rails['smtp_password'] = "xxxxxxxx"
gitlab_rails['smtp_domain'] = "smtp.aliyun.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'crperx@aliyun.com'
gitlab_rails['gitlab_email_display_name'] = 'noreply@aliyun.com'

# 其余邮箱大同小异(QQ,163这些),只要支持smtp协议的皆可,端口这些不用说了
# gitlab_rails['smtp_address'] = "smtp.aliyun.com" : 邮箱交互服务器
# gitlab_rails['smtp_user_name'] = "crperx@aliyun.com" : 邮箱登陆帐号
# gitlab_rails['smtp_password'] = "xxxxxxxx" : 邮箱登陆密码
#gitlab_rails['gitlab_email_enabled'] = true : 启动邮箱推送功能
# gitlab_rails['gitlab_email_from'] = 'crperx@aliyun.com': 谁来充当发邮件的
# gitlab_rails['gitlab_email_display_name'] = 'noreply@aliyun.com' : 别人看到的发件人名字

复制代码

至于测试邮箱有两种姿式,一种是gitlab控制台,一种就是打开网站去注册了,前者以下,后者不用说

  1. 进入Gitlab容器
  2. 执行gitlab-rails console进入到gitlab控制台
  3. Notify.test_email('待测试接收的邮箱', '邮件自定义标题', '邮件自定义正文').deliver_now

效果

经常使用的邮箱基本均可以收到....

Gitlab HTTPS

我这台渣渣服务器目前带不了太多服务,因此就不考虑nginx独立作反射了(gitlab支持反射代理)

用的gitlab内置的nginx,直接用默认端口

  • 申请证书,我申请的是阿里云的免费证书

申请过程挺简单的,只要你有备案好的域名,基本均可以批下来,这过程就不用说了

待批下来以后,便可下载证书(签名和私钥)

下载下来解压后是有两个文件,

  • 1533582000680.key: 证书私钥!!!!证书私钥!!!!证书私钥!!!!
  • 1533582000680.pem : 公钥,阿里云提供的是pem格式

我去看了下gitlab.rb(gitlab的主配置文件)是须要crt格式的,

###############################################################################
## GitLab NGINX
##! Docs: https://docs.gitlab.com/omnibus/settings/nginx.html
################################################################################

# nginx['enable'] = true
# nginx['client_max_body_size'] = '250m'
# nginx['redirect_http_to_https'] = false
# nginx['redirect_http_to_https_port'] = 80

##! Most root CA's are included by default 默认的根证书
# nginx['ssl_client_certificate'] = "/etc/gitlab/ssl/ca.crt"

##! enable/disable 2-way SSL client authentication 二步验证是否校验证书,看需求开
# nginx['ssl_verify_client'] = "off"

##! if ssl_verify_client on, verification depth in the client certificates chain 校验的深度
# nginx['ssl_verify_depth'] = "1"

# nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{node['fqdn']}.crt" 证书的位置
# nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{node['fqdn']}.key"
# nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
# nginx['ssl_prefer_server_ciphers'] = "on"

##! **Recommended by: https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
##! https://cipherli.st/**
# nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2"


复制代码

这时候咱们就须要转换一下了,打开终端,

# 我把数字重命名为gitlab了
# 这条命令的意思就是
# 生成x509规格的证书,输出位可读文本格式, 
# -in 是标准输入就是接受哪一个
# -out 标准输出,输出文件为何格式
openssl   x509  -outform PEM  -in gitlab.pem   -out gitlab.crt

# 如果转出格式用的二进制流(DER),会输出这个问题
# SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expect

复制代码

接下来就用scp把对应的证书传到服务器上,修改下配置文件

  • 传送证书
# -r 递归传送,由于传送的是整个目录
# 传到的是容器映射的目录,这样重启下容器就能生效了
scp  -r  ./ssl   root@xxxxx:/srv/gitlab/config

复制代码
  • 修改配置,截图有高亮

超时配置

由于服务器不给力.因此默认的不够用...

# 这个是针对请求钩子的,还有针对Git的这些
gitlab_rails['webhook_timeout'] = 60 #默认是10s

# 如果大致都须要求延长的,能够配置全局,后者是进程数
unicorn['worker_timeout'] = 60
unicorn['worker_processes'] = 2

复制代码
配置生效

gitlab配置的修改有两种,一种是启动容器的时候传参,参考上面;

一种直接改映射的配置文件; 至于如何生效,有两种方式;

其一:gitlab-ctl => gitlab-ctl reconfigure重载配置文件生效

对于其一,咱们确定是要进入容器才能操做的;

  • docker ps -a : 找到gitlab容器的实例,docker-compose psdocker ps大同小异
  • docker exec -it gitlab bash: 进入容器,并使用bash shell

应该说docker-compose的命令行基本是针对docker的封装的,

只是操做的是由compse生成的实例,docker也能干涉也不奇怪

gitlab-ctl还有一些其余的命令,好比暂停,中止gitlab,输出配置文件等等

其二:重启容器!


第二版

gitlab.rb的配置实在是多,整个配置文件目前接近1800行;

里面涵盖了日志,安全,nginx,数据库等等的全部配置

大多数配置都有默认值,因此不少东西看你的须要来开启,

咱们这里不须要开启太多东西,邮箱https,超时的配置,其余都默认(好比日志这些,数据库初始化这些)

证书必须提早复制过去!!!!,木有目录就新建

# 就是把配置文件写在容器构建里面,容器启动的时候直接生效,免去不少重启或者命令行这类的操做
# 注意替换中文区域的内容



version: '3.6'
services:
 gitlab:
 container_name: gitlab
 image: gitlab/gitlab-ce:latest
 restart: always
 environment:
 GITLAB_OMNIBUS_CONFIG: | external_url 'https://code.crper.com' unicorn['worker_timeout'] = 60 unicorn['worker_processes'] = 2 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtpdm.aliyun.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "crperx@aliyun.com" gitlab_rails['smtp_password'] = "Qwe456jkl?Asd789iop?" gitlab_rails['smtp_domain'] = "smtpdm.aliyun.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true gitlab_rails['gitlab_email_enabled'] = true gitlab_rails['gitlab_email_from'] = 'crperx@aliyun.com' gitlab_rails['gitlab_email_display_name'] = 'noreply@aliyun.com' gitlab_rails['gitlab_shell_ssh_port'] = 22 user['git_user_email'] = "crperx@aliyun.com" nginx['enable'] = true nginx['client_max_body_size'] = '250m' nginx['redirect_http_to_https'] = true nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.crt" nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.key" nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256" nginx['ssl_prefer_server_ciphers'] = "on" nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2" nginx['ssl_session_cache'] = "builtin:1000 shared:SSL:10m" nginx['listen_addresses'] = ["0.0.0.0"] nginx['http2_enabled'] = true  ports:
 - "80:80"
 - "443:443"
 - "22:22"
 volumes:
 - "/srv/gitlab/config:/etc/gitlab"
 - "/srv/gitlab/logs:/var/log/gitlab"
 - "/srv/gitlab/data:/var/opt/gitlab"
 gitlab-runner:
 image: gitlab/gitlab-runner:alpine


复制代码

官方资源:

错误汇总

  • [emerg] SSL_CTX_use_PrivateKey_file("/etc/gitlab/ssl/gitla.key") failed (SSL: error:02001002:system library:fopen:No such file or directory

这个是你映射的路径或者文件名字没匹配(读取文件)报错

  • 443 failed (97: Address family not supported by protocol)

官方的写法

# gitlab官方教材
nginx['listen_addresses'] = ["0.0.0.0", "[::]"] # listen on all IPv4 and IPv6 addresses

# 手动改成

nginx['listen_addresses'] = ["0.0.0.0"]


# [::] 表明IPV6 , 我用的是阿里云服务器,估计是个人安全策略没开放,可是没用到,直接删了也没所谓了
# 阿里云的安全策略有最高级的优先权,好比入站出站的端口开放,不开是无法访问的

复制代码

总结

  • Gitlab目前最新版(11)集成了部分中文(在用户中心更改下语言为简体中文便可)
  • 证书服务不必定要用阿里的,也能够用一些提供免费证书的网站

Gitlab对资源的要求不低.我单核|2G运存|1M带宽时不时的无响应...官推最低配置双核|4G运存

极度扎心,因此对于CI/CD(持续化集成)只能等有闲钱升级服务器再考虑了....

由于最初的考虑是,把一些经常使用的服务都容器化,统一用nginx代理服务

Docker Compose编排好比yapi,gitlab,测试网站这些.....

对于有不对之处尽请留言,会及时修正,谢谢阅读

相关文章
相关标签/搜索