148 lines
4.9 KiB
Bash
Executable File
148 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# ===========================================
|
|
# Captain Mobile - Deployment Script
|
|
# Ejecutar en ARCHITECT (69.62.126.110)
|
|
# ===========================================
|
|
|
|
set -e
|
|
echo "🚀 Captain Mobile Deployment"
|
|
echo "============================"
|
|
|
|
# Colores
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
# 1. Matar procesos colgados
|
|
echo -e "\n${YELLOW}[1/7] Limpiando procesos colgados...${NC}"
|
|
pkill -f "psql.*captain" 2>/dev/null || true
|
|
pkill -f "psql.*bypass" 2>/dev/null || true
|
|
echo -e "${GREEN}✓ Limpieza completada${NC}"
|
|
|
|
# 2. Configurar PostgreSQL
|
|
echo -e "\n${YELLOW}[2/7] Configurando PostgreSQL...${NC}"
|
|
sudo -u postgres psql <<EOF
|
|
-- Crear usuario si no existe
|
|
DO \$\$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'captain') THEN
|
|
CREATE USER captain WITH PASSWORD 'captain';
|
|
ELSE
|
|
ALTER USER captain WITH PASSWORD 'captain';
|
|
END IF;
|
|
END
|
|
\$\$;
|
|
|
|
-- Crear base de datos si no existe
|
|
SELECT 'CREATE DATABASE captain_mobile OWNER captain'
|
|
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'captain_mobile')\gexec
|
|
|
|
-- Permisos
|
|
GRANT ALL PRIVILEGES ON DATABASE captain_mobile TO captain;
|
|
EOF
|
|
echo -e "${GREEN}✓ Usuario y base de datos configurados${NC}"
|
|
|
|
# 3. Crear schema
|
|
echo -e "\n${YELLOW}[3/7] Creando schema...${NC}"
|
|
PGPASSWORD=captain psql -h localhost -U captain -d captain_mobile <<EOF
|
|
CREATE TABLE IF NOT EXISTS conversations (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id VARCHAR(50) NOT NULL,
|
|
title VARCHAR(255),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS messages (
|
|
id SERIAL PRIMARY KEY,
|
|
conversation_id INTEGER REFERENCES conversations(id) ON DELETE CASCADE,
|
|
role VARCHAR(20) NOT NULL,
|
|
content TEXT NOT NULL,
|
|
attachments JSONB,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_conversations_user ON conversations(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_messages_conversation ON messages(conversation_id);
|
|
EOF
|
|
echo -e "${GREEN}✓ Schema creado${NC}"
|
|
|
|
# 4. Instalar servicio systemd
|
|
echo -e "\n${YELLOW}[4/7] Configurando servicio systemd...${NC}"
|
|
sudo cp /home/architect/captain-claude/apps/captain-mobile/captain-api.service /etc/systemd/system/
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable captain-api
|
|
sudo systemctl restart captain-api
|
|
sleep 2
|
|
if systemctl is-active --quiet captain-api; then
|
|
echo -e "${GREEN}✓ Servicio captain-api activo${NC}"
|
|
else
|
|
echo -e "${RED}✗ Error iniciando servicio${NC}"
|
|
sudo journalctl -u captain-api -n 20 --no-pager
|
|
fi
|
|
|
|
# 5. Verificar API
|
|
echo -e "\n${YELLOW}[5/7] Verificando API...${NC}"
|
|
sleep 2
|
|
HEALTH=$(curl -s http://localhost:3030/health 2>/dev/null)
|
|
if echo "$HEALTH" | grep -q '"status":"ok"'; then
|
|
echo -e "${GREEN}✓ API funcionando correctamente${NC}"
|
|
echo "$HEALTH" | python3 -m json.tool 2>/dev/null || echo "$HEALTH"
|
|
else
|
|
echo -e "${RED}✗ API no responde${NC}"
|
|
echo "Logs:"
|
|
sudo journalctl -u captain-api -n 30 --no-pager
|
|
fi
|
|
|
|
# 6. Configurar Caddy
|
|
echo -e "\n${YELLOW}[6/7] Configurando Caddy...${NC}"
|
|
CADDY_CONFIG="
|
|
captain.tzzrarchitect.me {
|
|
reverse_proxy localhost:3030
|
|
|
|
@websocket {
|
|
header Connection *Upgrade*
|
|
header Upgrade websocket
|
|
}
|
|
reverse_proxy @websocket localhost:3030
|
|
}
|
|
"
|
|
|
|
# Verificar si ya existe la config
|
|
if grep -q "captain.tzzrarchitect.me" /etc/caddy/Caddyfile 2>/dev/null; then
|
|
echo -e "${YELLOW}⚠ Config de Caddy ya existe${NC}"
|
|
else
|
|
echo "$CADDY_CONFIG" | sudo tee -a /etc/caddy/Caddyfile > /dev/null
|
|
sudo systemctl reload caddy
|
|
echo -e "${GREEN}✓ Caddy configurado${NC}"
|
|
fi
|
|
|
|
# 7. Resumen DNS
|
|
echo -e "\n${YELLOW}[7/7] Configuración DNS requerida${NC}"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "Agregar en Cloudflare:"
|
|
echo " Tipo: A"
|
|
echo " Nombre: captain"
|
|
echo " Contenido: 69.62.126.110"
|
|
echo " Proxy: Activado (naranja)"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
|
|
# Resumen final
|
|
echo -e "\n${GREEN}═══════════════════════════════════════${NC}"
|
|
echo -e "${GREEN} DEPLOYMENT COMPLETADO ${NC}"
|
|
echo -e "${GREEN}═══════════════════════════════════════${NC}"
|
|
echo ""
|
|
echo "📡 API Local: http://localhost:3030"
|
|
echo "🌐 API Pública: https://captain.tzzrarchitect.me"
|
|
echo ""
|
|
echo "Próximos pasos:"
|
|
echo "1. Configurar DNS en Cloudflare (si no está)"
|
|
echo "2. Crear repo en Gitea: git.tzzr.net/tzzr/captain-mobile"
|
|
echo "3. Build APK con Flutter"
|
|
echo ""
|
|
echo "Test rápido:"
|
|
echo " curl -X POST http://localhost:3030/auth/login \\"
|
|
echo " -H 'Content-Type: application/json' \\"
|
|
echo " -d '{\"username\":\"captain\",\"password\":\"tzzr2025\"}'"
|