自建 Gitlab (郵箱配置、拆分 PostgreSQL、Redis) + 隨想

來源:互聯網
上載者:User

標籤:sse   key   要求標頭   情境   rate   message   前言   img   rect   

前言

最近折騰了一番自建 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,添加如下配置:

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

接著使用以下命令讓配置生效:

gitlab-ctl reconfiguregitlab-ctl restart

最後就可以進入 gitlab 控制台測試發送郵件:

gitlab-rails consoleNotify.test_email('[email protected]', '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-firstnetworks:  proxy:    external: truesecrets:  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-firstnetworks:  proxy:    external: true  youclk:    external: true

然後依次啟用即可,例:

# create infrastructureecho "youclk:****" | docker secret create dfp_users_monitoring -docker network create --driver overlay proxydocker network create --driver overlay youclk# startupdocker stack deploy -c src/docker-compose-proxy.yml proxydocker 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-firstnetworks:  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 TCPgitlab_rails['redis_host'] = 'redis'gitlab_rails['redis_port'] = 6379# Disable the built-in Postgrespostgresql['enable'] = false# Fill in the connection details for database.ymlgitlab_rails['db_adapter'] = 'postgresql'gitlab_rails['db_encoding'] = 'utf8'gitlab_rails['db_host'] = 'postgresql'gitlab_rails['db_port'] = 5432gitlab_rails['db_username'] = 'postgres'gitlab_rails['db_password'] = 'postgres'gitlab_rails['db_database'] = 'postgres'

第二步最佳化到此結束,啟動命令:

cp gitlab.rb /mnt/nas/gitlab/config/gitlab.rbdocker stack deploy -c src/docker-compose-gitlab.yml gitlab
4. 啟用 SSL

如果你的情況完全符合官方文檔推薦的情境,那很簡單:

external_url "https://gitlab.youclk.com"nginx['redirect_http_to_https'] = truemkdir -p /etc/gitlab/sslchmod 700 /etc/gitlab/sslcp 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'] = 80registry_nginx['listen_https'] = false

於是,我嘗試著修改成這樣子:

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

效果完全一致,這時候宛如被好幾萬頭草泥馬來回碾壓,我當初為什麼就沒有把參考文檔拉到最後面,忙活一整天卻鬧了個大笑話,血淋淋的教訓!

結語

周六經過這麼一番折騰本就很喪,又碰上 mac 擴音器壞了,心情一擼到底。然後就想著怎麼去調節一下,好嘛,這一想,又冒出一堆負能量。

不知道有多少人會像我一樣常常被 “自己” 掣肘,在內心層面我不算是一個很宅的人,我不喜歡呆在家裡,我總是和很多人談詩和遠方,但,只局限於談。一方面大塊時間的浪費常常給我帶來負罪感,因此我很少能玩得盡興;另一方面,對於每月結餘都是負數的資產狀況,偶爾還得厚著臉皮問家裡要,我不知道我還有什麼資格去追求些什麼?

想了一晚上,周日早上五點鐘起來,買了張動車票準備去上海散散心,好嘛,忘了地鐵沒那麼早開呀,又捨不得打的(倍感淒慘~),只能等到點了排隊去改簽(還跟插隊的吵了一架,理直氣壯地要插我前面,還有傻X幫忙維護,我也是見什麼鬼了~)... 雖過程曲折,但結果總歸不是太糟,被陸家嘴那一堆建築震撼之後也不再那麼消極了。最後,去了上海中心大廈的頂樓,在那點了杯咖啡,打了一天代碼,晚上七點鐘返回~

我的公眾號《有刻》,我們共同成長!

自建 Gitlab (郵箱配置、拆分 PostgreSQL、Redis) + 隨想

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.