feat: Introduce Dockerfile, Docker Compose, and Gitea workflow for API containerization and deployment.
This commit is contained in:
parent
af7e62cdf2
commit
1e59f29290
|
|
@ -0,0 +1,55 @@
|
|||
# Dependências
|
||||
node_modules/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Build
|
||||
dist/
|
||||
build/
|
||||
|
||||
# Testes
|
||||
coverage/
|
||||
.nyc_output/
|
||||
|
||||
# IDEs
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Git
|
||||
.git/
|
||||
.gitignore
|
||||
|
||||
# Env
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Logs
|
||||
logs/
|
||||
*.log
|
||||
|
||||
# Temporários
|
||||
tmp/
|
||||
temp/
|
||||
*.tmp
|
||||
|
||||
# Documentação
|
||||
README.md
|
||||
docs/
|
||||
|
||||
# CI/CD
|
||||
.github/
|
||||
.gitlab-ci.yml
|
||||
|
||||
# Docker
|
||||
Dockerfile
|
||||
docker-compose*.yml
|
||||
.dockerignore
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
# ============================================
|
||||
# Stage 1: Dependencies
|
||||
# ============================================
|
||||
FROM node:24-bookworm-slim AS dependencies
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
RUN npm ci --only=production --ignore-scripts && \
|
||||
npm cache clean --force
|
||||
|
||||
# ============================================
|
||||
# Stage 2: Builder
|
||||
# ============================================
|
||||
FROM node:24-bookworm-slim AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
RUN npm ci --ignore-scripts && \
|
||||
npm cache clean --force
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN npm run build
|
||||
|
||||
# ============================================
|
||||
# Stage 3: Oracle Instant Client
|
||||
# ============================================
|
||||
FROM node:24-bookworm-slim AS oracle-client
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
libaio1 \
|
||||
wget \
|
||||
unzip \
|
||||
ca-certificates && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN mkdir -p /opt/oracle && \
|
||||
wget --progress=dot:giga \
|
||||
https://download.oracle.com/otn_software/linux/instantclient/2360000/instantclient-basic-linux.x64-23.6.0.24.10.zip \
|
||||
-O /tmp/instantclient.zip && \
|
||||
unzip -q /tmp/instantclient.zip -d /opt/oracle && \
|
||||
rm /tmp/instantclient.zip && \
|
||||
mv /opt/oracle/instantclient_* /opt/oracle/instantclient
|
||||
|
||||
# ============================================
|
||||
# Stage 4: Production
|
||||
# ============================================
|
||||
FROM node:24-bookworm-slim AS production
|
||||
|
||||
LABEL maintainer="Joelson"
|
||||
LABEL description="API Controle Saída Loja - NestJS + Oracle"
|
||||
LABEL version="1.0"
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
libaio1 \
|
||||
dumb-init && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
apt-get clean
|
||||
|
||||
RUN groupadd -r nodejs && \
|
||||
useradd -r -g nodejs -s /bin/bash -d /home/nodejs nodejs && \
|
||||
mkdir -p /home/nodejs && \
|
||||
chown -R nodejs:nodejs /home/nodejs
|
||||
|
||||
COPY --from=oracle-client /opt/oracle/instantclient /opt/oracle/instantclient
|
||||
|
||||
ENV LD_LIBRARY_PATH=/opt/oracle/instantclient
|
||||
ENV ORACLE_HOME=/opt/oracle/instantclient
|
||||
ENV NODE_ENV=production
|
||||
ENV NPM_CONFIG_LOGLEVEL=warn
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=dependencies --chown=nodejs:nodejs /app/node_modules ./node_modules
|
||||
|
||||
COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
|
||||
COPY --chown=nodejs:nodejs package*.json ./
|
||||
|
||||
USER nodejs
|
||||
|
||||
EXPOSE 3001
|
||||
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
||||
CMD node -e "require('http').get('http://localhost:3001/', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
|
||||
|
||||
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
|
||||
|
||||
CMD ["node", "dist/main.js"]
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
version: '3.8'
|
||||
|
||||
services:
|
||||
api:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
target: production
|
||||
image: api-controle-saida-loja:latest
|
||||
container_name: api-controle-saida-loja
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "3001:3001"
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
PORT: 3001
|
||||
|
||||
ORACLE_USER: ${ORACLE_USER}
|
||||
ORACLE_PASSWORD: ${ORACLE_PASSWORD}
|
||||
ORACLE_CONNECTION_STRING: ${ORACLE_CONNECTION_STRING}
|
||||
ORACLE_LIB_DIR: /opt/oracle/instantclient
|
||||
|
||||
JWT_SECRET: ${JWT_SECRET}
|
||||
|
||||
env_file:
|
||||
- .env
|
||||
|
||||
healthcheck:
|
||||
test: [ "CMD", "node", "-e", "require('http').get('http://localhost:3001/', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" ]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '1'
|
||||
memory: 512M
|
||||
reservations:
|
||||
cpus: '0.5'
|
||||
memory: 256M
|
||||
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
|
||||
networks:
|
||||
- api-network
|
||||
|
||||
networks:
|
||||
api-network:
|
||||
driver: bridge
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
name: Deploy NestJS API
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build-and-push-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Login no Harbor
|
||||
run: |
|
||||
echo "${{ secrets.HARBOR_PASSWORD }}" | docker login 10.1.1.124:8082 -u ${{ secrets.HARBOR_USERNAME }} --password-stdin
|
||||
|
||||
- name: Build e Push
|
||||
run: |
|
||||
# Usando o short SHA para uma tag mais limpa
|
||||
TAG=$(echo ${{ gitea.sha }} | cut -c1-7)
|
||||
IMAGE_NAME="10.1.1.124:8082/library/controle-saida-loja-api"
|
||||
|
||||
docker build -t $IMAGE_NAME:$TAG .
|
||||
docker tag $IMAGE_NAME:$TAG $IMAGE_NAME:latest
|
||||
|
||||
docker push $IMAGE_NAME:$TAG
|
||||
docker push $IMAGE_NAME:latest
|
||||
|
||||
- name: Notificar Portainer via Webhook
|
||||
run: |
|
||||
# O segredo PORTAINER_WEBHOOK_CONTROLE_SAIDA_LOJA deve conter a URL completa gerada na Stack
|
||||
curl -f -X POST "${{ secrets.PORTAINER_WEBHOOK_CONTROLE_SAIDA_LOJA }}"
|
||||
Loading…
Reference in New Issue