diff --git a/scripts/docker-compose.acana.yml b/scripts/docker-compose.acana.yml new file mode 100644 index 00000000..a9ad237f --- /dev/null +++ b/scripts/docker-compose.acana.yml @@ -0,0 +1,130 @@ +services: + # --- Base de datos MariaDB --- + db: + image: mariadb:lts-noble + container_name: factuges_acana_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 + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + interval: 20s + timeout: 5s + retries: 10 + + # --- phpMyAdmin (solo accesible por Traefik + whitelist IP) --- + phpmyadmin: + image: phpmyadmin/phpmyadmin + container_name: factuges_acana_phpmyadmin + restart: unless-stopped + environment: + PMA_HOST: db + PMA_USER: ${DB_USER} + PMA_PASSWORD: ${DB_PASS} + PMA_VERBOSES: "FactuGES Acana" + MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS} + UPLOAD_LIMIT: 64M + depends_on: + - db + networks: + - internal + - edge + labels: + traefik.enable: "true" + # /phpmyadmin → phpMyAdmin + traefik.http.routers.factuges_acana_phpmyadmin.rule: Host(`${DOMAIN}`) && PathPrefix(`/phpmyadmin`) + traefik.http.routers.factuges_acana_phpmyadmin.entrypoints: websecure + traefik.http.routers.factuges_acana_phpmyadmin.tls.certresolver: cloudflare-dns + traefik.http.routers.factuges_acana_phpmyadmin.priority: "110" + traefik.http.routers.factuges_acana_phpmyadmin.service: factuges_acana_phpmyadmin + traefik.http.services.factuges_acana_phpmyadmin.loadbalancer.server.port: "80" + + # strip /phpmyadmin del path antes de llegar al contenedor + traefik.http.middlewares.factuges_acana_phpmyadmin_strip.stripprefix.prefixes: "/phpmyadmin" + + # whitelist a tu IP + traefik.http.middlewares.factuges_acana_phpmyadmin_ipwhitelist.ipwhitelist.sourcerange: "79.116.183.41/32" + + # encadenar middlewares + traefik.http.routers.factuges_acana_phpmyadmin.middlewares: "factuges_acana_phpmyadmin_strip,factuges_acana_phpmyadmin_ipwhitelist" + + # --- API Node.js --- + api: + image: factuges-server:acana-latest #${API_IMAGE} + container_name: factuges_acana_api + restart: unless-stopped + depends_on: + db: + condition: service_healthy + environment: + NODE_ENV: production + COMPANY: acana + PORT: ${API_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} + networks: + - internal + - edge + labels: + traefik.enable: "true" + # /api → backend + traefik.http.routers.factuges_acana_api.rule: Host(`${DOMAIN}`) && PathPrefix(`/api`) + traefik.http.routers.factuges_acana_api.entrypoints: websecure + traefik.http.routers.factuges_acana_api.tls.certresolver: cloudflare-dns + + traefik.http.routers.factuges_acana_api.priority: "100" + traefik.http.routers.factuges_acana_api.service: factuges_acana_api + + # Servicio + traefik.http.services.factuges_acana_api.loadbalancer.server.port: "${API_PORT:-3002}" + + # --- Web estática Vite (nginx) --- + web: + image: nginx:alpine + container_name: factuges_acana_web + restart: unless-stopped + depends_on: + - api + environment: + VITE_API_SERVER_URL: ${DOMAIN}/api + volumes: + - ./web/public:/usr/share/nginx/html:ro + - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro + networks: + - edge + labels: + traefik.enable: "true" + # / → frontend + traefik.http.routers.factuges_acana_web.rule: Host(`${DOMAIN}`) && PathPrefix(`/`) + traefik.http.routers.factuges_acana_web.entrypoints: websecure + traefik.http.routers.factuges_acana_web.tls.certresolver: cloudflare-dns + + # prioridad más baja para que /api y /phpmyadmin ganen + traefik.http.routers.factuges_acana_web.priority: "1" + traefik.http.routers.factuges_acana_web.service: factuges_acana_web + traefik.http.services.factuges_acana_web.loadbalancer.server.port: "80" + +networks: + edge: + name: edge + external: true + internal: + name: factuges_acana_internal + external: false + + +volumes: + # Solo declarativo; usamos ruta ./volumes/db_data arriba + db_data: diff --git a/scripts/stack.acana.env b/scripts/stack.acana.env new file mode 100644 index 00000000..3bc1c5e0 --- /dev/null +++ b/scripts/stack.acana.env @@ -0,0 +1,50 @@ +# Identidad de la compañía +COMPANY=acana + +# Dominios +DOMAIN=acana.factuges.app + +# MariaDB +DB_ROOT_PASS=cQF#qRM*JU+tDyf +DB_USER=acana +DB_PASS=r@U8%GJ+2e/AWR +DB_NAME=factuges_acana +DB_PORT=3306 + +# API +API_PORT=3002 +API_IMAGE=factuges-server:acana-latest +FRONTEND_URL=https://acana.factuges.app + + +# SYNC +ENV = development +LOCAL_TZ = Europe/Madrid +LAST_RUN_PATH = /usr/share/factuges-app/last_run_factuges.ini + +FACTUGES_HOST = acana.mywire.org +FACTUGES_PORT = 63050 +FACTUGES_DATABASE = D:\Rodax\BD\FACTUGES.FDB +FACTUGES_USER = sysdba +FACTUGES_PASSWORD = masterkey + +FWEB_MYSQL_HOST = db # ${DB_NAME} +FWEB_MYSQL_PORT = 3306 # ${DB_PORT} +FWEB_MYSQL_DATABASE = factuges_acana # ${DB_NAME} +FWEB_MYSQL_USER = acana # ${DB_USER} +FWEB_MYSQL_PASSWORD = r@U8%GJ+2e/AWR # ${DB_PASS} + +CTE_COMPANY_ID = '019a9667-6a65-767a-a737-48234ee50a3a' +CTE_SERIE = 'F25/' +CTE_STATUS_INVOICE = 'issued' +CTE_IS_PROFORMA = 0 +CTE_STATUS_VERIFACTU = 'Pendiente' +CTE_LANGUAGE_CODE = 'es' #En uecko vendrá de su ficha +CTE_COUNTRY_CODE = 'es' #En uecko vendrá de su ficha +CTE_IS_COMPANY = 1 +CTE_SYNC_RESULT_OK = 1 +CTE_SYNC_RESULT_FAIL = 2 + +VERIFACTU_API_KEY = vf_test_ei8WYAvEq5dhSdEyQVjgCS8NZaNpEK2BljSHSUXf+Y0= +VERIFACTU_BASE_URL = https://api.verifacti.com/ +VERIFACTU_NIFS_API_KEY = vfn_osYpNdqSzAdTAHpazXG2anz4F3o0gfbSb5FFrCBZcno= diff --git a/scripts/stack.arribas.env b/scripts/stack.arribas.env new file mode 100644 index 00000000..8eebe83d --- /dev/null +++ b/scripts/stack.arribas.env @@ -0,0 +1,17 @@ +# Identidad de la compañía +COMPANY=arribas + +# Dominios +DOMAIN=arribas.factuges.app + +# MariaDB +DB_ROOT_PASS=cQF#qRM*JU+tDyf +DB_USER=arribas +DB_PASS=r@U8%GJ+2e/AWR +DB_NAME=factuges_arribas +DB_PORT=3306 + +# API +API_PORT=3002 +API_IMAGE=tu-registry/factuges-api:latest +FRONTEND_URL=https://arribas.factuges.app