From a4704040461c9a19503d018a2909500fc38dc093 Mon Sep 17 00:00:00 2001 From: Alvar San Martin Date: Tue, 17 Mar 2026 15:42:01 +0100 Subject: [PATCH] Preparando despliegue --- deployment/develop/docker/Dockerfile | 24 +++++ deployment/develop/docker/docker-compose.yaml | 77 +++++++++++++++ deployment/develop/docker/entrypoint.sh | 3 + deployment/develop/docker/rebuild.sh | 9 ++ deployment/develop/jenkinsfile.groovy | 94 +++++++++++++++++++ deployment/develop/start.sh | 5 + 6 files changed, 212 insertions(+) create mode 100644 deployment/develop/docker/Dockerfile create mode 100644 deployment/develop/docker/docker-compose.yaml create mode 100644 deployment/develop/docker/entrypoint.sh create mode 100644 deployment/develop/docker/rebuild.sh create mode 100644 deployment/develop/jenkinsfile.groovy create mode 100644 deployment/develop/start.sh diff --git a/deployment/develop/docker/Dockerfile b/deployment/develop/docker/Dockerfile new file mode 100644 index 0000000..bc368f6 --- /dev/null +++ b/deployment/develop/docker/Dockerfile @@ -0,0 +1,24 @@ + +# Stage base para coordinar las fases de build y ejecucion +FROM node:22-alpine +# Hace falta para la herramienta de migraciones, cuando se publique se +# sustituira por el paquete de npm +WORKDIR /app + +COPY ./package.json ./package-lock.json ./ +COPY ./src ./src +# copia el codigo en general +COPY tsconfig.json ./ +COPY .env* ./ +COPY ./deployment/local/start.sh ./ + +# Copiar el archivo de migrations? porque ahora no creo que se estΓ© lanzando nada +COPY ./deployment/database/migrations ./deployment/database/migrations + +RUN npm config set @sf-alvar:registry https://git.savefamilygps.net/api/packages/SaveFamily/npm/ &&\ + npm install &&\ + ls && npm run build:esbuild &&\ + chmod +x start.sh + +EXPOSE ${PORT} +ENTRYPOINT [ "./start.sh" ] diff --git a/deployment/develop/docker/docker-compose.yaml b/deployment/develop/docker/docker-compose.yaml new file mode 100644 index 0000000..b44e801 --- /dev/null +++ b/deployment/develop/docker/docker-compose.yaml @@ -0,0 +1,77 @@ +name: sf-nfc-server +networks: + savefamily: + external: true + proxy: + external: true + internal: + driver: bridge + +services: + sf-nfc-api: + container_name: sf-nfc-server + image: sf-nfc-server + build: + context: ./ + dockerfile: deployment/local/docker/Dockerfile.local + args: + PORT: "${PORT:-3000}" + develop: + watch: + - path: ./src + action: sync + target: /usr/local/app/packages + - path: ./package.json + action: rebuild + ports: + - ${PORT}:${PORT} + networks: + - internal + - proxy + env_file: + - .env + restart: unless-stopped + healthcheck: + test: + [ + "CMD-SHELL", + 'node -e "fetch(''http://localhost:'' + (process.env.PORT || 3000) + ''/health'').then(r => { if (!r.ok) process.exit(1) }).catch(() => process.exit(1))"', + ] + interval: 10s + timeout: 5s + retries: 5 + start_period: 15s + depends_on: + postgresql-nfc: + condition: service_healthy + labels: + - "io.portainer.accesscontrol.teams=develop" + - "traefik.enable=true" + - "traefik.http.routers.sf-nfc-server.entrypoints=web" + - "traefik.http.routers.sf-nfc-server.rule=Host(`sf-nfc-server.savefamilygps.net`)" + - "traefik.http.middlewares.sf-nfc-server-https-redirect.redirectscheme.scheme=https" + - "traefik.http.routers.sf-nfc-server.middlewares=sf-nfc-server-https-redirect" + - "traefik.http.routers.sf-nfc-server-secure.entrypoints=websecure" + - "traefik.http.routers.sf-nfc-server-secure.rule=Host(`sf-nfc-server.savefamilygps.net`)" + - "traefik.http.routers.sf-nfc-server-secure.tls=true" + - "traefik.http.routers.sf-nfc-server-secure.service=sf-sims" + - "traefik.http.routers.sf-nfc-server-secure.tls.certresolver=myresolver" + - "traefik.http.services.sf-nfc-server.loadbalancer.server.port=${PORT}" + - "traefik.docker.network=proxy" + + postgresql-nfc: + container_name: postgresql-nfc + image: postgres:16.1 + env_file: + - .env + ports: + - "${POSTGRES_PORT}:5432" + volumes: + - ./sql-data/:/var/lib/postgres/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 5s + retries: 5 + start_period: 5s + timeout: 5s + command: -p 5432 diff --git a/deployment/develop/docker/entrypoint.sh b/deployment/develop/docker/entrypoint.sh new file mode 100644 index 0000000..9c7f4f5 --- /dev/null +++ b/deployment/develop/docker/entrypoint.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cd /home +cd /home/node/app && npm run build-start diff --git a/deployment/develop/docker/rebuild.sh b/deployment/develop/docker/rebuild.sh new file mode 100644 index 0000000..7ef4f7e --- /dev/null +++ b/deployment/develop/docker/rebuild.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +cd /mnt/docker-storage/containers/savefamily/sf-nfc-server + +docker stop sf-nfc-serve || true +docker rm sf-nfc-serve || true +docker rmi sf-nfc-serve || true + +docker compose -f docker-compose.yaml up --build -d sf-nfc-server diff --git a/deployment/develop/jenkinsfile.groovy b/deployment/develop/jenkinsfile.groovy new file mode 100644 index 0000000..677b012 --- /dev/null +++ b/deployment/develop/jenkinsfile.groovy @@ -0,0 +1,94 @@ +#!/usr/bin/env groovy + +String BASE_REMOTE_PATH = "//home/devops" +String APP_REMOTE_PATH = "//mnt/docker-storage/containers/savefamily/sf-nfc-server" + +pipeline { + agent any + tools { nodejs "22.15.0" } + + environment { + GENERAL_CHANGES = "false" + } + + stages { + stage('πŸ“¦ Install dependencies') { + steps { + sh 'npm install' + } + } + stage("🧱 Building") { + steps { + sh 'npm run build:esbuild' + } + } + stage("πŸ— Deploying") { + steps { + sshPublisher( + publishers: [ + sshPublisherDesc( + verbose: true, + configName: "Save Family", + transfers: [ + sshTransfer( + cleanRemote: false, + execCommand: "mkdir -p $APP_REMOTE_PATH" + ), + sshTransfer( + cleanRemote: false, + execCommand: "ln -sf $BASE_REMOTE_PATH/vault/savefamily/sf-nfc-server/.env $APP_REMOTE_PATH/.env" + ), + sshTransfer( + cleanRemote: false, + remoteDirectory: "$APP_REMOTE_PATH", + sourceFiles: "dist/**/*", + excludes: "dist/**/node_modules/**" + ), + sshTransfer( + cleanRemote: false, + remoteDirectory: "$APP_REMOTE_PATH", + sourceFiles: "docs/**/*", + ), + sshTransfer( + cleanRemote: false, + remoteDirectory: "$APP_REMOTE_PATH", + sourceFiles: "deployment/database/**/*", + removePrefix: "deployment", + ), + sshTransfer( + cleanRemote: false, + remoteDirectory: "$APP_REMOTE_PATH", + sourceFiles: "deployment/develop/docker/**/*", + removePrefix: "deployment/develop/docker", + ), + sshTransfer( + cleanRemote: false, + remoteDirectory: "$APP_REMOTE_PATH", + sourceFiles: "package.json", + ), + sshTransfer( + cleanRemote: false, + remoteDirectory: "$APP_REMOTE_PATH", + sourceFiles: "package-lock.json", + ), + sshTransfer( + cleanRemote: false, + execCommand: "sh $APP_REMOTE_PATH/rebuild.sh" + ) + ] + ) + ] + ) + } + } + } + + post { + failure { + echo 'πŸ‘ŽπŸΌ Processing failed' + } + success { + echo 'πŸ‘πŸΌ Processing success' + } + } +} diff --git a/deployment/develop/start.sh b/deployment/develop/start.sh new file mode 100644 index 0000000..c2440d3 --- /dev/null +++ b/deployment/develop/start.sh @@ -0,0 +1,5 @@ +#!/bin/sh +echo "Lanzando migraciones e iniciando servidor" +npm run migrate +npm run build:esbuild +npm run start