Template del servicio de SIM

This commit is contained in:
2026-01-08 13:36:52 +01:00
parent a49469cd9e
commit 68631ff18f
33 changed files with 5138 additions and 1 deletions

19
deployment/Dockerfile.dev Normal file
View File

@@ -0,0 +1,19 @@
# stage base para coordinar las fases de build y ejecucion
FROM node:22-alpine AS base
WORKDIR /usr/local/app
COPY ./package.json ./yarn.lock ./
RUN corepack enable && \
corepack prepare yarn@4.12.0 --activate
# compilacion del ts -> js
FROM base AS backend
WORKDIR /usr/local/app
EXPOSE ${PORT}
COPY package*.json ./
# copia el codigo en general
COPY .tsconfig*.json ./
COPY ./packages ./packages
RUN yarn && cat package.json
CMD ["yarn", "run", "dev"]

View File

@@ -0,0 +1,31 @@
CREATE TABLE sim_job_queue (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
job_type TEXT NOT NULL,
sim_id INT, -- NOT NULL???
payload JSONB NOT NULL,
status TEXT NOT NULL DEFAULT "pending", -- pasar a enum
priority SMALLINT NOT NULL DEFAULT 100, -- trabajamos entre 200 y 0 para 0 la maxima prioridad
retry_count INT NOT NULL DEFAULT 0,
max_retries INT NOT NULL DEFAULT 3, -- lo definiria en runtime
scheduled_for TIMESTAMP NOT NULL DEFAULT now(),
created_at TIMESTAMP NOT NULL DEFAULT now(),
started_at TIMESTAMP,
completed_at TIMESTAMP,
error_msg TEXT,
-- En teoria el check es mas flexible que el enum
CONSTRAINT valid_status CHECK (
status IN ('pending', 'processing', 'completed', 'failed', 'dead')
)
-- Revisar si interesa asociar cada trabajo a un id o permitir que sean independientes
CONSTRAINT fk_sim_id
FOREIGN KEY(sim_id) REFERENCES tableName(tarjetas_sim)
)
-- Indice de pendientes de consumir
CREATE INDEX idx_job_fetch ON sim_job_queue (status, scheduled_for, priority DESC, created_at)
WHERE status = 'pending';
-- Indice del resto de procesos
CREATE INDEX idx_job_monitor ON sim_job_queue (job_type, status, created_at);

View File

@@ -0,0 +1,65 @@
name: sim-eventos
networks:
default:
name: network-test # Tiene que coincidir con el compose objetivo
services:
rabbitmq:
container_name: rabbitmq-broker
image: "rabbitmq:4.2.2-management"
ports:
- "5672:5672"
- "15672:15672"
env_file:
- .env
restart: unless-stopped
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
interval: 30s
timeout: 10s
retries: 5
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}
volumes:
- ./rabbitmq_plugins/enabled_plugins:/etc/rabbitmq/enabled_plugins:ro
- ./deployment/rabbit/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
- ./deployment/rabbit/definitions.json:/etc/rabbitmq/definitions.json:ro
sim-gateway:
container_name: sim-gateway
volumes:
- ./:/usr/local/app
- ./node_modules:/usr/local/node_modules
build:
context: ./
dockerfile: deployment/Dockerfile.dev
args:
PORT: "${PORT:-3000}"
develop:
watch:
- path: ./src
action: sync
target: /usr/local/app/src
- path: ./package.json
action: rebuild
ports:
- ${PORT}:${PORT}
env_file:
- .env
restart: unless-stopped
postgresql-sim:
image: postgres:16.1
env_file:
- .env
ports:
- "5432:${DEV_POSTGRES_PORT}"
volumes:
- ./sql-data/:/var/lib/postgres/data
- ./deployment/database/test.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
retries: 5
start_period: 30s
timeout: 10s

View File

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

View File

@@ -0,0 +1,71 @@
{
"rabbit_version": "4.2.2",
"rabbitmq_version": "4.2.2",
"product_name": "RabbitMQ",
"product_version": "4.2.2",
"users": [
{
"name": "guest",
"password": "guest",
"hashing_algorithm": "rabbit_password_hashing_sha256",
"tags": "administrator"
}
],
"vhosts": [
{
"name": "sim-vhost"
}
],
"permissions": [
{
"user": "guest",
"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": [],
"exchanges": [
{
"name": "sim.exchange",
"vhost": "sim-vhost",
"type": "direct",
"durable": true,
"auto_delete": false,
"internal": false,
"argurments": {}
}
],
"queues": [
{
"name": "sim.queue",
"vhost": "sim-vhost",
"durable": true,
"auto_delete": false,
"arguments": {}
}
],
"bindings": [
{
"source": "sim.exchange",
"vhost": "sim-vhost",
"destination": "sim.queue",
"destination_type": "queue",
"routing_key": "sim.*",
"arguments": {}
}
]
}

View File

@@ -0,0 +1,11 @@
default_user = guest
default_pass = guest
listeners.tcp.default = 5672
management.tcp.port = 15672
management.load_definitions = /etc/rabbitmq/definitions.json
default_queue_type = quorum