Scripts para puesta en producción para Rodax

This commit is contained in:
David Arranz 2025-12-15 19:00:34 +01:00
parent 7cf071035b
commit 401292539b
6 changed files with 269 additions and 0 deletions

View File

@ -0,0 +1,192 @@
name: factuges-rodax
services:
# --- Base de datos MariaDB ---
db:
image: mariadb:lts-noble
container_name: factuges_rodax_db
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASS}
MARIADB_USER: ${DB_USER}
MARIADB_PASSWORD: ${DB_PASS}
MARIADB_DATABASE: ${DB_NAME}
volumes:
- ./volumes/db_data:/var/lib/mysql
networks:
- internal
- edge
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 20s
timeout: 5s
retries: 10
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: factuges_rodax_phpmyadmin
restart: unless-stopped
environment:
PMA_ARBITRARY: 1
PMA_ABSOLUTE_URI: https://factuges.rodax-software.local/phpmyadmin/
PMA_HOST: db
PMA_USER: ${DB_USER}
PMA_PASSWORD: ${DB_PASS}
PMA_VERBOSES: "FactuGES Rodax"
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
UPLOAD_LIMIT: 64M
depends_on:
db:
condition: service_healthy
networks:
- internal
- edge
ports:
- "8080:8080"
labels:
traefik.enable: "true"
# /phpmyadmin → phpMyAdmin
traefik.http.routers.factuges_rodax_phpmyadmin.rule: "Host(`factuges.rodax-software.local`) && PathPrefix(`/phpmyadmin/`)"
traefik.http.routers.factuges_rodax_phpmyadmin.entrypoints: "websecure"
traefik.http.routers.factuges_rodax_phpmyadmin.tls: "true"
traefik.http.routers.factuges_rodax_phpmyadmin.priority: "110"
traefik.http.routers.factuges_rodax_phpmyadmin.service: "factuges_rodax_phpmyadmin"
traefik.http.services.factuges_rodax_phpmyadmin.loadbalancer.server.port: "80"
# strip /phpmyadmin del path antes de llegar al contenedor
traefik.http.middlewares.factuges_rodax_phpmyadmin_strip.stripprefix.prefixes: "/phpmyadmin/"
# whitelist a tu IP
#traefik.http.middlewares.factuges_rodax_phpmyadmin_ipwhitelist.ipwhitelist.sourcerange: "192.168.0.0/24"
# encadenar middlewares
traefik.http.routers.factuges_rodax_phpmyadmin.middlewares: "factuges_rodax_phpmyadmin_strip"
# --- API (imagen versionada generada por build-api.sh) ---
api:
image: ${API_IMAGE}
container_name: factuges_rodax_api
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
NODE_ENV: production
COMPANY: rodax
PORT: ${SERVER_PORT:-3002}
DB_DIALECT: "mysql"
DB_HOST: "db"
DB_PORT: ${DB_PORT}
DB_NAME: ${DB_NAME}
DB_USER: ${DB_USER}
DB_PASS: ${DB_PASS}
FRONTEND_URL: ${FRONTEND_URL}
TEMPLATES_PATH: ${TEMPLATES_PATH}
volumes:
- ./templates:/repo/apps/server/templates:ro
networks:
- internal
- edge
labels:
traefik.enable: "true"
# /api → backend
traefik.http.routers.factuges_rodax_api.rule: "Host(`factuges.rodax-software.local`) && PathPrefix(`/api`)"
traefik.http.routers.factuges_rodax_api.entrypoints: "websecure"
traefik.http.routers.factuges_rodax_api.tls: "true"
traefik.http.routers.factuges_rodax_api.priority: "100"
traefik.http.routers.factuges_rodax_api.service: "factuges_rodax_api"
# Servicio
traefik.http.services.factuges_rodax_api.loadbalancer.server.port: "${API_PORT:-3002}"
# --- Web estática (React compilado) ---
web:
image: nginx:alpine
container_name: factuges_rodax_web
restart: unless-stopped
depends_on:
- api
environment:
VITE_API_SERVER_URL: https://factuges.rodax-software.local/api/v1
volumes:
# Build de Vite (en el host) -> Nginx
- ./web/latest/dist:/usr/share/nginx/html:ro
# Config de Nginx con try_files para SPA
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
networks:
- edge
labels:
traefik.enable: "true"
# Router HTTPS
traefik.http.routers.factuges_rodax_web.rule: "Host(`factuges.rodax-software.local`)"
traefik.http.routers.factuges_rodax_web.entrypoints: "websecure"
traefik.http.routers.factuges_rodax_web.tls: "true"
# Servicio
traefik.http.services.factuges_rodax_web.loadbalancer.server.port: "80"
factuges_sync:
image: "factuges-sync:rodax-latest"
container_name: "factuges_rodax_sync"
restart: "no"
environment:
ENV: "production"
LOCAL_TZ: "Europe/Madrid"
STATE_PATH: "${STATE_PATH}"
FACTUGES_HOST: "${FACTUGES_HOST}"
FACTUGES_PORT: "${FACTUGES_PORT}"
FACTUGES_DATABASE: "${FACTUGES_DATABASE}"
FACTUGES_USER: "${FACTUGES_USER}"
FACTUGES_PASSWORD: "${FACTUGES_PASSWORD}"
FWEB_MYSQL_HOST: "db"
FWEB_MYSQL_PORT: "${DB_PORT}"
FWEB_MYSQL_DATABASE: "${DB_NAME}"
FWEB_MYSQL_USER: "${DB_USER}"
FWEB_MYSQL_PASSWORD: "${DB_PASS}"
CTE_COMPANY_ID: "${CTE_COMPANY_ID}"
CTE_SERIE: "${CTE_SERIE}"
CTE_STATUS_INVOICE: "${CTE_STATUS_INVOICE}"
CTE_IS_PROFORMA: "${CTE_IS_PROFORMA}"
CTE_STATUS_VERIFACTU: "${CTE_STATUS_VERIFACTU}"
CTE_LANGUAGE_CODE: "${CTE_LANGUAGE_CODE}"
CTE_COUNTRY_CODE: "${CTE_COUNTRY_CODE}"
CTE_IS_COMPANY: "${CTE_IS_COMPANY}"
CTE_SYNC_RESULT_OK: "${CTE_SYNC_RESULT_OK}"
CTE_SYNC_RESULT_FAIL: "${CTE_SYNC_RESULT_FAIL}"
VERIFACTU_API_KEY: "${VERIFACTU_API_KEY}"
VERIFACTU_BASE_URL: "${VERIFACTU_BASE_URL}"
VERIFACTU_NIFS_API_KEY: "${VERIFACTU_NIFS_API_KEY}"
depends_on:
db:
condition: service_healthy
networks:
- internal
- edge
volumes:
- ./volumes/db_sync:/app/rodax
networks:
edge:
name: edge
external: true
internal:
name: factuges_rodax_internal
external: false
volumes:
# Solo declarativo; usamos ruta ./volumes/db_data arriba
db_data:

View File

View File

@ -0,0 +1,16 @@
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /assets/ {
expires 1h;
add_header Cache-Control "public, immutable";
}
}

View File

@ -0,0 +1,7 @@
tls:
stores:
default:
defaultCertificate:
certFile: "/etc/traefik/certs/factuges-local.crt"
keyFile: "/etc/traefik/certs/factuges-local.key"

View File

@ -0,0 +1,16 @@
http:
middlewares:
dashboard-auth:
basicAuth:
users:
- "admin:$apr1$cfPd6Z11$bS8dOI/CxBOAmg3e5jIGJ/"
routers:
dashboard:
rule: "Host(`traefik.factuges.rodax-software.local`)"
entryPoints:
- websecure
service: api@internal
middlewares:
- dashboard-auth
tls: {}

View File

@ -0,0 +1,38 @@
global:
checkNewVersion: false
sendAnonymousUsage: false
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
api:
dashboard: true
insecure: false
providers:
file:
directory: "/etc/traefik/dynamic"
watch: true
docker:
endpoint: "unix:///var/run/docker.sock"
watch: true
exposedByDefault: false
#useBindPortIP: true
log:
level: INFO
format: json
filePath: "/var/log/traefik/traefik.log"
accessLog: {}