Add Docker support with multi-stage Vite build and nginx serving

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Shayan Azadi
2026-07-01 00:32:25 +03:30
parent ce6c110e06
commit d7252f1d21
5 changed files with 118 additions and 0 deletions

13
.dockerignore Normal file
View File

@@ -0,0 +1,13 @@
node_modules
dist
dist-ssr
*.local
.env
.env.*
!.env.example
npm-debug.log*
.git
.gitignore
README.md
tsconfig.tsbuildinfo
tsconfig.node.tsbuildinfo

31
Dockerfile Normal file
View File

@@ -0,0 +1,31 @@
# FunZone Accounting Frontend Dockerfile
FROM node:18-alpine AS build
WORKDIR /app
ARG VITE_API_BASE_URL=http://localhost:8001/api
ARG VITE_ACCOUNTING_BASE_URL=http://localhost:8010/api
ARG VITE_BASE_PATH=/
ENV VITE_API_BASE_URL=$VITE_API_BASE_URL
ENV VITE_ACCOUNTING_BASE_URL=$VITE_ACCOUNTING_BASE_URL
ENV VITE_BASE_PATH=$VITE_BASE_PATH
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
RUN apk add --no-cache curl
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/health || exit 1
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -65,6 +65,22 @@ npm run preview # پیش‌نمایش بیلد روی پورت 5176
npm run lint # بررسی نوع‌ها (type-check) npm run lint # بررسی نوع‌ها (type-check)
``` ```
## Docker
```bash
docker compose up -d --build
```
The container serves the production build on **http://localhost:3006**.
Build-time API URLs (FunZone backend + accounting service):
```bash
VITE_API_BASE_URL=http://localhost:8001/api \
VITE_ACCOUNTING_BASE_URL=http://localhost:8010/api \
docker compose up -d --build
```
## معماری ## معماری
- `src/types` — مدل‌های دامنه با تایپ قوی - `src/types` — مدل‌های دامنه با تایپ قوی

18
docker-compose.yml Normal file
View File

@@ -0,0 +1,18 @@
services:
accounting-frontend:
build:
context: .
dockerfile: Dockerfile
args:
VITE_API_BASE_URL: ${VITE_API_BASE_URL:-http://localhost:8001/api}
VITE_ACCOUNTING_BASE_URL: ${VITE_ACCOUNTING_BASE_URL:-http://localhost:8010/api}
VITE_BASE_PATH: ${VITE_BASE_PATH:-/}
container_name: funzone_accounting_frontend
ports:
- "127.0.0.1:3006:80"
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3

40
nginx.conf Normal file
View File

@@ -0,0 +1,40 @@
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private auth;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/javascript
application/xml+rss
application/json;
location / {
try_files $uri $uri/ /index.html;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}