ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

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

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

GitLab CE รวมทั้งที่เก็บโค้ด ระบบตรวจสอบโค้ด ระบบติดตามงาน และ CI/CD ไว้ในตัวเดียว องค์กรที่มีข้อกำหนดว่าซอร์สโค้ดต้องไม่อยู่บนบริการภายนอก หรือต้องการรัน CI โดยไม่จำกัดนาที จะได้ประโยชน์ชัดเจน

สิ่งที่ต้องรู้ก่อนคือ GitLab กินทรัพยากรมากกว่าที่หลายคนคาด ขั้นต่ำที่ใช้งานได้จริงคือ 4 คอร์และ RAM 8 GB สำหรับทีมขนาดเล็ก การติดตั้งบนเครื่อง 2 GB จะทำงานได้แต่ช้าจนใช้งานจริงไม่ไหว

สิ่งที่ต้องเตรียม

  • Cloud VPS ที่มี RAM อย่างน้อย 8 GB และพื้นที่ดิสก์ 50 GB ขึ้นไป
  • โดเมนที่ชี้มาที่เซิร์ฟเวอร์
  • บัญชี SMTP สำหรับส่งอีเมลแจ้งเตือน

ขั้นตอนที่ 1: เตรียมไฟล์

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

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 มีข้อกำหนดเรื่องเส้นทางการอัปเกรด ห้ามข้ามเวอร์ชันหลัก ตรวจเส้นทางที่รองรับจากเอกสารทางการก่อนอัปเกรดข้ามหลายรุ่น

ปัญหาที่พบบ่อย

เข้าหน้าเว็บแล้วขึ้น 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/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security