Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -140,3 +140,6 @@ vite.config.ts.timestamp-*

# Vite cache directory
.vite

# Vite logs directory
.logs
2 changes: 1 addition & 1 deletion .logs/api_dev.jsonl
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"level":"info","trace":1752758946.110915,"event":"server-start","at":1752758946.1434226}
{"level":"info","trace":1752839585.7461548,"event":"server-start","at":1752839585.7912903}
30 changes: 30 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Stage 1: Builder
FROM denoland/deno:latest AS builder
WORKDIR /app

# Copy project files
COPY ./api /app/api
COPY ./tasks/vite.js /app/tasks/vite.js
COPY ./deno.json /app/deno.json
COPY ./deno.lock /app/deno.lock
COPY ./.env.prod /app/.env.prod
COPY ./web /app/web

# Cache dependencies
RUN deno cache --allow-scripts --lock=deno.lock api/server.ts tasks/vite.js

# Build frontend (dist/web) and compile backend with static files
RUN deno task prod

# Stage 2: Final image
FROM debian:bookworm-slim
WORKDIR /app

# Copy compiled executable and Deno cache
COPY --from=builder /app/dist/api /app/server

# Expose port from .env.prod (3021)
EXPOSE 3021

# Run the compiled executable
CMD ["/app/server", "--env=prod"]
6 changes: 4 additions & 2 deletions api/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@ import { join } from 'jsr:@std/path/join'
import { serveDir } from 'jsr:@std/http/file-server'
import { PORT } from './lib/env.ts'

const staticDir = join(Deno.cwd(), 'dist/web')
const isProd = Deno.args.includes('--env=prod')
const staticDir = isProd
? join((import.meta.dirname || Deno.cwd()).split('/api')[0], 'dist/web')
: Deno.cwd()
const indexHtml = await Deno.readFile(join(staticDir, 'index.html'))
const htmlContent = { headers: { 'Content-Type': 'text/html' } }
const serveDirOpts = { fsRoot: staticDir }

const { ResponseError } = respond
const isProd = Deno.args.includes('--env=prod')

const handleRequest = async (ctx: RequestContext) => {
const logProps: Record<string, unknown> = {}
Expand Down
20 changes: 14 additions & 6 deletions deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,21 @@
"api:dev": "deno serve -A --env-file=.env.dev --port=3021 api/server.ts --env=dev",
"vite:dev": "deno run -A --env-file=.env.dev tasks/vite.js --env=dev",
"dev": { "dependencies": ["api:dev", "vite:dev"] },
"api:prod": "deno compile -A --env-file=.env.prod --output dist/api api/server.ts --env=prod",
"vite:prod": "deno run -A --env-file=.env.prod tasks/vite.js --build --env=prod",
"prod": { "dependencies": ["api:prod", "vite:prod"] },
"api:prod": "deno compile -A --env-file=.env.prod --no-check --output dist/api --target x86_64-unknown-linux-gnu --include dist/web api/server.ts --env=prod",
"vite:prod": "deno run -A tasks/vite.js --build --env=prod",
"prod": "deno task vite:prod && deno task api:prod",
"start:prod": "dist/api --env=prod",
"fmt": "deno fmt",
"lint": "deno lint"
"lint": "deno lint",
"docker:build": "docker build -t devtools .",
"docker:prod": "docker run --name devtools-app -p 8877:3021 --env-file .env.prod devtools",
"docker:stop": "docker stop devtools-app",
"docker:start": "docker start devtools-app",
"docker:restart": "docker restart devtools-app",
"docker:rm": "docker rm -f devtools-app",
"docker:logs": "docker logs -f devtools-app",
"docker:exec": "docker exec -it devtools-app /bin/sh",
"docker:clean": "docker rm -f devtools-app && docker rmi devtools"
},
"imports": {
"./": "./",
Expand All @@ -20,8 +29,7 @@
"@tailwindcss/vite": "npm:@tailwindcss/vite@^4.1.11",
"tailwindcss": "npm:tailwindcss@^4.1.11",
"daisyui": "npm:daisyui@^5.0.46",
"lucide-preact": "npm:lucide-preact@^0.525.0",
"sonda": "npm:sonda@^0.7.1"
"lucide-preact": "npm:lucide-preact@^0.525.0"
},
"fmt": {
"useTabs": false,
Expand Down
59 changes: 0 additions & 59 deletions deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions tasks/vite.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { join } from 'node:path'
import { build, createServer } from 'vite'
import preact from '@preact/preset-vite'
import tailwindcss from '@tailwindcss/vite'
import Sonda from 'sonda/vite'

// import { PORT } from '../api/lib/env.ts';
const PORT = 3000
Expand Down Expand Up @@ -32,10 +31,6 @@ if (isBuild) {
plugins: [
preact({ jsxImportSource: 'preact' }),
tailwindcss(),
Sonda({
enabled: true,
format: 'html',
}),
],
server: {
host: true,
Expand Down
Loading