Docker折腾记: (3)Docker Compose构建Gitlab,从配置(https,邮箱验证)到基本可用
前言
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
: 容器在后台运行并输出容器IDpublish
: 就是暴露端口,简写-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: gitlabimage: gitlab/gitlab-ce:latestrestart: alwaysenvironment: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=5869705gitlab_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
控制台,一种就是打开网站去注册了,前者如下,后者不用说
- 进入
Gitlab
容器 - 执行
gitlab-rails console
进入到gitlab
控制台 - 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 ps
和docker 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: gitlabimage: gitlab/gitlab-ce:latestrestart: alwaysenvironment:GITLAB_OMNIBUS_CONFIG: |external_url 'https://code.crper.com'unicorn['worker_timeout'] = 60unicorn['worker_processes'] = 2gitlab_rails['smtp_enable'] = truegitlab_rails['smtp_address'] = "smtpdm.aliyun.com"gitlab_rails['smtp_port'] = 465gitlab_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'] = truegitlab_rails['smtp_tls'] = truegitlab_rails['gitlab_email_enabled'] = truegitlab_rails['gitlab_email_from'] = 'crperx@aliyun.com'gitlab_rails['gitlab_email_display_name'] = 'noreply@aliyun.com'gitlab_rails['gitlab_shell_ssh_port'] = 22user['git_user_email'] = "crperx@aliyun.com"nginx['enable'] = truenginx['client_max_body_size'] = '250m'nginx['redirect_http_to_https'] = truenginx['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'] = trueports:- "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
官方资源:
- 主流的
STMP
服务配置 gitlab nginx
配置- 全局配置文件(
gitlab.rb
)
错误汇总
- [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)集成了部分中文(在用户中心更改下语言为简体中文即可)- 证书服务不一定要用阿里的,也可以用一些提供免费证书的网站
- Lets Encrypt / Free SSL : 当然一分钱一分货,付费的安全性肯定比免费的高~~
Gitlab
对资源的要求不低.我单核|2G运存|1M带宽
时不时的无响应…官推最低配置双核|4G运存
极度扎心,所以对于CI/CD
(持续化集成)只能等有闲钱升级服务器再考虑了…
因为最初的考虑是,把一些常用的服务都容器化,统一用nginx
代理服务
用Docker Compose
编排比如yapi
,gitlab
,测试网站这些…
对于有不对之处尽请留言,会及时修正,谢谢阅读
Docker折腾记: (3)Docker Compose构建Gitlab,从配置(https,邮箱验证)到基本可用相关推荐
- 从零开始一步一步搭建Ubuntu Server服务器、修改数据源、安装Docker、配置镜像加速器、Compose部署Gitlab服务
场景 最终目的是使用Docker Compose部署一个Gitlab服务. 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程 ...
- Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程)
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- Docker最全总结,DockerFile,Docker编排容器,Docker镜像,Docker-compose构建
文章目录 Docker 简介 为什么使用docker: Docker引擎: Docker系统镜像: Docker容器: Docker仓库: ubuntu安装docker: ubuntu脚本自动安装: ...
- docker基础入门和docker compose实战
Docker运维部署 docker官网:https://www.docker.com/ 文档:https://docs.docker.com/ Docker的文档是超级详细的! 仓库:https:// ...
- Docker容器虚拟化技术---Docker运维管理(Docker Compose)4
Docker容器虚拟化技术-Docker运维管理(Docker Compose)4 Docker Compose 通过前面的讲解我们知道使用一个Dockerfile模板文件,可以很方便地定义一个单独的 ...
- Docker基础、利用Docker Compose部署Vue项目
前言 最近,接触了Docker,写一个笔记记录一下学习的成果.参考了docker官网和一个b站老师的讲解教程Docker快速上手教程,受益良多! 一.Docker安装和重要概念 1.安装docker ...
- Docker实现SpringBoot项目的快速构建(二)
目录 前言 本章节技术栈 1.通过docker-compose实现快速环境搭建 1.1.编写docker-compose.yml 1.2.docker-compose安装与使用 1.2.1.docke ...
- linux docker查找镜像文件,搜索/下载/构建自定义/删除Docker镜像,运行和删除Docker容器的方法...
本文为你介绍的内容是Docker入门相关的操作方法:搜索Docker镜像.下载Docker镜像.运行Docker容器.构建自定义Docker镜像.删除容器.删除Docker镜像.以下给出的所有步骤均在 ...
- 这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操
文章目录 一.Compose简介 1.在Compose中有两个重要的概念 2.docker,dockerfile与docker-compose区别 二.Compose安装与卸载 1.Centos系统安 ...
最新文章
- 学习使用Bing Maps Silverlight Control(五):离线使用和自定义地图模式
- ZwQueryVirtualMemory暴力枚举进程模块
- python词汇-基本 Python 词汇
- bzoj3993 [SDOI2015]星际战争
- Newtonsoft.Json的简单使用
- 【图文详解】Mysql8.0安装教程
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...
- libpng warning: iCCP: known incorrect sRGB profile
- 计算机常用技巧及快捷键
- 思达报表工具Style Report基础教程—创建一个多数据块的联合(Union)、镜像(Mirror)...
- Flask 框架 是 Python 中最流行的 Web 框架之一
- python 指定时间内_python获取指定时间段内的随机不重复的时间点
- 商业数据可视化分析工具
- 用互联网大脑模型分析滴滴的战略意图和战术失误
- xss.haozi靶场练习记录
- PBOC/EMV之持卡人验证
- JSP网站开发技术两种模式介绍
- android 音频在手机上测试播放不流畅问题
- 记:.net中海关终端节点报文加签与推送
- Oracle-1 - :超级适合初学者的入门级笔记,CRUD,事务,约束 ......
热门文章
- 从月薪2千到2万,我总结了100道经典面试题剖析及指南,借鉴
- 24页下载 | 5G+智慧地铁白皮书
- MySQL安装与使用(Windows)
- Unity灯光、烘焙小结(五)Unity官方场景(PBR材质)制作经验总结
- 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
- 微信useragent java_微信内置浏览器UserAgent的判断
- Google App Engine 入门(中文教程)(一)
- HashMap,Hashtable,ConcurrentHashMap
- 函数指针和函数指针数组
- C语言里的函数指针、指针数组和函数指针数组