2025-10-09 20:19:20 +02:00
|
|
|
# Multi-stage build for Gym Tracker application
|
|
|
|
|
# Stage 1: Dependencies
|
|
|
|
|
FROM node:20-alpine AS dependencies
|
|
|
|
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
|
|
|
|
# Copy backend package files
|
|
|
|
|
COPY backend/package*.json ./backend/
|
|
|
|
|
|
|
|
|
|
# Install backend dependencies
|
|
|
|
|
RUN cd backend && npm ci --only=production
|
|
|
|
|
|
|
|
|
|
# Stage 2: Final image
|
|
|
|
|
FROM node:20-alpine
|
|
|
|
|
|
|
|
|
|
# Install nginx
|
|
|
|
|
RUN apk add --no-cache nginx
|
|
|
|
|
|
|
|
|
|
# Create app directory
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
|
|
|
|
# Copy backend files and dependencies
|
|
|
|
|
COPY --from=dependencies /app/backend/node_modules ./backend/node_modules
|
|
|
|
|
COPY backend/package*.json ./backend/
|
|
|
|
|
COPY backend/*.js ./backend/
|
|
|
|
|
|
|
|
|
|
# Copy frontend files to nginx html directory
|
|
|
|
|
COPY frontend/ /usr/share/nginx/html/
|
|
|
|
|
|
|
|
|
|
# Copy nginx configuration
|
|
|
|
|
COPY nginx/nginx.conf /etc/nginx/nginx.conf
|
|
|
|
|
|
|
|
|
|
# Create data directory for SQLite database
|
|
|
|
|
RUN mkdir -p /app/data && chmod 755 /app/data
|
|
|
|
|
|
|
|
|
|
# Create nginx directories and set permissions
|
|
|
|
|
RUN mkdir -p /var/log/nginx /var/lib/nginx /run/nginx && \
|
|
|
|
|
chown -R nginx:nginx /var/log/nginx /var/lib/nginx /run/nginx
|
|
|
|
|
|
|
|
|
|
# Create startup script
|
|
|
|
|
RUN echo '#!/bin/sh' > /app/start.sh && \
|
|
|
|
|
echo 'echo "Starting Gym Tracker application..."' >> /app/start.sh && \
|
|
|
|
|
echo '' >> /app/start.sh && \
|
|
|
|
|
echo '# Start nginx in background' >> /app/start.sh && \
|
|
|
|
|
echo 'echo "Starting nginx..."' >> /app/start.sh && \
|
|
|
|
|
echo 'nginx' >> /app/start.sh && \
|
|
|
|
|
echo '' >> /app/start.sh && \
|
|
|
|
|
echo '# Start backend server' >> /app/start.sh && \
|
|
|
|
|
echo 'echo "Starting backend server on port 3000..."' >> /app/start.sh && \
|
|
|
|
|
echo 'cd /app/backend' >> /app/start.sh && \
|
|
|
|
|
echo 'exec node server.js' >> /app/start.sh && \
|
|
|
|
|
chmod +x /app/start.sh
|
|
|
|
|
|
|
|
|
|
# Expose ports
|
|
|
|
|
EXPOSE 80 3000
|
|
|
|
|
|
|
|
|
|
# Set environment variables
|
|
|
|
|
ENV NODE_ENV=production
|
|
|
|
|
ENV PORT=3000
|
|
|
|
|
|
|
|
|
|
# Health check
|
|
|
|
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
|
|
|
|
|
CMD wget --quiet --tries=1 --spider http://localhost/health || exit 1
|
|
|
|
|
|
|
|
|
|
# Run startup script
|
|
|
|
|
CMD ["/app/start.sh"]
|