Deploy prd
This commit is contained in:
parent
2ecccc2e29
commit
4492a12ca2
14 changed files with 517 additions and 53 deletions
13
backend/.env.development
Normal file
13
backend/.env.development
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Desenvolvimento
|
||||||
|
DATABASE_URL=postgresql://toptranadm:ft7zJdVNk8FivQUk@175.15.15.90:5432/toptrandev
|
||||||
|
DB_USER=toptranadm
|
||||||
|
DB_PASSWORD=ft7zJdVNk8FivQUk
|
||||||
|
DB_HOST=175.15.15.90
|
||||||
|
DB_PORT=5432
|
||||||
|
DB_NAME=toptrandev
|
||||||
|
|
||||||
|
PORT=4000
|
||||||
|
NODE_ENV=development
|
||||||
|
|
||||||
|
JWT_SECRET=iDgji2sbBKqmPerRHnQXFK0iHwmfNTNb5zreuetUecD
|
||||||
|
JWT_REFRESH_SECRET=pFLRKyVdDaTVdEWNebDWMQuMdbpgCnsx4p3WiVRgmuU
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
# Database
|
|
||||||
DATABASE_URL=postgresql://postgres:postgres@175.15.15.90:5432/toptran
|
|
||||||
DB_USER=postgres
|
|
||||||
DB_PASSWORD=postgres
|
|
||||||
DB_HOST=175.15.15.90
|
|
||||||
DB_PORT=5432
|
|
||||||
DB_NAME=toptran
|
|
||||||
|
|
||||||
# Server
|
|
||||||
PORT=4000
|
|
||||||
NODE_ENV=production
|
|
||||||
|
|
||||||
# JWT
|
|
||||||
JWT_SECRET=iDgji2sbBKqmPerRHnQXFK0iHwmfNTNb5zreuetUecD
|
|
||||||
JWT_REFRESH_SECRET=pFLRKyVdDaTVdEWNebDWMQuMdbpgCnsx4p3WiVRgmuU
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
# Database
|
|
||||||
DATABASE_URL=postgresql://postgres:postgres@175.15.15.90:5432/toptran
|
|
||||||
DB_USER=postgres
|
|
||||||
DB_PASSWORD=postgres
|
|
||||||
DB_HOST=175.15.15.90
|
|
||||||
DB_PORT=5432
|
|
||||||
DB_NAME=toptran
|
|
||||||
|
|
||||||
# Server
|
|
||||||
PORT=4000
|
|
||||||
NODE_ENV=production
|
|
||||||
|
|
||||||
# JWT
|
|
||||||
JWT_SECRET=iDgji2sbBKqmPerRHnQXFK0iHwmfNTNb5zreuetUecD
|
|
||||||
JWT_REFRESH_SECRET=pFLRKyVdDaTVdEWNebDWMQuMdbpgCnsx4p3WiVRgmuU
|
|
||||||
13
backend/.env.production
Normal file
13
backend/.env.production
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Produção
|
||||||
|
DATABASE_URL=postgresql://toptranadm:ft7zJdVNk8FivQUk@175.15.15.90:5432/toptranprod
|
||||||
|
DB_USER=toptranadm
|
||||||
|
DB_PASSWORD=ft7zJdVNk8FivQUk
|
||||||
|
DB_HOST=175.15.15.90
|
||||||
|
DB_PORT=5432
|
||||||
|
DB_NAME=toptranprod
|
||||||
|
|
||||||
|
PORT=5000
|
||||||
|
NODE_ENV=production
|
||||||
|
|
||||||
|
JWT_SECRET=iDgji2sbBKqmPerRHnQXFK0iHwmfNTNb5zreuetUecD
|
||||||
|
JWT_REFRESH_SECRET=pFLRKyVdDaTVdEWNebDWMQuMdbpgCnsx4p3WiVRgmuU
|
||||||
31
backend/.gitignore
vendored
Normal file
31
backend/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
# Dependencies
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log*
|
||||||
|
|
||||||
|
# Build
|
||||||
|
dist/
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.*.local
|
||||||
|
|
||||||
|
# Keep these for reference (remova a # se quiser ignorar)
|
||||||
|
# .env.development
|
||||||
|
# .env.production
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
logs/
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Prisma
|
||||||
|
prisma/migrations/
|
||||||
|
|
@ -1,12 +1,17 @@
|
||||||
|
# Multi-stage build - funciona para dev e prod
|
||||||
|
ARG NODE_ENV=production
|
||||||
|
|
||||||
# Build stage
|
# Build stage
|
||||||
FROM node:lts-alpine3.22 AS builder
|
FROM node:lts-alpine3.22 AS builder
|
||||||
|
|
||||||
|
ARG NODE_ENV
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
|
|
||||||
# Instalar todas as dependências (incluindo dev) para compilar TypeScript
|
# Build sempre precisa dos @types e ferramentas de compilação
|
||||||
RUN npm ci
|
RUN npm ci --include=dev
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
|
|
@ -15,17 +20,26 @@ RUN npm run build
|
||||||
# Runtime stage
|
# Runtime stage
|
||||||
FROM node:lts-alpine3.22
|
FROM node:lts-alpine3.22
|
||||||
|
|
||||||
|
ARG NODE_ENV
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Copiar apenas arquivos necessários do builder
|
# Copiar arquivos do builder
|
||||||
COPY --from=builder /app/dist ./dist
|
COPY --from=builder /app/dist ./dist
|
||||||
COPY --from=builder /app/node_modules ./node_modules
|
|
||||||
COPY --from=builder /app/prisma ./prisma
|
COPY --from=builder /app/prisma ./prisma
|
||||||
COPY --from=builder /app/package*.json ./
|
COPY --from=builder /app/package*.json ./
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
# Instalar apenas dependências de produção no runtime
|
||||||
ENV PORT=4000
|
RUN if [ "$NODE_ENV" = "production" ]; then \
|
||||||
|
npm ci --only=production; \
|
||||||
|
else \
|
||||||
|
npm ci; \
|
||||||
|
fi
|
||||||
|
|
||||||
EXPOSE 4000
|
ARG PORT=4000
|
||||||
|
ENV NODE_ENV=${NODE_ENV}
|
||||||
|
ENV PORT=${PORT}
|
||||||
|
|
||||||
|
EXPOSE ${PORT}
|
||||||
|
|
||||||
CMD ["npm", "start"]
|
CMD ["npm", "start"]
|
||||||
251
backend/README.md
Normal file
251
backend/README.md
Normal file
|
|
@ -0,0 +1,251 @@
|
||||||
|
# 🚀 ToP Tran Backend
|
||||||
|
|
||||||
|
Backend da aplicação ToP Tran construído com Node.js, Express, TypeScript e Prisma.
|
||||||
|
|
||||||
|
## 📋 Requisitos
|
||||||
|
|
||||||
|
- Node.js 18+
|
||||||
|
- Docker/Podman
|
||||||
|
- PostgreSQL 16+
|
||||||
|
|
||||||
|
## 🏗️ Estrutura
|
||||||
|
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── controllers/ # Lógica HTTP
|
||||||
|
├── routes/ # Definição de rotas
|
||||||
|
├── services/ # Lógica de negócios
|
||||||
|
├── repositories/ # Acesso ao banco de dados
|
||||||
|
├── middlewares/ # Middlewares Express
|
||||||
|
├── lib/ # Bibliotecas utilitárias
|
||||||
|
└── server.ts # Ponto de entrada
|
||||||
|
|
||||||
|
prisma/
|
||||||
|
├── schema.prisma # Definição do banco de dados
|
||||||
|
└── migrations/ # Histórico de mudanças no BD
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Quick Start
|
||||||
|
|
||||||
|
### Desenvolvimento Local
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Instalar dependências
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# 2. Configurar .env
|
||||||
|
cp .env.example .env
|
||||||
|
|
||||||
|
# 3. Executar migrações
|
||||||
|
npx prisma migrate dev
|
||||||
|
|
||||||
|
# 4. Iniciar servidor
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Com Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Desenvolvimento
|
||||||
|
chmod +x deploy.sh
|
||||||
|
./deploy.sh development
|
||||||
|
|
||||||
|
# Produção
|
||||||
|
./deploy.sh production
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📦 Scripts Disponíveis
|
||||||
|
|
||||||
|
| Script | Descrição |
|
||||||
|
| ------------------- | ----------------------------------- |
|
||||||
|
| `npm run dev` | Iniciar servidor em modo watch |
|
||||||
|
| `npm run build` | Compilar TypeScript para JavaScript |
|
||||||
|
| `npm run start` | Rodar aplicação compilada |
|
||||||
|
| `npm run typecheck` | Verificar tipos sem compilar |
|
||||||
|
|
||||||
|
## 🐳 Docker Commands
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Com NODE_ENV=production (padrão)
|
||||||
|
NODE_ENV=production podman build -t toptran-backend:latest .
|
||||||
|
|
||||||
|
# Com NODE_ENV=development
|
||||||
|
NODE_ENV=development podman build --build-arg NODE_ENV=development -t toptran-backend:dev .
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Produção
|
||||||
|
NODE_ENV=production podman-compose --env-file .env.production -f docker-compose.yml up -d
|
||||||
|
|
||||||
|
# Desenvolvimento
|
||||||
|
NODE_ENV=development podman-compose --env-file .env.development -f docker-compose.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NODE_ENV=production podman-compose -f docker-compose.yml logs -f backend
|
||||||
|
```
|
||||||
|
|
||||||
|
### Stop
|
||||||
|
|
||||||
|
```bash
|
||||||
|
podman-compose -f docker-compose.yml down
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🗄️ Banco de Dados
|
||||||
|
|
||||||
|
### Migrações
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Criar nova migração
|
||||||
|
npx prisma migrate dev --name descricao_da_mudanca
|
||||||
|
|
||||||
|
# Aplicar migrações
|
||||||
|
npx prisma migrate deploy
|
||||||
|
|
||||||
|
# Resetar banco (⚠️ deleta dados)
|
||||||
|
npx prisma migrate reset
|
||||||
|
```
|
||||||
|
|
||||||
|
### Studio (GUI)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx prisma studio
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📡 Rotas da API
|
||||||
|
|
||||||
|
### Autenticação
|
||||||
|
|
||||||
|
- `POST /auth/register` - Registrar usuário
|
||||||
|
- `POST /auth/login` - Login
|
||||||
|
- `POST /auth/refresh` - Refresh token
|
||||||
|
|
||||||
|
### Usuários
|
||||||
|
|
||||||
|
- `GET /users/me` - Obter dados do usuário
|
||||||
|
- `GET /users/profile` - Obter perfil
|
||||||
|
- `PATCH /users/profile` - Atualizar perfil
|
||||||
|
- `PUT /users/me` - Atualizar usuário
|
||||||
|
- `DELETE /users/me` - Deletar conta
|
||||||
|
|
||||||
|
### Sincronização
|
||||||
|
|
||||||
|
- `GET /sync/companies` - Listar empresas
|
||||||
|
- `POST /sync/companies` - Sincronizar empresas
|
||||||
|
- `GET /sync/rides` - Listar corridas
|
||||||
|
- `POST /sync/rides` - Sincronizar corridas
|
||||||
|
|
||||||
|
## 🔑 Variáveis de Ambiente
|
||||||
|
|
||||||
|
```env
|
||||||
|
# Banco de Dados
|
||||||
|
DATABASE_URL=postgresql://user:password@host:5432/db_name
|
||||||
|
DB_USER=user
|
||||||
|
DB_PASSWORD=password
|
||||||
|
DB_HOST=localhost
|
||||||
|
DB_PORT=5432
|
||||||
|
DB_NAME=toptran
|
||||||
|
|
||||||
|
# Servidor
|
||||||
|
PORT=4000
|
||||||
|
NODE_ENV=production
|
||||||
|
|
||||||
|
# JWT
|
||||||
|
JWT_SECRET=sua_chave_secreta_aqui
|
||||||
|
JWT_REFRESH_SECRET=sua_chave_refresh_aqui
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚢 Deploy
|
||||||
|
|
||||||
|
### Opção 1: Script de Deploy
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod +x deploy.sh
|
||||||
|
|
||||||
|
# Desenvolvimento
|
||||||
|
./deploy.sh development
|
||||||
|
|
||||||
|
# Produção
|
||||||
|
./deploy.sh production
|
||||||
|
```
|
||||||
|
|
||||||
|
### Opção 2: Manual com Docker Compose
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Produção
|
||||||
|
NODE_ENV=production podman-compose \
|
||||||
|
--env-file .env.production \
|
||||||
|
-f docker-compose.yml \
|
||||||
|
up --build -d
|
||||||
|
|
||||||
|
# Executar migrações
|
||||||
|
NODE_ENV=production podman-compose \
|
||||||
|
--env-file .env.production \
|
||||||
|
-f docker-compose.yml \
|
||||||
|
exec -T backend npx prisma migrate deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
### Opção 3: SSH para Servidor
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# No servidor
|
||||||
|
cd /var/www/toptran-backend
|
||||||
|
git pull origin main
|
||||||
|
npm ci --only=production
|
||||||
|
npm run build
|
||||||
|
npx prisma migrate deploy
|
||||||
|
|
||||||
|
# Com PM2
|
||||||
|
pm2 restart toptran-backend
|
||||||
|
pm2 save
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 Troubleshooting
|
||||||
|
|
||||||
|
### Erro: "Cannot find module 'express'"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Erro: "Database connection refused"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Verificar se PostgreSQL está rodando
|
||||||
|
podman ps | grep postgres
|
||||||
|
|
||||||
|
# Verificar DATABASE_URL em .env
|
||||||
|
cat .env
|
||||||
|
```
|
||||||
|
|
||||||
|
### Erro: "port 4000 already in use"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Parar container antigo
|
||||||
|
podman stop toptran-backend
|
||||||
|
|
||||||
|
# Ou usar porta diferente
|
||||||
|
PORT=5000 podman-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Referências
|
||||||
|
|
||||||
|
- [Express.js](https://expressjs.com/)
|
||||||
|
- [Prisma](https://www.prisma.io/)
|
||||||
|
- [TypeScript](https://www.typescriptlang.org/)
|
||||||
|
- [Docker](https://docs.docker.com/)
|
||||||
|
|
||||||
|
## 👤 Autor
|
||||||
|
|
||||||
|
Rayan
|
||||||
|
|
||||||
|
## 📄 Licença
|
||||||
|
|
||||||
|
ISC
|
||||||
105
backend/deploy.sh
Executable file
105
backend/deploy.sh
Executable file
|
|
@ -0,0 +1,105 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script de deploy - funciona para dev e prod
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Cores para output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Função para printar com cor
|
||||||
|
print_info() {
|
||||||
|
echo -e "${BLUE}ℹ${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_success() {
|
||||||
|
echo -e "${GREEN}✓${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
echo -e "${YELLOW}⚠${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_error() {
|
||||||
|
echo -e "${RED}✗${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Verificar argumentos
|
||||||
|
ENV=${1:-production}
|
||||||
|
|
||||||
|
if [ "$ENV" != "production" ] && [ "$ENV" != "development" ] && [ "$ENV" != "dev" ] && [ "$ENV" != "prod" ]; then
|
||||||
|
print_error "Ambiente inválido: $ENV"
|
||||||
|
echo "Uso: ./deploy.sh [development|production|dev|prod]"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Normalizar nomes
|
||||||
|
if [ "$ENV" = "dev" ]; then
|
||||||
|
ENV="development"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$ENV" = "prod" ]; then
|
||||||
|
ENV="production"
|
||||||
|
fi
|
||||||
|
|
||||||
|
COMPOSE_FILE="docker-compose.$ENV.yml"
|
||||||
|
|
||||||
|
print_info "🚀 Iniciando deploy para: $ENV"
|
||||||
|
|
||||||
|
# Verificar se arquivo .env existe
|
||||||
|
if [ ! -f ".env.$ENV" ]; then
|
||||||
|
print_error "Arquivo .env.$ENV não encontrado!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$COMPOSE_FILE" ]; then
|
||||||
|
print_error "Arquivo $COMPOSE_FILE não encontrado!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_success "Usando $COMPOSE_FILE com .env.$ENV"
|
||||||
|
|
||||||
|
# Executar migrações localmente antes de subir o container
|
||||||
|
# (prisma é devDependency e não está disponível no runtime do container)
|
||||||
|
print_info "Executando migrações do Prisma..."
|
||||||
|
DB_URL=$(grep "^DATABASE_URL=" ".env.$ENV" | cut -d'=' -f2-)
|
||||||
|
if DATABASE_URL="$DB_URL" npx prisma migrate deploy; then
|
||||||
|
print_success "Migrações executadas"
|
||||||
|
else
|
||||||
|
print_warning "Erro nas migrações (talvez já estejam aplicadas)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Parar e remover containers antigos
|
||||||
|
print_info "Parando containers antigos..."
|
||||||
|
CONTAINER_NAME="toptran-backend-${ENV}"
|
||||||
|
podman stop "$CONTAINER_NAME" 2>/dev/null || true
|
||||||
|
podman rm -f "$CONTAINER_NAME" 2>/dev/null || true
|
||||||
|
podman-compose -f "$COMPOSE_FILE" down 2>/dev/null || true
|
||||||
|
|
||||||
|
# Build
|
||||||
|
print_info "Building docker image..."
|
||||||
|
podman-compose -f "$COMPOSE_FILE" build --no-cache
|
||||||
|
|
||||||
|
print_success "Build concluído"
|
||||||
|
|
||||||
|
# Iniciar containers
|
||||||
|
print_info "Iniciando containers..."
|
||||||
|
podman-compose -f "$COMPOSE_FILE" up -d
|
||||||
|
|
||||||
|
print_success "Containers iniciados"
|
||||||
|
|
||||||
|
# Mostrar status
|
||||||
|
print_info "Status dos containers:"
|
||||||
|
podman ps --filter "name=toptran" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
|
||||||
|
# Mostrar logs
|
||||||
|
print_info "Ultimos logs:"
|
||||||
|
sleep 3
|
||||||
|
podman-compose -f "$COMPOSE_FILE" logs --tail=20 backend
|
||||||
|
|
||||||
|
print_success "Deploy concluído para $ENV!"
|
||||||
|
print_info "Para ver logs: podman-compose -f $COMPOSE_FILE logs -f backend"
|
||||||
27
backend/docker-compose.development.yml
Normal file
27
backend/docker-compose.development.yml
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
args:
|
||||||
|
- NODE_ENV=development
|
||||||
|
- PORT=4000
|
||||||
|
image: toptran-backend:development
|
||||||
|
container_name: toptran-backend-development
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "4000:4000"
|
||||||
|
env_file:
|
||||||
|
- .env.development
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=development
|
||||||
|
volumes:
|
||||||
|
- ./logs:/app/logs
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "-qO", "/dev/null", "http://localhost:4000/sync/companies"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 40s
|
||||||
27
backend/docker-compose.production.yml
Normal file
27
backend/docker-compose.production.yml
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
args:
|
||||||
|
- NODE_ENV=production
|
||||||
|
- PORT=5000
|
||||||
|
image: toptran-backend:production
|
||||||
|
container_name: toptran-backend-production
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "5000:5000"
|
||||||
|
env_file:
|
||||||
|
- .env.production
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=production
|
||||||
|
volumes:
|
||||||
|
- ./logs:/app/logs
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "-qO", "/dev/null", "http://localhost:5000/sync/companies"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 40s
|
||||||
27
backend/docker-compose.yml
Normal file
27
backend/docker-compose.yml
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
args:
|
||||||
|
- NODE_ENV=${NODE_ENV:-production}
|
||||||
|
image: toptran-backend:${NODE_ENV:-production}
|
||||||
|
container_name: toptran-backend-${NODE_ENV:-production}
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "${PORT:-5000}:${PORT:-5000}"
|
||||||
|
env_file:
|
||||||
|
- .env.${NODE_ENV:-production}
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=${NODE_ENV:-production}
|
||||||
|
volumes:
|
||||||
|
- ./logs:/app/logs
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "sh", "-c", "curl -f http://localhost:${PORT:-5000}/sync/companies"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 40s
|
||||||
|
|
||||||
1
backend/package-lock.json
generated
1
backend/package-lock.json
generated
|
|
@ -25,6 +25,7 @@
|
||||||
"@types/express": "^5.0.6",
|
"@types/express": "^5.0.6",
|
||||||
"@types/jsonwebtoken": "^9.0.10",
|
"@types/jsonwebtoken": "^9.0.10",
|
||||||
"@types/node": "^25.6.0",
|
"@types/node": "^25.6.0",
|
||||||
|
"dotenv": "^17.4.2",
|
||||||
"prisma": "^7.8.0",
|
"prisma": "^7.8.0",
|
||||||
"ts-node-dev": "^2.0.0",
|
"ts-node-dev": "^2.0.0",
|
||||||
"tsx": "^4.21.0"
|
"tsx": "^4.21.0"
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
"@types/express": "^5.0.6",
|
"@types/express": "^5.0.6",
|
||||||
"@types/jsonwebtoken": "^9.0.10",
|
"@types/jsonwebtoken": "^9.0.10",
|
||||||
"@types/node": "^25.6.0",
|
"@types/node": "^25.6.0",
|
||||||
|
"dotenv": "^17.4.2",
|
||||||
"prisma": "^7.8.0",
|
"prisma": "^7.8.0",
|
||||||
"ts-node-dev": "^2.0.0",
|
"ts-node-dev": "^2.0.0",
|
||||||
"tsx": "^4.21.0"
|
"tsx": "^4.21.0"
|
||||||
|
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
version: "3.9"
|
|
||||||
|
|
||||||
services:
|
|
||||||
backend:
|
|
||||||
container_name: top-tran-backend
|
|
||||||
image: top-tran-backend
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
ports:
|
|
||||||
- "3000:3000"
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
environment:
|
|
||||||
- PORT=3000
|
|
||||||
restart: always
|
|
||||||
Loading…
Add table
Reference in a new issue