Skip to content

Commit c380fe5

Browse files
authored
DT-46: Add docker Config (#47)
* feat(DockerFile): Add Docker support with multi-stage build * Add logs directory to gitignore
1 parent 2ffde51 commit c380fe5

7 files changed

Lines changed: 52 additions & 73 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,6 @@ vite.config.ts.timestamp-*
140140

141141
# Vite cache directory
142142
.vite
143+
144+
# Vite logs directory
145+
.logs

.logs/api_dev.jsonl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"level":"info","trace":1752758946.110915,"event":"server-start","at":1752758946.1434226}
1+
{"level":"info","trace":1752839585.7461548,"event":"server-start","at":1752839585.7912903}

Dockerfile

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Stage 1: Builder
2+
FROM denoland/deno:latest AS builder
3+
WORKDIR /app
4+
5+
# Copy project files
6+
COPY ./api /app/api
7+
COPY ./tasks/vite.js /app/tasks/vite.js
8+
COPY ./deno.json /app/deno.json
9+
COPY ./deno.lock /app/deno.lock
10+
COPY ./.env.prod /app/.env.prod
11+
COPY ./web /app/web
12+
13+
# Cache dependencies
14+
RUN deno cache --allow-scripts --lock=deno.lock api/server.ts tasks/vite.js
15+
16+
# Build frontend (dist/web) and compile backend with static files
17+
RUN deno task prod
18+
19+
# Stage 2: Final image
20+
FROM debian:bookworm-slim
21+
WORKDIR /app
22+
23+
# Copy compiled executable and Deno cache
24+
COPY --from=builder /app/dist/api /app/server
25+
26+
# Expose port from .env.prod (3021)
27+
EXPOSE 3021
28+
29+
# Run the compiled executable
30+
CMD ["/app/server", "--env=prod"]

api/server.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ import { join } from 'jsr:@std/path/join'
1010
import { serveDir } from 'jsr:@std/http/file-server'
1111
import { PORT } from './lib/env.ts'
1212

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

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

2123
const handleRequest = async (ctx: RequestContext) => {
2224
const logProps: Record<string, unknown> = {}

deno.json

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,21 @@
33
"api:dev": "deno serve -A --env-file=.env.dev --port=3021 api/server.ts --env=dev",
44
"vite:dev": "deno run -A --env-file=.env.dev tasks/vite.js --env=dev",
55
"dev": { "dependencies": ["api:dev", "vite:dev"] },
6-
"api:prod": "deno compile -A --env-file=.env.prod --output dist/api api/server.ts --env=prod",
7-
"vite:prod": "deno run -A --env-file=.env.prod tasks/vite.js --build --env=prod",
8-
"prod": { "dependencies": ["api:prod", "vite:prod"] },
6+
"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",
7+
"vite:prod": "deno run -A tasks/vite.js --build --env=prod",
8+
"prod": "deno task vite:prod && deno task api:prod",
99
"start:prod": "dist/api --env=prod",
1010
"fmt": "deno fmt",
11-
"lint": "deno lint"
11+
"lint": "deno lint",
12+
"docker:build": "docker build -t devtools .",
13+
"docker:prod": "docker run --name devtools-app -p 8877:3021 --env-file .env.prod devtools",
14+
"docker:stop": "docker stop devtools-app",
15+
"docker:start": "docker start devtools-app",
16+
"docker:restart": "docker restart devtools-app",
17+
"docker:rm": "docker rm -f devtools-app",
18+
"docker:logs": "docker logs -f devtools-app",
19+
"docker:exec": "docker exec -it devtools-app /bin/sh",
20+
"docker:clean": "docker rm -f devtools-app && docker rmi devtools"
1221
},
1322
"imports": {
1423
"./": "./",
@@ -20,8 +29,7 @@
2029
"@tailwindcss/vite": "npm:@tailwindcss/vite@^4.1.11",
2130
"tailwindcss": "npm:tailwindcss@^4.1.11",
2231
"daisyui": "npm:daisyui@^5.0.46",
23-
"lucide-preact": "npm:lucide-preact@^0.525.0",
24-
"sonda": "npm:sonda@^0.7.1"
32+
"lucide-preact": "npm:lucide-preact@^0.525.0"
2533
},
2634
"fmt": {
2735
"useTabs": false,

deno.lock

Lines changed: 0 additions & 59 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tasks/vite.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { join } from 'node:path'
33
import { build, createServer } from 'vite'
44
import preact from '@preact/preset-vite'
55
import tailwindcss from '@tailwindcss/vite'
6-
import Sonda from 'sonda/vite'
76

87
// import { PORT } from '../api/lib/env.ts';
98
const PORT = 3000
@@ -32,10 +31,6 @@ if (isBuild) {
3231
plugins: [
3332
preact({ jsxImportSource: 'preact' }),
3433
tailwindcss(),
35-
Sonda({
36-
enabled: true,
37-
format: 'html',
38-
}),
3934
],
4035
server: {
4136
host: true,

0 commit comments

Comments
 (0)