Merge branch 'main' into dev

This commit is contained in:
Owen
2025-08-23 15:21:32 -07:00
8 changed files with 496 additions and 297 deletions

View File

@@ -12,7 +12,7 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3

View File

@@ -18,7 +18,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4

View File

@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:

View File

@@ -0,0 +1,53 @@
http:
middlewares:
redirect-to-https:
redirectScheme:
scheme: https
routers:
# HTTP to HTTPS redirect router
main-app-router-redirect:
rule: "Host(`{{.DashboardDomain}}`)"
service: next-service
entryPoints:
- web
middlewares:
- redirect-to-https
# Next.js router (handles everything except API and WebSocket paths)
next-router:
rule: "Host(`{{.DashboardDomain}}`) && !PathPrefix(`/api/v1`)"
service: next-service
entryPoints:
- websecure
tls:
certResolver: letsencrypt
# API router (handles /api/v1 paths)
api-router:
rule: "Host(`{{.DashboardDomain}}`) && PathPrefix(`/api/v1`)"
service: api-service
entryPoints:
- websecure
tls:
certResolver: letsencrypt
# WebSocket router
ws-router:
rule: "Host(`{{.DashboardDomain}}`)"
service: api-service
entryPoints:
- websecure
tls:
certResolver: letsencrypt
services:
next-service:
loadBalancer:
servers:
- url: "http://pangolin:3002" # Next.js server
api-service:
loadBalancer:
servers:
- url: "http://pangolin:3000" # API/WebSocket server

View File

@@ -0,0 +1,34 @@
api:
insecure: true
dashboard: true
providers:
file:
directory: "/var/dynamic"
watch: true
experimental:
plugins:
badger:
moduleName: "github.com/fosrl/badger"
version: "v1.2.0"
log:
level: "DEBUG"
format: "common"
maxSize: 100
maxBackups: 3
maxAge: 3
compress: true
entryPoints:
web:
address: ":80"
websecure:
address: ":9443"
transport:
respondingTimeouts:
readTimeout: "30m"
serversTransport:
insecureSkipVerify: true

32
docker-compose.t.yml Normal file
View File

@@ -0,0 +1,32 @@
name: pangolin
services:
gerbil:
image: gerbil
container_name: gerbil
network_mode: host
restart: unless-stopped
command:
- --reachableAt=http://localhost:3003
- --generateAndSaveKeyTo=/var/config/key
- --remoteConfig=http://localhost:3001/api/v1/
- --sni-port=443
volumes:
- ./config/:/var/config
cap_add:
- NET_ADMIN
- SYS_MODULE
traefik:
image: docker.io/traefik:v3.4.1
container_name: traefik
restart: unless-stopped
network_mode: host
command:
- --configFile=/etc/traefik/traefik_config.yml
volumes:
- ./config/traefik:/etc/traefik:ro # Volume to store the Traefik configuration
- ./config/letsencrypt:/letsencrypt # Volume to store the Let's Encrypt certificates
- ./config/traefik/logs:/var/log/traefik # Volume to store Traefik logs
- ./certificates:/var/certificates:ro
- ./dynamic:/var/dynamic:ro

634
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -32,23 +32,23 @@
"@oslojs/crypto": "1.0.1", "@oslojs/crypto": "1.0.1",
"@oslojs/encoding": "1.1.0", "@oslojs/encoding": "1.1.0",
"@radix-ui/react-avatar": "1.1.10", "@radix-ui/react-avatar": "1.1.10",
"@radix-ui/react-checkbox": "1.3.2", "@radix-ui/react-checkbox": "1.3.3",
"@radix-ui/react-collapsible": "1.1.11", "@radix-ui/react-collapsible": "1.1.12",
"@radix-ui/react-dialog": "1.1.14", "@radix-ui/react-dialog": "1.1.15",
"@radix-ui/react-dropdown-menu": "2.1.15", "@radix-ui/react-dropdown-menu": "2.1.16",
"@radix-ui/react-icons": "1.3.2", "@radix-ui/react-icons": "1.3.2",
"@radix-ui/react-label": "2.1.7", "@radix-ui/react-label": "2.1.7",
"@radix-ui/react-popover": "1.1.14", "@radix-ui/react-popover": "1.1.15",
"@radix-ui/react-progress": "^1.1.7", "@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-radio-group": "1.3.7", "@radix-ui/react-radio-group": "1.3.8",
"@radix-ui/react-scroll-area": "^1.2.9", "@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-select": "2.2.5", "@radix-ui/react-select": "2.2.6",
"@radix-ui/react-separator": "1.1.7", "@radix-ui/react-separator": "1.1.7",
"@radix-ui/react-slot": "1.2.3", "@radix-ui/react-slot": "1.2.3",
"@radix-ui/react-switch": "1.2.5", "@radix-ui/react-switch": "1.2.6",
"@radix-ui/react-tabs": "1.1.12", "@radix-ui/react-tabs": "1.1.13",
"@radix-ui/react-toast": "1.2.14", "@radix-ui/react-toast": "1.2.15",
"@radix-ui/react-tooltip": "^1.2.7", "@radix-ui/react-tooltip": "^1.2.8",
"@react-email/components": "0.5.0", "@react-email/components": "0.5.0",
"@react-email/render": "^1.2.0", "@react-email/render": "^1.2.0",
"@react-email/tailwind": "1.2.2", "@react-email/tailwind": "1.2.2",
@@ -72,7 +72,7 @@
"eslint": "9.33.0", "eslint": "9.33.0",
"eslint-config-next": "15.4.6", "eslint-config-next": "15.4.6",
"express": "5.1.0", "express": "5.1.0",
"express-rate-limit": "7.5.1", "express-rate-limit": "8.0.1",
"glob": "11.0.3", "glob": "11.0.3",
"helmet": "8.1.0", "helmet": "8.1.0",
"http-errors": "2.0.0", "http-errors": "2.0.0",
@@ -103,7 +103,7 @@
"semver": "^7.7.2", "semver": "^7.7.2",
"swagger-ui-express": "^5.0.1", "swagger-ui-express": "^5.0.1",
"tailwind-merge": "3.3.1", "tailwind-merge": "3.3.1",
"tw-animate-css": "^1.3.6", "tw-animate-css": "^1.3.7",
"uuid": "^11.1.0", "uuid": "^11.1.0",
"vaul": "1.1.2", "vaul": "1.1.2",
"winston": "3.17.0", "winston": "3.17.0",
@@ -114,9 +114,9 @@
"zod-validation-error": "3.5.2" "zod-validation-error": "3.5.2"
}, },
"devDependencies": { "devDependencies": {
"@dotenvx/dotenvx": "1.48.4", "@dotenvx/dotenvx": "1.49.0",
"@esbuild-plugins/tsconfig-paths": "0.1.2", "@esbuild-plugins/tsconfig-paths": "0.1.2",
"@tailwindcss/postcss": "^4.1.10", "@tailwindcss/postcss": "^4.1.12",
"@types/better-sqlite3": "7.6.12", "@types/better-sqlite3": "7.6.12",
"@types/cookie-parser": "1.4.9", "@types/cookie-parser": "1.4.9",
"@types/cors": "2.8.19", "@types/cors": "2.8.19",
@@ -144,7 +144,7 @@
"tsc-alias": "1.8.16", "tsc-alias": "1.8.16",
"tsx": "4.20.4", "tsx": "4.20.4",
"typescript": "^5", "typescript": "^5",
"typescript-eslint": "^8.39.1" "typescript-eslint": "^8.40.0"
}, },
"overrides": { "overrides": {
"emblor": { "emblor": {