ทวงคืนโค้ดและบันทึกของคุณจาก GitHub: คู่มือติดตั้ง Forgejo เซิร์ฟเวอร์ Git ส่วนตัวบน Home Server ด้วย Docker

ย้ายที่เก็บโค้ด สคริปต์ และประวัติการแก้ไขทั้งหมดออกจากคลาวด์ของบริษัทใหญ่ มาไว้ในบ้านตัวเองด้วย Forgejo บน Docker พร้อมวิธีเปิด SSH สำหรับ push และวิธีใช้เก็บเวอร์ชันของ Second Brain

Share
ทวงคืนโค้ดและบันทึกของคุณจาก GitHub: คู่มือติดตั้ง Forgejo เซิร์ฟเวอร์ Git ส่วนตัวบน Home Server ด้วย Docker

เราพูดกันบ่อยเรื่องการเป็นเจ้าของรูปภาพ เอกสาร และรหัสผ่าน แต่มีข้อมูลอีกกองหนึ่งที่คนสายเทคมักลืมนึกถึง นั่นคือ โค้ดและประวัติการแก้ไขของมัน

สคริปต์ที่คุณเขียนเอง ไฟล์ 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 สำหรับไฟล์ใหญ่

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

  1. Home Server ที่มี Docker และ Docker Compose พร้อมใช้งาน
  2. พอร์ตว่างสองพอร์ต: 3000 สำหรับหน้าเว็บ และ 2222 สำหรับ Git ผ่าน SSH
  3. (แนะนำ) 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 ของจริง

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

Read more

สร้าง AI Agent สำหรับการทำ Decision Log อัตโนมัติ: เปลี่ยนทุกการตัดสินใจสำคัญให้เป็นบทเรียนเพื่อการเติบโต

สร้าง AI Agent สำหรับการทำ Decision Log อัตโนมัติ: เปลี่ยนทุกการตัดสินใจสำคัญให้เป็นบทเรียนเพื่อการเติบโต

เรียนรู้วิธีใช้ AI Agent ช่วยบันทึกและวิเคราะห์การตัดสินใจสำคัญในชีวิตประจำวัน เพื่อเปลี่ยนทุกทางเลือกให้กลายเป็นฐานข้อมูลบทเรียนที่มีค่าสำหรับอนาคต

By Linn
คู่มือใช้งาน Obsidian Graph View: เปลี่ยนใยแมงมุมความรู้ให้เป็นเครื่องมือนำทางความคิดใน Second Brain

คู่มือใช้งาน Obsidian Graph View: เปลี่ยนใยแมงมุมความรู้ให้เป็นเครื่องมือนำทางความคิดใน Second Brain

Graph View ใน Obsidian ไม่ใช่แค่ภาพกราฟสวยๆ ไว้ดูเล่น มาเรียนรู้วิธีปรับแต่ง Local Graph, Color Groups และฟิลเตอร์ เพื่อเปลี่ยนเครือข่ายความรู้ให้กลายเป็นเครื่องมือนำทางความคิดจริง

By Linn
สร้าง Smart Clipboard Agent: ดักจับและคัดแยกข้อความที่คัดลอกระหว่างวัน บันทึกเข้า Obsidian อัตโนมัติด้วย Python + Ollama

สร้าง Smart Clipboard Agent: ดักจับและคัดแยกข้อความที่คัดลอกระหว่างวัน บันทึกเข้า Obsidian อัตโนมัติด้วย Python + Ollama

เปลี่ยนข้อความ โค้ด ลิงก์ และไอเดียที่คุณคัดลอกระหว่างวันให้กลายเป็นบันทึกความรู้ที่มีบริบทใน Second Brain โดยอัตโนมัติ ด้วยสคริปต์ Python คอยมอนิเตอร์คลิปบอร์ดคู่กับ Local LLM บน Ollama แบบออฟไลน์ 100%

By Linn
บอกลาคำสั่ง Docker CLI ที่ซับซ้อน: คู่มือติดตั้ง Dockge จัดการ Docker Compose บน Home Server อย่างมือโปร

บอกลาคำสั่ง Docker CLI ที่ซับซ้อน: คู่มือติดตั้ง Dockge จัดการ Docker Compose บน Home Server อย่างมือโปร

ยกระดับการจัดการคอนเทนเนอร์บน Home Server ให้ง่ายและเป็นระเบียบ ด้วย Dockge ตัวจัดการ Docker Compose สไตล์มินิมอลที่เน้นความโปร่งใส ควบคุมไฟล์ .yml ได้โดยตรง 100%

By Linn