คำตอบสั้น ๆ: ติดตั้ง GitLab สำหรับเก็บซอร์สโค้ดและรัน CI/CD บนเซิร์ฟเวอร์ขององค์กร พร้อมตั้ง Runner สำรองข้อมูล และวางแผนทรัพยากร
คู่มือนี้อธิบาย GitLab CE ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
GitLab CE รวมทั้งที่เก็บโค้ด ระบบตรวจสอบโค้ด ระบบติดตามงาน และ CI/CD ไว้ในตัวเดียว องค์กรที่มีข้อกำหนดว่าซอร์สโค้ดต้องไม่อยู่บนบริการภายนอก หรือต้องการรัน CI โดยไม่จำกัดนาที จะได้ประโยชน์ชัดเจน
สิ่งที่ต้องรู้ก่อนคือ GitLab กินทรัพยากรมากกว่าที่หลายคนคาด ขั้นต่ำที่ใช้งานได้จริงคือ 4 คอร์และ RAM 8 GB สำหรับทีมขนาดเล็ก การติดตั้งบนเครื่อง 2 GB จะทำงานได้แต่ช้าจนใช้งานจริงไม่ไหว
สิ่งที่ต้องเตรียม (GitLab CE)
- Cloud VPS ที่มี RAM อย่างน้อย 8 GB และพื้นที่ดิสก์ 50 GB ขึ้นไป
- โดเมนที่ชี้มาที่เซิร์ฟเวอร์
- บัญชี SMTP สำหรับส่งอีเมลแจ้งเตือน
ขั้นตอนที่ 1: เตรียมไฟล์ (GitLab CE)
sudo mkdir -p /srv/gitlab/{config,logs,data}
cd /srv/gitlab
sudo nano docker-compose.yml
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: always
hostname: git.example.com
shm_size: 256m
ports:
- "127.0.0.1:8929:8929"
- "2224:22"
volumes:
- ./config:/etc/gitlab
- ./logs:/var/log/gitlab
- ./data:/var/opt/gitlab
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://git.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
nginx['listen_port'] = 8929
nginx['listen_https'] = false
nginx['proxy_set_headers'] = {
'X-Forwarded-Proto' => 'https',
'X-Forwarded-Ssl' => 'on'
}
# ปิดส่วนที่ทีมเล็กไม่ได้ใช้ ประหยัดหน่วยความจำได้มาก
prometheus_monitoring['enable'] = false
alertmanager['enable'] = false
grafana['enable'] = false
# ลดจำนวน worker ให้เหมาะกับเครื่อง
puma['worker_processes'] = 2
sidekiq['max_concurrency'] = 10
# อีเมล
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = 'smtp.example.com'
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = '[email protected]'
gitlab_rails['smtp_password'] = 'รหัสผ่าน'
gitlab_rails['smtp_authentication'] = 'login'
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = '[email protected]'
# สำรองข้อมูลอัตโนมัติ เก็บ 7 วัน
gitlab_rails['backup_keep_time'] = 604800
sudo docker compose up -d
sudo docker compose logs -f gitlab
ครั้งแรกใช้เวลา 5-10 นาที รอจนสถานะเป็น healthy
sudo docker compose ps
ขั้นตอนที่ 2: ตั้ง Nginx และ SSL (GitLab CE)
sudo nano /etc/nginx/sites-available/gitlab
server {
listen 80;
server_name git.example.com;
client_max_body_size 0;
location / {
proxy_pass http://127.0.0.1:8929;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 600s;
proxy_http_version 1.1;
}
}
sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d git.example.com --agree-tos -m [email protected] --redirect
ขั้นตอนที่ 3: เข้าใช้งานครั้งแรก
sudo docker compose exec gitlab cat /etc/gitlab/initial_root_password
เข้าสู่ระบบด้วยผู้ใช้ root และรหัสผ่านที่ได้ แล้วเปลี่ยนรหัสผ่านทันที ไฟล์นี้จะถูกลบอัตโนมัติภายใน 24 ชั่วโมง
ตั้งค่าที่ควรทำทันทีในหน้า Admin
- ปิดการสมัครสมาชิกเอง ที่ Settings แล้ว General แล้ว Sign-up restrictions
- บังคับการยืนยันตัวตนสองขั้นตอนสำหรับทุกคน
- ตั้งขนาดสูงสุดของที่เก็บโค้ดต่อโครงการ
ขั้นตอนที่ 4: ตั้งค่า SSH
เนื่องจากพอร์ต 22 ของเครื่องแม่ใช้สำหรับ SSH เข้าเซิร์ฟเวอร์อยู่แล้ว GitLab จึงใช้พอร์ต 2224 ตามที่ตั้งไว้
# ทดสอบจากเครื่องนักพัฒนา
ssh -T -p 2224 [email protected]
ตั้งใน ~/.ssh/config ให้ไม่ต้องพิมพ์พอร์ตทุกครั้ง
Host git.example.com
Port 2224
User git
IdentityFile ~/.ssh/id_ed25519
git clone [email protected]:group/project.git
ขั้นตอนที่ 5: ติดตั้ง GitLab Runner สำหรับ CI/CD
ควรติดตั้งบนเครื่องคนละเครื่องกับ GitLab เพราะงาน CI กินทรัพยากรมากและอาจทำให้ GitLab เองช้า
sudo mkdir -p /srv/gitlab-runner/config
sudo docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
รับ Token จากหน้า Admin แล้ว CI/CD แล้ว Runners แล้วลงทะเบียน
sudo docker exec -it gitlab-runner gitlab-runner register \
--non-interactive \
--url "https://git.example.com" \
--token "glrt-xxxxx" \
--executor "docker" \
--docker-image "alpine:latest" \
--docker-privileged=false \
--docker-volumes "/var/run/docker.sock:/var/run/docker.sock"
sudo docker exec gitlab-runner gitlab-runner list
ทดสอบด้วยไฟล์ .gitlab-ci.yml ในโครงการ
stages: [test]
unit-test:
stage: test
image: node:20-alpine
script:
- npm ci
- npm test
cache:
paths: [node_modules/]