Rumah  >  Artikel  >  pangkalan data  >  Mencipta Hab Git Jauh untuk Syarikat Anda (Tanpa Github)

Mencipta Hab Git Jauh untuk Syarikat Anda (Tanpa Github)

Susan Sarandon
Susan Sarandonasal
2024-11-07 19:18:03434semak imbas

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

Mencipta Hab Git Jauh untuk Syarikat Anda: Panduan Komprehensif

Dalam artikel ini, kami akan meneroka cara membuat hab Git jauh untuk syarikat anda tanpa bergantung pada GitHub. Kami akan menggunakan TypeScript dan Go untuk pelaksanaan bahagian belakang, menyepadukan MySQL untuk penyimpanan data dan melaksanakan pengesahan pengguna menggunakan FIDO2. Penyelesaian ini menyediakan alternatif yang selamat dan boleh disesuaikan kepada platform pengehosan pihak ketiga.

Pelaksanaan Bahagian Belakang

Pelayan TypeScript

Mari mulakan dengan menyediakan pelayan TypeScript untuk mengendalikan operasi 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}`);
});

Pelayan TypeScript ini menyediakan titik akhir untuk mencipta repositori Git baharu pada pelayan.

Pergi Pelayan Git

Seterusnya, mari kita laksanakan pelayan Go untuk mengendalikan operasi tolak dan tarik 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)
}

Pelayan Go ini mengendalikan operasi tolak dan tarik Git dengan melaksanakan arahan Git yang sesuai.

Penyepaduan Pangkalan Data

Untuk menyimpan metadata repositori dan maklumat pengguna, kami akan menggunakan MySQL. Berikut ialah contoh cara untuk menyediakan sambungan pangkalan data dan mencipta jadual:

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();

Kod ini menyediakan sambungan MySQL dan mencipta jadual untuk menyimpan repositori dan maklumat pengguna.

Pengesahan Pengguna dengan FIDO2

Melaksanakan pengesahan FIDO2 menyediakan pengalaman log masuk yang selamat tanpa kata laluan. Berikut ialah contoh asas cara menyepadukan pengesahan 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' });
  }
});

Kod ini menyediakan titik akhir asas untuk pendaftaran dan log masuk FIDO2. Anda perlu melaksanakan logik tambahan untuk menyimpan dan mendapatkan semula cabaran dan bukti kelayakan pengguna daripada pangkalan data.

Kesimpulan

Dengan menggabungkan TypeScript dan Go for the backend, MySQL untuk penyimpanan data dan FIDO2 untuk pengesahan pengguna, anda boleh mencipta hab Git jauh yang teguh dan selamat untuk syarikat anda. Penyelesaian ini menawarkan kawalan penuh ke atas kod sumber dan pengurusan pengguna anda, tanpa bergantung pada platform pihak ketiga seperti GitHub.

Ingat untuk melaksanakan pengendalian ralat, pengelogan dan langkah keselamatan yang betul dalam persekitaran pengeluaran. Selain itu, pertimbangkan untuk menambah ciri seperti kawalan akses, proses semakan kod dan penyepaduan dengan alatan pembangunan sedia ada anda untuk mencipta penyelesaian pengurusan Git komprehensif yang disesuaikan dengan keperluan syarikat anda.

Atas ialah kandungan terperinci Mencipta Hab Git Jauh untuk Syarikat Anda (Tanpa Github). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn