為您的公司建立遠端 Git 中心:綜合指南
在本文中,我們將探討如何在不依賴 GitHub 的情況下為您的公司建立遠端 Git 中心。我們將使用 TypeScript 和 Go 進行後端實現,整合 MySQL 進行資料存儲,並使用 FIDO2 實現使用者身份驗證。該解決方案為第三方託管平台提供了安全且可自訂的替代方案。
讓我們先設定 TypeScript 伺服器來處理 Git 操作:
import express from 'express'; import { execSync } from 'child_process'; const app = express(); const port = 3000; app.post('/create-repo', (req, res) => { const { repoName } = req.body; try { execSync(`git init --bare /path/to/repos/${repoName}.git`); res.status(200).json({ message: 'Repository created successfully' }); } catch (error) { res.status(500).json({ error: 'Failed to create repository' }); } }); app.listen(port, () => { console.log(`Server running on port ${port}`); });
此 TypeScript 伺服器提供了一個端點,用於在伺服器上建立新的 Git 儲存庫。
接下來,讓我們實作一個 Go 伺服器來處理 Git 推播與拉取操作:
package main import ( "fmt" "net/http" "os/exec" ) func handleGitOperation(w http.ResponseWriter, r *http.Request) { repoPath := r.URL.Path[1:] gitCommand := r.Header.Get("X-Git-Command") cmd := exec.Command("git", gitCommand, "--stateless-rpc", repoPath) cmd.Stdin = r.Body cmd.Stdout = w cmd.Stderr = w if err := cmd.Run(); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } func main() { http.HandleFunc("/", handleGitOperation) fmt.Println("Git server running on :8080") http.ListenAndServe(":8080", nil) }
此 Go 伺服器透過執行適當的 Git 指令來處理 Git 推播和拉取操作。
為了儲存儲存庫元資料和使用者訊息,我們將使用 MySQL。以下是如何設定資料庫連線和建立表格的範例:
import mysql from 'mysql2/promise'; const pool = mysql.createPool({ host: 'localhost', user: 'your_username', password: 'your_password', database: 'git_hub', }); async function createTables() { const connection = await pool.getConnection(); try { await connection.query(` CREATE TABLE IF NOT EXISTS repositories ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, owner_id INT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) `); await connection.query(` CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) `); } finally { connection.release(); } } createTables();
此程式碼設定 MySQL 連線並建立用於儲存儲存庫和使用者資訊的表。
實作 FIDO2 驗證可提供安全、無密碼的登入體驗。以下是如何整合 FIDO2 身份驗證的基本範例:
import { Fido2Lib } from 'fido2-lib'; const f2l = new Fido2Lib({ timeout: 60000, rpId: 'your-company.com', rpName: 'Your Company Git Hub', challengeSize: 128, attestation: 'none', cryptoParams: [-7, -257], }); app.post('/register', async (req, res) => { const { username, email } = req.body; const challengeResponse = await f2l.attestationOptions(); // Store challenge and user info in the database res.json(challengeResponse); }); app.post('/login', async (req, res) => { const { credential } = req.body; try { const result = await f2l.assertionResult(credential, { challenge: 'stored_challenge', origin: 'https://your-company.com', factor: 'either', }); // Verify the result and create a session res.json({ success: true }); } catch (error) { res.status(401).json({ error: 'Authentication failed' }); } });
此程式碼提供 FIDO2 註冊和登入的基本端點。您需要實作額外的邏輯來儲存和檢索資料庫中的挑戰和使用者憑證。
透過結合使用 TypeScript 和 Go 作為後端、使用 MySQL 進行資料儲存以及使用 FIDO2 進行使用者身份驗證,您可以為您的公司建立一個強大且安全的遠端 Git 中心。此解決方案可完全控制您的原始程式碼和使用者管理,而無需依賴 GitHub 等第三方平台。
請記住在生產環境中實施適當的錯誤處理、日誌記錄和安全措施。此外,請考慮新增存取控制、程式碼審查流程以及與現有開發工具整合等功能,以建立適合您公司需求的全面 Git 管理解決方案。
以上是為您的公司建立遠端 Git Hub(無需 Github)的詳細內容。更多資訊請關注PHP中文網其他相關文章!