Thursday, November 21, 2024

[Gitlab] Cài đặt GitLab bằng cách sử dụng Docker Compose

-

Xin chào. Hôm nay mình sẽ chỉ cho bạn cách bạn có thể cài đặt máy chủ GitLab sử dụng Docker Compose.

1. GitLab là gì?

Gitlab là một công cụ hỗ trợ phát triển phần mềm sử dụng quy trình Tích hợp liên tục và Phân phối liên tục. Thành phần chính của nó là hệ thống kiểm soát phiên bản Git. Ngoài ra, nó cung cấp nhiều chức năng hỗ trợ công việc của các lập trình viên trong việc xây dựng liên tục, thử nghiệm và cài đặt tự động các dự án cho các môi trường khác nhau.

2. Docker Compose là gì?

Docker là phần mềm dùng để chạy các ứng dụng trong môi trường ảo hóa. Do đó, chúng ta có thể chạy ứng dụng trong một vùng chứa riêng độc lập với hệ điều hành. Bằng cách này, chúng ta có thể chuẩn bị các môi trường khác nhau bằng các công cụ khác nhau mà không sợ xung đột giữa các phiên bản của thư viện.

3. Cấu hình cho Docker Compose

Mình sẽ bắt đầu công việc cài đặt bằng cách tạo một thư mục để lưu trữ dữ liệu và cấu hình Gitlab. Đầu tiên hãy thư mục chứa thông tin ssl của Gitlab.

mkdir -p /home/share/nginx/ssl/

Trong thư mục ssl hãy đưa file ssl của bạn vào, file ssl của mình có tên hoanghd.com.pem.

$ ll /home/share/nginx/ssl/
total 24
drwxr-xr-x 2 root root  4096 Nov 13 04:55 ./
drwxr-xr-x 3 root root  4096 Nov 13 04:54 ../
-rw-r--r-- 1 root root 12870 Nov 13 04:55 hoanghd.com.pem

Tạo file gitlab-docker-compose.yaml chứa thông tin triển khai gitlab như dưới.

version: '3'
services:
  gitlab1:
    image: gitlab/gitlab-ce:latest
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.hoanghd.com'
        gitlab_rails['time_zone'] = 'Asia/Ho_Chi_Minh'
        # gitlab_rails['gitlab_email_from'] = 'gitlab@hoanghd.com'
        # gitlab_rails['gitlab_email_display_name'] = 'GitLab Administrator'
        # gitlab_rails['gitlab_email_reply_to'] = 'gitlab@hoanghd.com'
        # gitlab_rails['backup_keep_time'] = 14515200
        # gitlab_rails['smtp_enable'] = true
        # gitlab_rails['smtp_address'] = "smtp.hoanghd.com"
        # gitlab_rails['smtp_port'] = 587
        # gitlab_rails['smtp_user_name'] = "gitlab@hoanghd.com"
        # gitlab_rails['smtp_password'] = "changeMeToSomethingGood"
        # gitlab_rails['smtp_domain'] = "hoanghd.com"
        # gitlab_rails['smtp_authentication'] = "login"
        # gitlab_rails['smtp_enable_starttls_auto'] = true
        # unicorn['worker_timeout'] = 60
        # unicorn['worker_processes'] = 3
        logging['logrotate_frequency'] = "weekly"
        logging['logrotate_rotate'] = 52
        logging['logrotate_compress'] = "compress"
        logging['logrotate_method'] = "copytruncate"
        logging['logrotate_delaycompress'] = "delaycompress"
        nginx['listen_port'] = 443
        nginx['redirect_http_to_https'] = true
        nginx['ssl_certificate'] = "/etc/ssl/certs/gitlab/hoanghd.com.pem"
        nginx['ssl_certificate_key'] = "/etc/ssl/certs/gitlab/hoanghd.com.pem"
        nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2"
        nginx['logrotate_frequency'] = "weekly"
        nginx['logrotate_rotate'] = 52
        nginx['logrotate_compress'] = "compress"
        nginx['logrotate_method'] = "copytruncate"
        nginx['logrotate_delaycompress'] = "delaycompress"
    ports:
      - '8443:443'
      - '22:22'
    volumes:
      - /volume_data/conf:/etc/gitlab
      - /home/share/nginx/ssl/hoanghd.com.pem:/etc/ssl/certs/gitlab/hoanghd.com.pem
      - /volume_data/logs:/var/log/gitlab
      - /volume_data/main:/var/opt/gitlab
    networks:
      - gitlab_network

networks:
  gitlab_network:
    driver: bridge
    name: share_default
    ipam:
      config:
        - subnet: "172.18.0.0/16"

Sau khi hoàn thành ta có 1 cây thư mục như dưới

├── gitlab-docker-compose.yaml
├── hoanghd
└── share
    └── nginx
        └── ssl
            └── hoanghd.com.pem

4 directories, 2 files

Do mình sử dụng port 22 cho container chạy gitlab nên mình sẽ thay đổi port ssh mặc định của server host thành 8022. Hãy vào file /etc/ssh/sshd_config bỏ comment phía trước dòng #Port 22 thành Port 8022 hoặc bạn có thể thay đổi nhanh bằng lệnh dưới.

sudo sed -i 's|#Port .*|Port 8022|g' /etc/ssh/sshd_config

Restart lại service ssh

systemctl restart sshd

Verify lại xem port ssh đã thay đổi chưa

$ netstat -tlnp | grep 8022
tcp        0      0 0.0.0.0:8022            0.0.0.0:*               LISTEN      20134/sshd          
tcp6       0      0 :::8022                 :::*                    LISTEN      20134/sshd

Chúng ta triển khai gitlab-docker-compose.yaml. Quá trình triển khải có thể mất ít phút.

$ docker-compose -f gitlab-docker-compose.yaml up -d
[+] Running 7/9
 ⠏ gitlab1 Pulling                                                                                                                                                                                               58.0s
   ⠿ eaead16dc43b Pull complete                                                                                                                                                                                   4.4s
   ⠿ 980a35cadaba Pull complete                                                                                                                                                                                   6.0s
   ⠿ ce88b4809cf9 Pull complete                                                                                                                                                                                   6.2s
   ⠿ 77ead27c47b9 Pull complete                                                                                                                                                                                   6.3s
   ⠿ 21d2f74a5ba5 Pull complete                                                                                                                                                                                   6.5s
   ⠿ cdd3f99acfb7 Pull complete                                                                                                                                                                                   6.6s
   ⠿ 02d60fb8e75b Pull complete                                                                                                                                                                                   6.8s
   ⠴ 334462837fd3 Downloading [============================================>      ]  1.025GB/1.162GB                                                                                                             53.6s

Verify lại kết quả triển khai

$ docker ps
CONTAINER ID   IMAGE                     COMMAND             CREATED         STATUS                   PORTS                                                                                NAMES
2f496872a447   gitlab/gitlab-ce:latest   "/assets/wrapper"   6 minutes ago   Up 6 minutes (healthy)   0.0.0.0:22->22/tcp, :::22->22/tcp, 80/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp   gitlab

Sử dụng lệnh dưới để lấy mật khẩu

$ docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
Password: Vcld07YKNNN2dCbc3Mb9eiYOoRn3Dq0pnBHIIcLP4p8=

Sau khi triển khai xong hãy dùng trình duyệt login vào https://192.168.13.206:8443/ và chúng ta có kết quả như hình, sử dụng username root và mật khẩu đã lấy dược ở bước trên để login vào gitlab.

Lưu ý: Ở file gitlab-docker-compose.yaml nếu ở phần external_url bạn để tên miền (ví dụ https://gitlab.hoanghd.com).

external_url 'https://gitlab.hoanghd.com'

Thì ở phần forward port bạn nên expose ra là 443 để khi login bằng tên miền sẽ không phải điền thêm port phía sau tên miền (ví dụ https://gitlab.hoanghd.com:8443).

ports:
  - '443:443'
  - '22:22'

Dưới đây là kết quả khi mình sử dụng tên miền.

4. Tạo job và push thử job đầu tiên.

Bây giờ mình tạo 1 project để test như dưới.

Thêm sshkey cho gitlab.

Quay lại project của bạn copy link repo, ở đây mình sử dụng ssh để push code.

Trên client mình tạo 1 thư mục test-project và 1 file test.

mkdir test-project
cd test-project/
echo 'Xin chao cac ban' > ./test-project/hoanghd.txt

Sau khi tạo xong thư mục project mình có cây thư mục như dưới.

test-project
    └── hoanghd.txt

1 directories, 1 files

Tiến hành các thao tác dưới để tạo commit đầu tiên.

git init
git config --global user.name "hoanghd"
git config --global user.email "hoanghd164@gmail.com"
git add .
git commit -m "The first commit"

Thêm repo project test của bạn.

git remote add test-project git@192.168.13.206:root/test-project.git

Verify lại repo sau khi đã thêm xong.

$ git remote -v
test-project    git@192.168.13.206:root/test-project.git (fetch)
test-project    git@192.168.13.206:root/test-project.git (push)

Push project lên gitlab.

git push -u --force test-project master

Dưới đây là log của tiến trình push code lên gitlab.

$ git push -u --force test-project master
Counting objects: 3, done.
Writing objects: 100% (3/3), 232 bytes | 232.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 192.168.13.206:root/test-project.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'test-project'.

Chúng ta có kết quả.

5. triển khai Gitlab sử dụng Nginx reverse proxy.

Nếu trên server của bạn có nhiều dịch vụ https chạy port 443, nếu triển khai theo cách trên bạn sẽ bị đụng port với nhiều dịch vụ khác đang chạy https. Cách của mình là sử dụng thêm máy chủ Nginx để reverse proxy, khi đó nginx sẽ lắng nghe port https tất cả các services và chuyển tiếp đến người dùng đầu cuối bằng port 443, khi đó người dùng đầu cuối chỉ cần sử dụng tên miền chứ không cần quan tâm đến port 443 nữa. Cách triển khai như sau:

Đầu tiên hãy tạo các thư mục lưu file config nginx, riêng thư mục lưu file ssl mình sẽ sử dụng thư mục cũ đã tạo ở phần trên.

mkdir -p /home/share/nginx/ssl
mkdir -p /home/share/nginx/conf.d

Tạo file /home/share/nginx/nginx.conf với nội dung như dưới. Ở file này mình đã có 1 số thay đổi khác với file mặc định của Nginx.

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
}

http {
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	include /etc/nginx/mime.types;
	default_type application/octet-stream;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_prefer_server_ciphers on;
	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;
	gzip on;
	include /etc/nginx/conf.d/*.conf;
}

Tạo file /home/share/nginx/conf.d/gitlab.hoanghd.com.conf với nội dung dưới. Hãy thay đổi gitlab.hoanghd.com thành domain của bạn. Phần proxy_pass bạn hãy điền url của Gitlab, ví dụ https://gitlab với gitlab là tên container của Gitlab được tạo ở trong file gitlab-docker-compose.yaml.

server {
    listen 80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

server {
    server_name gitlab.hoanghd.com;
    server_tokens off;

    location / {
        client_max_body_size 0;
        gzip off;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_redirect off;
        proxy_pass https://gitlab;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_http_version 1.1;
    }

    listen 443 ssl;
        ssl_certificate /etc/nginx/ssl/hoanghd.com.pem;
        ssl_certificate_key /etc/nginx/ssl/hoanghd.com.pem;
        ssl_trusted_certificate /etc/nginx/ssl/hoanghd.com.pem;
}

Tạo file gitlab-docker-compose.yaml. Ở file này mình có 1 số thay đổi như sau:

  • Bỏ expose cổng 443 ở service gitlab
  • Thêm service nginx và expose cổng 443 cho service này
version: '3'
services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.hoanghd.com'
        gitlab_rails['time_zone'] = 'Asia/Ho_Chi_Minh'
        # gitlab_rails['gitlab_email_from'] = 'gitlab@hoanghd.com'
        # gitlab_rails['gitlab_email_display_name'] = 'GitLab Administrator'
        # gitlab_rails['gitlab_email_reply_to'] = 'gitlab@hoanghd.com'
        # gitlab_rails['backup_keep_time'] = 14515200
        # gitlab_rails['smtp_enable'] = true
        # gitlab_rails['smtp_address'] = "smtp.hoanghd.com"
        # gitlab_rails['smtp_port'] = 587
        # gitlab_rails['smtp_user_name'] = "gitlab@hoanghd.com"
        # gitlab_rails['smtp_password'] = "changeMeToSomethingGood"
        # gitlab_rails['smtp_domain'] = "hoanghd.com"
        # gitlab_rails['smtp_authentication'] = "login"
        # gitlab_rails['smtp_enable_starttls_auto'] = true
        # unicorn['worker_timeout'] = 60
        # unicorn['worker_processes'] = 3
        logging['logrotate_frequency'] = "weekly"
        logging['logrotate_rotate'] = 52
        logging['logrotate_compress'] = "compress"
        logging['logrotate_method'] = "copytruncate"
        logging['logrotate_delaycompress'] = "delaycompress"
        nginx['listen_port'] = 443
        nginx['redirect_http_to_https'] = true
        nginx['ssl_certificate'] = "/etc/ssl/certs/gitlab/hoanghd.com.pem"
        nginx['ssl_certificate_key'] = "/etc/ssl/certs/gitlab/hoanghd.com.pem"
        nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2"
        nginx['logrotate_frequency'] = "weekly"
        nginx['logrotate_rotate'] = 52
        nginx['logrotate_compress'] = "compress"
        nginx['logrotate_method'] = "copytruncate"
        nginx['logrotate_delaycompress'] = "delaycompress"
    ports:
      - '22:22'
    volumes:
      - /volume_data/conf:/etc/gitlab
      - /home/share/nginx/ssl/hoanghd.com.pem:/etc/ssl/certs/gitlab/hoanghd.com.pem
      - /volume_data/logs:/var/log/gitlab
      - /volume_data/main:/var/opt/gitlab
    networks:
      - gitlab_network

  nginx:
    image: nginx
    container_name: nginx
    restart: unless-stopped
    ports:
      - 443:443
      - 80:80
    volumes:
      - /home/share/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /home/share/nginx/ssl/hoanghd.com.pem:/etc/nginx/ssl/hoanghd.com.pem
      - /home/share/nginx/conf.d:/etc/nginx/conf.d
    links:
      - gitlab
    networks:
      - gitlab_network

networks:
  gitlab_network:
    driver: bridge
    name: share_default
    ipam:
      config:
        - subnet: "172.18.0.0/16"

Sau khi tạo xong file ta có cây thư mục như sau.

.
├── gitlab-docker-compose.yaml
├── share
    └── nginx
        ├── conf.d
        │   └── gitlab.hoanghd.com.conf
        ├── nginx.conf
        └── ssl
            └── hoanghd.com.pem

6 directories, 7 files

Hãy triển khai file gitlab-docker-compose.yaml

$ docker-compose -f gitlab-docker-compose.yaml up -d
[+] Running 7/7
 ⠿ nginx Pulled                                                                                                                                                                                                                  12.7s
   ⠿ e9995326b091 Pull complete                                                                                                                                                                                                   5.4s
   ⠿ 71689475aec2 Pull complete                                                                                                                                                                                                   6.4s
   ⠿ f88a23025338 Pull complete                                                                                                                                                                                                   6.6s
   ⠿ 0df440342e26 Pull complete                                                                                                                                                                                                   6.8s
   ⠿ eef26ceb3309 Pull complete                                                                                                                                                                                                   6.9s
   ⠿ 8e3ed6a9e43a Pull complete                                                                                                                                                                                                   7.0s
[+] Running 3/3
 ⠿ Network home_default  Created                                                                                                                                                                                                  0.1s
 ⠿ Container gitlab      Started                                                                                                                                                                                                  1.6s
 ⠿ Container nginx       Started                                                                                                                                                                                                  1.8s

Sau khi tạo xong ta có 2 container nginx và gitlab như dưới

$ docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED         STATUS                   PORTS                                                                      NAMES
b7490b07f69f   nginx                     "/docker-entrypoint.…"   8 minutes ago   Up 8 minutes             0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   nginx
8a5baac34e5f   gitlab/gitlab-ce:latest   "/assets/wrapper"        8 minutes ago   Up 8 minutes (healthy)   80/tcp, 0.0.0.0:22->22/tcp, :::22->22/tcp, 443/tcp                         gitlab

Dùng trình duyệt login vào url https://gitlab.hoanghd.com ta có kết quả như hình

Như vậy chúng ta đã triển khai xong Gitlab sử dụng Nginx làm reverse proxy.

Chúc các bạn thành công

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories