热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自建Gitlab(邮箱配置、拆分PostgreSQL、Redis)+随想

前言最近折腾了一番自建gitlab,在此做个记录,供君参考。整个构建过程基于DockerSwarm(近期有计划将微服务移植到Kubernetes,但还没倒腾顺手,暂时先沿用旧的方案

前言

最近折腾了一番自建 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帮忙维护,我也是见什么鬼了~)... 虽过程曲折,但结果总归不是太糟,被陆家嘴那一堆建筑震撼之后也不再那么消极了。最后,去了上海中心大厦的顶楼,在那点了杯咖啡,打了一天代码,晚上七点钟返回~


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


推荐阅读
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • 深入解析Dubbo:使用与源码分析
    本文详细介绍了Dubbo的使用方法和源码分析,涵盖其架构设计、核心特性和调用流程。 ... [详细]
  • Ubuntu 22.04 安装搜狗输入法详细指南及常见问题解决方案
    本文将详细介绍如何在 Ubuntu 22.04 上安装搜狗输入法,并提供常见问题的解决方法。包括下载安装包、更新源、安装依赖项等步骤。 ... [详细]
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 微服务优雅上下线的最佳实践
    本文介绍了微服务上下线的正确姿势,避免使用 kill -9 等粗暴手段,确保服务的稳定性和可靠性。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • Spring Boot + RabbitMQ 消息确认机制详解
    本文详细介绍如何在 Spring Boot 项目中使用 RabbitMQ 的消息确认机制,包括消息发送确认和消息接收确认,帮助开发者解决在实际操作中可能遇到的问题。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
author-avatar
fuckyourgirlfriend
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有