為何使用docker-compose進行GitLab的部署安裝
原因:docker-compose便於對GitLab 容器進行資源控制進行(如優化節省服務器資源、便捷刪除等)
GitLab本身是一個笨重的應用服務,一般來説,需要4核CPU和8GB內存才能正常運行,再低一些也行,不過需要把gitlab自帶的一些功能服務給進行優化,比如有:
-
Puma Worker Processes(處理HTTP請求,網頁訪問、API調用等)調低一些
-
Sidekiq Max Concurrency(後台任務併發)也調低一些
-
Prometheus Monitoring(監控系統)直接關掉——監控系統方案有很多,不用也無妨,甚至可以直接使用命令行查看監控
-
- 數據庫優化(減少PostgreSQL緩衝區)、Redis內存限制(限制緩存使用)、郵件功能關閉、Gitaly優化、Git操作限制等...
編寫docker-compose.yml
比如這裏是使用12345端口作為http,使用12346端口作為ssh
# version: '3.6' # 筆者的是Docker Compose V2 所以不用版本號了
services:
web:
image: 'gitlab/gitlab-ce:latest'
container_name: gitlab-play
restart: always
hostname: '15.201.99.306'
environment:
GITLAB_OMNIBUS_CONFIG: |
# === 基礎訪問配置 ===
external_url 'http://15.201.99.306:12345'
gitlab_rails['gitlab_shell_ssh_port'] = 12346
# === 郵件功能配置 ===
# 默認值: true,優化後: false,節省內存: ~50-100MB
gitlab_rails['incoming_email_enabled'] = false # 關閉郵件接收功能
gitlab_rails['outgoing_email_enabled'] = false # 關閉郵件發送功能
# === 認證配置 ===
# 默認值: false,保持關閉狀態,避免額外內存開銷: ~30-50MB
gitlab_rails['ldap_enabled'] = false # 關閉LDAP認證
# === 核心資源優化配置 ===
# 默認值: 根據CPU核心數自動計算(通常4-8個),優化後: 1,節省內存: ~200-400MB
puma['worker_processes'] = 1
# 默認值: 25,優化後: 3,節省內存: ~150-300MB
sidekiq['max_concurrency'] = 3
# === 關閉監控組件以節省資源內存 ===
# 以下監控組件默認都是 true,全部關閉後總共節省內存: ~800MB-1.2GB
prometheus_monitoring['enable'] = false # 默認: true,節省: ~200-300MB
node_exporter['enable'] = false # 默認: true,節省: ~50-100MB
redis_exporter['enable'] = false # 默認: true,節省: ~30-50MB
postgres_exporter['enable'] = false # 默認: true,節省: ~30-50MB
gitlab_exporter['enable'] = false # 默認: true,節省: ~50-100MB
alertmanager['enable'] = false # 默認: true,節省: ~100-150MB
# === 數據庫優化以節省資源內存 ===
# 默認值: "256MB",優化後: "128MB",節省內存: ~128MB
postgresql['shared_buffers'] = "128MB"
# 默認值: 8,優化後: 2,節省內存: ~50-100MB
postgresql['max_worker_processes'] = 2
# === 額外的內存優化配置 ===
# 默認值: 300MB,優化後: 200MB,節省內存: ~100MB
gitaly['ruby_max_rss'] = 200000000 # 限制Gitaly Ruby進程最大內存使用(200MB)
# 內存分配器優化,加快內存回收,節省內存: ~50-100MB
gitlab_rails['env'] = {
'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000'
}
# === Git操作併發限制 ===
# 默認值: 20,優化後: 3,節省內存: ~100-200MB
gitaly['concurrency'] = [
{
'rpc' => "/gitaly.SmartHTTPService/PostReceivePack",
'max_per_repo' => 3 # 限制每個倉庫的併發推送操作
}, {
'rpc' => "/gitaly.SSHService/SSHUploadPack",
'max_per_repo' => 3 # 限制每個倉庫的併發拉取操作
}
]
# === Redis優化配置 ===
# 默認值: 無限制,優化後: 256MB,節省內存: ~100-200MB
redis['maxmemory'] = "256mb"
redis['maxmemory_policy'] = "allkeys-lru" # 內存不足時刪除最少使用的鍵
# === Unicorn/Puma額外優化 ===
# 默認值: 8,優化後: 4,節省內存: ~100-150MB
puma['max_threads'] = 4
# 默認值: 60秒,優化後: 30秒,更快釋放空閒連接
puma['worker_timeout'] = 30
# === 關閉不必要的服務 ===
# 默認值: true,優化後: false,節省內存: ~50-100MB
registry['enable'] = false # 關閉Docker Registry功能
# 默認值: true,優化後: false,節省內存: ~30-50MB
mattermost['enable'] = false # 關閉Mattermost聊天功能
# 默認值: true,優化後: false,節省內存: ~20-30MB
gitlab_kas['enable'] = false # 關閉Kubernetes Agent功能
# 端口映射
ports:
- "12345:12345" # HTTP訪問端口
- "12346:12346" # SSH訪問端口
# 數據卷映射
volumes:
- './config:/etc/gitlab' # 配置文件目錄
- './logs:/var/log/gitlab' # 日誌目錄
- './data:/var/opt/gitlab' # 數據目錄
# 默認值: 64m,優化後: 512m,為GitLab提供足夠的共享內存
shm_size: '512m'
# 資源限制配置
deploy:
resources:
limits:
# 默認值: 無限制,優化後: 3.5G,為8G服務器預留足夠系統內存
memory: 3.5G
# 默認值: 無限制,優化後: 2.0核,為4核服務器預留CPU資源
cpus: '2.0'
優化總結
# ========================================
# 內存優化總結:
# ========================================
# 1. 關閉監控組件: 節省 ~800MB-1.2GB
# 2. 減少Puma worker進程: 節省 ~200-400MB
# 3. 降低Sidekiq併發: 節省 ~150-300MB
# 4. 數據庫緩衝區優化: 節省 ~128MB
# 5. 關閉郵件功能: 節省 ~50-100MB
# 6. Gitaly內存限制: 節省 ~100MB
# 7. Redis內存限制: 節省 ~100-200MB
# 8. 關閉Registry等服務: 節省 ~100-180MB
# 9. Git操作併發限制: 節省 ~100-200MB
# 10. 其他優化配置: 節省 ~100-200MB
# ========================================
#
# 總計預計節省內存: 1.8GB - 2.8GB
#
# 優化前GitLab默認內存使用: ~4-6GB
# 優化後預計內存使用: ~2-3GB
#
# ========================================
啓動容器——跑GitLab服務
當然,提前安裝好docker和docker compose,執行如下命令,查看版本
然後,把yml文件丟到服務器上,在對應目錄下,執行命令,啓動容器,跑起來GitLab服務
docker compose up -d
- docker compose:調用 Docker Compose v2 插件(v2 版本命令格式為空格分隔,區別於舊版 docker-compose)
- up:用於創建並啓動 docker-compose.yml(或 compose.yml)文件中定義的所有服務(容器、網絡、卷等)
- -d:可選參數,全稱 --detach,表示「後台運行」模式。執行後不會阻塞終端,服務會在後台啓動,終端可繼續輸入其他命令
下載成功以後,gitlab自動會進行初始化,可以執行命令docker logs -f gitlab-play查看輸入日誌,這裏的gitlab-play也就是yml裏面的container\_name
輸出一大堆日誌如下【這個過程有點慢,大概5-10分鐘左右】
當gitlab初始化結束後,我們就可以在瀏覽器中,輸入自己的服務器ip和剛剛設置的端口,比如筆者設置的是12345,進行訪問了,就能夠看到對應頁面了,如下
gitlab初始化慢的原因
- gitlab初始首次啓動需執行大量後台任務
- 比如有:數據庫初始化:創建數百張表、索引和默認數據
- Redis 數據庫初始化:設置緩存結構
- GitLab 服務自檢:Puma、Sidekiq、NGINX、PostgreSQL 等組件逐個啓動並自檢
- 生成 SSH 主機密鑰:RSA、ECDSA、Ed25519 等密鑰生成(耗時)
- 網絡問題、硬盤問題(ssd固態硬盤就快速一些)
修改gitlab默認密碼
首先執行查看命令docker exec gitlab-play cat /etc/gitlab/initial_root_password 注意,gitlab-play是yml文件中定義的,容器名字
然後,輸入用户名密碼 root/umy******************3+nw=進入
密碼文件通常在24小時後會自動刪除,所以得立刻修改
然後點擊左上角的頭像,點擊進入Edit Profile
點擊Password
- 接下來,可以選擇給gitlab配置ssl證書,如果有的話,因為 Git 默認不支持對gitlab使用未加密的http連接
- 或者使用Access Tokens或者改用SSH協議
- 當然也可以使用nginx代理,視情況而定(當然也可以配置host)
給gitlab配置ssl證書
創建對應文件夾,做數據卷的映射
# 數據卷映射(包含SSL證書目錄)
volumes:
- './config:/etc/gitlab' # 配置文件(含ssl子目錄的證書)
- './logs:/var/log/gitlab' # 日誌目錄
- './data:/var/opt/gitlab' # 數據目錄
注意 把ssl證書,存放在config/ssl/ 裏面
對應的,在yml文件中指定對應的證書和私鑰
# === SSL證書配置 ===
nginx['ssl_certificate'] = "/etc/gitlab/ssl/ashuai.site.pem" # 容器內證書路徑
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/ashuai.site.key" # 容器內私鑰路徑
同時hostname: 'ashuai.site'並且external_url 'https://ashuai.site:12345'指定
完整域名docker-compose.yml配置
services:
web:
image: 'gitlab/gitlab-ce:latest'
container_name: gitlab-play
restart: always
hostname: 'ashuai.site'
environment:
GITLAB_OMNIBUS_CONFIG: |
# === 基礎訪問配置(HTTPS + 自定義端口)===
external_url 'https://ashuai.site:12345'
gitlab_rails['gitlab_shell_ssh_port'] = 12346 # SSH端口保持不變
# === SSL證書配置 ===
nginx['ssl_certificate'] = "/etc/gitlab/ssl/ashuai.site.pem" # 容器內證書路徑
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/ashuai.site.key" # 容器內私鑰路徑
# nginx['redirect_http_to_https'] = true # 強制HTTP請求重定向到HTTPS
# === 郵件功能配置 ===
gitlab_rails['incoming_email_enabled'] = false
gitlab_rails['outgoing_email_enabled'] = false
# === 認證配置 ===
gitlab_rails['ldap_enabled'] = false
# === 核心資源優化配置 ===
puma['worker_processes'] = 1
sidekiq['max_concurrency'] = 3
# === 關閉監控組件 ===
prometheus_monitoring['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
gitlab_exporter['enable'] = false
alertmanager['enable'] = false
# === 數據庫優化 ===
postgresql['shared_buffers'] = "128MB"
postgresql['max_worker_processes'] = 2
# === 額外內存優化 ===
gitaly['ruby_max_rss'] = 200000000 # 200MB
gitlab_rails['env'] = {
'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000'
}
# === Git操作併發限制 ===
gitaly['concurrency'] = [
{
'rpc' => "/gitaly.SmartHTTPService/PostReceivePack",
'max_per_repo' => 3
}, {
'rpc' => "/gitaly.SSHService/SSHUploadPack",
'max_per_repo' => 3
}
]
# === Redis優化 ===
redis['maxmemory'] = "256mb"
redis['maxmemory_policy'] = "allkeys-lru"
# === Puma優化 ===
puma['max_threads'] = 4
puma['worker_timeout'] = 30
# === 關閉不必要的服務 ===
registry['enable'] = false
mattermost['enable'] = false
gitlab_kas['enable'] = false
# 端口映射(HTTPS和SSH保持自定義端口,避免衝突)
ports:
- "12345:12345" # HTTPS訪問端口(外部:內部)
- "12346:12346" # SSH訪問端口(外部:內部)
# 數據卷映射(包含SSL證書目錄)
volumes:
- './config:/etc/gitlab' # 配置文件(含ssl子目錄的證書)
- './logs:/var/log/gitlab' # 日誌目錄
- './data:/var/opt/gitlab' # 數據目錄
# 共享內存配置
shm_size: '512m'
# 資源限制
deploy:
resources:
limits:
memory: 3.5G
cpus: '2.0'
最後,就是設置組織羣組、創建項目、正常pull/push代碼了,也就是日常開發了...
A good memory is no substitute for a pen and paper. Let's jot it down...
線上地址
https://ashuai.site:12345/users/sign_in
筆者關閉了註冊功能,只能通過邀請...