@agent-foundry/replay-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Dockerfile ADDED
@@ -0,0 +1,156 @@
1
+ # Dockerfile for Aliyun Function Compute
2
+ # Build from the project root: docker build -f packages/replay-server/Dockerfile -t replay-server .
3
+ #
4
+ # This multi-stage build:
5
+ # 1. Builds the game bundle (game-life-restart)
6
+ # 2. Builds the replay-server
7
+ # 3. Creates a minimal runtime image with both
8
+
9
+ # =============================================================================
10
+ # Stage 1: Build game bundle
11
+ # =============================================================================
12
+ FROM node:18-bullseye-slim AS game-builder
13
+
14
+ RUN npm install -g pnpm@9.1.0
15
+
16
+ WORKDIR /app
17
+
18
+ # Copy monorepo config for workspace resolution
19
+ COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
20
+
21
+ # Copy package.json files for dependencies
22
+ COPY packages/replay-shared/package.json ./packages/replay-shared/
23
+ COPY repo/game-life-restart/package.json ./repo/game-life-restart/
24
+
25
+ # Install dependencies
26
+ RUN pnpm install --frozen-lockfile
27
+
28
+ # Copy source files
29
+ COPY packages/replay-shared/tsconfig.json ./packages/replay-shared/
30
+ COPY packages/replay-shared/src ./packages/replay-shared/src
31
+ COPY repo/game-life-restart/tsconfig.json ./repo/game-life-restart/
32
+ COPY repo/game-life-restart/tsconfig.node.json ./repo/game-life-restart/
33
+ COPY repo/game-life-restart/vite.config.ts ./repo/game-life-restart/
34
+ COPY repo/game-life-restart/tailwind.config.js ./repo/game-life-restart/
35
+ COPY repo/game-life-restart/postcss.config.js ./repo/game-life-restart/
36
+ COPY repo/game-life-restart/index.html ./repo/game-life-restart/
37
+ COPY repo/game-life-restart/src ./repo/game-life-restart/src
38
+ COPY repo/game-life-restart/public ./repo/game-life-restart/public
39
+
40
+ # Build replay-shared first (dependency)
41
+ WORKDIR /app/packages/replay-shared
42
+ RUN pnpm run build
43
+
44
+ # Build game with correct base path for bundle serving
45
+ WORKDIR /app/repo/game-life-restart
46
+ ENV VITE_BASE_PATH=/bundles/game-life-restart/
47
+ RUN pnpm run build
48
+
49
+ # =============================================================================
50
+ # Stage 2: Build replay-server
51
+ # =============================================================================
52
+ FROM node:18-bullseye-slim AS server-builder
53
+
54
+ RUN npm install -g pnpm@9.1.0
55
+
56
+ WORKDIR /app
57
+
58
+ # Copy monorepo config
59
+ COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
60
+
61
+ # Copy package.json files
62
+ COPY packages/replay-shared/package.json ./packages/replay-shared/
63
+ COPY packages/replay-server/package*.json ./packages/replay-server/
64
+
65
+ # Install dependencies
66
+ RUN pnpm install --frozen-lockfile
67
+
68
+ # Copy source files
69
+ COPY packages/replay-shared/tsconfig.json ./packages/replay-shared/
70
+ COPY packages/replay-shared/src ./packages/replay-shared/src
71
+ COPY packages/replay-server/tsconfig.json ./packages/replay-server/
72
+ COPY packages/replay-server/src ./packages/replay-server/src
73
+
74
+ # Build shared package first
75
+ WORKDIR /app/packages/replay-shared
76
+ RUN pnpm run build
77
+
78
+ # Build replay-server
79
+ WORKDIR /app/packages/replay-server
80
+ RUN pnpm run build
81
+
82
+ # =============================================================================
83
+ # Stage 3: Runtime
84
+ # =============================================================================
85
+ FROM node:18-bullseye-slim AS runtime
86
+
87
+ # Install FFmpeg, Chromium dependencies, Chinese fonts, and pnpm
88
+ RUN apt-get update && apt-get install -y \
89
+ ffmpeg \
90
+ chromium \
91
+ chromium-sandbox \
92
+ libnss3 \
93
+ libatk1.0-0 \
94
+ libatk-bridge2.0-0 \
95
+ libcups2 \
96
+ libdrm2 \
97
+ libxkbcommon0 \
98
+ libxcomposite1 \
99
+ libxdamage1 \
100
+ libxrandr2 \
101
+ libgbm1 \
102
+ libasound2 \
103
+ libxss1 \
104
+ libgtk-3-0 \
105
+ fonts-noto-cjk \
106
+ fonts-noto-cjk-extra \
107
+ fonts-wqy-zenhei \
108
+ fontconfig \
109
+ && rm -rf /var/lib/apt/lists/*
110
+
111
+ # Install pnpm globally
112
+ RUN npm install -g pnpm@9.1.0
113
+
114
+ # Set Puppeteer to use system Chromium
115
+ ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
116
+ ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
117
+
118
+ WORKDIR /app
119
+
120
+ # Copy monorepo configuration files
121
+ COPY --from=server-builder /app/package.json /app/pnpm-workspace.yaml /app/pnpm-lock.yaml ./
122
+
123
+ # Copy package.json files for both packages
124
+ COPY --from=server-builder /app/packages/replay-shared/package.json ./packages/replay-shared/
125
+ COPY --from=server-builder /app/packages/replay-server/package.json ./packages/replay-server/
126
+
127
+ # Install production dependencies
128
+ RUN pnpm install --frozen-lockfile --prod
129
+
130
+ # Copy built artifacts from server-builder
131
+ COPY --from=server-builder /app/packages/replay-shared/dist ./packages/replay-shared/dist
132
+ COPY --from=server-builder /app/packages/replay-server/dist ./packages/replay-server/dist
133
+
134
+ # Copy game bundle from game-builder
135
+ COPY --from=game-builder /app/repo/game-life-restart/dist ./packages/replay-server/bundles/game-life-restart
136
+
137
+ # Create output directory
138
+ RUN mkdir -p /app/packages/replay-server/output
139
+
140
+ # Set working directory to replay-server
141
+ WORKDIR /app/packages/replay-server
142
+
143
+ # Environment variables
144
+ ENV PORT=9000
145
+ ENV BUNDLES_DIR=/app/packages/replay-server/bundles
146
+ ENV OUTPUT_DIR=/app/packages/replay-server/output
147
+
148
+ # Expose port
149
+ EXPOSE 9000
150
+
151
+ # Health check
152
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
153
+ CMD node -e "require('http').get('http://localhost:${PORT:-9000}/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
154
+
155
+ # Start server
156
+ CMD ["node", "dist/server/index.js"]