- Added Express.js admin panel on port 3001 (ADMIN_PORT env) - Dashboard: stats (users, products, purchases, revenue) - Users: list, details, ban/unban toggle - Products: CRUD by category - Wallets: list with balances - Purchases: history with filters - Audit log: view audit trail - Auth: token-based login with ADMIN_SECRET env var - Migrated sqlite3 → better-sqlite3 - database.js: async adapter (runAsync/allAsync/getAsync) - purchaseService.js: lastID → lastInsertRowid - userService.js: lastID → lastInsertRowid - Removed sqlite3 from package.json - Fixed: dotenv/config import added to index.js - Fixed: ENCRYPTION_KEY validation (32+ char hex) - Fixed: Dockerfile multi-stage build (no python needed) - Fixed: Docker DNS (network: host in build) - Fixed: docker-compose port 3001, healthcheck on 3001 - Added express, cookie-parser, pino-pretty, better-sqlite3 deps
43 lines
986 B
Docker
43 lines
986 B
Docker
FROM node:22-alpine AS builder
|
|
|
|
WORKDIR /app
|
|
|
|
COPY package*.json ./
|
|
RUN npm install && npm cache clean --force
|
|
|
|
# --- Runtime image ---
|
|
FROM node:22-alpine
|
|
|
|
# Install runtime dependencies
|
|
RUN apk update && \
|
|
apk add --no-cache --repository https://dl-cdn.alpinelinux.org/alpine/edge/community \
|
|
wireguard-tools \
|
|
&& apk add --no-cache \
|
|
iptables \
|
|
iproute2 \
|
|
openresolv \
|
|
bash \
|
|
curl \
|
|
&& rm -rf /var/cache/apk/*
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy node_modules from builder
|
|
COPY --from=builder /app/node_modules ./node_modules
|
|
COPY package*.json ./
|
|
|
|
# Copy application source
|
|
COPY ./src ./src
|
|
|
|
# Copy startup script
|
|
COPY ./wg/start.sh /app/start.sh
|
|
RUN chmod +x /app/start.sh
|
|
|
|
# Create db directory
|
|
RUN mkdir -p /app/db
|
|
|
|
# Health check: bot responds to /health on port 3000
|
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
|
CMD curl -sf http://localhost:3001/health || exit 1
|
|
|
|
CMD ["/bin/bash", "/app/start.sh"] |