เราพูดกันบ่อยเรื่องการเป็นเจ้าของรูปภาพ เอกสาร และรหัสผ่าน แต่มีข้อมูลอีกกองหนึ่งที่คนสายเทคมักลืมนึกถึง นั่นคือ โค้ดและประวัติการแก้ไขของมัน
สคริปต์ที่คุณเขียนเอง ไฟล์ 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 ของทุกบริการในบ้านขึ้นไปก่อน วันที่คุณเผลอแก้คอนฟิกจนระบบพัง คุณจะขอบคุณตัวเองที่มีประวัติย้อนหลังเก็บไว้ในบ้าน ไม่ใช่ในเซิร์ฟเวอร์ของใครที่ไหนก็ไม่รู้ครับ