feat: add Gitea CI/CD workflows for Docker and direct Next.js deployment, Renovate, Dockerfile, docker-compose, and .dockerignore.
Deploy Next.js with Docker / build-and-deploy (push) Failing after 2m22s Details
Deploy Next.js Application / build-and-deploy (push) Failing after 6m19s Details

This commit is contained in:
JuruSysadmin 2026-01-07 14:04:13 -03:00
parent 1d392464e4
commit 3684e64d7f
6 changed files with 269 additions and 9 deletions

52
.dockerignore Normal file
View File

@ -0,0 +1,52 @@
# Dependencies
node_modules
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Next.js
.next
out
dist
# Testing
coverage
.nyc_output
# Misc
.DS_Store
*.pem
# Debug
*.log
# Local env files
.env*.local
.env
# Vercel
.vercel
# Git
.git
.gitignore
.gitattributes
# IDE
.vscode
.idea
*.swp
*.swo
*~
# CI/CD
.github
.gitea
# Documentation
README.md
*.md
# Config files
renovate.json
config.js

View File

@ -0,0 +1,50 @@
name: Deploy Next.js with Docker
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Container Registry
uses: docker/login-action@v3
with:
registry: ${{ secrets.REGISTRY_URL }}
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile.production
push: true
tags: |
${{ secrets.REGISTRY_URL }}/portal-dias-rota:latest
${{ secrets.REGISTRY_URL }}/portal-dias-rota:${{ github.sha }}
cache-from: type=registry,ref=${{ secrets.REGISTRY_URL }}/portal-dias-rota:buildcache
cache-to: type=registry,ref=${{ secrets.REGISTRY_URL }}/portal-dias-rota:buildcache,mode=max
- name: Deploy to server
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_SSH_KEY }}
port: ${{ secrets.DEPLOY_PORT || 22 }}
script: |
cd ${{ secrets.DEPLOY_PATH }}
docker pull ${{ secrets.REGISTRY_URL }}/portal-dias-rota:latest
docker-compose down
docker-compose up -d
docker image prune -f

View File

@ -0,0 +1,58 @@
name: Deploy Next.js Application
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build Next.js application
run: npm run build
env:
ORACLE_USER: ${{ secrets.ORACLE_USER }}
ORACLE_PASSWORD: ${{ secrets.ORACLE_PASSWORD }}
ORACLE_CONNECTION_STRING: ${{ secrets.ORACLE_CONNECTION_STRING }}
ORACLE_POOL_MIN: ${{ secrets.ORACLE_POOL_MIN }}
ORACLE_POOL_MAX: ${{ secrets.ORACLE_POOL_MAX }}
ORACLE_POOL_INCREMENT: ${{ secrets.ORACLE_POOL_INCREMENT }}
ORACLE_QUEUE_TIMEOUT: ${{ secrets.ORACLE_QUEUE_TIMEOUT }}
ORACLE_INACTIVITY_TIMEOUT: ${{ secrets.ORACLE_INACTIVITY_TIMEOUT }}
- name: Deploy to production server
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_SSH_KEY }}
port: ${{ secrets.DEPLOY_PORT || 22 }}
source: ".next,package.json,package-lock.json,public,src,.env.production"
target: ${{ secrets.DEPLOY_PATH }}
strip_components: 0
- name: Restart application
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_SSH_KEY }}
port: ${{ secrets.DEPLOY_PORT || 22 }}
script: |
cd ${{ secrets.DEPLOY_PATH }}
npm ci --production
pm2 restart portal-dias-rota || pm2 start npm --name "portal-dias-rota" -- start

View File

@ -1,21 +1,15 @@
name: Renovate Bot
name: Renovate Manual
on:
schedule:
- cron: '0 6 * * *'
workflow_dispatch:
workflow_dispatch:
jobs:
renovate:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Self-hosted Renovate
uses: docker://renovate/renovate:latest
env:
RENOVATE_PLATFORM: 'gitea'
RENOVATE_ENDPOINT: 'http://git.jurunense.com/api/v1'
RENOVATE_TOKEN: ${{ secrets.RENOVATE_TOKEN }}
RENOVATE_AUTODISCOVER: 'true'
RENOVATE_REQUIRE_CONFIG: 'required'
RENOVATE_AUTODISCOVER: 'true'

75
Dockerfile Normal file
View File

@ -0,0 +1,75 @@
# Etapa 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
# Instalar dependências necessárias para Oracle Instant Client
RUN apk add --no-cache libaio libnsl libc6-compat curl unzip
# Baixar e instalar Oracle Instant Client
RUN mkdir -p /opt/oracle && \
cd /opt/oracle && \
curl -o instantclient-basiclite.zip https://download.oracle.com/otn_software/linux/instantclient/2340000/instantclient-basiclite-linux.x64-23.4.0.24.05.zip && \
unzip instantclient-basiclite.zip && \
rm -f instantclient-basiclite.zip && \
cd instantclient_23_4 && \
rm -f *jdbc* *occi* *mysql* *jar uidrvci genezi adrci && \
echo /opt/oracle/instantclient_23_4 > /etc/ld.so.conf.d/oracle-instantclient.conf && \
ldconfig
# Configurar variáveis de ambiente do Oracle
ENV LD_LIBRARY_PATH=/opt/oracle/instantclient_23_4:$LD_LIBRARY_PATH
# Copiar arquivos de dependências
COPY package*.json ./
# Instalar dependências
RUN npm ci
# Copiar código fonte
COPY . .
# Build da aplicação Next.js
RUN npm run build
# Etapa 2: Runtime
FROM node:20-alpine AS runner
WORKDIR /app
# Instalar dependências necessárias para Oracle Instant Client
RUN apk add --no-cache libaio libnsl libc6-compat
# Copiar Oracle Instant Client do builder
COPY --from=builder /opt/oracle/instantclient_23_4 /opt/oracle/instantclient_23_4
# Configurar LD_LIBRARY_PATH
RUN echo /opt/oracle/instantclient_23_4 > /etc/ld.so.conf.d/oracle-instantclient.conf && \
ldconfig
ENV LD_LIBRARY_PATH=/opt/oracle/instantclient_23_4:$LD_LIBRARY_PATH
# Criar usuário não-root
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
# Copiar arquivos necessários do builder
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
# Definir permissões
RUN chown -R nextjs:nodejs /app
# Mudar para usuário não-root
USER nextjs
# Expor porta
EXPOSE 3003
# Variáveis de ambiente
ENV NODE_ENV=production
ENV PORT=3003
# Comando de inicialização
CMD ["node", "server.js"]

31
docker-compose.yml Normal file
View File

@ -0,0 +1,31 @@
version: '3.8'
services:
portal-dias-rota:
image: ${REGISTRY_URL}/portal-dias-rota:latest
container_name: portal-dias-rota
restart: unless-stopped
ports:
- "3003:3003"
environment:
- NODE_ENV=production
- ORACLE_USER=${ORACLE_USER}
- ORACLE_PASSWORD=${ORACLE_PASSWORD}
- ORACLE_CONNECTION_STRING=${ORACLE_CONNECTION_STRING}
- ORACLE_POOL_MIN=${ORACLE_POOL_MIN:-1}
- ORACLE_POOL_MAX=${ORACLE_POOL_MAX:-30}
- ORACLE_POOL_INCREMENT=${ORACLE_POOL_INCREMENT:-1}
- ORACLE_QUEUE_TIMEOUT=${ORACLE_QUEUE_TIMEOUT:-60000}
- ORACLE_INACTIVITY_TIMEOUT=${ORACLE_INACTIVITY_TIMEOUT:-20000}
networks:
- portal-network
healthcheck:
test: [ "CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3003" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
portal-network:
driver: bridge