Gitea: ติดตั้ง Git Server ขนาดเบาของทีมด้วย Docker Compose
คำตอบสั้น ๆ: ติดตั้ง Gitea ด้วย Docker Compose คู่กับ PostgreSQL เป็น Git Server ของทีม ใช้งานผ่าน HTTPS, SSH พอร์ต 2222 ปิดการสมัครเอง และสำรองข้อมูลด้วย gitea dump
คู่มือนี้อธิบาย Gitea ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Gitea คือ Git Server แบบโอเพนซอร์สที่เขียนด้วยภาษา Go เป็นไบนารีตัวเดียว ใช้ RAM น้อย แต่มีฟีเจอร์ที่ทีมพัฒนาต้องใช้ครบ ทั้ง repository ส่วนตัว, Pull Request พร้อม code review, Issue, Wiki, Package Registry และ Actions สำหรับ CI ที่เขียนคล้าย GitHub Actions เหมาะกับบริษัทที่อยากเก็บซอร์สโค้ดไว้บนเซิร์ฟเวอร์ของตัวเองโดยไม่ต้องใช้เครื่องสเปกสูงแบบ GitLab CE
เมื่อทำตามคู่มือนี้จบ คุณจะมี Git Server ที่รันด้วย Docker Compose คู่กับ PostgreSQL ใช้หน้าเว็บผ่าน HTTPS, clone และ push ผ่าน SSH ที่พอร์ต 2222 โดยไม่ชนกับ SSH ของเครื่อง ปิดการสมัครสมาชิกเอง และสำรองข้อมูลทั้งหมดด้วยคำสั่ง dump
สิ่งที่ต้องเตรียม
- Cloud VPS ที่ใช้ Ubuntu 24.04 พร้อม Docker Engine และ Compose plugin ขนาดเริ่มต้นราว 2 vCPU / RAM 2 GB สำหรับทีมไม่เกิน 30 คน เป็นค่าประมาณ ส่วนดิสก์ให้เผื่อตามขนาด repository และไฟล์ LFS
- ซับโดเมน เช่น
git.example.com ที่ชี้มาที่เซิร์ฟเวอร์แล้ว
- Nginx Proxy Manager พร้อมเครือข่าย Docker ชื่อ
proxy
- ไฟร์วอลล์ระดับคลาวด์เปิด TCP 2222 สำหรับ Git ผ่าน SSH ส่วนพอร์ต 22 ยังเป็นของการดูแลเครื่องตามปกติ
หน้าเว็บผ่าน NPM ที่ 443 ส่วน Git ผ่าน SSH เข้าพอร์ต 2222 ตรงไปที่คอนเทนเนอร์ ไม่ชนกับ SSH ของเครื่อง
ขั้นตอนที่ 1: เตรียมโฟลเดอร์และรหัสผ่านฐานข้อมูล
sudo install -d -o $USER /opt/git
cd /opt/git
echo "POSTGRES_PASSWORD=$(openssl rand -hex 24)" > .env
chmod 600 .env
ใช้ openssl rand -hex เพราะได้ตัวอักษรที่ไม่ต้อง escape ในไฟล์คอนฟิก คอนเทนเนอร์ของ Git Server รันด้วยผู้ใช้ git ที่มี UID/GID 1000 ไฟล์ทั้งหมดจะอยู่ในโฟลเดอร์ data/ ที่ระบบสร้างให้ตอนเริ่มครั้งแรก
ขั้นตอนที่ 2: เขียน compose.yaml แล้วเริ่มระบบ
services:
gitea:
image: gitea/gitea:28
container_name: gitea
restart: unless-stopped
environment:
USER_UID: 1000
USER_GID: 1000
volumes:
- ./data:/data
- /etc/localtime:/etc/localtime:ro
ports:
- "2222:22"
depends_on:
db:
condition: service_healthy
networks:
- default
- proxy
db:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_DB: git
POSTGRES_USER: git
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ./postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U git -d git"]
interval: 10s
retries: 5
networks:
proxy:
external: true
แท็ก 28 หมายถึงรุ่นล่าสุดในสายเวอร์ชันหลัก 28 พอร์ต 2222:22 พาพอร์ต 2222 ของเครื่องเข้าไปที่ SSH ภายในคอนเทนเนอร์ ส่วนหน้าเว็บพอร์ต 3000 ไม่ได้ publish ออกไป เพราะเข้าผ่าน Nginx Proxy Manager เท่านั้น เวอร์ชันหลักของ PostgreSQL ถูกตรึงไว้โดยตั้งใจ เพราะข้อมูลไม่อัปเกรดข้ามเวอร์ชันหลักให้เอง
docker compose up -d
docker compose ps
ขั้นตอนที่ 3: เปิด HTTPS ด้วย Proxy Host
ใน Nginx Proxy Manager เพิ่ม Proxy Host กรอก Domain Names git.example.com, Forward Hostname gitea, Forward Port 3000 เปิด Websockets Support เพราะรุ่นใหม่ใช้ WebSocket ส่งการแจ้งเตือนบนหน้าเว็บ เปิด Block Common Exploits แล้วขอใบรับรองในแท็บ SSL พร้อม Force SSL
ขั้นตอนที่ 4: ตั้งค่าในหน้า Initial Configuration
เปิด https://git.example.com ครั้งแรกจะเจอหน้า Initial Configuration ดูรหัสผ่านฐานข้อมูลด้วย cat /opt/git/.env แล้วกรอกทีละส่วนดังนี้
- Database Settings: Database Type เลือก PostgreSQL, Host
db:5432, Username และ Database Name เป็น git, Password ตามค่าใน .env
- Site Title: ชื่อที่ทีมจำง่าย เช่น Example Git
- Server Domain:
git.example.com ใช้ทั้งในลิงก์ HTTPS และลิงก์ SSH
- SSH Server Port:
2222 ค่านี้ใช้สร้างลิงก์ clone ที่แสดงบนหน้าเว็บ ส่วนภายในคอนเทนเนอร์ยังฟังที่ 22
- Gitea Base URL:
https://git.example.com/
- เปิด Optional Settings → Server and Third-Party Service Settings แล้วติ๊ก Disable Self-Registration
- Administrator Account Settings: สร้างบัญชีผู้ดูแลตอนนี้เลย ชื่อผู้ใช้ห้ามเป็น
admin เพราะเป็นชื่อสงวน ใช้ เช่น itadmin
SSH Server Port ต้องเป็น 2222 และ Base URL ต้องเป็น https ลิงก์ clone จึงจะถูกต้อง (ภาพจำลอง)
กด Install Gitea ระบบจะเขียนค่าลงไฟล์ app.ini ในโฟลเดอร์ data และล็อกหน้าติดตั้งไว้ จากนั้นเพิ่มผู้ใช้ได้จาก Site Administration → User Accounts หรือเชื่อม SSO กับ Keycloak ภายหลัง
ขั้นตอนที่ 5: เพิ่ม SSH Key แล้วทดสอบ clone
ผู้ใช้แต่ละคนไปที่ Settings → SSH / GPG Keys → Add Key แล้ววาง public key ของตัวเอง ทดสอบการเชื่อมต่อจากเครื่องของผู้ใช้ ต้องได้ข้อความยืนยันว่าเข้าสู่ระบบได้แต่ไม่มีสิทธิ์ใช้ shell
ssh -T -p 2222 [email protected]
git clone ssh://[email protected]:2222/it-team/infra.git
เพื่อไม่ต้องพิมพ์พอร์ตทุกครั้ง เพิ่มบล็อกนี้ใน ~/.ssh/config ของผู้ใช้ ตามแนวทางในคู่มือ ใช้ไฟล์ ~/.ssh/config
Host git.example.com
Port 2222
User git
ข้อความ successfully authenticated แปลว่าคีย์ถูกต้อง การไม่ให้ใช้ shell เป็นเรื่องปกติ
ขั้นตอนที่ 6: สำรองข้อมูลด้วย dump และอัปเดต
คำสั่ง dump ที่มากับโปรแกรมรวม repository ฐานข้อมูล ไฟล์แนบ และ app.ini ไว้ในไฟล์ zip เดียว ต้องรันด้วยผู้ใช้ git และให้ไดเรกทอรีทำงานเป็นโฟลเดอร์ที่เขียนได้ ไม่เช่นนั้นจะ zip ไม่สำเร็จเพราะสิทธิ์ไม่พอ
sudo mkdir -p /var/backups/git
docker exec -u git -w /tmp gitea bash -c \
'/usr/local/bin/gitea dump -c /data/gitea/conf/app.ini --file /tmp/dump.zip'
sudo docker cp gitea:/tmp/dump.zip /var/backups/git/dump-$(date +%F).zip
docker exec gitea rm /tmp/dump.zip
ตั้งสคริปต์นี้เป็น cron รายวัน แล้วส่งไฟล์ออกนอกเครื่อง การกู้คืนในคอนเทนเนอร์ไม่มีคำสั่งอัตโนมัติ ต้องแตกไฟล์แล้ววางคืนตาม คู่มือ Backup and Restore จึงควรซ้อมกู้คืนบนเครื่องทดสอบสักครั้ง
อัปเดตภายในเวอร์ชันหลักเดิมด้วย docker compose pull && docker compose up -d หลังสำรองข้อมูล ส่วนการขึ้นเวอร์ชันหลักใหม่ ให้อ่านหัวข้อ BREAKING ใน release notes ก่อนเปลี่ยนแท็กเสมอ
ปัญหาที่พบบ่อยเกี่ยวกับ Gitea
clone ผ่าน SSH แล้วขึ้น Permission denied (publickey) ทำอย่างไร?
ตรวจว่าเชื่อมต่อพอร์ต 2222 ไม่ใช่ 22 ถ้าลืมใส่พอร์ต ระบบจะไปเจอ SSH ของเครื่องโฮสต์ซึ่งไม่รู้จักคีย์นี้ จากนั้นตรวจว่าเพิ่ม public key ในบัญชีที่ถูกต้องแล้ว และใช้ชื่อผู้ใช้ git เสมอ ไม่ใช่ชื่อบัญชีของตัวเอง
ลิงก์ clone บนหน้าเว็บแสดง http หรือพอร์ต 3000?
ค่า Base URL หรือ SSH Server Port ตอนติดตั้งไม่ถูกต้อง แก้ ROOT_URL และ SSH_PORT ในส่วน [server] ของไฟล์ app.ini (อยู่ใต้ data/) แล้วรัน docker compose restart
ลืมรหัสผ่านบัญชีผู้ดูแลต้องทำอย่างไร?
เปลี่ยนรหัสผ่านจากบรรทัดคำสั่งด้วย docker exec -u git gitea gitea admin user change-password --username itadmin --password 'รหัสผ่านใหม่' แล้วล็อกอินใหม่ จากนั้นลบคำสั่งนี้ออกจาก shell history
Gitea กับ GitLab CE ควรเลือกตัวไหน?
ถ้าทีมเล็กถึงกลางและต้องการ Git Server ที่ดูแลง่าย ใช้ทรัพยากรน้อย เลือก Gitea ถ้าองค์กรต้องการ CI/CD ในตัวที่ครบมาก ระบบ approval ซับซ้อน และมีเครื่องสเปกสูงพอ เลือก GitLab CE อ่านตัวเลือกการติดตั้งเพิ่มเติมได้ที่ เอกสาร Installation with Docker
ตัวเลขทรัพยากรเป็นค่าประมาณสำหรับเริ่มต้น ขึ้นกับจำนวนผู้ใช้และขนาด repository
ต้องการเซิร์ฟเวอร์สำหรับเก็บซอร์สโค้ดของทีมพร้อมพื้นที่ดิสก์ที่ขยายได้ ดู Cloud VPS App Plus หรือ ติดต่อทีมงาน THAI DATA CLOUD เพื่อช่วยวางระบบ Git และ CI ขององค์กร
อ่านเพิ่มเติมเกี่ยวกับ Gitea