/** * dockerfile.ts — Gerador de Dockerfiles production-ready */ import type { DockerfileOptions } from './types'; export function generateDockerfile(o: DockerfileOptions): { content: string; stages: number; mb: number } { const v = o.nodeVersion || '20'; switch (o.stack) { case 'nextjs': return nextjs(v); case 'nestjs': return nestjs(v); case 'nuxt': return nuxt(v); case 'laravel':return laravel(o.phpVersion); case 'php-generic': return php(o.phpVersion); case 'python': return python(o.pythonVersion); case 'go': return go(o.nodeVersion); case 'rust': return rust(); case 'wordpress': return { content: '# Use xCloud Native', stages: 0, mb: 0 }; case 'nodejs': return nodejs(v); default: return { content: '# Unknown stack', stages: 0, mb: 0 }; } } /* ─── NODE: Express/Fastify ─── */ function nodejs(v: string) { return { content: `FROM node:${v}-alpine AS deps WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci --omit=dev COPY . . FROM node:${v}-alpine WORKDIR /app ENV NODE_ENV=production COPY --from=deps /app/node_modules ./node_modules COPY --from=deps /app . EXPOSE 3000 CMD ["node", "server.js"]`, stages: 2, mb: 140, }; } /* ─── NEXT.JS standalone ─── */ function nextjs(v: string) { return { content: `FROM node:${v}-alpine AS deps WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci FROM node:${v}-alpine AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . ENV NEXT_TELEMETRY_DISABLED=1 RUN npm run build FROM node:${v}-alpine AS runner WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/public ./public EXPOSE 3000 ENV PORT=3000 ENV HOSTNAME=0.0.0.0 CMD ["node", "server.js"]`, stages: 3, mb: 180, }; } /* ─── NESTJS ─── */ function nestjs(v: string) { return { content: `FROM node:${v}-alpine AS deps WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci --omit=dev FROM node:${v}-alpine AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build FROM node:${v}-alpine WORKDIR /app ENV NODE_ENV=production COPY --from=deps /app/node_modules ./node_modules COPY --from=builder /app/dist ./dist COPY package.json ./ EXPOSE 3000 CMD ["node", "dist/main"]`, stages: 3, mb: 170, }; } /* ─── NUXT ─── */ function nuxt(v: string) { return { content: `FROM node:${v}-alpine AS deps WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci FROM node:${v}-alpine AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build FROM node:${v}-alpine WORKDIR /app ENV NODE_ENV=production ENV NITRO_PORT=3000 ENV NITRO_HOST=0.0.0.0 COPY --from=builder /app/.output ./.output EXPOSE 3000 CMD ["node", ".output/server/index.mjs"]`, stages: 3, mb: 170, }; } /* ─── LARAVEL ─── */ function laravel(v: string = '8.3') { return { content: `FROM php:${v}-fpm-alpine RUN apk add --no-cache git curl libpng-dev libxml2-dev zip unzip nodejs npm RUN docker-php-ext-install pdo pdo_mysql bcmath gd opcache RUN echo "opcache.enable=1" > /usr/local/etc/php/conf.d/opcache.ini && echo "opcache.memory_consumption=256" >> /usr/local/etc/php/conf.d/opcache.ini COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer WORKDIR /var/www/html COPY composer.json composer.lock ./ RUN composer install --no-dev --no-scripts --prefer-dist COPY . . RUN composer dump-autoload --optimize RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache EXPOSE 9000 CMD ["php-fpm"]`, stages: 1, mb: 220, }; } /* ─── PHP genérico ─── */ function php(v: string = '8.3') { return { content: `FROM php:${v}-apache RUN a2enmod rewrite headers RUN docker-php-ext-install pdo pdo_mysql mysqli COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer ENV APACHE_DOCUMENT_ROOT=/var/www/html/public RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf WORKDIR /var/www/html COPY composer.json composer.lock* ./ RUN composer install --no-dev --no-scripts --prefer-dist COPY . . RUN chown -R www-data:www-data /var/www/html EXPOSE 80 CMD ["apache2-foreground"]`, stages: 1, mb: 200, }; } /* ─── PYTHON FastAPI ─── */ function python(v: string | undefined) { const pv = v || '3.12'; return { content: `FROM python:${pv}-slim WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends build-essential curl && rm -rf /var/lib/apt/lists/* COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . RUN useradd -m -u 1001 appuser && chown -R appuser:appuser /app USER appuser EXPOSE 8000 ENV PORT=8000 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]`, stages: 1, mb: 250, }; } /* ─── GO ─── */ function go(v: string | undefined) { const gv = v || '1.22'; return { content: `FROM golang:${gv}-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o app . FROM alpine:3.19 RUN apk add --no-cache ca-certificates COPY --from=builder /app/app /usr/local/bin/app USER 1001 EXPOSE 8080 ENV PORT=8080 CMD ["app"]`, stages: 2, mb: 40, }; } /* ─── RUST ─── */ function rust() { return { content: `FROM rust:1.75-slim AS builder WORKDIR /app COPY Cargo.toml Cargo.lock ./ COPY src ./src RUN cargo build --release FROM debian:bookworm-slim RUN apt-get update && apt-get install -y --no-install-recommends libssl3 ca-certificates && rm -rf /var/lib/apt/lists/* COPY --from=builder /app/target/release/app /usr/local/bin/app USER 1001 EXPOSE 8080 ENV PORT=8080 CMD ["app"]`, stages: 2, mb: 60, }; }