diff --git a/.gitignore b/.gitignore index 235662a..f3a586c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,12 +3,10 @@ node_modules npm-debug.log .DS_Store .git +.env .vscode .idea frontend/build frontend/dist backend/node_modules -backend/.env frontend/node_modules -docker-compose.dev.yml -scripts/docker-release.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a0bef04 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,53 @@ +# =============================== +# Stage 1: Frontend Build +# =============================== +FROM node:20-alpine AS frontend-build + +# Arbeitsverzeichnis +WORKDIR /app/frontend + +# Nur package.json & package-lock.json kopieren und Dependencies installieren +COPY frontend/package.json frontend/package-lock.json ./ +RUN npm ci + +# Restliche Frontend-Dateien kopieren +COPY frontend/ ./ + +# Frontend Build erzeugen (statische Dateien) +RUN npm run build + + +# =============================== +# Stage 2: Backend + Frontend +# =============================== +FROM node:20-alpine AS runtime + +# Arbeitsverzeichnis +WORKDIR /app/backend + +# Backend Dependencies installieren +COPY backend/package.json backend/package-lock.json ./ +RUN npm ci --only=production + +# Backend-Code kopieren +COPY backend/ ./ + +# public leeren +RUN rm -rf ./public/* + +# Inhalt von dist inklusive Unterordner direkt nach public kopieren +COPY --from=frontend-build /app/frontend/dist/. ./public/ + +# Environment +ENV NODE_ENV=production + +# Ports +# Backend intern: 4001 +# Frontend exposed: 5173 +EXPOSE 5173 + +# Node User +USER node + +# Container startet das Backend (liefert statisches Frontend) +CMD ["node", "index.js"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0110094 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3.8' +services: + app: + build: + context: . + dockerfile: Dockerfile + ports: + - "4001:4001" + environment: + PORTAINER_URL: "Your_Portainer_Server_Address" + PORTAINER_API_KEY: "Your_Portainer_API_Key" + PORTAINER_ENDPOINT_ID: "Your_Portainer_Endpoint_ID" + restart: unless-stopped