Merge branch 'main' into seguimiento-tareas

This commit is contained in:
2026-02-13 10:57:54 +01:00
26 changed files with 540 additions and 40 deletions

View File

@@ -0,0 +1,22 @@
# --- Release image ---
FROM node:22-alpine AS release
WORKDIR /home/node/app
RUN corepack enable
COPY ./dist/packages ./packages
COPY ./package.json ./
# Force node-modules linker (no .yarnrc.yml in build context)
RUN echo 'nodeLinker: node-modules' > .yarnrc.yml
RUN yarn install
RUN mkdir -p dist && ln -sf ../packages dist/packages
COPY ./entrypoint.sh ./
RUN chmod +x entrypoint.sh
EXPOSE ${PORT:-3000}
ENTRYPOINT ["./entrypoint.sh"]

View File

@@ -0,0 +1,102 @@
name: sim-eventos
networks:
savefamily:
external: true
proxy:
external: true
internal:
driver: bridge
services:
rabbitmq-sim-broker:
container_name: rabbitmq-sim-broker
image: "rabbitmq:4.2.2-management"
expose:
- 5672
- 15672
env_file:
- ./.env
restart: unless-stopped
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
interval: 10s
timeout: 5s
retries: 5
environment:
RABBITMQ_USER: ${RABBITMQ_USER}
RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD}
entrypoint: ["bash", "/usr/local/bin/docker-entrypoint-wrapper.sh"]
command: ["rabbitmq-server"]
volumes:
- ./rabbit/docker-entrypoint-wrapper.sh:/usr/local/bin/docker-entrypoint-wrapper.sh:ro
- ./rabbitmq_plugins/enabled_plugins:/etc/rabbitmq/enabled_plugins:ro
- ./rabbit/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
- ./rabbit/definitions.json:/etc/rabbitmq/definitions.template.json:ro
networks:
- internal
- proxy
labels:
- "io.portainer.accesscontrol.teams=develop"
- "traefik.enable=true"
- "traefik.http.routers.sf-sims-rabbitmq.entrypoints=web"
- "traefik.http.routers.sf-sims-rabbitmq.rule=Host(`sf-sims-rabbitmq.savefamilygps.net`)"
- "traefik.http.middlewares.sf-sims-rabbitmq-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.sf-sims-rabbitmq.middlewares=sf-sims-rabbitmq-https-redirect"
- "traefik.http.routers.sf-sims-rabbitmq-secure.entrypoints=websecure"
- "traefik.http.routers.sf-sims-rabbitmq-secure.rule=Host(`sf-sims-rabbitmq.savefamilygps.net`)"
- "traefik.http.routers.sf-sims-rabbitmq-secure.tls=true"
- "traefik.http.routers.sf-sims-rabbitmq-secure.service=sf-sims-rabbitmq"
- "traefik.http.routers.sf-sims-rabbitmq-secure.tls.certresolver=myresolver"
- "traefik.http.services.sf-sims-rabbitmq.loadbalancer.server.port=15672"
- "traefik.docker.network=proxy"
sf-sims-api:
container_name: sf-sims-api
build:
context: .
dockerfile: Dockerfile
args:
PORT: ${PORT:-3000}
image: sf-sims-api
env_file:
- ./.env
restart: unless-stopped
depends_on:
rabbitmq-sim-broker:
condition: service_healthy
networks:
- savefamily
- proxy
- internal
expose:
- ${PORT}
volumes:
- ./.env:/home/node/app/.env:ro
- ./sim-consumidor-objenious.env:/home/node/app/packages/sim-consumidor-objenious/.env:ro
- ./sim-objenious-cron.env:/home/node/app/packages/sim-objenious-cron/.env:ro
- ./obj.pem:/home/node/app/packages/sim-consumidor-objenious/obj.pem:ro
- ./obj.pem:/home/node/app/packages/sim-objenious-cron/obj.pem:ro
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
labels:
- "io.portainer.accesscontrol.teams=develop"
- "traefik.enable=true"
- "traefik.http.routers.sf-sims.entrypoints=web"
- "traefik.http.routers.sf-sims.rule=Host(`sf-sims.savefamilygps.net`)"
- "traefik.http.middlewares.sf-sims-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.sf-sims.middlewares=sf-sims-https-redirect"
- "traefik.http.routers.sf-sims-secure.entrypoints=websecure"
- "traefik.http.routers.sf-sims-secure.rule=Host(`sf-sims.savefamilygps.net`)"
- "traefik.http.routers.sf-sims-secure.tls=true"
- "traefik.http.routers.sf-sims-secure.service=sf-sims"
- "traefik.http.routers.sf-sims-secure.tls.certresolver=myresolver"
- "traefik.http.services.sf-sims.loadbalancer.server.port=${PORT}"
- "traefik.docker.network=proxy"

View File

@@ -0,0 +1,4 @@
#!/bin/sh
cd /home
cd /home/node/app && yarn start

View File

@@ -0,0 +1,9 @@
#!/bin/bash
cd /mnt/docker-storage/containers/savefamily/sf-sims
docker stop sf-sims-api || true
docker rm sf-sims-api || true
docker rmi sf-sims-api || true
docker compose -f docker-compose.yaml up --build -d sf-sims-api

View File

@@ -0,0 +1,111 @@
#!/usr/bin/env groovy
String BASE_REMOTE_PATH = "//home/devops"
String APP_REMOTE_PATH = "//mnt/docker-storage/containers/savefamily/sf-sims"
pipeline {
agent any
tools { nodejs "22.15.0" }
environment {
GENERAL_CHANGES = "false"
}
stages {
stage('📦 Install dependencies') {
steps {
sh 'npm install -g yarn'
sh 'corepack enable'
sh 'corepack prepare yarn@4.12.0 --activate'
sh 'yarn install --immutable'
}
}
stage("🧱 Building") {
steps {
sh 'rm -rf dist/'
sh 'yarn run build'
}
}
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-sims/.env $APP_REMOTE_PATH/.env"
),
sshTransfer(
cleanRemote: false,
execCommand: "ln -sf $BASE_REMOTE_PATH/vault/savefamily/sf-sims/sim-consumidor-objenious.env $APP_REMOTE_PATH/sim-consumidor-objenious.env"
),
sshTransfer(
cleanRemote: false,
execCommand: "ln -sf $BASE_REMOTE_PATH/vault/savefamily/sf-sims/sim-objenious-cron.env $APP_REMOTE_PATH/sim-objenious-cron.env"
),
sshTransfer(
cleanRemote: false,
execCommand: "ln -sf $BASE_REMOTE_PATH/vault/savefamily/sf-sims/obj.pem $APP_REMOTE_PATH/obj.pem"
),
sshTransfer(
cleanRemote: false,
remoteDirectory: "$APP_REMOTE_PATH",
sourceFiles: "dist/**/*",
excludes: "dist/**/node_modules/**"
),
sshTransfer(
cleanRemote: false,
remoteDirectory: "$APP_REMOTE_PATH",
sourceFiles: "deployment/database/**/*",
removePrefix: "deployment",
),
sshTransfer(
cleanRemote: false,
remoteDirectory: "$APP_REMOTE_PATH",
sourceFiles: "deployment/develop/rabbit/**/*",
removePrefix: "deployment/develop",
),
sshTransfer(
cleanRemote: false,
remoteDirectory: "$APP_REMOTE_PATH",
sourceFiles: "rabbitmq_plugins/**/*"
),
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,
execCommand: "sh $APP_REMOTE_PATH/rebuild.sh"
)
]
)
]
)
}
}
}
post {
failure {
echo '👎🏼 Processing failed'
}
success {
echo '👍🏼 Processing success'
}
}
}

View File

@@ -0,0 +1,90 @@
{
"rabbit_version": "4.2.2",
"rabbitmq_version": "4.2.2",
"product_name": "RabbitMQ",
"product_version": "4.2.2",
"users": [
{
"name": "RABBITMQ_USER_PLACEHOLDER",
"password": "RABBITMQ_PASSWORD_PLACEHOLDER",
"tags": ["administrator"]
}
],
"vhosts": [
{
"name": "sim-vhost"
}
],
"permissions": [
{
"user": "RABBITMQ_USER_PLACEHOLDER",
"vhost": "sim-vhost",
"configure": ".*",
"write": ".*",
"read": ".*"
}
],
"topic_permissions": [],
"parameters": [],
"global_parameters": [
{
"name": "cluster_name",
"value": "rabbit@a8d5c6e08439"
},
{
"name": "internal_cluster_id",
"value": "rabbitmq-cluster-id-gXeBLbsUC2W2tU0Bx_QY_w"
}
],
"policies": [
{
"vhost": "sim-vhost",
"name": "pol.sim.dlx",
"pattern": "sim.*",
"apply-to": "queues",
"definition": {
"dead-letter-exchange": "sim.dlx"
},
"priority": 7
}
],
"exchanges": [
{
"name": "sim.exchange",
"vhost": "sim-vhost",
"type": "topic",
"durable": true,
"auto_delete": false,
"internal": false,
"argurments": {}
},
{
"name": "sim.dlx",
"vhost": "sim-vhost",
"type": "topic",
"durable": true,
"auto_delete": false,
"internal": false,
"argurments": {}
}
],
"queues": [
{
"name": "sim.logs",
"vhost": "sim-vhost",
"durable": true,
"auto_delete": false,
"arguments": {}
}
],
"bindings": [
{
"source": "sim.exchange",
"vhost": "sim-vhost",
"destination": "sim.logs",
"destination_type": "queue",
"routing_key": "sim.#",
"arguments": {}
}
]
}

View File

@@ -0,0 +1,12 @@
#!/bin/bash
set -eu
# Substitute env vars into definitions template before RabbitMQ starts.
# RabbitMQ 4.x skips default user creation when definitions.json is loaded,
# so the user must be defined in the JSON itself.
sed \
-e "s|RABBITMQ_USER_PLACEHOLDER|${RABBITMQ_USER}|g" \
-e "s|RABBITMQ_PASSWORD_PLACEHOLDER|${RABBITMQ_PASSWORD}|g" \
/etc/rabbitmq/definitions.template.json > /etc/rabbitmq/definitions.json
exec docker-entrypoint.sh "$@"

View File

@@ -0,0 +1,4 @@
management.load_definitions = /etc/rabbitmq/definitions.json
default_vhost = sim-vhost
default_queue_type = quorum