動態

詳情 返回 返回

Ubuntu服務器上使用docker-compose部署 gitlab(圖文並茂記錄) - 動態 詳情

為何使用docker-compose進行GitLab的部署安裝

原因:docker-compose便於對GitLab 容器進行資源控制進行(如優化節省服務器資源、便捷刪除等)

GitLab本身是一個笨重的應用服務,一般來説,需要4核CPU和8GB內存才能正常運行,再低一些也行,不過需要把gitlab自帶的一些功能服務給進行優化,比如有:

    1. Puma Worker Processes(處理HTTP請求,網頁訪問、API調用等)調低一些
    1. Sidekiq Max Concurrency (後台任務併發)也調低一些
    1. Prometheus Monitoring(監控系統)直接關掉——監控系統方案有很多,不用也無妨,甚至可以直接使用命令行查看監控
    1. 數據庫優化(減少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

筆者關閉了註冊功能,只能通過邀請...
user avatar toopoo 頭像 yqyx36 頭像 joe235 頭像 rk405264704 頭像 user_ze46ouik 頭像 mi2nagemao 頭像 guoduandemuer 頭像 79px 頭像 limingxin 頭像 caigaobadoudetangyuan 頭像 baidusecrity 頭像 spacewander 頭像
點贊 17 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.