diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a234060 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +# Install dependencies only when needed +FROM node:18-alpine AS deps +WORKDIR /app + +COPY package.json package-lock.json* ./ +RUN npm install + +# Build the app +FROM node:18-alpine AS builder +WORKDIR /app + +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN npm run build + +# Run the app +FROM node:18-alpine AS runner +WORKDIR /app + +ENV NODE_ENV production +ENV PORT 3000 + +COPY --from=builder /app/public ./public +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/package.json ./package.json + +EXPOSE 3000 + +CMD ["npm", "start"] diff --git a/docker-compose.yml b/docker-compose.yml index 2cea8d8..6814432 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,56 +1,23 @@ -version: "3.8" - -services: - traefik: - image: traefik:latest - command: - - "--api.dashboard=true" - - "--providers.docker=true" - - "--entrypoints.http.address=:80" - - "--entrypoints.https.address=:443" - - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" - - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http" - - "--certificatesresolvers.letsencrypt.acme.email=you@example.com" - - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - ports: - - "80:80" - - "443:443" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "./letsencrypt:/letsencrypt" - labels: - - "traefik.enable=true" - - webapp: - image: your-image-name:latest - expose: - - "3000" - labels: - - "traefik.enable=true" - - # HTTP Router - - "traefik.http.routers.http-webapp.rule=Host(`planpostai.com`) || Host(`www.planpostai.com`)" - - "traefik.http.routers.http-webapp.entrypoints=http" - - "traefik.http.routers.http-webapp.middlewares=redirect-to-https" - - # HTTPS Router - - "traefik.http.routers.https-webapp.rule=Host(`planpostai.com`) || Host(`www.planpostai.com`)" - - "traefik.http.routers.https-webapp.entrypoints=https" - - "traefik.http.routers.https-webapp.tls=true" - - "traefik.http.routers.https-webapp.tls.certresolver=letsencrypt" - - "traefik.http.routers.https-webapp.middlewares=redirect-to-www,gzip" - - "traefik.http.routers.https-webapp.service=webapp-service" - - # Redirect HTTP → HTTPS - - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" - - # Redirect non-www to www - - "traefik.http.middlewares.redirect-to-www.redirectregex.regex=^https?://(?:www\\.)?(.+)" - - "traefik.http.middlewares.redirect-to-www.redirectregex.replacement=https://www.$${1}" - - "traefik.http.middlewares.redirect-to-www.redirectregex.permanent=true" - - # Enable GZIP - - "traefik.http.middlewares.gzip.compress=true" - - # Service Definition - - "traefik.http.services.webapp-service.loadbalancer.server.port=3000" +webapp: + build: + context: . + dockerfile: Dockerfile + expose: + - "3000" + labels: + - "traefik.enable=true" + - "traefik.http.routers.http-webapp.rule=Host(`planpostai.com`) || Host(`www.planpostai.com`)" + - "traefik.http.routers.http-webapp.entrypoints=http" + - "traefik.http.routers.http-webapp.middlewares=redirect-to-https" + - "traefik.http.routers.https-webapp.rule=Host(`planpostai.com`) || Host(`www.planpostai.com`)" + - "traefik.http.routers.https-webapp.entrypoints=https" + - "traefik.http.routers.https-webapp.tls=true" + - "traefik.http.routers.https-webapp.tls.certresolver=letsencrypt" + - "traefik.http.routers.https-webapp.middlewares=redirect-to-www,gzip" + - "traefik.http.routers.https-webapp.service=webapp-service" + - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" + - "traefik.http.middlewares.redirect-to-www.redirectregex.regex=^https?://(?:www\\.)?(.+)" + - "traefik.http.middlewares.redirect-to-www.redirectregex.replacement=https://www.$${1}" + - "traefik.http.middlewares.redirect-to-www.redirectregex.permanent=true" + - "traefik.http.middlewares.gzip.compress=true" + - "traefik.http.services.webapp-service.loadbalancer.server.port=3000"