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>
This commit is contained in:
consultoria-as
2026-06-09 21:00:50 -07:00
commit 38e9e4b91c
8 changed files with 1814 additions and 0 deletions

105
INSTALACION.md Normal file
View File

@@ -0,0 +1,105 @@
# 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
```bash
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)
```bash
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`:
```ini
[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
```
```bash
sudo systemctl daemon-reload
sudo systemctl enable --now catalogo-borrador
```
### c) Redespliegue
```bash
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
```bash
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).
```bash
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`.*