Minimale git-remote met publiek/prive-toggle

main

Deze repository wordt als momentopname gepubliceerd: een clone bevat de volledige inhoud, maar geen commitgeschiedenis.

2.5 kB Ruw bestand
import path from "node:path";

function required(name: string): string {
  const value = process.env[name];
  if (!value) {
    throw new Error(`Ontbrekende omgevingsvariabele ${name}. Zie .env.example.`);
  }
  return value;
}

function optional(name: string, fallback: string): string {
  const value = process.env[name];
  return value && value.length > 0 ? value : fallback;
}

function hostOf(url: string): string {
  try {
    return new URL(url).hostname;
  } catch {
    return "localhost";
  }
}

const repoRoot = path.resolve(required("REPO_ROOT"));

export const config = {
  repoRoot,

  /**
   * De publieke momentopnames staan in eigen bare repositories, los van je eigen
   * repositories met geschiedenis. Dat is geen extra voorzichtigheid maar de enige
   * werkende manier: git-namespaces en hidden refs houden objecten alleen uit de
   * advertentie, terwijl `git fetch <sha>` ze daarna gewoon ophaalt. Wat niet
   * gedeeld mag worden, moet in een andere repository staan.
   */
  publishedRoot: path.join(repoRoot, ".published"),
  port: Number.parseInt(optional("PORT", "3300"), 10),
  host: optional("HOST", "127.0.0.1"),
  publicUrl: optional("PUBLIC_URL", "http://localhost:3300").replace(/\/+$/, ""),
  ownerToken: required("OWNER_TOKEN"),
  sessionSecret: required("SESSION_SECRET"),
  siteName: optional("SITE_NAME", "Repositories"),
  trustProxy: optional("TRUST_PROXY", "0") === "1",

  /** URL-prefix voor het git smart-HTTP transport. Clone-URL wordt PUBLIC_URL + dit + /naam.git */
  gitPrefix: "/git",

  /**
   * Tweede transport-prefix, uitsluitend voor jezelf: hier wordt niets afgeschermd,
   * dus je clonet je volledige geschiedenis terug. Vraagt altijd om inloggegevens,
   * ook voor publieke repositories.
   */
  gitFullPrefix: "/git-full",

  /** Gebruikersnaam voor Basic auth en voor het inlogformulier. */
  ownerUser: optional("OWNER_USER", "owner"),

  /**
   * Auteur van de gepubliceerde momentopnames. Deze naam en dit adres reizen mee
   * naar iedereen die je code cloont, dus zet hier hoe je bekend wil staan.
   */
  snapshotAuthor: {
    name: optional("SNAPSHOT_AUTHOR_NAME", "pub-repo"),
    email: optional(
      "SNAPSHOT_AUTHOR_EMAIL",
      `pub-repo@${hostOf(optional("PUBLIC_URL", "http://localhost"))}`,
    ),
  },

  /** Bestanden groter dan dit worden niet gerenderd, alleen als download aangeboden. */
  maxRenderBytes: 1024 * 1024,

  /** Bovengrens op een enkele push, in bytes. Voorkomt dat iemand je schijf volzet. */
  maxRequestBuffer: "100M",
} as const;

export type Config = typeof config;