ทวงคืนโค้ดและบันทึกของคุณจาก GitHub: คู่มือติดตั้ง Forgejo เซิร์ฟเวอร์ Git ส่วนตัวบน Home Server ด้วย Docker
ย้ายที่เก็บโค้ด สคริปต์ และประวัติการแก้ไขทั้งหมดออกจากคลาวด์ของบริษัทใหญ่ มาไว้ในบ้านตัวเองด้วย Forgejo บน Docker พร้อมวิธีเปิด SSH สำหรับ push และวิธีใช้เก็บเวอร์ชันของ Second Brain
เราพูดกันบ่อยเรื่องการเป็นเจ้าของรูปภาพ เอกสาร และรหัสผ่าน แต่มีข้อมูลอีกกองหนึ่งที่คนสายเทคมักลืมนึกถึง นั่นคือ โค้ดและประวัติการแก้ไขของมัน
สคริปต์ที่คุณเขียนเอง ไฟล์ docker-compose.yml ของทุกบริการใน Home Server ไฟล์คอนฟิกที่ปรับจูนมาเป็นปี หรือแม้แต่โน้ตใน Obsidian ที่อยากเก็บย้อนเวลาได้ — ทั้งหมดนี้ส่วนใหญ่ถูกฝากไว้ที่ GitHub หรือ GitLab ซึ่งแปลว่าเราไม่ได้ถือกุญแจจริง ๆ สักดอก ถ้าวันหนึ่งบัญชีถูกระงับ นโยบายเปลี่ยน หรือเนื้อหาถูกดึงไปใช้งานต่อโดยที่เราไม่ได้อนุญาต เราแทบไม่มีอำนาจต่อรองเลย
ทางออกที่เบาและเสถียรที่สุดคือ Forgejo — เซิร์ฟเวอร์ Git โอเพนซอร์สที่รันบน Home Server ได้สบาย ๆ
Forgejo คืออะไร แล้วต่างจาก GitLab อย่างไร?
Forgejo คือซอฟต์แวร์ Git hosting ที่แยกสายมาจาก Gitea โดยชุมชนนักพัฒนา ภายใต้การดูแลขององค์กรไม่แสวงหากำไร Codeberg e.V. หน้าตาและการใช้งานคล้าย GitHub มาก (issues, pull request, wiki, releases, CI) แต่จุดที่ทำให้เหมาะกับ Home Server คือ:
- กินทรัพยากรน้อยมาก: เขียนด้วยภาษา Go เป็นไฟล์เดียวจบ ใช้ RAM ระดับหลักร้อยเมกะไบต์ ต่างจาก GitLab ที่แนะนำ RAM ขั้นต่ำ 4 GB ขึ้นไป — Raspberry Pi หรือโน้ตบุ๊กเก่าก็เอาอยู่
- ใช้ SQLite ได้ ไม่ต้องมีฐานข้อมูลแยก: สำหรับผู้ใช้คนเดียวหรือไม่กี่คน ไม่จำเป็นต้องยก PostgreSQL มาทั้งตัว ทำให้การสำรองข้อมูลเหลือแค่ก๊อปโฟลเดอร์เดียว
- ใบอนุญาตปลอดภัยระยะยาว: เป็นโปรเจกต์ที่ชุมชนถือครอง ไม่มีบริษัทเจ้าของรายเดียวที่จะเปลี่ยนใบอนุญาตทีหลังได้
- เข้ากันได้กับเครื่องมือเดิม: ใช้
git clone/git pushปกติ และรองรับ Git LFS สำหรับไฟล์ใหญ่
สิ่งที่ต้องเตรียม
- Home Server ที่มี Docker และ Docker Compose พร้อมใช้งาน
- พอร์ตว่างสองพอร์ต:
3000สำหรับหน้าเว็บ และ2222สำหรับ Git ผ่าน SSH - (แนะนำ) Tailscale หรือ Reverse Proxy ถ้าอยากเข้าถึงจากนอกบ้าน — อย่าเปิดพอร์ตตรงเข้าเราเตอร์
ขั้นตอนที่ 1: สร้างไฟล์ Docker Compose
mkdir -p ~/forgejo/data
cd ~/forgejo
สร้างไฟล์ docker-compose.yml:
services:
forgejo:
image: codeberg.org/forgejo/forgejo:11
container_name: forgejo
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- FORGEJO__database__DB_TYPE=sqlite3
- FORGEJO__server__DOMAIN=192.168.1.50 # IP หรือโดเมนของเซิร์ฟเวอร์คุณ
- FORGEJO__server__ROOT_URL=http://192.168.1.50:3000/
- FORGEJO__server__SSH_PORT=2222 # พอร์ตที่เครื่องลูกข่ายมองเห็น
- FORGEJO__server__SSH_LISTEN_PORT=22 # พอร์ตข้างในคอนเทนเนอร์
- FORGEJO__service__DISABLE_REGISTRATION=false # ปิดทีหลังเมื่อสมัครเสร็จ
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:22"
[!NOTE] ค่าUSER_UIDและUSER_GIDต้องตรงกับผู้ใช้ที่เป็นเจ้าของโฟลเดอร์./dataบนเครื่องจริง ตรวจได้ด้วยคำสั่งid -uและid -gถ้าตั้งผิด คอนเทนเนอร์จะเขียนไฟล์ไม่ได้และล้มตั้งแต่เริ่ม
สั่งรัน:
docker compose up -d
ขั้นตอนที่ 2: ตั้งค่าครั้งแรกและปิดรับสมัครสมาชิก
เปิดเบราว์เซอร์ไปที่ http://<ไอพีเซิร์ฟเวอร์>:3000 จะเจอหน้าติดตั้งครั้งแรก ให้ตรวจสอบว่า Database Type เป็น SQLite3 แล้วเลื่อนลงมาที่หัวข้อ Administrator Account Settings เพื่อสร้างบัญชีผู้ดูแลตั้งแต่ตอนนี้เลย (ถ้าข้ามไป บัญชีแรกที่สมัครจะกลายเป็นแอดมินโดยอัตโนมัติ)
เมื่อเข้าใช้งานได้แล้ว อย่าลืมปิดการสมัครสมาชิก เพราะเซิร์ฟเวอร์นี้เป็นของคุณคนเดียว แก้ค่าในไฟล์ docker-compose.yml:
- FORGEJO__service__DISABLE_REGISTRATION=true
แล้วสั่ง docker compose up -d อีกครั้งเพื่อให้ค่าใหม่มีผล จากนั้นลองโหลดหน้าเว็บใหม่ ปุ่ม Register จะต้องหายไปจริง — อย่าเชื่อแค่ว่าแก้ไฟล์แล้วต้องได้ผล ให้เปิดดูด้วยตาทุกครั้ง
ขั้นตอนที่ 3: ใส่กุญแจ SSH แล้ว push ของจริง
เข้าไปที่เมนูโปรไฟล์ → Settings → SSH / GPG Keys แล้ววางกุญแจสาธารณะของคุณ (ดูได้จาก cat ~/.ssh/id_ed25519.pub ถ้ายังไม่มีให้สร้างด้วย ssh-keygen -t ed25519)
จากนั้นสร้าง repository ใหม่บนหน้าเว็บ แล้วผลักโค้ดชุดแรกขึ้นไป — จุดที่คนพลาดกันบ่อยคือ ต้องระบุพอร์ต 2222 ในที่อยู่ด้วย ไม่อย่างนั้น Git จะไปเคาะพอร์ต 22 ของตัวเครื่องแม่แทน แล้วขึ้นข้อความปฏิเสธสิทธิ์ที่ชวนสับสน:
cd ~/my-project
git init
git remote add origin ssh://[email protected]:2222/yourname/my-project.git
git add .
git commit -m "ย้ายบ้านมาอยู่เซิร์ฟเวอร์ตัวเอง"
git push -u origin main
ใช้เก็บเวอร์ชันของ Second Brain ก็ได้
ประโยชน์ที่หลายคนนึกไม่ถึงคือการเอา Forgejo มาคู่กับ Obsidian โดยทำให้ vault เป็น Git repository แล้วตั้งให้ commit อัตโนมัติวันละครั้ง
ต่างจากการซิงก์ด้วย Syncthing ตรงที่ Git เก็บ ประวัติทุกเวอร์ชัน ไว้ให้ — วันที่เผลอลบโน้ตสำคัญ หรือปลั๊กอินเขียนไฟล์เสียหาย คุณย้อนกลับไปดูฉบับเมื่อวานได้ทันทีด้วย git log และ git checkout โดยไม่ต้องพึ่งถังขยะของแอปใด ๆ
ข้อควรระวังคือ อย่า commit ความลับลงไปด้วย ไฟล์ .env โทเค็น API หรือคีย์ของบริการต่าง ๆ ควรอยู่ใน .gitignore เสมอ เพราะ Git ออกแบบมาให้ลืมยาก ของที่ commit ไปแล้วยังฝังอยู่ในประวัติแม้จะลบไฟล์ทิ้งภายหลัง
ข้อควรระวังเรื่องการสำรองข้อมูล
การมีเซิร์ฟเวอร์ Git เป็นของตัวเองแปลว่า คุณเป็นคนเดียวที่รับผิดชอบเวลาดิสก์พัง อย่าเข้าใจผิดว่าการที่โค้ดมีสำเนาอยู่ในเครื่องโน้ตบุ๊กแล้วคือการสำรองข้อมูล เพราะ issues, wiki และการตั้งค่าทั้งหมดอยู่ในโฟลเดอร์ ./data เท่านั้น
วิธีที่ตรงไปตรงมาที่สุดคือใช้คำสั่งดัมป์ที่ Forgejo เตรียมไว้ให้ แล้วส่งไฟล์ผลลัพธ์เข้าระบบสำรองข้อมูลที่เข้ารหัสของคุณอีกทอด:
docker exec -u git forgejo forgejo dump -c /data/gitea/conf/app.ini -f /data/backup.zip
สิ่งสำคัญกว่าการตั้งเวลาสำรองคือ การทดลองกู้คืนจริงอย่างน้อยปีละครั้ง ลองแตกไฟล์ zip ขึ้นเซิร์ฟเวอร์เปล่าดูสักครั้ง แล้วคุณจะรู้ว่าไฟล์สำรองนั้นใช้ได้จริง หรือเป็นแค่ความสบายใจลวง ๆ
บทสรุป
Forgejo เป็นชิ้นส่วนที่เติมเต็ม Home Server ได้อย่างลงตัว เพราะมันไม่ได้เก็บแค่ไฟล์ปัจจุบัน แต่เก็บ เส้นทางความคิดทั้งหมด ว่าโค้ดและบันทึกของคุณเดินทางมาถึงจุดนี้ได้อย่างไร
เริ่มจาก repository เดียวก็พอ — ลองย้ายโฟลเดอร์ที่เก็บไฟล์ docker-compose.yml ของทุกบริการในบ้านขึ้นไปก่อน วันที่คุณเผลอแก้คอนฟิกจนระบบพัง คุณจะขอบคุณตัวเองที่มีประวัติย้อนหลังเก็บไว้ในบ้าน ไม่ใช่ในเซิร์ฟเวอร์ของใครที่ไหนก็ไม่รู้ครับ