Skip to content

Commit 559c858

Browse files
committed
Add Docker support for evolu-relay with development configuration and Dockerfile.dev
1 parent 781f895 commit 559c858

5 files changed

Lines changed: 133 additions & 9 deletions

File tree

.changeset/small-women-repeat.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@evolu/relay": patch
3+
---
4+
5+
add log for relay version

apps/relay/Dockerfile.dev

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
FROM node:22-alpine AS base
2+
ENV PNPM_HOME="/pnpm"
3+
ENV PATH="$PNPM_HOME:$PATH"
4+
5+
FROM base AS builder
6+
RUN apk update && apk add --no-cache libc6-compat
7+
WORKDIR /app
8+
RUN corepack enable pnpm
9+
RUN pnpm install -g turbo
10+
COPY . .
11+
12+
# Generate a partial monorepo with a pruned lockfile for the relay workspace
13+
RUN turbo prune @evolu/relay --docker
14+
15+
# ------------------------------------------------------------
16+
# Installer stage - build the pruned workspace
17+
FROM base AS installer
18+
RUN apk update && apk add --no-cache libc6-compat
19+
WORKDIR /app
20+
21+
# Install pnpm and turbo
22+
RUN corepack enable pnpm
23+
RUN pnpm install -g turbo
24+
25+
# Install dependencies from pruned lockfile
26+
COPY --from=builder /app/out/json/ .
27+
RUN pnpm install --frozen-lockfile
28+
29+
# Copy source and build
30+
COPY --from=builder /app/out/full/ .
31+
# Ensure README.md is available at the root for the build process
32+
COPY --from=builder /app/README.md ./README.md
33+
RUN turbo run build
34+
35+
# ------------------------------------------------------------
36+
# Runner stage - minimal runtime image
37+
FROM base AS runner
38+
WORKDIR /app
39+
40+
# Create non-root user
41+
RUN addgroup --system --gid 1001 nodejs && \
42+
adduser --system --uid 1001 evolu --ingroup nodejs
43+
RUN chown evolu:nodejs /app
44+
USER evolu
45+
46+
# Copy built application
47+
COPY --from=installer --chown=evolu:nodejs /app/apps/relay/dist ./dist
48+
49+
# Copy the complete node_modules with all dependencies
50+
COPY --from=installer --chown=evolu:nodejs /app/node_modules ./node_modules
51+
52+
# Copy the built workspace packages that the relay needs at runtime
53+
COPY --from=installer --chown=evolu:nodejs /app/packages/common/dist ./node_modules/@evolu/common/dist
54+
COPY --from=installer --chown=evolu:nodejs /app/packages/common/package.json ./node_modules/@evolu/common/package.json
55+
COPY --from=installer --chown=evolu:nodejs /app/packages/nodejs/dist ./node_modules/@evolu/nodejs/dist
56+
COPY --from=installer --chown=evolu:nodejs /app/packages/nodejs/package.json ./node_modules/@evolu/nodejs/package.json
57+
58+
# Expose port
59+
EXPOSE 4000
60+
61+
# Health check
62+
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
63+
CMD wget --no-verbose --tries=1 --spider http://localhost:4000 || exit 1
64+
65+
# Start the application
66+
CMD ["node", "dist/src/cli.js", "start"]

apps/relay/docker-compose.dev.yaml

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
services:
2+
evolu-relay:
3+
container_name: evolu-relay-dev-server
4+
image: evolu/relay:latest
5+
build:
6+
context: ../../
7+
dockerfile: apps/relay/Dockerfile.dev
8+
tags:
9+
- evolu/relay:dev
10+
ports:
11+
- "4000:4000"
12+
volumes:
13+
# Use named volume by default, can be overridden with bind mount if needed
14+
- evolu-relay-dev-data:/app/apps/relay/data
15+
environment:
16+
- NODE_ENV=${NODE_ENV:-production}
17+
- LOG_LEVEL=${LOG_LEVEL:-info}
18+
- RELAY_NAME=${RELAY_NAME:-evolu-relay-dev}
19+
- RELAY_PORT=${RELAY_PORT:-4000}
20+
- RELAY_ENABLE_LOGGING=${RELAY_ENABLE_LOGGING:-false}
21+
restart: unless-stopped
22+
deploy:
23+
resources:
24+
limits:
25+
memory: ${MEMORY_LIMIT:-1G}
26+
cpus: ${CPU_LIMIT:-1.0}
27+
reservations:
28+
memory: ${MEMORY_RESERVED:-512M}
29+
cpus: ${CPU_RESERVED:-0.5}
30+
healthcheck:
31+
test:
32+
[
33+
"CMD",
34+
"sh",
35+
"-c",
36+
"wget --no-verbose --tries=1 --spider http://localhost:4000 2>&1 | grep -q '426 Upgrade Required' || exit 1",
37+
]
38+
interval: 30s
39+
timeout: 5s
40+
retries: 3
41+
start_period: 30s
42+
logging:
43+
driver: "json-file"
44+
options:
45+
max-size: ${LOG_MAX_SIZE:-50m}
46+
max-file: ${LOG_MAX_FILES:-5}
47+
networks:
48+
- evolu-dev-network
49+
50+
volumes:
51+
evolu-relay-dev-data:
52+
driver: local
53+
name: evolu-relay-dev-data
54+
55+
networks:
56+
evolu-dev-network:
57+
name: evolu-relay-dev-network
58+
driver: bridge

apps/relay/package.json

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,10 @@
1212
"clean": "shx rm -rf .turbo node_modules dist db.sqlite",
1313
"docker:build": "docker-compose build --no-cache",
1414
"docker:up": "docker-compose up --build",
15-
"docker:up:detached": "docker-compose up -d --build",
1615
"docker:down": "docker-compose down -v",
17-
"docker:restart": "docker-compose down && docker-compose up --build",
18-
"docker:logs": "docker-compose logs -f evolu-relay",
19-
"docker:shell": "docker exec -it evolu-relay-server sh",
20-
"docker:inspect": "docker inspect evolu-relay-server",
21-
"docker:stats": "docker stats evolu-relay-server",
22-
"docker:clean": "docker-compose down -v && docker system prune -f",
23-
"docker:clean:all": "docker-compose down -v && docker system prune -af && docker volume prune -f"
16+
"docker:dev:build": "docker-compose -f docker-compose.dev.yaml build --no-cache",
17+
"docker:dev:up": "docker-compose -f docker-compose.dev.yaml up --build",
18+
"docker:dev:down": "docker-compose -f docker-compose.dev.yaml down -v"
2419
},
2520
"dependencies": {
2621
"@evolu/common": "workspace:*",

apps/relay/src/cli.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ function main() {
3838
.action(async (options: unknown) => {
3939
logger.enabled = true;
4040
const params = cliParams.fromUnknown(options);
41-
logger.log("Evolu Relay", packageJson.version);
41+
logger.log("Evolu Relay version:", packageJson.version);
4242

4343
if (!params.ok) {
4444
logger.error(params.error.reason);

0 commit comments

Comments
 (0)