From 86654c8ee5e86e5f02a8b5ee9c372bbacdf0f0f0 Mon Sep 17 00:00:00 2001 From: madonuko Date: Sun, 5 Jul 2026 16:28:16 +0800 Subject: [PATCH 01/10] feat: name generator for servers/create Resolves #21 --- apps/dashboard/src/lib/server/name-generator.ts | 8 ++++++++ .../projects/[projectid]/servers/create/+page.svelte | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 apps/dashboard/src/lib/server/name-generator.ts diff --git a/apps/dashboard/src/lib/server/name-generator.ts b/apps/dashboard/src/lib/server/name-generator.ts new file mode 100644 index 0000000..86ffd12 --- /dev/null +++ b/apps/dashboard/src/lib/server/name-generator.ts @@ -0,0 +1,8 @@ +const choices = [ + ["kitten", "cat", "neko", "puppy"], + ["box", "stack", "rack", "server"], +]; + +const choose = (i: int) => choices[i][Math.floor(Math.random() * choices[i].length)]; + +export const generateServerName = () => choose(0) + choose(1); diff --git a/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte b/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte index 655625d..d607c3a 100644 --- a/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte +++ b/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte @@ -28,6 +28,7 @@ Plus, X } from '@lucide/svelte'; + import { generateServerName } from '$lib/server/name-generator'; type PageData = { currentProject?: { id: string } | null; @@ -123,7 +124,7 @@ const ipv6Available = $derived(Boolean(data.ipamAvailability?.ipv6.available)); const bothNetworksAvailable = $derived(ipv4Available && ipv6Available); - let serverName = $state(''); + let serverName = $state(generateServerName()); let selectedImageId = $state(null); let selectedImageVersion = $state(null); let selectedPlanId = $state(null); From 6d93e534964fa4e7021fa2ef5868afa5130e7b24 Mon Sep 17 00:00:00 2001 From: Hero Date: Sun, 5 Jul 2026 03:29:32 -0500 Subject: [PATCH 02/10] Update README.md --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bb5e5b0..ad30157 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,10 @@ 1. `pnpm install` 2. Start a Postgres server: `podman run -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword -d postgres` -3. Add secrets to `.env` -4. Set up the database: `pnpm --filter stack-dashboard db:push` -5. `pnpm --filter stack-dashboard dev` +3. Copy `apps/dashboard/.env.example` to `apps/dashboard/.env` +4. Add secrets to `apps/dashboard/.env` +5. Set up the database: `pnpm --filter stack-dashboard db:push` +6. `pnpm --filter stack-dashboard dev` ### Postgres Setup @@ -21,6 +22,7 @@ - Generate Better Auth - Autumn - Postgres connection URL + - if you use the podman command(s) listed above, the connection string is `postgres://postgres:mysecretpassword@127.0.0.1:5432/postgres` - Highly recommended: - Proxmox - Optional: From 0fa5ca2ed6862ef42d10524388357253afb498a0 Mon Sep 17 00:00:00 2001 From: madonuko Date: Mon, 6 Jul 2026 16:25:44 +0800 Subject: [PATCH 03/10] feat(name-generator): more choices from lea --- apps/dashboard/src/lib/server/name-generator.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dashboard/src/lib/server/name-generator.ts b/apps/dashboard/src/lib/server/name-generator.ts index 86ffd12..19c1a49 100644 --- a/apps/dashboard/src/lib/server/name-generator.ts +++ b/apps/dashboard/src/lib/server/name-generator.ts @@ -1,6 +1,6 @@ const choices = [ - ["kitten", "cat", "neko", "puppy"], - ["box", "stack", "rack", "server"], + ["kitten", "cat", "neko", "puppy", "dog", "doggy"], + ["box", "stack", "rack", "server", "node"], ]; const choose = (i: int) => choices[i][Math.floor(Math.random() * choices[i].length)]; From 0423d36ed4a909d73eb9e399b0ae4fae620023fa Mon Sep 17 00:00:00 2001 From: madonuko Date: Mon, 6 Jul 2026 17:41:27 +0800 Subject: [PATCH 04/10] feat: onclick `` regenerateServerName somebody please test my code and probably need to add a bunch of tailwind classes --- .../(app)/projects/[projectid]/servers/create/+page.svelte | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte b/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte index d607c3a..96bd3f6 100644 --- a/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte +++ b/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte @@ -26,7 +26,8 @@ EyeOff, HardDriveUpload, Plus, - X + X, + Dices } from '@lucide/svelte'; import { generateServerName } from '$lib/server/name-generator'; @@ -125,6 +126,9 @@ const bothNetworksAvailable = $derived(ipv4Available && ipv6Available); let serverName = $state(generateServerName()); + function regenerateServerName() { + serverName = generateServerName(); + } let selectedImageId = $state(null); let selectedImageVersion = $state(null); let selectedPlanId = $state(null); @@ -424,6 +428,7 @@ placeholder="my-server" class="h-11 text-base sm:h-9 sm:text-sm" /> + From 585d65bfd1314b60b628db7857f24929e862b25c Mon Sep 17 00:00:00 2001 From: Willow C Reed Date: Mon, 6 Jul 2026 15:11:49 -0600 Subject: [PATCH 05/10] add codeberg mirroring --- .github/workflows/mirror.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/mirror.yml diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml new file mode 100644 index 0000000..518908f --- /dev/null +++ b/.github/workflows/mirror.yml @@ -0,0 +1,16 @@ +name: mirror + +on: [push] + +jobs: + mirror: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: yesolutions/mirror-action@master + with: + REMOTE: "https://codeberg.org/FyraStack/dashboard.git" + GIT_USERNAME: ${{ secrets.GIT_USERNAME }} + GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }} From 3340b80f9914ba66d8c94c95a8c790524bc94401 Mon Sep 17 00:00:00 2001 From: Addison LeClair Date: Tue, 7 Jul 2026 00:52:10 -0700 Subject: [PATCH 06/10] fix: local wrangler for development --- apps/dashboard/.env.example | 19 ++++++----- apps/dashboard/package.json | 2 +- apps/dashboard/svelte.config.js | 6 +++- apps/dashboard/wrangler.local.jsonc | 50 +++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 apps/dashboard/wrangler.local.jsonc diff --git a/apps/dashboard/.env.example b/apps/dashboard/.env.example index 8b0ff42..a6dbd5c 100644 --- a/apps/dashboard/.env.example +++ b/apps/dashboard/.env.example @@ -14,10 +14,11 @@ BETTER_AUTH_SECRET="" # VyOS # In production, router updates are routed through the VYOS_VPC_01 / VYOS_VPC_02 # Workers VPC bindings (router 1 first, falling back to router 2 if it is offline). -# Set VYOS_USE_VPC="false" to bypass VPC and talk directly to VYOS_API_URL instead. +# VPC bindings only exist in the deployed Workers — keep VYOS_USE_VPC="false" in +# local dev so requests go directly to VYOS_API_URL instead. VYOS_API_URL="" VYOS_API_KEY="" -VYOS_USE_VPC="true" +VYOS_USE_VPC="false" # Only used for the direct (non-VPC) fallback; the VPC path terminates TLS itself. VYOS_VERIFY_SSL="false" @@ -41,18 +42,20 @@ GITHUB_CLIENT_SECRET="" # Proxmox VE backend # In production, requests are routed through the PROXMOX_VPC Workers VPC binding, -# which terminates TLS. Set PROXMOX_USE_VPC="false" to bypass VPC and talk directly -# to PROXMOX_API_URL (self-signed certs are accepted automatically outside production). +# which terminates TLS. VPC bindings only exist in the deployed Workers — keep +# PROXMOX_USE_VPC="false" in local dev so requests go directly to PROXMOX_API_URL +# (self-signed certs are accepted automatically outside production). PROXMOX_API_URL="https://pve.example.com:8006" PROXMOX_TOKEN_ID="root@pam!stack" PROXMOX_TOKEN_SECRET="" -PROXMOX_USE_VPC="true" +PROXMOX_USE_VPC="false" PROXMOX_VM_FIREWALL_SECURITY_GROUP="" # In production, snippet uploads are routed through the SNIPPETS Workers VPC binding. -# Set PROXMOX_SNIPPETS_USE_VPC="false" to bypass VPC and talk directly to the endpoint -# below (PROXMOX_SNIPPETS_ENDPOINT_VERIFY_SSL then governs TLS for that direct path). -PROXMOX_SNIPPETS_USE_VPC="true" +# VPC bindings only exist in the deployed Workers — keep this "false" in local dev to +# talk directly to the endpoint below (PROXMOX_SNIPPETS_ENDPOINT_VERIFY_SSL then +# governs TLS for that direct path). +PROXMOX_SNIPPETS_USE_VPC="false" PROXMOX_SNIPPETS_ENDPOINT_URL="https://pxmx-01.example:8005" PROXMOX_SNIPPETS_ENDPOINT_USERNAME="pvecic" PROXMOX_SNIPPETS_ENDPOINT_PASSWORD="change-me" diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 0af4dbc..09ca21d 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -7,7 +7,7 @@ "dev": "NODE_TLS_REJECT_UNAUTHORIZED=0 vite dev", "build": "vite build", "preview": "vite preview", - "cf:dev": "pnpm run build && wrangler dev --local-protocol http", + "cf:dev": "pnpm run build && wrangler dev -c wrangler.local.jsonc --local-protocol http", "cf:dev:remote": "pnpm run build && wrangler dev --remote", "cf:deploy": "wrangler deploy --env=\"\"", "cf:deploy:preview": "pnpm run build && wrangler deploy --env preview", diff --git a/apps/dashboard/svelte.config.js b/apps/dashboard/svelte.config.js index 2ba3e3d..bb36f98 100644 --- a/apps/dashboard/svelte.config.js +++ b/apps/dashboard/svelte.config.js @@ -8,7 +8,11 @@ const config = { } }, kit: { - adapter: adapter(), + adapter: adapter({ + platformProxy: { + configPath: 'wrangler.local.jsonc' + } + }), experimental: { remoteFunctions: true } diff --git a/apps/dashboard/wrangler.local.jsonc b/apps/dashboard/wrangler.local.jsonc new file mode 100644 index 0000000..98980c6 --- /dev/null +++ b/apps/dashboard/wrangler.local.jsonc @@ -0,0 +1,50 @@ +{ + "$schema": "../../node_modules/wrangler/config-schema.json", + "name": "stack-dashboard", + "main": ".svelte-kit/cloudflare/_worker.js", + "compatibility_date": "2026-04-05", + "compatibility_flags": ["nodejs_compat"], + "assets": { + "binding": "ASSETS", + "directory": ".svelte-kit/cloudflare", + "run_worker_first": [ + "/", + "/_app/remote/*", + "/api/*", + "/admin/*", + "/projects/*", + "/login*", + "/register*", + "/signup*", + "/accept-invitation/*" + ] + }, + "vars": { + "ORIGIN": "http://localhost:5173", + "EMAIL_FROM_ADDRESS": "no-reply@example.com", + "EMAIL_FROM_NAME": "Fyra Stack", + "EMAIL_REPLY_TO": "support@example.com", + "AUTUMN_DEFAULT_PLAN_ID": "stack", + "AUTUMN_SERVER_ENTITY_FEATURE_ID": "active_servers", + "VYOS_USE_VPC": "false", + "PROXMOX_USE_VPC": "false", + "PROXMOX_SNIPPETS_USE_VPC": "false" + }, + "hyperdrive": [ + { + "binding": "HYPERDRIVE", + "id": "25228ed6f77e49fb8041aed12879327d" + } + ], + "kv_namespaces": [ + { + "binding": "FEATURE_FLAGS", + "id": "0ad17de8747747bca1975d473e66e295" + } + ], + "send_email": [ + { + "name": "EMAIL" + } + ] +} From 4ea741ffcda3c1b24d96562aacfbe882367ab978 Mon Sep 17 00:00:00 2001 From: madonuko Date: Sun, 5 Jul 2026 16:28:16 +0800 Subject: [PATCH 07/10] feat: name generator for servers/create Resolves #21 --- apps/dashboard/src/lib/server/name-generator.ts | 8 ++++++++ .../projects/[projectid]/servers/create/+page.svelte | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 apps/dashboard/src/lib/server/name-generator.ts diff --git a/apps/dashboard/src/lib/server/name-generator.ts b/apps/dashboard/src/lib/server/name-generator.ts new file mode 100644 index 0000000..86ffd12 --- /dev/null +++ b/apps/dashboard/src/lib/server/name-generator.ts @@ -0,0 +1,8 @@ +const choices = [ + ["kitten", "cat", "neko", "puppy"], + ["box", "stack", "rack", "server"], +]; + +const choose = (i: int) => choices[i][Math.floor(Math.random() * choices[i].length)]; + +export const generateServerName = () => choose(0) + choose(1); diff --git a/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte b/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte index 655625d..d607c3a 100644 --- a/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte +++ b/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte @@ -28,6 +28,7 @@ Plus, X } from '@lucide/svelte'; + import { generateServerName } from '$lib/server/name-generator'; type PageData = { currentProject?: { id: string } | null; @@ -123,7 +124,7 @@ const ipv6Available = $derived(Boolean(data.ipamAvailability?.ipv6.available)); const bothNetworksAvailable = $derived(ipv4Available && ipv6Available); - let serverName = $state(''); + let serverName = $state(generateServerName()); let selectedImageId = $state(null); let selectedImageVersion = $state(null); let selectedPlanId = $state(null); From f983db6c4f37eacd79e1aba0b4e66dd2b8b4fdd0 Mon Sep 17 00:00:00 2001 From: madonuko Date: Mon, 6 Jul 2026 16:25:44 +0800 Subject: [PATCH 08/10] feat(name-generator): more choices from lea --- apps/dashboard/src/lib/server/name-generator.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dashboard/src/lib/server/name-generator.ts b/apps/dashboard/src/lib/server/name-generator.ts index 86ffd12..19c1a49 100644 --- a/apps/dashboard/src/lib/server/name-generator.ts +++ b/apps/dashboard/src/lib/server/name-generator.ts @@ -1,6 +1,6 @@ const choices = [ - ["kitten", "cat", "neko", "puppy"], - ["box", "stack", "rack", "server"], + ["kitten", "cat", "neko", "puppy", "dog", "doggy"], + ["box", "stack", "rack", "server", "node"], ]; const choose = (i: int) => choices[i][Math.floor(Math.random() * choices[i].length)]; From 31c8825a2ea54526902823185e4fdcea5ed4c66e Mon Sep 17 00:00:00 2001 From: madonuko Date: Mon, 6 Jul 2026 17:41:27 +0800 Subject: [PATCH 09/10] feat: onclick `` regenerateServerName somebody please test my code and probably need to add a bunch of tailwind classes --- .../(app)/projects/[projectid]/servers/create/+page.svelte | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte b/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte index d607c3a..96bd3f6 100644 --- a/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte +++ b/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte @@ -26,7 +26,8 @@ EyeOff, HardDriveUpload, Plus, - X + X, + Dices } from '@lucide/svelte'; import { generateServerName } from '$lib/server/name-generator'; @@ -125,6 +126,9 @@ const bothNetworksAvailable = $derived(ipv4Available && ipv6Available); let serverName = $state(generateServerName()); + function regenerateServerName() { + serverName = generateServerName(); + } let selectedImageId = $state(null); let selectedImageVersion = $state(null); let selectedPlanId = $state(null); @@ -424,6 +428,7 @@ placeholder="my-server" class="h-11 text-base sm:h-9 sm:text-sm" /> + From 36dbd1192028afe7c75057b43e7c6ad7c49766a8 Mon Sep 17 00:00:00 2001 From: madonuko Date: Tue, 7 Jul 2026 16:20:32 +0800 Subject: [PATCH 10/10] fix(servers/create): styles --- .gitignore | 2 ++ README.md | 4 +++- apps/dashboard/src/lib/{server => }/name-generator.ts | 0 .../projects/[projectid]/servers/create/+page.svelte | 8 +++++--- 4 files changed, 10 insertions(+), 4 deletions(-) rename apps/dashboard/src/lib/{server => }/name-generator.ts (100%) diff --git a/.gitignore b/.gitignore index ecaf88b..d31a31b 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ vite.config.ts.timestamp-* # traces for local dev Trace-*.json + +bun.lock diff --git a/README.md b/README.md index ad30157..bdf22f0 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,9 @@ 2. Start a Postgres server: `podman run -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword -d postgres` 3. Copy `apps/dashboard/.env.example` to `apps/dashboard/.env` 4. Add secrets to `apps/dashboard/.env` -5. Set up the database: `pnpm --filter stack-dashboard db:push` + - Update `CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_HYPERDRIVE` and set all `VPC` stuff to false + - set `BETTER_AUTH_SECRET`, `AUTUMN_SECRET` to anything +5. Set up the database: `pnpm --filter stack-dashboard db:migrate` 6. `pnpm --filter stack-dashboard dev` ### Postgres Setup diff --git a/apps/dashboard/src/lib/server/name-generator.ts b/apps/dashboard/src/lib/name-generator.ts similarity index 100% rename from apps/dashboard/src/lib/server/name-generator.ts rename to apps/dashboard/src/lib/name-generator.ts diff --git a/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte b/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte index 96bd3f6..145b3dc 100644 --- a/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte +++ b/apps/dashboard/src/routes/(app)/projects/[projectid]/servers/create/+page.svelte @@ -29,7 +29,7 @@ X, Dices } from '@lucide/svelte'; - import { generateServerName } from '$lib/server/name-generator'; + import { generateServerName } from '$lib/name-generator'; type PageData = { currentProject?: { id: string } | null; @@ -422,13 +422,15 @@ >Name -
+
- +