Files
catalogo-servicios/INSTALACION.md
consultoria-as 38e9e4b91c Catalogo de Servicios (builder): codigo + documentacion extensiva
Builder multi-proveedor de servicios (tour / A&B / transportacion).
Python stdlib + SQLite + vanilla JS SPA. Hereda filosofia del Hub.

Secretos y datos (catalogo.db, secret.key, uploads/) excluidos via .gitignore.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 21:00:50 -07:00

2.6 KiB

Instalación y Despliegue — Catálogo de Servicios

Sin Docker, sin pip, sin CI/CD. Solo Python 3 y systemd.


Requisitos

  • Python 3.8+ (stdlib únicamente)
  • Linux con systemd para correr como servicio (en Windows/Mac corre con python3 server.py)

1. Desarrollo local

git clone https://git.consultoria-as.com/consultoria-as/catalogo-servicios.git
cd catalogo-servicios
python3 server.py
# → http://localhost:4403

Primera vez: pantalla de setup para crear la cuenta admin. Genera catalogo.db y secret.key.


2. Despliegue en servidor (Tailscale iclaude)

Ubicación en producción: /mnt/iclaude/catalogo-borrador/. Puerto 4403 (4401 = Hub, 4402 = airbnb-pricing, 4404 = foto-studio).

a) Copiar archivos (sin secretos ni datos)

scp server.py index.html claude@iclaude:/mnt/iclaude/catalogo-borrador/

No copiar secret.key ni catalogo.db — el servidor ya tiene los suyos. Los datos viven solo en el servidor.

b) Servicio systemd

/etc/systemd/system/catalogo-borrador.service:

[Unit]
Description=Catalogo (borrador) - builder de servicios
After=network.target

[Service]
Type=simple
User=claude
WorkingDirectory=/mnt/iclaude/catalogo-borrador
ExecStart=/usr/bin/python3 /mnt/iclaude/catalogo-borrador/server.py
Restart=always
RestartSec=5
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now catalogo-borrador

c) Redespliegue

scp index.html server.py claude@iclaude:/mnt/iclaude/catalogo-borrador/
ssh claude@iclaude "sudo systemctl restart catalogo-borrador"

Migraciones de esquema corren solas al reiniciar (idempotentes).

Logs

sudo journalctl -u catalogo-borrador -n 50 --no-pager

3. Acceso

  • Privado (tailnet): http://iclaude:4403/ · http://192.168.50.46:4403/
  • Público (clientes, sin Tailscale): vía Tailscale Funnel en puerto dedicado (8443).
    tailscale funnel --bg 8443
    tailscale funnel status
    

    Nota: usar puerto dedicado (no un path bajo /catalogo) porque la app usa rutas absolutas /api/....


4. Solución de problemas

Síntoma Causa Solución
"Sesión inválida" constante reloj del servidor desfasado corregir hora (cron sync_clock.sh)
Logins rotos bajo Funnel con path rutas absolutas /api/ exponer en puerto propio (8443), no en /catalogo
Thumbnail equivocado prefijos de archivo first_image prefiere foto_, excluye menu/docs

Stack mínimo: todo corre con un solo python3 server.py.