為您的公司建立遠端 Git Hub(無需 Github)

Susan Sarandon
發布: 2024-11-07 19:18:03
原創
506 人瀏覽過

Creating a Remote Git Hub for Your Company(Without Github)

為您的公司建立遠端 Git 中心:綜合指南

在本文中,我們將探討如何在不依賴 GitHub 的情況下為您的公司建立遠端 Git 中心。我們將使用 TypeScript 和 Go 進行後端實現,整合 MySQL 進行資料存儲,並使用 FIDO2 實現使用者身份驗證。該解決方案為第三方託管平台提供了安全且可自訂的替代方案。

後端實施

TypeScript 伺服器

讓我們先設定 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 儲存庫。

轉到 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 驗證可提供安全、無密碼的登入體驗。以下是如何整合 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板