Se configuró un Nginx Proxy Manager que permita adminitrad más códodamente los endpoints tanto de apis como de archivos .html servidor tanto por auth/ y app/
This commit is contained in:
parent
3d3ef3f002
commit
511b370a2e
@ -2,49 +2,53 @@
|
|||||||
# Docker Comose para entorno de desarrollo o development.
|
# Docker Comose para entorno de desarrollo o development.
|
||||||
|
|
||||||
services:
|
services:
|
||||||
gateway:
|
|
||||||
image: nginx:alpine
|
nginx-proxy-manager:
|
||||||
container_name: suitecoffee-gateway
|
image: jc21/nginx-proxy-manager:latest
|
||||||
|
container_name: nginx-proxy-manager
|
||||||
|
restart: unless-stopped
|
||||||
depends_on:
|
depends_on:
|
||||||
suitecoffee-app:
|
suitecoffee-app:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
suitecoffee-auth:
|
suitecoffee-auth:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
ports:
|
ports:
|
||||||
- "80:80" # único puerto público (agregá 443 si después sumás TLS)
|
- "80:80" # HTTP público
|
||||||
|
- "81:81" # UI de administración NPM
|
||||||
|
- "443:443" # HTTPS público
|
||||||
volumes:
|
volumes:
|
||||||
- ./gateway/nginx.conf:/etc/nginx/nginx.conf:ro
|
- npm_data:/data # config + DB (SQLite)
|
||||||
|
- npm_letsencrypt:/etc/letsencrypt
|
||||||
networks:
|
networks:
|
||||||
- suitecoffee-net
|
- suitecoffee-net
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
suitecoffee-app:
|
suitecoffee-app:
|
||||||
container_name: suitecoffee-app
|
container_name: suitecoffee-app
|
||||||
depends_on:
|
depends_on:
|
||||||
suitecoffee-db:
|
suitecoffee-db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
suitecoffee-tenants:
|
suitecoffee-tenants:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
build:
|
build:
|
||||||
context: ./services/app
|
context: ./services/app
|
||||||
dockerfile: Dockerfile.development
|
dockerfile: Dockerfile.development
|
||||||
volumes:
|
volumes:
|
||||||
- ./services/app:/app
|
- ./services/app:/app
|
||||||
env_file:
|
env_file:
|
||||||
- ./services/app/.env.development
|
- ./services/app/.env.development
|
||||||
environment:
|
environment:
|
||||||
- NODE_ENV=${NODE_ENV}
|
- NODE_ENV=${NODE_ENV}
|
||||||
command: npm run dev
|
command: npm run dev
|
||||||
healthcheck:
|
healthcheck:
|
||||||
# IMPORTANTE: asegurate de tener curl instalado en la imagen de app (ver nota abajo)
|
# IMPORTANTE: asegurate de tener curl instalado en la imagen de app (ver nota abajo)
|
||||||
test: ["CMD-SHELL", "curl -fsS http://localhost:${APP_DOCKER_PORT}/health || exit 1"]
|
test: ["CMD-SHELL", "curl -fsS http://localhost:${APP_DOCKER_PORT}/health || exit 1"]
|
||||||
interval: 10s
|
interval: 10s
|
||||||
timeout: 3s
|
timeout: 3s
|
||||||
retries: 10
|
retries: 10
|
||||||
start_period: 20s
|
start_period: 20s
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
- suitecoffee-net
|
- suitecoffee-net
|
||||||
|
|
||||||
suitecoffee-auth:
|
suitecoffee-auth:
|
||||||
container_name: suitecoffee-auth
|
container_name: suitecoffee-auth
|
||||||
@ -112,6 +116,8 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
tenants-data:
|
tenants-data:
|
||||||
suitecoffee-data:
|
suitecoffee-data:
|
||||||
|
npm_data:
|
||||||
|
npm_letsencrypt:
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
suitecoffee-net:
|
suitecoffee-net:
|
||||||
|
|||||||
@ -1,49 +0,0 @@
|
|||||||
worker_processes 1;
|
|
||||||
|
|
||||||
events { worker_connections 1024; }
|
|
||||||
|
|
||||||
http {
|
|
||||||
# Logs básicos
|
|
||||||
access_log /var/log/nginx/access.log;
|
|
||||||
error_log /var/log/nginx/error.log;
|
|
||||||
|
|
||||||
# Ajustes útiles para proxys
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_set_header Connection "";
|
|
||||||
|
|
||||||
# Soporte WebSocket (si lo usás en dev)
|
|
||||||
map $http_upgrade $connection_upgrade {
|
|
||||||
default upgrade;
|
|
||||||
'' close;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name _;
|
|
||||||
|
|
||||||
# Frontend / App principal (Next/React/Express, etc.)
|
|
||||||
# / -> app
|
|
||||||
location / {
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection $connection_upgrade;
|
|
||||||
proxy_pass http://suitecoffee-app:4000; # usa el puerto interno de app
|
|
||||||
}
|
|
||||||
|
|
||||||
# API de app (si preferís separar por path)
|
|
||||||
location /api/ {
|
|
||||||
proxy_pass http://suitecoffee-app:3000;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Servicio de autenticación (por ejemplo /auth/*)
|
|
||||||
# location /auth/ {
|
|
||||||
# proxy_pass http://suitecoffee-auth:4000;
|
|
||||||
# }
|
|
||||||
|
|
||||||
# Opcional: servir estáticos si la app build genera /public
|
|
||||||
# location /static/ { alias /usr/share/nginx/html/static/; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -64,11 +64,8 @@ async function verificarConexion() {
|
|||||||
|
|
||||||
|
|
||||||
// === Servir páginas estáticas ===
|
// === Servir páginas estáticas ===
|
||||||
app.use('/pages', express.static(path.join(__dirname, 'pages')));
|
app.use(express.static(path.join(__dirname, 'pages')));
|
||||||
|
|
||||||
|
|
||||||
// Rutas de conveniencia para abrir cada página rápido:
|
|
||||||
// (Opcional: puedes usar directamente /pages/roles.html, etc.)
|
|
||||||
app.get('/roles', (req, res) => res.sendFile(path.join(__dirname, 'pages', 'roles.html')));
|
app.get('/roles', (req, res) => res.sendFile(path.join(__dirname, 'pages', 'roles.html')));
|
||||||
app.get('/usuarios', (req, res) => res.sendFile(path.join(__dirname, 'pages', 'usuarios.html')));
|
app.get('/usuarios', (req, res) => res.sendFile(path.join(__dirname, 'pages', 'usuarios.html')));
|
||||||
app.get('/categorias',(req, res) => res.sendFile(path.join(__dirname, 'pages', 'categorias.html')));
|
app.get('/categorias',(req, res) => res.sendFile(path.join(__dirname, 'pages', 'categorias.html')));
|
||||||
|
|||||||
@ -35,6 +35,7 @@ try {
|
|||||||
const app = express();
|
const app = express();
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
|
app.set('trust proxy', 1);
|
||||||
|
|
||||||
// Configuración de conexión PostgreSQL
|
// Configuración de conexión PostgreSQL
|
||||||
|
|
||||||
@ -65,7 +66,7 @@ async function verificarConexion() {
|
|||||||
|
|
||||||
|
|
||||||
// === Servir páginas estáticas ===
|
// === Servir páginas estáticas ===
|
||||||
app.use('/pages', express.static(path.join(__dirname, 'pages')));
|
app.use('/auth', express.static(path.join(__dirname, 'pages')));
|
||||||
|
|
||||||
app.get('/planes', async (req, res) => {
|
app.get('/planes', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
@ -82,13 +83,12 @@ app.get('/planes', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Rutas de conveniencia para abrir cada página rápido:
|
// Ruta raíz
|
||||||
// (Opcional: puedes usar directamente /pages/roles.html, etc.)
|
app.get('/', (req, res) => {
|
||||||
app.get('/', (req, res) => res.sendFile(path.join(__dirname, 'pages', 'index.html')));
|
res.sendFile(path.join(__dirname, 'pages', 'index.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post('/api/registro', async (req, res) => {
|
||||||
|
|
||||||
app.post('/registro', async (req, res) => {
|
|
||||||
const {
|
const {
|
||||||
nombre_empresa,
|
nombre_empresa,
|
||||||
rut,
|
rut,
|
||||||
@ -143,7 +143,7 @@ app.post('/registro', async (req, res) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
app.post('/login', async (req, res) => {
|
app.post('/api/login', async (req, res) => {
|
||||||
const { correo, clave_acceso } = req.body;
|
const { correo, clave_acceso } = req.body;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -96,7 +96,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const url = modoRegistro ? '/registro' : '/login';
|
const url = modoRegistro ? '/api/registro' : '/api/login';
|
||||||
const res = await fetch(url, {
|
const res = await fetch(url, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user