feat: Implement Docker build and serving setup

Adds Dockerfile for frontend and backend, along with Nginx configuration and .dockerignore files. This enables containerized deployment and proper handling of static assets and API proxying. Updates mockDb.ts to correctly type ticket attachments.
This commit is contained in:
2025-12-07 20:29:36 +01:00
parent 919be985c9
commit 0b2453e5a9
6 changed files with 75 additions and 2 deletions

Binary file not shown.

11
.dockerignore.txt Normal file
View File

@@ -0,0 +1,11 @@
node_modules
dist
.git
.env
.DS_Store
docker-compose.yml
Dockerfile
server/node_modules
.idea
.vscode

15
Dockerfile.txt Normal file
View File

@@ -0,0 +1,15 @@
# Stage 1: Build Frontend
FROM node:18-alpine as build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Stage 2: Serve with Nginx
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

39
nginx.txt Normal file
View File

@@ -0,0 +1,39 @@
worker_processes 1;
events { worker_connections 1024; }
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# Limite upload per allegati (es. foto/video ticket)
client_max_body_size 50M;
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
# Compressione Gzip
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# Gestione SPA (React Router)
location / {
try_files $uri $uri/ /index.html;
}
# Proxy API verso il backend
location /api/ {
proxy_pass http://backend:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
}

8
server/Dockerfile.txt Normal file
View File

@@ -0,0 +1,8 @@
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3001
CMD ["node", "server.js"]

View File

@@ -297,7 +297,7 @@ export const CondoService = {
return request<Ticket[]>(url); return request<Ticket[]>(url);
}, },
createTicket: async (data: Partial<Ticket> & { attachments?: { fileName: string, fileType: string, data: string }[] }) => { createTicket: async (data: Omit<Partial<Ticket>, 'attachments'> & { attachments?: { fileName: string, fileType: string, data: string }[] }) => {
const activeId = CondoService.getActiveCondoId(); const activeId = CondoService.getActiveCondoId();
if(!activeId) throw new Error("No active condo"); if(!activeId) throw new Error("No active condo");
return request('/tickets', { return request('/tickets', {