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