การติดตั้ง gitlab บน docker
วิธีการ run gitlab บน container นั้นมีอยู่ 2 วิธีคือ run ด้วย docker และ kubernetes เราจึงสรุปวิธีการติดตั้ง แบ่งออกเป็น 3 หัวข้อดังนี้
- การติดตั้่ง gitlab ด้วย docker
- การติดตั้่ง gitlab ด้วย docker compose
- การติดตั้่ง gitlab บน kubernetes
![](/ads/gitlab-ads-top.png)
ขั้นตอนการติดตั้ง gitlab ด้วย docker
- run gitlab container
- login เข้า gitlab ด้วย initial root account
- ตั้ง root password ใหม่
- สร้าง admin user สำหรับเข้าใช้งานในครั้งต่อไป
เราจะไม่ใช้ root account ในการทำงานในแต่ละวันเพราะมีความเสี่ยง เราจะใช้ root account ในกรณีฉุกเฉินเท่านั้น
1. Run gitlab container
run คำสั่ง docker run ตาม script ด้านล่างนี้ เพื่อเริ่มต้นใช้งาน gitlab
docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume config:/etc/gitlab:Z \
--volume logs:/var/log/gitlab:Z \
--volume data:/var/opt/gitlab:Z \
--shm-size 256m \
gitlab/gitlab-ce:latest
โดย parameters ต่างๆที่เรากำหนดไว้มีความหมาย ดังนี้
- detach เป็นการ run container เป็น background process(เราสามารถ run คำสั่งอื่นๆต่อได้เลย)
- hostname ตั้งชื่อ hostname ให้กับ container
- publish เปิด 3 port คือ 443(https), 80(http) และ 22(ssh)
- name ตั้งชื่อ container(ใช้ในการสร้าง connection)
- restart ตั้งเป็น always คือถ้า gitlab หยุดทำงานให้ทำการ restart ใหม่
- volume ทำการ mount volume 3 folders คือ config, logs และ data
- shm-size กำหนด shared memory ที่ต้องการใช้งานเป็น 256m (เนื่องจาก gitlab ใช้งาน memory ค่อนข้างสูงบางทีอาจต้องใช้มากกว่า 256m)
- image ที่เราใช้ในกรณีนี้คือ gitlab/gitlab-ce:latest เป็น community edition version ล่าสุด(ไม่ควรใช้ latest ควรจะใช้เลข version ตรงๆไปเลยจะดีกว่า เช่น gitlab/gitlab-ce:15.6.6-ce.0 ซึ่งเป็น gitlab version ล่าลุด ณ ปัจจุบัน)
community edition: gitlab-ce สำหรับ free version ถ้าต้องการใช้ free trial ต้องใช้ enterprise edition: gitlab-ee แทน
volume ทุกตัวจะลงท้ายด้วย :Z หมายถึง การบอกให้ volume นี้เป็น private volume ไม่สามารถ share กับ container อื่นได้ ซึ่งถ้าต้องการให้ volume นี้สามารถ share กับ container อื่นได้ให้ใช้ :z แทน
จัดการกับ volume
ในกรณีนี้เราจะใช้ docker volume ที่อยู่ภายใน default folder ของ docker ถ้าต้องการกำหนด mount volume ออกมาใน path ของเราเอง เราจะใช้การกำหนด environment variables ด้วยคำสั่งนี้
บน linux หรือ macos เราจะใช้คำสัง export ในการกำหนด gitlab home
export GITLAB_HOME=/path/to/gitlab-home
บน windows กำหนด path ที่ต้องการ mount config, logs และ data ออกมา โดยถ้าเป็น WSL2 เราจะใช้รูปแบบนี้ /c/gitlab ซึ่งก็จะเท่ากับ c:\gitlab
$env:GITLAB_HOME="/path/to/gitlab-home"
เปลี่ยนคำสั่ง docker run ในบรรทัดที่ 6-8 ในส่วนของ volume
|
|
หรือถ้าจะกำหนด volume ให้ mount เป็น directory ปัจจุบันให้ใช้คำสั่งนี้
|
|
บน macos ให้ใช้คำสั่งนี้ เปลี่ยนจาก $pwd เป็น $(pwd)
|
|
การกำหนด config ให้กับ gitlab
ถ้าอยากจะปรับ configuration ของ gitlab เราสามารถปรับได้ด้วยวิธีต่างๆ ดังนี้
- เข้าไปแก้ coinfig ใน container โดยตรง
- เข้าไปใน shell ของ container
docker exec -it gitlab /bin/bash
- แก้ไข config ใน file /etc/gitlab/gitlab.rb โดยใส่ config ที่ต้องการลงไป เราสามารถเข้าไปดูตัวอย่างของ configuration file แบบเต็มๆ ได้ที่นี่
external_url "https://gitlab.example.com
- ทำการ update configuration ด้วยคำสั่ง
sudo gitlab-ctl reconfigure
หรือจะทำการ restart docker ก็ได้่
docker restart gitlab # gitlab เป็นชื่อ container ที่เราตั้งด้วย --name
- แบบที่ 2 คือการกำหนด configuration ไว้ล่วงหน้าก่อนที่ gitlab จะ start ขึ้นมาทำงาน
|
|
แต่ถ้ามี config ที่ต้องกำหนดหลายตัวเราจะใช้การสร้าง file gitlab.rb ที่มี config ที่เราต้องการ แล้ววางไว้ใน folder $GITLAB_HOME/config ก็ได้
![](/ads/gitlab-ads-middle.png)
2. login เข้า gitlab ด้วย root account
การ login เข้า gitlab ตรั้งแรกเราจะต้องดึงเอา initial root password ที่ gitlab generate ไว้ให้ออกมาซึ่งมี 2 วิธีให้เลือกดังนี้
-
ในการ run command แบบปกติทั่วไปจะมีข้อความ(logs message) แสดงออกมาที่หน้าจอ ซึ่งในกรณีนี้ตอน run gitlab ขึ้นมาระบบจะแสดง initial root password ออกมาในข้อความนั้น แต่เนื่องจากเรา run gitlab อยู่ใน detach mode(เป็น background process) เราจึงไม่เห็นข้อความนี้ เราเลยต้องใช้คำสั่ง docker logs แสดงข้อความนี้ออกมา
docker logs -f gitlab
ในตัวอย่างนี้เราจะใส่ -f เข้าไปด้วยเผื่อว่าเราจะ run docker logs ก่อนที่ระบบจะแสดง initial root password ออกมา เพราะ -f คือการ follow เมื่อใน container มี logs message เพิ่มขึ้นมาใหม่ก็จะแสดงออกมาให้เราเห็นทันที จนกว่าเราจะกด Ctrl + C เพื่อยกเลิกการ follow
-
ในวิธีที่ 2 นี้คือการเข้าไปอ่าน file ที่ชื่อว่า initial_root_password นี้โดยตรง ซึ่งหลังจากที่เรานำ initial root password ไปใช้งานไฟล์นี้จะถูกลบออกไปทันที ดังนั้นเราจะสามารถ run คำสั่งนี้ได้จนกว่าจะมีการ login ครั้งแรก
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
ในตำสั่ง docker exec นี้จะค้นหาคำว่า Password: ด้วยคำสั่ง grep โดยจะหาคำว่า Password: จากไฟล์ initial_root_password ที่อยู่ใน folder /etc/gitlab
เมื่อได้ initial root password เราก็สามารถ login เข้า gitlab server ด้วย user root และ password ที่ได้มานี้ได้เลย
3. ตั้ง root password ใหม่
หลังจาก login เข้ามาแล้วเราควรเปลี่ยน password นี้เป็น password อื่นถึงแม้คุณจะใช้ password manager ในการจัดเก็บ password ก็ตาม ยังไงก็ไม่ควรใช้ password ที่ generate ออกมาในครั้งแรก
4. สร้าง admin user
ขั้นตอนสุดท้ายคือการสร้าง admin user เพื่อให้ admin ใช้งานแทน root account ซึ่งถือเป็น top secret ของเรา ซึ่งถ้าเราสามารถแยก admin ออกมามากกว่า 1 role ได้ก็จะยิ่งดีมาก
ขั้นตอนการติดตั้ง gitlab ด้วย docker compose
เราสามารถติดตั้ง gitlab ด้วย docker compose แทน docker ก็ได้ ข้แดีของการใช้ docker compose คือ
- เราไม่ต้องเขียน command ยาวๆ ลองดูความยาวของ docker run ส่วน docker compose จะใช้แค่ docker-compose up -d แค่นี้เอง
- เนื่องจากเราใช้ไฟล์ docker-compose.yml ในการ run เราจึงสามารถส่งต่อให้กับคนอื่นๆในทีมได้ง่าย แถมยังทำ version control ได้อีกด้วย
- สามารถสร้าง network ได้ง่าย โดยเฉพาะในอนาคตถ้ามีการทำ ci/cd เราจะมีการสร้าง gitlab runner ด้วย container ซึ่งเราสามารถเพิ่มเข้าไปใน docker-compose.yml ได้ง่ายมาก
ขั้นตอนในการ run gitlab ด้วย docker compose มีดังนี้
- สร้าง file docker-compose.yml ตามตัวอย่างด้านล่าง
|
|
- run docker compose ด้วยคำสั่ง up (ต้อง run ใน folder ที่มี docker-compose.yml เท่านั้น)
docker-compose up -d
- สำหรับเครื่องที่ run docker compose บน production สิ่งที่ต้องทำเพิ่มเติมคือ ตั้งค่า network ที่ใช้เป็น bridge
|
|
หลังจากนั้นให้ทำการ forward port ออกไปสู่ public network ด้วยคำสั่ง
sudo iptables -I DOCKER-USER -i src_if -o dst_if -j ACCEPT
การติดตั้ง gitlab บน kubernetes
ในการติดตั้ง kubernetes จะมีวิธีการที่ค่อนข้างสลับซับซ้อนเราจึงแยกออกไปอีกบทความซึ่งจะเน้นเรื่องของ การติดตั้่ง gitlab บน kubernetes โดยเฉพาะและยังแยกวิธีการติดตั้งออกเป็น 2 วิธีคือ
![](/ads/gitlab-ads-bottom.png)