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

简介: gitlab 11.1内置了CI/CD,这个特性从gitlab 8+就开始有了,不过配置比较琐碎经过几个大版本的迭代,现在已经简化了使用方式,也修复了一些坑,这个特性大大吸引了我;


前言


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

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


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

所以对于好东西不拿来用太对不起自己,于是开始了漫漫的爬坑之路;


由于东西是部署在公司内的,所以就不开放访问了,但是可以参考下我的大体配置;


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


前置基础


基础环境


  • Debian Linux 9
  • Docker 18.06,gitlab镜像用的gitlab官方提供的gitlab-ce,好处如下
  • 官方的,用的放心,更新频率高(能与时俱进) - 这个教程用的是当前最新的11.1
  • 一键安装(因为类似postgresql,ruby,nginx)这类的基础的环境都包括进去了
  • 只暴露主配置文件/数据库存放位置/还有日志,


  • 升级不用考虑数据的问题;对于业务不是很复杂的公司.能快速部署....


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

有专业的运维和公司不缺钱的大佬可以折腾


必备知识


Linux/Docker && Docker Compose / Nginx


效果图





构建启动


这块的知识并不是gitlab,还是docker


  • 官方教程的基本启动姿势:


  • 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容器


  1. 执行gitlab-rails console进入到gitlab控制台


  1. 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 , 我用的是阿里云服务器,估计是我的安全策略没开放,但是没用到,直接删了也没所谓了
# 阿里云的安全策略有最高级的优先权,比如入站出站的端口开放,不开是没法访问的


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第20天】 在微服务架构日益普及的今天,Docker作为其重要的实现技术之一,承载着大量应用的运行。然而,随之而来的是对于容器健康状态、资源使用情况以及性能指标的监控需求急剧增加。本文旨在探讨构建一个高效且稳定的Docker容器监控体系,不仅涵盖了监控工具的选择与配置,还详细阐述了监控数据的分析与处理流程。通过精心设计的监控策略和实时响应机制,我们能够确保系统的稳定性,并及时发现及处理潜在的问题。
|
4天前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第17天】在当今云计算和微服务架构的大潮中,Docker容器化技术和Kubernetes容器编排系统成为了后端开发领域的热门技术栈。本文将探讨如何通过Docker和Kubernetes的结合使用来构建一个高效、可扩展且易于管理的微服务环境。我们将从基础概念出发,深入到实际操作层面,最后讨论这种组合对持续集成和持续部署(CI/CD)流程的影响,旨在为开发者和企业提供一种可靠的后端服务解决方案。
|
6天前
|
存储 前端开发 JavaScript
基于 GitHub Workflow和 Docker 构建 NextJS
基于 GitHub Workflow和 Docker 构建 NextJS
9 0
|
6天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第14天】 在现代微服务架构中,Docker容器作为应用部署的基本单元,其运行状态的监控对于保障系统稳定性和性能至关重要。本文将探讨如何构建一个高效且稳定的Docker容器监控体系,涵盖监控工具的选择、关键指标的采集、数据可视化以及告警机制的设计。通过对Prometheus和Grafana的整合使用,实现对容器资源利用率、网络IO以及应用健康状态的全方位监控,确保系统的高可用性和故障快速响应。
|
6天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第13天】在微服务架构和容器化部署日益普及的背景下,对Docker容器的监控变得尤为重要。本文将探讨一种构建高效稳定Docker容器监控体系的方法,通过集成Prometheus和cAdvisor工具,实现对容器资源使用情况、性能指标和运行状态的实时监控。同时,结合Grafana进行数据可视化,为运维人员提供直观的分析界面,以便及时发现和解决潜在问题,保障系统的高可用性和稳定性。
31 6
|
6天前
|
运维 安全 API
构建高效自动化运维体系:Ansible与Docker的协同实践
【5月更文挑战第13天】在现代IT基础设施管理中,自动化运维已成为提升效率、确保一致性和降低人为错误的关键。本文通过深入探讨Ansible和Docker的集成实践,揭示了如何构建一个灵活、可扩展且高效的自动化运维体系。我们将从理论到实践,展示如何利用这两种技术实现自动化部署、管理和扩展应用服务,以及它们如何帮助运维团队应对快速变化的业务需求和复杂的IT环境。
31 1
|
6天前
|
jenkins 持续交付 API
上传gitlab代码后jenkins自动进行发布的配置
上传gitlab代码后jenkins自动进行发布的配置
15 1
|
6天前
|
安全 网络协议 应用服务中间件
一文读懂HTTPS⭐揭秘加密传输背后的原理与Nginx配置攻略
一文读懂HTTPS⭐揭秘加密传输背后的原理与Nginx配置攻略
|
6天前
|
存储 机器学习/深度学习 中间件
快速上手 Elasticsearch:Docker Compose 部署详解
本文介绍了如何使用Docker Compose快速搭建Elasticsearch学习环境。Elasticsearch是一款用于实时搜索和分析的分布式中间件,适用于多种场景,如搜索、日志分析、机器学习等。首先,创建docker网络,拉取最新版8.12.2镜像。接着,编写docker-compose.yml文件,配置单节点集群,设置端口映射、内存限制及数据卷挂载。然后,创建并配置数据卷目录,允许远程访问和跨域。最后,启动服务并验证,通过浏览器访问确认服务运行正常。本文为初学者提供了一个简便的Elasticsearch部署方法。
265 4
快速上手 Elasticsearch:Docker Compose 部署详解
|
6天前
|
存储 数据可视化 数据安全/隐私保护
使用 Docker Compose 部署 Docker Registry
【1月更文挑战第2天】 在内网环境中,我们期望能够在本地共享镜像。为了解决这一问题,Docker Registry成为了我们的救星。Docker Registry是一个用于存储和管理Docker镜像的开源工具。通过在本地部署Docker Registry,您可以轻松地构建、存储和分享自己的Docker镜像。
174 3
使用 Docker Compose 部署 Docker Registry