IC, Caddyfile
This commit is contained in:
+37
@@ -0,0 +1,37 @@
|
|||||||
|
.src/config.ts
|
||||||
|
/config.ts
|
||||||
|
|
||||||
|
# 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
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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.
|
||||||
@@ -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=="],
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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<string, Set<number>>();
|
||||||
|
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
export class ConfigWriter{
|
||||||
|
static async writeLocal(filename: string, content: string) {
|
||||||
|
await Bun.write(filename, content);
|
||||||
|
console.log(`written to ${filename}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user