ติดตั้ง GitLab CE บน Cloud VPS ด้วย Docker

ติดตั้ง GitLab สำหรับเก็บซอร์สโค้ดและรัน CI/CD บนเซิร์ฟเวอร์ขององค์กร พร้อมตั้ง Runner สำรองข้อมูล และวางแผนทรัพยากร

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 10 นาที เข้าชม 8 ครั้ง

แชร์FacebookXLINELinkedIn
GitLab CE — ติดตั้ง GitLab CE บน Cloud VPS ด้วย Docker
ติดตั้ง GitLab CE บน Cloud VPS ด้วย Docker

คำตอบสั้น ๆ: ติดตั้ง 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/]

ขั้นตอนที่ 6: สำรองข้อมูล

# สำรองที่เก็บโค้ดและฐานข้อมูล
sudo docker compose exec -T gitlab gitlab-backup create

# ไฟล์จะอยู่ใน
sudo ls -lh /srv/gitlab/data/backups/

สำคัญ ไฟล์สำรองที่สร้างด้วยคำสั่งนี้ไม่รวมไฟล์คอนฟิกและกุญแจเข้ารหัส ต้องสำรองแยก ไม่เช่นนั้นกู้คืนแล้วจะถอดรหัสข้อมูลรับรองที่บันทึกไว้ไม่ได้

sudo tar czf /var/backups/gitlab-config-$(date +%F).tar.gz -C /srv/gitlab config

ตั้งเวลาอัตโนมัติ

sudo nano /usr/local/bin/gitlab-backup.sh
#!/bin/bash
set -euo pipefail
cd /srv/gitlab

docker compose exec -T gitlab gitlab-backup create CRON=1
tar czf "/var/backups/gitlab-config-$(date +%F).tar.gz" -C /srv/gitlab config

# ส่งออกนอกเครื่อง
rsync -az /srv/gitlab/data/backups/ [email protected]:/srv/backups/gitlab/
find /var/backups -name 'gitlab-config-*.tar.gz' -mtime +30 -delete

ขั้นตอนที่ 7: เฝ้าดูทรัพยากร

sudo docker stats gitlab --no-stream
sudo docker compose exec gitlab gitlab-ctl status
sudo du -sh /srv/gitlab/*

หากหน่วยความจำตึง ลดจำนวน worker ลงในคอนฟิก

puma['worker_processes'] = 2
sidekiq['max_concurrency'] = 5
sudo docker compose restart gitlab

ขั้นตอนที่ 8: อัปเกรด

# สำรองก่อนเสมอ
sudo /usr/local/bin/gitlab-backup.sh

# ตรวจเวอร์ชันปัจจุบัน
sudo docker compose exec gitlab gitlab-rake gitlab:env:info | grep Version

sudo docker compose pull
sudo docker compose up -d
sudo docker compose logs -f gitlab

GitLab มีข้อกำหนดเรื่องเส้นทางการอัปเกรด ห้ามข้ามเวอร์ชันหลัก ตรวจเส้นทางที่รองรับจากเอกสารทางการก่อนอัปเกรดข้ามหลายรุ่น

ปัญหาที่พบบ่อยเกี่ยวกับ GitLab CE

เข้าหน้าเว็บแล้วขึ้น 502

GitLab ยังเริ่มไม่เสร็จ รอจนสถานะเป็น healthy ด้วย sudo docker compose ps หากค้างนานเกินสิบนาที ให้ดู Log ด้วย sudo docker compose exec gitlab gitlab-ctl tail

Clone ผ่าน SSH ไม่ได้

ตรวจว่าใช้พอร์ต 2224 และตั้ง gitlab_shell_ssh_port ตรงกัน ทดสอบด้วย ssh -T -p 2224 [email protected]

อีเมลไม่ถูกส่ง

sudo docker compose exec gitlab gitlab-rails console
Notify.test_email('[email protected]','ทดสอบ','ข้อความ').deliver_now

ดิสก์เต็มเร็ว

สาเหตุหลักคือ artifact ของ CI และ container registry ตั้งอายุให้ลบอัตโนมัติในหน้า Admin แล้ว CI/CD และตรวจขนาดด้วย sudo du -sh /srv/gitlab/data/*

ต้องการ Cloud VPS สเปกสูงสำหรับระบบพัฒนาซอฟต์แวร์ ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

สรุปขั้นตอน GitLab CE

ทบทวน GitLab CE ทั้งหมดตามลำดับ ก่อนนำไปใช้กับระบบจริง

  1. เตรียมไฟล์ (GitLab CE)
  2. ตั้ง Nginx และ SSL (GitLab CE)
  3. เข้าใช้งานครั้งแรก
  4. ตั้งค่า SSH
  5. ติดตั้ง GitLab Runner สำหรับ CI/CD
  6. สำรองข้อมูล
  7. เฝ้าดูทรัพยากร
  8. อัปเกรด

เมื่อทำครบทุกข้อแล้ว GitLab CE จะพร้อมใช้งาน หากผลลัพธ์ไม่เป็นไปตามที่คาด ให้ย้อนกลับไปดูหัวข้อปัญหาที่พบบ่อยด้านบน ซึ่งรวบรวมกรณีที่พบจริงจากการใช้งาน GitLab CE ไว้แล้ว

อ่านเพิ่มเติมเกี่ยวกับ GitLab CE

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน