Initial
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
node_modules
|
||||||
13
Caddyfile
Normal file
13
Caddyfile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
auto_https off
|
||||||
|
}
|
||||||
|
|
||||||
|
:80 {
|
||||||
|
handle /health {
|
||||||
|
respond "ok" 200
|
||||||
|
}
|
||||||
|
|
||||||
|
handle {
|
||||||
|
reverse_proxy {$FRONTEND_UPSTREAM}
|
||||||
|
}
|
||||||
|
}
|
||||||
45
Frontend/Earthfile
Normal file
45
Frontend/Earthfile
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
VERSION 0.8
|
||||||
|
|
||||||
|
node-base:
|
||||||
|
FROM node:24.12.0-alpine
|
||||||
|
WORKDIR /app
|
||||||
|
RUN corepack enable && corepack prepare pnpm@10.24.0 --activate
|
||||||
|
COPY package.json pnpm-lock.yaml ./
|
||||||
|
|
||||||
|
deps:
|
||||||
|
FROM +node-base
|
||||||
|
RUN pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
build:
|
||||||
|
FROM +deps
|
||||||
|
COPY . .
|
||||||
|
RUN pnpm build
|
||||||
|
SAVE ARTIFACT dist AS LOCAL ./dist
|
||||||
|
|
||||||
|
dev-image:
|
||||||
|
ARG REGISTRY="registry.mangopig.tech"
|
||||||
|
ARG IMAGE_NAME="boost-ai/demo-frontend-dev"
|
||||||
|
ARG TAG="latest"
|
||||||
|
|
||||||
|
FROM +deps
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
ENV HOST=0.0.0.0
|
||||||
|
ENV PORT=4321
|
||||||
|
EXPOSE 4321
|
||||||
|
|
||||||
|
SAVE IMAGE $IMAGE_NAME:$TAG
|
||||||
|
SAVE IMAGE --push $REGISTRY/$IMAGE_NAME:$TAG
|
||||||
|
|
||||||
|
# image:
|
||||||
|
# ARG REGISTRY="registry.mangopig.tech"
|
||||||
|
# ARG IMAGE_NAME="boost-ai/demo"
|
||||||
|
# ARG TAG="latest"
|
||||||
|
|
||||||
|
# FROM nginx:1.29-alpine
|
||||||
|
# COPY +build/dist /tmp/dist
|
||||||
|
# RUN rm -rf /usr/share/nginx/html/* && cp -R /tmp/dist/. /usr/share/nginx/html/
|
||||||
|
# COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||||
|
# EXPOSE 80
|
||||||
|
# SAVE IMAGE boost-ai/demo-frontend:latest
|
||||||
|
# SAVE IMAGE --push $REGISTRY/$IMAGE_NAME:$TAG
|
||||||
27
Frontend/package.json
Normal file
27
Frontend/package.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "example-bare",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite dev",
|
||||||
|
"build": "vite build",
|
||||||
|
"start": "vite start",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@solidjs/start": "2.0.0-alpha.2",
|
||||||
|
"@solidjs/vite-plugin-nitro-2": "^0.1.0",
|
||||||
|
"solid-js": "^1.9.5",
|
||||||
|
"vite": "^7.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=22"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^25.6.2",
|
||||||
|
"autoprefixer": "^10.5.0",
|
||||||
|
"cssnano": "^8.0.1",
|
||||||
|
"postcss": "^8.5.14",
|
||||||
|
"postcss-preset-env": "^11.2.1",
|
||||||
|
"sass": "^1.99.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
6705
Frontend/pnpm-lock.yaml
generated
Normal file
6705
Frontend/pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
5
Frontend/postcss.config.cjs
Normal file
5
Frontend/postcss.config.cjs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
// Path: Frontend/postcss.config.cjs
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
plugins: [require("autoprefixer"), require("postcss-preset-env"), require("cssnano")],
|
||||||
|
};
|
||||||
BIN
Frontend/public/favicon.ico
Normal file
BIN
Frontend/public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 664 B |
13
Frontend/src/app.tsx
Normal file
13
Frontend/src/app.tsx
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
// Path: Frontend/src/app.tsx
|
||||||
|
|
||||||
|
import { createSignal } from "solid-js";
|
||||||
|
|
||||||
|
export default function App() {
|
||||||
|
const [count, setCount] = createSignal(0);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<main>
|
||||||
|
<h1>AI</h1>
|
||||||
|
</main>
|
||||||
|
);
|
||||||
|
}
|
||||||
6
Frontend/src/entry-client.tsx
Normal file
6
Frontend/src/entry-client.tsx
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
// Path: src/entry-client.tsx
|
||||||
|
|
||||||
|
// @refresh reload
|
||||||
|
import { mount, StartClient } from "@solidjs/start/client";
|
||||||
|
|
||||||
|
mount(() => <StartClient />, document.getElementById("app")!);
|
||||||
23
Frontend/src/entry-server.tsx
Normal file
23
Frontend/src/entry-server.tsx
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
// Path: src/entry-server.tsx
|
||||||
|
|
||||||
|
// @refresh reload
|
||||||
|
import { createHandler, StartServer } from "@solidjs/start/server";
|
||||||
|
|
||||||
|
export default createHandler(() => (
|
||||||
|
<StartServer
|
||||||
|
document={({ assets, children, scripts }) => (
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<link rel="icon" href="/favicon.ico" />
|
||||||
|
{assets}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app">{children}</div>
|
||||||
|
{scripts}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
));
|
||||||
3
Frontend/src/global.d.ts
vendored
Normal file
3
Frontend/src/global.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
// Path: src/global.d.ts
|
||||||
|
|
||||||
|
/// <reference types="@solidjs/start/env" />
|
||||||
19
Frontend/tsconfig.json
Normal file
19
Frontend/tsconfig.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ESNext",
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"jsxImportSource": "solid-js",
|
||||||
|
"allowJs": true,
|
||||||
|
"strict": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"types": ["vite/client"],
|
||||||
|
"isolatedModules": true,
|
||||||
|
"paths": {
|
||||||
|
"~/*": ["./src/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
17
Frontend/vite.config.ts
Normal file
17
Frontend/vite.config.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
// Path: Frontend/vite.config.ts
|
||||||
|
|
||||||
|
import { solidStart } from "@solidjs/start/config";
|
||||||
|
import { nitroV2Plugin as nitro } from "@solidjs/vite-plugin-nitro-2";
|
||||||
|
import { defineConfig } from "vite";
|
||||||
|
|
||||||
|
const extraAllowedHosts = (process.env.ALLOWED_HOSTS ?? "")
|
||||||
|
.split(",")
|
||||||
|
.map((host) => host.trim())
|
||||||
|
.filter(Boolean);
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [solidStart(), nitro()],
|
||||||
|
server: {
|
||||||
|
allowedHosts: ["localhost", ...extraAllowedHosts],
|
||||||
|
},
|
||||||
|
});
|
||||||
38
Makefile
Normal file
38
Makefile
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
SHELL := /bin/bash
|
||||||
|
|
||||||
|
.DEFAULT_GOAL := help
|
||||||
|
|
||||||
|
.PHONY: help guard-dev-tag down dev dev-build dev-up
|
||||||
|
|
||||||
|
FRONTEND_DIR := Frontend
|
||||||
|
FRONTEND_DIST_DIR := $(FRONTEND_DIR)/dist
|
||||||
|
BACKEND_DIR := Backend
|
||||||
|
BACKEND_TMP_DIR := $(BACKEND_DIR)/tmp
|
||||||
|
EARTHLY ?= earthly
|
||||||
|
COMPOSE ?= docker compose
|
||||||
|
|
||||||
|
help: ## Show this help message
|
||||||
|
@echo "Usage: make [target]"
|
||||||
|
@echo ""
|
||||||
|
@echo "Available targets:"
|
||||||
|
@awk 'BEGIN {FS = ":.*## "}; /^[a-zA-Z0-9_.-]+:.*## / {printf " %-12s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
|
||||||
|
|
||||||
|
guard-dev-tag:
|
||||||
|
@if [ -z "$(DEV_TAG)" ]; then \
|
||||||
|
echo "Error: DEV_TAG is not set. Please provide a tag for the development image."; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
down: ## Stop all servers and clean up temporary files
|
||||||
|
@DEV_TAG=$${DEV_TAG:-dummy} $(COMPOSE) -f docker-compose.dev.yaml down --remove-orphans
|
||||||
|
@rm -rf "$(BACKEND_TMP_DIR)" "$(FRONTEND_DIST_DIR)"
|
||||||
|
|
||||||
|
dev: guard-dev-tag ## Start the development server
|
||||||
|
@$(MAKE) dev-build DEV_TAG=$(DEV_TAG)
|
||||||
|
@$(MAKE) dev-up DEV_TAG=$(DEV_TAG)
|
||||||
|
|
||||||
|
dev-build: guard-dev-tag ## Build the development image for the frontend
|
||||||
|
@cd "$(FRONTEND_DIR)" && $(EARTHLY) +dev-image --REGISTRY="registry.mangopig.tech" --IMAGE_NAME="boost-ai/demo-frontend-dev" --TAG=$(DEV_TAG)
|
||||||
|
|
||||||
|
dev-up: guard-dev-tag ## Start the development server using docker compose
|
||||||
|
@DEV_TAG=$(DEV_TAG) $(COMPOSE) -f docker-compose.dev.yaml up -d --remove-orphans --force-recreate
|
||||||
28
docker-compose.dev.yaml
Normal file
28
docker-compose.dev.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
services:
|
||||||
|
caddy:
|
||||||
|
image: caddy:2-alpine
|
||||||
|
container_name: caddy
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- FRONTEND_UPSTREAM=frontend-dev:4321
|
||||||
|
ports:
|
||||||
|
- "8080:80"
|
||||||
|
volumes:
|
||||||
|
- ./Caddyfile:/etc/caddy/Caddyfile
|
||||||
|
depends_on:
|
||||||
|
- frontend-dev
|
||||||
|
|
||||||
|
frontend-dev:
|
||||||
|
image: boost-ai/demo-frontend-dev:${DEV_TAG:?error DEV_TAG environment variable not set}
|
||||||
|
container_name: frontend-dev
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- ./Frontend:/app
|
||||||
|
- BoostAI_node_modules:/app/node_modules
|
||||||
|
command: ["pnpm", "dev", "--host", "0.0.0.0", "--port", "4321"]
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=development
|
||||||
|
- ALLOWED_HOSTS=windows-wsl
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
BoostAI_node_modules:
|
||||||
Reference in New Issue
Block a user