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:
BIN
.dockerignore
BIN
.dockerignore
Binary file not shown.
11
.dockerignore.txt
Normal file
11
.dockerignore.txt
Normal 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
15
Dockerfile.txt
Normal 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
39
nginx.txt
Normal 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
8
server/Dockerfile.txt
Normal 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"]
|
||||||
@@ -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', {
|
||||||
|
|||||||
Reference in New Issue
Block a user