From ec9005ee434abfa14f253fd75187ad265d85033d Mon Sep 17 00:00:00 2001 From: my name Date: Wed, 15 Jul 2026 04:29:40 +0200 Subject: [PATCH] IC, Caddyfile --- .gitignore | 34 +++++++++++++++++++++++++ Caddyfile | 17 +++++++++++++ README.md | 15 ++++++++++++ bun.lock | 26 ++++++++++++++++++++ package.json | 14 +++++++++++ src/config.ts | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ src/formatter.ts | 19 ++++++++++++++ src/index.ts | 31 +++++++++++++++++++++++ src/types.ts | 24 ++++++++++++++++++ src/validator.ts | 26 ++++++++++++++++++++ src/writer.ts | 6 +++++ tsconfig.json | 30 +++++++++++++++++++++++ 12 files changed, 306 insertions(+) create mode 100644 .gitignore create mode 100644 Caddyfile create mode 100644 README.md create mode 100644 bun.lock create mode 100644 package.json create mode 100644 src/config.ts create mode 100644 src/formatter.ts create mode 100644 src/index.ts create mode 100644 src/types.ts create mode 100644 src/validator.ts create mode 100644 src/writer.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a14702c --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# dependencies (bun install) +node_modules + +# output +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..8a505a7 --- /dev/null +++ b/Caddyfile @@ -0,0 +1,17 @@ +# generated by typescript + +memos.lyr41n.net { + reverse_proxy 92.222.229.62:8032 + } +git.lyr41n.net { + reverse_proxy 92.222.229.62:8030 + } +beszel.lyr41n.net { + reverse_proxy 92.222.229.62:9091 + } +pi. { + reverse_proxy 10.0.0.2:8084 + } +llama. { + reverse_proxy 10.0.0.2:8080 + } \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7c82c8c --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# pulumi + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.3.14. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime. diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..b7ad4f9 --- /dev/null +++ b/bun.lock @@ -0,0 +1,26 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "pulumi", + "devDependencies": { + "@types/bun": "latest", + }, + "peerDependencies": { + "typescript": "^5", + }, + }, + }, + "packages": { + "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], + + "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], + + "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5fc791f --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "pulumi", + "module": "src/index.ts", + "type": "module", + "scripts": { + "gen": "bun run src/index.ts" + }, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5" + } +} diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..137d2cf --- /dev/null +++ b/src/config.ts @@ -0,0 +1,64 @@ +import type { Host, Service } from "./types"; + +/** +vps + **/ +export const vps_ovh: Host = { + id: "vps-ovh", + ip: "92.222.229.62", + sshPort: 2002, + user: "ubuntu", + baseDomain: "lyr41n.net" +} + +/** +desktop + **/ +export const endm460: Host = { + id: "endm460", + ip: "10.0.0.2", + sshPort: 22, + user: "lyr41n", + baseDomain: "" +} + +/** +define services +**/ +export const services: Service[] = [ + { + name: "memos", + subdomain: "memos", + port: 8032, + type: "binary", + host: vps_ovh + }, + { + name: "gitea", + subdomain: "git", + port: 8030, + type: "binary", + host: vps_ovh + }, + { + name: "beszel", + subdomain: "beszel", + port: 9091, + type: "binary", + host: vps_ovh + }, + { + name: "pigallery", + subdomain: "pi", + port: 8084, + type: "binary", + host: endm460 + }, + { + name: "llcpp", + subdomain: "llama", + port: 8080, + type: "binary", + host: endm460 + } +] diff --git a/src/formatter.ts b/src/formatter.ts new file mode 100644 index 0000000..45ea767 --- /dev/null +++ b/src/formatter.ts @@ -0,0 +1,19 @@ +import type { Service } from "./types"; + +/** +assembles the contents for caddyfile + **/ +export function formatcaddyfile(proxies: Service[]): string { + let output = "# generated by typescript\n\n"; + + const proxyconfig = proxies.map(proxy => { + const fullDomain = `${proxy.subdomain}.${proxy.host.baseDomain}`; + const destination = `${proxy.host.ip}:${proxy.port}` + + return `${fullDomain} { + reverse_proxy ${destination} + }` + }).join('\n'); + + return output + proxyconfig +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..ee35afc --- /dev/null +++ b/src/index.ts @@ -0,0 +1,31 @@ +import { services } from "./config"; +import { formatcaddyfile } from "./formatter"; +import type { Service } from "./types"; +import { ConfigValidator } from "./validator"; +import { ConfigWriter } from "./writer"; + +console.log("Hello via Bun!"); + +// const vpsservices: Service[] = services.filter(service => service.host.id == "vps-ovh"); +// console.log(vpsservices); + +/** +entry point / manager + **/ +async function main() { + try { + console.log("starting caddy config"); + + ConfigValidator.validate(services); + + const output = formatcaddyfile(services); + + await ConfigWriter.writeLocal("Caddyfile", output); + + console.log("completed succesfully"); + } catch (error) { + console.error("error", error); + } +} + +main(); diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..b35ea89 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,24 @@ +export interface Host { + id: string; + ip: string; + sshPort: number; + user: string; + baseDomain: string; +} + +export interface Service { + name: string; + subdomain: string; + port: number; + type: "binary" | "compose"; + workingDir?: string; + dataDir?: string; + host: Host; +} + +export interface StaticSite { + domains: string[]; + root: string; + encode?: string; + custom404?: boolean; +} diff --git a/src/validator.ts b/src/validator.ts new file mode 100644 index 0000000..785b99b --- /dev/null +++ b/src/validator.ts @@ -0,0 +1,26 @@ +import type { Service } from "./types"; + +/** +should validate config, for now just checks for port collisions + **/ +export class ConfigValidator { + static validate(services: Service[]){ + const hostports = new Map>(); + + for (const service of services) { + const hostip = service.host.ip; + + if (!hostports.has(hostip)) { + hostports.set(hostip, new Set()); + } + + const ports = hostports.get(hostip)!; + if (ports.has(service.port)) { + throw new Error(`port collision: host ${hostip} already has a service on ${service.port}(${service.name})`) + } + ports.add(service.port); + } + + console.log("validated collision"); + } +} diff --git a/src/writer.ts b/src/writer.ts new file mode 100644 index 0000000..ac39e78 --- /dev/null +++ b/src/writer.ts @@ -0,0 +1,6 @@ +export class ConfigWriter{ + static async writeLocal(filename: string, content: string) { + await Bun.write(filename, content); + console.log(`written to ${filename}`); + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b2e7497 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "Preserve", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + "types": ["bun"], + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +}