Merge branch 'main' into seguimiento-tareas
This commit is contained in:
22
deployment/develop/docker/Dockerfile
Normal file
22
deployment/develop/docker/Dockerfile
Normal 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"]
|
||||
102
deployment/develop/docker/docker-compose.yaml
Normal file
102
deployment/develop/docker/docker-compose.yaml
Normal 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"
|
||||
4
deployment/develop/docker/entrypoint.sh
Normal file
4
deployment/develop/docker/entrypoint.sh
Normal file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
cd /home
|
||||
|
||||
cd /home/node/app && yarn start
|
||||
9
deployment/develop/docker/rebuild.sh
Normal file
9
deployment/develop/docker/rebuild.sh
Normal 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
|
||||
111
deployment/develop/jenkinsfile.groovy
Normal file
111
deployment/develop/jenkinsfile.groovy
Normal 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'
|
||||
}
|
||||
}
|
||||
}
|
||||
90
deployment/develop/rabbit/definitions.json
Normal file
90
deployment/develop/rabbit/definitions.json
Normal 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": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
12
deployment/develop/rabbit/docker-entrypoint-wrapper.sh
Executable file
12
deployment/develop/rabbit/docker-entrypoint-wrapper.sh
Executable 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 "$@"
|
||||
4
deployment/develop/rabbit/rabbitmq.conf
Normal file
4
deployment/develop/rabbit/rabbitmq.conf
Normal file
@@ -0,0 +1,4 @@
|
||||
management.load_definitions = /etc/rabbitmq/definitions.json
|
||||
|
||||
default_vhost = sim-vhost
|
||||
default_queue_type = quorum
|
||||
Reference in New Issue
Block a user