สร้าง GitHub App
คู่มือนี้แสดงวิธีมอบตัวตน GitHub ของตัวเองให้เซิร์ฟเวอร์ของคุณ ใช้เวลาประมาณสองนาที มีเพียงเจ้าของเซิร์ฟเวอร์เท่านั้นที่ทำ และต้องทำเพียงครั้งเดียวต่อเซิร์ฟเวอร์
สำหรับการเชื่อมต่อบัญชีของคุณเองในภายหลัง ดู ตั้งค่าการผสาน GitHub
ทำไมเซิร์ฟเวอร์ของคุณจึงต้องมีแอปของตัวเอง
หัวข้อที่มีชื่อว่า “ทำไมเซิร์ฟเวอร์ของคุณจึงต้องมีแอปของตัวเอง”งานสองอย่างที่ต่างกันออกมาจากการลงทะเบียนครั้งเดียว และแอปคือสิ่งที่ทำให้ทั้งสองอย่างซื่อสัตย์:
| งาน | อะไรเป็นตัวตอบ | ทำไมจึงสำคัญ |
|---|---|---|
| บุคคลลงชื่อเข้าใช้ | client id ของแอป ผ่าน device flow | คุณได้ข้อมูลรับรองที่เป็นของคุณเอง บนเซิร์ฟเวอร์ บนทุกอุปกรณ์ — โดยไม่มีโทเค็นให้วางหรือหมุนเวียน |
| เซิร์ฟเวอร์ลงมือทำ | id ของแอป + private key → โทเค็นการติดตั้ง | webhook การโพลล์ PR และการซิงค์ตั๋วงานเลิกพึ่งพาว่าโทเค็นของมนุษย์คนหนึ่งยังใช้ได้อยู่หรือไม่ |
สังเกตว่าสิ่งที่ ไม่ อยู่ในตารางนั้นคือ client secret — device flow ของ GitHub ตรวจสอบสิทธิ์ด้วย client id เพียงอย่างเดียว ทั้งคำขอ device code และการโพลล์ โทเค็น — จึงไม่มีข้อมูลลับใดให้เก็บไว้สำหรับการลงชื่อเข้าใช้
หากไม่มีแอปของคุณเอง อย่างแรกก็ยังทำงานได้ผ่าน client id ที่บิลด์มาพร้อมให้ ส่วนอย่างที่สองจะถอยไปใช้ข้อมูลรับรองของเจ้าของเซิร์ฟเวอร์ งานเบื้องหลังจึงพ่วงอยู่กับคนที่เริ่มตั้งค่าก่อน
สิ่งที่ต้องมีก่อน
หัวข้อที่มีชื่อว่า “สิ่งที่ต้องมีก่อน”- คุณเป็นเจ้าของเซิร์ฟเวอร์ — การดำเนินการ
providerApps.*ถูกจำกัดไว้เฉพาะเจ้าของ และการ์ดนี้มองไม่เห็นสำหรับคนอื่น - บัญชี GitHub หรือองค์กรที่คุณสร้างแอปได้
- ไม่มีอะไรที่ต้องเข้าถึงได้จากสาธารณะ: การลงชื่อเข้าใช้เป็น device flow เซิร์ฟเวอร์ จึงไม่ต้องมีพอร์ตขาเข้า ทันเนล callback URL หรือโดเมนใด ๆ
ลงทะเบียนแอป
หัวข้อที่มีชื่อว่า “ลงทะเบียนแอป”- ไปที่ github.com/settings/apps/new (สำหรับองค์กร: Settings → Developer settings → GitHub Apps → New GitHub App)
- GitHub App name — อะไรก็ได้;
Control Center (yourname)ก็ใช้ได้ ชื่อนี้จะ ปรากฏบนคอมมิตและคอมเมนต์ที่เซิร์ฟเวอร์สร้าง - Homepage URL — อะไรก็ได้ เช่น
https://github.com/your-name - Callback URL — เว้นว่างไว้ device flow ไม่ต้องใช้มัน
- ติ๊ก Enable Device Flow นี่คือการตั้งค่าเดียวที่การลงชื่อเข้าใช้ขาดไม่ได้
- ยกเลิกติ๊ก Webhook → Active เว้นแต่คุณจะต่อ webhook แยกต่างหาก
- ใต้ Repository permissions ให้สิทธิ์อย่างน้อย:
- Contents: Read and write
- Metadata: Read-only (บังคับ)
- Pull requests: Read and write
- Issues: Read and write หากคุณใช้ GitHub Issues เป็นตั๋วงาน และ สำหรับการค้นหาคอมเมนต์ในบทสนทนา PR ของบอต (ดูคุยกับ Control Center จาก GitHub PR)
- Checks: Read-only สำหรับสถานะ CI บนหน้า PR
- ใต้ Where can this GitHub App be installed? เลือกแบบที่เหมาะกับคุณ — “Only on this account” เหมาะกับเซิร์ฟเวอร์ส่วนตัว
- คลิก Create GitHub App
เก็บค่าทั้งสาม
หัวข้อที่มีชื่อว่า “เก็บค่าทั้งสาม”บนหน้าแอป ทันทีหลังสร้างเสร็จ:
| ค่า | ตำแหน่ง |
|---|---|
| App ID | แท็บ General ใกล้ด้านบน |
| Client ID | แท็บ General ใต้ “Client secrets” |
| Private key | Generate a private key — ไฟล์ .pem จะถูกดาวน์โหลด |
ไฟล์ private key จะถูกดาวน์โหลดเพียงครั้งเดียว และ GitHub จะไม่แสดงมันอีก เก็บไว้ จนกว่าคุณจะวางมันเสร็จ; คุณสร้างไฟล์ใหม่ได้เสมอ
client secret เป็นทางเลือก และให้ผลอย่างเดียวเท่านั้น: หากคุณเปิด “Expire user authorization tokens” ไว้ มันคือสิ่งที่ต่ออายุโทเค็นของใครสักคน อย่างเงียบ ๆ แทนที่จะให้เขาลงชื่อเข้าใช้อีกครั้งทุกแปดชั่วโมง ส่วนการ ลงชื่อเข้าใช้เองไม่เคยใช้มัน
การตั้งค่าที่ง่ายกว่าคือปิดการหมดอายุนั้น แล้วจะไม่ต้องมี secret ที่ไหนเลย หากคุณเปิดไว้ ให้สร้าง secret แล้ววางใน การตั้งค่า → เซิร์ฟเวอร์ → ลงชื่อเข้าใช้ครั้งเดียว (การ์ด แอปผู้ให้บริการ) — ไม่มีตัวแปรสภาพแวดล้อมสำหรับ มัน และไม่มีอะไรถูกฝังไว้ในบิลด์ มันจึงอยู่บนเซิร์ฟเวอร์ของคุณ
ติดตั้งบนบัญชีของคุณ
หัวข้อที่มีชื่อว่า “ติดตั้งบนบัญชีของคุณ”แอปที่ลงทะเบียนแล้วแต่ยังไม่ติดตั้งนั้นยืนยันตัวตนผู้คนได้ แต่อ่านอะไรไม่ได้เลย
- บนหน้าแอป เปิด Install App
- ติดตั้งบนบัญชีหรือองค์กรของคุณ
- เลือก All repositories หรือเลือกรีโพที่เซิร์ฟเวอร์นี้ควรเห็น
วางลงใน Control Center
หัวข้อที่มีชื่อว่า “วางลงใน Control Center”- ไปที่ การตั้งค่า → เซิร์ฟเวอร์ → ลงชื่อเข้าใช้ครั้งเดียว แล้วเลื่อนไปที่ การ์ด แอปผู้ให้บริการ
- ในบล็อก GitHub ตั้งค่าแต่ละช่อง:
- App id — App ID ที่เป็นตัวเลข
- Private key — วาง
.pemทั้งไฟล์ รวมบรรทัดBEGINและEND - Client id — จากหน้าเดียวกัน
- Client secret — เฉพาะเมื่อคุณสร้างไว้ (สำหรับการต่ออายุโทเค็น)
- คลิก ทดสอบ
คีย์จะถูกแยกวิเคราะห์ทันทีที่บันทึก การวางที่ถูกตัดขาดหรือรูปแบบผิดจึงถูกปฏิเสธ ตรงนั้นทันที แทนที่จะไปล้มเหลวในคำขอเบื้องหลังหลายชั่วโมงให้หลัง ทดสอบ ไปไกลกว่านั้น และถาม GitHub ว่าแอปติดตั้งอยู่บนบัญชีใดบ้าง — “บันทึกแล้ว” กับ “ใช้งานได้” เป็นข้ออ้างคนละแบบ และมีเพียงอย่างหลังเท่านั้นที่หมายความว่าจะมีอะไรทำงาน
จุดตรวจสอบ: บล็อก GitHub อ่านได้ว่า “เซิร์ฟเวอร์ทำหน้าที่เป็นตัวเองได้ และคนลงชื่อเข้าใช้ได้” และแถว GitHub ใต้ การตั้งค่า → เวิร์กสเปซ → โปรไฟล์และตัวตน → โฮสต์โค้ด ตอนนี้มี ลงชื่อเข้าใช้ด้วย GitHub ให้เลือก
ตั้งค่าด้วยตัวแปรสภาพแวดล้อมแทน
หัวข้อที่มีชื่อว่า “ตั้งค่าด้วยตัวแปรสภาพแวดล้อมแทน”สำหรับการติดตั้งแบบไม่มีส่วนติดต่อหรือแบบสคริปต์ เซิร์ฟเวอร์จะเติมแต่ละช่องจาก ตัวแปรสภาพแวดล้อมในครั้งแรกที่ยังไม่มีค่าจัดเก็บไว้:
GITHUB_APP_ID=123456GITHUB_APP_PRIVATE_KEY="$(cat control-center.private-key.pem)"GITHUB_CLIENT_ID=Iv1.0123456789abcdefไม่มีแฟล็กบนบรรทัดคำสั่งสำหรับค่าเหล่านี้ — ความลับบนบรรทัดคำสั่งนั้นทุกโปรเซส
บนโฮสต์อ่านได้ผ่าน ps ตัวแปรสภาพแวดล้อมเป็นที่เดียวที่ตั้งค่าเหล่านี้ได้ และมัน
มีสิทธิ์เหนือกว่าสิ่งที่บิลด์มาพร้อมให้ .env.template คือรายการที่สมบูรณ์
สำหรับการพัฒนาภายในเครื่อง .env ที่รากของรีโพเก็บค่าเดียวกัน และเดสก์ท็อป
ส่งค่าเหล่านั้นให้เซิร์ฟเวอร์ที่มันเปิดขึ้น ใส่คีย์บนบรรทัดเดียวที่นั่น:
ค่าใน .env หนึ่งค่าคือหนึ่งบรรทัด และ \n ภายในเครื่องหมายอัญประกาศคู่จะถูกถอดเป็นขึ้นบรรทัดใหม่
GITHUB_APP_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIEow…\n-----END RSA PRIVATE KEY-----"GITHUB_APP_ID และ GITHUB_APP_PRIVATE_KEY เป็นชื่อเดียวกับที่โบรกเกอร์โทเค็นของแซนด์บ็อกซ์
อ่านอยู่แล้ว โฮสต์ที่ตั้งค่าโทเค็นเอเจนต์แบบละเอียดไว้แล้วจึงได้ช่องทางการลงชื่อเข้าใช้ไปฟรี ๆ การเติมค่าจะเกิดขึ้นครั้งเดียวต่อหนึ่งช่อง — หลังจากนั้นค่าที่จัดเก็บไว้จะเป็นฝ่ายชนะ การแก้ไขในการตั้งค่าจึงไม่ถูกย้อนโดยการรีสตาร์ตครั้งถัดไป
ทำแบบเดียวกันกับ Linear
หัวข้อที่มีชื่อว่า “ทำแบบเดียวกันกับ Linear”Linear ไม่มี device flow การลงชื่อเข้าใช้ของมันจึงเป็นการไปกลับผ่านเบราว์เซอร์ และ ต้องมี callback URL — การ์ด แอปผู้ให้บริการ แสดง URL ที่คุณต้องลงทะเบียนให้อย่างแม่นยำ
- สร้างแอปพลิเคชัน OAuth ที่ linear.app/settings/api/applications/new
- ตั้ง Callback URL เป็น URL ที่การ์ดแสดง ตามตัวอักษร
- วาง Client ID และ Client secret ลงในบล็อก Linear
- จะเพิ่มคีย์ API ของเวิร์กสเปซก็ได้ — นั่นคือข้อมูลรับรองที่เซิร์ฟเวอร์ ใช้ซิงค์ตั๋วงานเมื่อไม่มีมนุษย์ร้องขอ
การแก้ปัญหา
หัวข้อที่มีชื่อว่า “การแก้ปัญหา”กล่องโต้ตอบการลงชื่อเข้าใช้บอกว่าผู้ให้บริการไม่ได้ส่ง device code กลับมา
หัวข้อที่มีชื่อว่า “กล่องโต้ตอบการลงชื่อเข้าใช้บอกว่าผู้ให้บริการไม่ได้ส่ง device code กลับมา”Enable Device Flow ปิดอยู่บนแอป เปิดมันใต้ General แล้วลองใหม่
การทดสอบบอกว่าข้อมูลรับรองใช้งานได้ แต่แอปไม่ได้ติดตั้งที่ใดเลย
หัวข้อที่มีชื่อว่า “การทดสอบบอกว่าข้อมูลรับรองใช้งานได้ แต่แอปไม่ได้ติดตั้งที่ใดเลย”การลงทะเบียนและการติดตั้งเป็นคนละขั้นตอน เปิด Install App บนหน้าแอป แล้วติดตั้งมัน
การทดสอบบอกว่าไม่สามารถอ่าน private key ได้
หัวข้อที่มีชื่อว่า “การทดสอบบอกว่าไม่สามารถอ่าน private key ได้”วางไฟล์ .pem ทั้งไฟล์ รวมบรรทัด -----BEGIN และ -----END คีย์
ed25519 หรือ EC ใช้ไม่ได้ — GitHub Apps ลงนามด้วย RSA
สมาชิกลงชื่อเข้าใช้แล้ว แต่ไม่เห็นรีโพสิทอรีใดเลย
หัวข้อที่มีชื่อว่า “สมาชิกลงชื่อเข้าใช้แล้ว แต่ไม่เห็นรีโพสิทอรีใดเลย”แอปไม่ได้ติดตั้งบนบัญชีที่เป็นเจ้าของรีโพเหล่านั้น หรือการติดตั้งของมันเลือก รีโพอื่น การลงชื่อเข้าใช้ของสมาชิกเองให้สิทธิ์เพียงเท่าที่แอปได้รับอนุญาตให้เห็นเท่านั้น