前言

最近折腾了一番自建 gitlab,在此做个记录,供君参考。整个构建过程基于 Docker Swarm(近期有计划将微服务移植到 Kubernetes,但还没倒腾顺手,暂时先沿用旧的方案),主题配图与主题无关,请忽略......

1. 快速启用

配置的一般原则是先可用再优化,简单启动 gitlab 只需要一条命令:

sudo docker run --detach \
--hostname gitlab.yuclk.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /mnt/nas/gitlab/config:/etc/gitlab \
--volume /mnt/nas/gitlab/logs:/var/log/gitlab \
--volume /mnt/nas/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest

然后就功能而言只差配置邮箱这么一步了,通过 docker exec -it 进入容器,修改 /etc/gitlab/gitlab.rb,添加如下配置:

# SMTP
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = 'smtp.exmail.qq.com'
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = 'gitlab@youclk.com'
gitlab_rails['smtp_password'] = '******'
gitlab_rails['smtp_domain'] = 'smtp.qq.com'
gitlab_rails['smtp_authentication'] = 'login'
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'peer' # If your SMTP server does not like the default 'From: gitlab@localhost' you
# can change the 'From' with this setting.
gitlab_rails['gitlab_email_from'] = 'gitlab@youclk.com'
# gitlab_rails['gitlab_email_reply_to'] = 'noreply@youclk.com'

接着使用以下命令让配置生效:

gitlab-ctl reconfigure
gitlab-ctl restart

最后就可以进入 gitlab 控制台测试发送邮件:

gitlab-rails console
Notify.test_email('destination_email@address.com', 'Message Subject', 'Message Body').deliver_now

除此之外还有两种配置方式,例:

sudo docker run \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://my.domain.com/'; gitlab_rails['lfs_enabled'] = true;"
sudo docker run -e GITLAB_CDN_HOST=gitlab.youclk.com

以上只是简写示例,我个人并不推荐后面两种,虽然通过环境变量设置具有更高的自由度,但是配置太多了,我还是更倾向替换或者挂载配置文件的方式。

通过以上配置之后整个 gitlab 的基本功能都可用了(CI/CD 日后有空再折腾)。

2. 集成到 swarm

这一步只需要准备两个编排文件,proxy:

version: '3.5'
services:
proxy:
image: vfarcic/docker-flow-proxy:18.04.06-12
ports:
- 80:80
networks:
- proxy
environment:
- LISTENER_ADDRESS=swarm-listener:18.04.06-12
- MODE=swarm
secrets:
- dfp_users_monitoring
deploy:
labels:
- com.df.notify=true
- com.df.port=8080
- com.df.serviceDomain=localhost
- com.df.reqPathSearchReplace=/alive,/v1/docker-flow-proxy/ping
restart_policy:
condition: any
max_attempts: 3
update_config:
delay: 5s
order: start-first swarm-listener:
image: vfarcic/docker-flow-swarm-listener:18.04.12-7
networks:
- proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DF_NOTIFY_CREATE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/reconfigure
- DF_NOTIFY_REMOVE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/remove
deploy:
placement:
constraints: [node.role == manager]
restart_policy:
condition: any
max_attempts: 3
update_config:
delay: 5s
order: start-first networks:
proxy:
external: true
secrets:
dfp_users_monitoring:
external: true

gitlab:

version: '3.5'
services:
gitlab:
image: gitlab/gitlab-ce
hostname: gitlab.youclk.com
networks:
- proxy
- youclk
ports:
- 2289:22
volumes:
- /mnt/nas/gitlab/config:/etc/gitlab
- /mnt/nas/gitlab/logs:/var/log/gitlab
- /mnt/nas/gitlab/data:/var/opt/gitlab
deploy:
mode: replicated
labels:
- com.df.notify=true
- com.df.port=80
- com.df.serviceDomain=gitlab.youclk.com
restart_policy:
condition: any
max_attempts: 3
update_config:
delay: 5s
order: start-first networks:
proxy:
external: true
youclk:
external: true

然后依次启用即可,例:

# create infrastructure
echo "youclk:****" | docker secret create dfp_users_monitoring -
docker network create --driver overlay proxy
docker network create --driver overlay youclk # startup
docker stack deploy -c src/docker-compose-proxy.yml proxy
docker stack deploy -c src/docker-compose-gitlab.yml gitlab

第一步优化完毕,如果不希望太折腾的话到这就可以结束了,服务的可用性方面不会有太大影响。

3. 分离缓存与数据库

我不知道 gitlab 为什么不进一步提供纯净版的镜像,而且官方推荐 omnibus 的安装方式,反正我至少不喜欢把数据库和缓存都集成到一个镜像里面,预期是构建一个子镜像并移除 nginx、postgreSQL、redis。经过一番揪心地测试之后,还是得说可惜,浪费了不少时间却没有顺利达到目的,最后只能按照官方推荐的在配置文件中禁用 postgreSQL 和 redis。

首先准备一份 db 的编排文件:

version: '3.5'
services:
redis:
image: redis
networks:
- proxy
- youclk
ports:
- 6379:6379
deploy:
restart_policy:
condition: any
max_attempts: 3
update_config:
delay: 5s
order: start-first postgresql:
image: postgres
networks:
- proxy
- youclk
ports:
- 5432:5432
volumes:
- /mnt/nas/db/postgresql:/var/lib/postgresql
- $PWD/src/postgresql.conf:/etc/postgresql/postgresql.conf
deploy:
labels:
- com.df.notify=true
- com.df.port=5432
restart_policy:
condition: any
max_attempts: 3
update_config:
delay: 5s
order: start-first
networks:
proxy:
external: true
youclk:
external: true

注意,postgreSQL 默认是禁用远程连接的,需要修改 /etc/postgresql/postgresql.conf,反正是内网用,允许所有 ip 就好了 listen_addresses = '*',获取配置文件的方式:

docker run -i --rm postgres cat /usr/share/postgresql/postgresql.conf.sample > my-postgres.conf

然后就像我编排文件中示例,挂载上去就行了。

postgreSQL 默认的用户名、密码、初始数据库都是 postgres,可以通过设置环境变量更改默认配置:

environment:
- POSTGRES_PASSWORD=mysecretpassword
- POSTGRES_USER=myuser
- POSTGRES_DB=mydb

最后就是就是修改 gitlab 的配置文件了:

# redis
redis['enable'] = false # Redis via TCP
gitlab_rails['redis_host'] = 'redis'
gitlab_rails['redis_port'] = 6379 # Disable the built-in Postgres
postgresql['enable'] = false # Fill in the connection details for database.yml
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
gitlab_rails['db_host'] = 'postgresql'
gitlab_rails['db_port'] = 5432
gitlab_rails['db_username'] = 'postgres'
gitlab_rails['db_password'] = 'postgres'
gitlab_rails['db_database'] = 'postgres'

第二步优化到此结束,启动命令:

cp gitlab.rb /mnt/nas/gitlab/config/gitlab.rb
docker stack deploy -c src/docker-compose-gitlab.yml gitlab

4. 启用 SSL

如果你的情况完全符合官方文档推荐的场景,那很简单:

external_url "https://gitlab.youclk.com"
nginx['redirect_http_to_https'] = true mkdir -p /etc/gitlab/ssl
chmod 700 /etc/gitlab/ssl
cp gitlab.youclk.com.key gitlab.youclk.com.crt /etc/gitlab/ssl/

但一般情况下在微服务中证书呀、负载均衡呀、网关呀等都是属于外围的基础设施了,不会和应用挂钩,这种情况下更简单,因为,完全不需要任何配置。

5. 强迫症的救赎

上一节提到在目前的微服务环境下启用 SSL 不需要任何配置,那我写这节干嘛?脑残吗?好吧,是脑残,而且是添加了强迫症的脑残,先放一张图:

逼死强迫症的是什么,各位能懂吗?也许这辈子都不会用到使用 HTTP 去 clone 代码,但哥哥就是受不了这个提示,一想起来就头皮发麻,宛如被一万头草泥马来回碾压。

这个小问题让我吃不香,睡不着,都胖了好几斤,我必须要解决他。然后,我不知道当时的状态是不是已经已经在阿鼻地狱的边缘,我最开始想到的是从源代码中去寻找这个提示的逻辑,强行改成 HTTPS(失败);注入一段 js 去修改提示(有修改的延迟,仍然无法忍受);修改 nginx 的配置文件(成功)。

最后的方案是先设置 external_url 为 https(这个绕不过去),然后因为负载均衡过来的的只有 http,所以先代理到 https ,再回到 http(也可以不回),就为了抵消 external_url 的配置,最后修改下请求头就行了:

proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;

现在是不是舒服多了...以上一番测试差不多花了一天的时间,就为了这么个小玩意儿,但无论怎么样,最后有结果了还是能稍感欣慰的。

但,你以为就这么结束了吗,不,当我重新回顾了一下参考文档后,我发现了这么一段提示:

# Other bundled components (Registry, Pages, etc) use a similar strategy for proxied SSL. Set the particular component's *_external_url with https:// and prefix the nginx[...] configuration with the component name. For example, for Registry use the following configuration:

registry_external_url 'https://registry.example.com'

registry_nginx['listen_port'] = 80
registry_nginx['listen_https'] = false

于是,我尝试着修改成这样子:

external_url 'https://gitlab.youclk.com'
nginx['listen_port'] = 80
nginx['listen_https'] = false

效果完全一致,这时候宛如被好几万头草泥马来回碾压,我当初为什么就没有把参考文档拉到最后面,忙活一整天却闹了个大笑话,血淋淋的教训!

结语

周六经过这么一番折腾本就很丧,又碰上 mac 扬声器坏了,心情一撸到底。然后就想着怎么去调节一下,好嘛,这一想,又冒出一堆负能量。

不知道有多少人会像我一样常常被 “自己” 掣肘,在内心层面我不算是一个很宅的人,我不喜欢呆在家里,我总是和很多人谈诗和远方,但,只局限于谈。一方面大块时间的浪费常常给我带来负罪感,因此我很少能玩得尽兴;另一方面,对于每月结余都是负数的资产状况,偶尔还得厚着脸皮问家里要,我不知道我还有什么资格去追求些什么?

想了一晚上,周日早上五点钟起来,买了张动车票准备去上海散散心,好嘛,忘了地铁没那么早开呀,又舍不得打的(备感凄惨),只能等到点了排队去改签(还跟插队的吵了一架,理直气壮地要插我前面,还有傻X帮忙维护,我也是见什么鬼了)... 虽过程曲折,但结果总归不是太糟,被陆家嘴那一堆建筑震撼之后也不再那么消极了。最后,去了上海中心大厦的顶楼,在那点了杯咖啡,打了一天代码,晚上七点钟返回~


我的公众号《有刻》,我们共同成长!

自建 Gitlab (邮箱配置、拆分 PostgreSQL、Redis) + 随想的更多相关文章

  1. Gitlab邮箱配置

    一些动作会自动发邮件,比如合并代码等 未验证

  2. 4、git和gitlab的配置(1)

    4.0.服务器说明: 服务器名称 ip地址 controller-node1 172.16.1.90 4.1.git介绍: 1.git分布式图: 2.git区域: 3.四种状态: 上面的操作在工作目录 ...

  3. gitlab发送邮件配置

    在使用gitlab过程中,通常需配置邮件来实现代码管理服务器向成员(member)发送邮件.本文将实现gitlab中邮件配置 1.编辑 /etc/gitlab/gitlab.rb,修改配置邮件,这里以 ...

  4. [ci]gitlab安装配置(含gitlab邮件配置)

    gitlab安装配置 参考: https://www.unixhot.com/article/48 原则:简单维护为准,故yum安装gitlab 1,gitlab安装 2,gitlab邮箱配置 1,g ...

  5. CentOS7安装GitLab、汉化、邮箱配置及使用

    同步首发:http://www.yuanrengu.com/index.php/20171112.html 一.GitLab简介 GitLab是利用Ruby On Rails开发的一个开源版本管理系统 ...

  6. gitlab 阿里邮箱配置

    gitlab 阿里邮箱配置 # gitlab_rails['smtp_user_name'] = "smtp user"# gitlab_rails['smtp_password' ...

  7. gitlab服务器邮箱配置

    如想用 SMTP 代替 Sendmail 发送email,添加如下相应邮箱服务商的配置到/etc/gitlab/gitlab.rb, 然后运行gitlab-ctl reconfigure使修改生效. ...

  8. CentOS7安装GitLab、汉化、邮箱配置及使用(转载)

    同步首发: https://www.cnblogs.com/heyonggang/p/7778203.html http://www.yuanrengu.com/index.php/20171112. ...

  9. gitlab的配置

    一. 管理员配置 gitlab 1. 登录 gitlab 等待 docker 容器启动完成后, 登陆 http://localhost:8080 第一次访问是让我们修改管理员密码.如下所示 初始化 g ...

随机推荐

  1. CentOS 安装开发环境 并安装coTurn

    从官网 https://www.centos.org/download/ 下载镜像文件 从163的镜像站点下载,速度较快 http://mirrors.163.com/centos/7/isos/x8 ...

  2. Linux如何查看YUM的安装目录

    Linux下如何查看使用YUM安装过的包的安装路径呢? 在搞清楚这个问题前,我们先来了解一下YUM. YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和R ...

  3. c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法

    通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值 ...

  4. IIS下MySQL停止和启动的方法

    mysql服务的启动与停止:点击开始--运行,输入services.msc , 在弹出的服务窗口中,找到mysql服务,直接点击左侧对应  的就可以了 如下图所示:

  5. CSS2属性选择器和css3选择器的用法和区别

    兄弟们,这是我第一次写博客,希望对进来的人有用,写的不好别喷哈,谢谢. css2属性选择器: 1.[attribute] 例子:   [title] 解释:   选择含有  title  属性的所有元 ...

  6. 【2018.05.11 智能驾驶/汽车电子】非技术向:关于Simulink和AutoSar的几种观点

    最近看到几篇关于Simulink及AutoSar的Blog和Paper,感觉比较有意思,转载备忘之. 1. 看衰Simulink及AutoSar From:Tumiz的技术天地 https://blo ...

  7. February 16th, 2018 Week 7th Friday

    Full of luck, health and cheer. We wish you a Happy Chinese New Year! 春节快乐,万事如意! From Shanbay. Today ...

  8. February 13th, 2018 Week 7th Tuesday

    You are your greatest asset. 你就是你自己最大的资本. For most of us, there are few things that we can count on ...

  9. 新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo

    新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo ...

  10. js判断是否是移动端自动跳转到wap页面代码

    <script type="text/javascript"> function is_mobile(){ var regex_match=/(nokia|iphone ...