尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
🐾 Michicondrias - Plataforma Integral para Mascotas Este es el repositorio monorepo de Michicondrias, una arquitectura de microservicios desplegada de forma serverless. Arquitectura • Frontend: Next.js (Vercel) • Backend: FastAPI (AWS Lambda + Mangum) • Base de Datos: PostgreSQL (Neon Serverless) • Almacenamiento: AWS S3 • CI/CD: GitHub Actions檢視完整 README ↗
Plataforma integral para el cuidado de mascotas: salud y carnet digital, directorio de clínicas, adopciones, mascotas perdidas, tienda, servicios profesionales (paseo, cuidado, adiestramiento, estética, transporte), seguros, funeraria y más.
Monorepo con una app móvil (Expo / React Native) y 17 microservicios (FastAPI) sobre una base PostgreSQL compartida.
| Capa | Tecnología |
|---|---|
| App móvil | Expo SDK 55, React Native 0.83, expo-router, React Query, expo-updates (OTA) |
| Backend | FastAPI + SQLAlchemy 2.0 + Alembic, un proceso uvicorn por servicio (Python 3.12, sin Docker) |
| Base de datos | PostgreSQL en Supabase (pooler de transacciones, puerto 6543), compartida por todos los servicios |
| Almacenamiento | Oracle Object Storage vía API S3 (bucket público de fotos + bucket privado para documentos KYC) |
| Servidor | VM Oracle Cloud (ARM, Always Free): systemd + Caddy como proxy inverso con prefijo por servicio |
| Pagos | Stripe (pedidos, suscripción Michi-Tracker Pro y donaciones) |
| IA | Claude (Anthropic) para el triage de síntomas, con reglas de urgencia como piso |
| CI/CD | GitHub Actions: deploy-oracle.yml (principal) y deploy-aws-lambda.yml (manual, alterno) |
La API pública es https://michicondrias.duckdns.org/<servicio>/api/v1/... (Caddy quita el prefijo y los servicios usan
PROXY_PREFIX como root_path). El puerto local de cada servicio está en deploy/services.conf,
que es la única fuente de verdad para systemd, Caddy y el despliegue.
| Servicio | Responsabilidad |
|---|---|
core | Usuarios, login (JWT, 2FA), roles, verificación de identidad (KYC), notificaciones, ajustes y analíticas |
mascotas | Mascotas, galería, triage con IA, plan de dieta, Michi-Tracker |
carnet | Carnet digital: vacunas, consultas, recetas y recordatorios |
directorio | Clínicas, veterinarios, servicios, citas, agenda, pacientes, recetas, cirugías, inventario y videoconsultas |
laboratorio | Estudios clínicos: citas, órdenes y resultados |
aseguradoras | Planes, cotización, pólizas y reclamos |
adopciones | Publicaciones, solicitudes, formularios de compatibilidad y contratos |
perdidas | Mascotas perdidas, avistamientos y lugares pet-friendly |
ecommerce | Catálogo, carrito/pedidos, vendedores, pagos Stripe, reseñas y donaciones |
paseadores, cuidadores | Perfiles profesionales, solicitudes, calendario y reseñas |
entrenadores, estilistas | Programas de adiestramiento y servicios de grooming, con reseñas |
transportistas | Viajes para mascotas: tarifa, conductores, aceptación y seguimiento |
funeraria | Servicios funerarios, reservas, memoriales y reporte de defunción |
patrocinadores | Campañas, boost de alertas y estadísticas |
establecimientos | Lugares y comercios pet-friendly, cupones y reseñas |
El JWT lleva el rol del usuario. Todos empiezan como consumidor; para pasar a un rol profesional hay que completar la
verificación de identidad y que un admin la apruebe (Perfil → Ser Profesional). Tras la aprobación, la app pide un
token nuevo y el usuario ve sus herramientas sin volver a iniciar sesión.
consumidor, admin y los profesionales: veterinario, hospital, refugio, hogar_temporal, vendedor, paseador,
cuidador, patrocinador, establecimiento, funeraria, aseguradora, laboratorio, entrenador, estilista,
transportista. La app muestra a cada rol su panel en Inicio y una pestaña de Herramientas; el mapa rol → pantallas está
en mobile/src/constants/roleTools.ts y el backend exige el rol en los endpoints profesionales.
mobile/ App Expo (app/ = pantallas con expo-router, src/ = hooks, servicios, componentes, constants/ = tema y tokens)
backend/ Un directorio por microservicio: michicondrias_<servicio>/app + alembic/
deploy/ Despliegue: Oracle (principal), AWS Lambda (alterno) y services.conf
scripts/ Utilidades de migración y datos de prueba
.github/ Workflows de despliegue
Cada servicio es independiente. Necesitas Python 3.12 y un PostgreSQL accesible.
cd backend/michicondrias_core
python3.12 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
export DATABASE_URL=postgresql://usuario:clave@localhost:5432/michicondrias
export SECRET_KEY=un-secreto-largo
export INTERNAL_SERVICE_TOKEN=un-token-interno # llamadas entre servicios
uvicorn app.main:app --port 8000
El resto de variables (almacenamiento S3, Stripe, ANTHROPIC_API_KEY, Resend, etc.) están descritas en
deploy/oracle/common.env.example. Sin ANTHROPIC_API_KEY el triage usa solo reglas
de urgencia; sin claves de Stripe, los pagos responden con un error claro.
Las migraciones son por servicio, cada uno con su propia tabla de versiones: cd backend/michicondrias_<servicio> && alembic upgrade head.
cd mobile
npm install
cp .env.example .env # EXPO_PUBLIC_API_URL, EXPO_PUBLIC_STORAGE_URL, EXPO_PUBLIC_GOOGLE_MAPS_API_KEY
npx expo start # o: npx expo start --web --port 3000
Opcionales: EXPO_PUBLIC_TERMS_URL, EXPO_PUBLIC_PRIVACY_URL, EXPO_PUBLIC_SUPPORT_PHONE, EXPO_PUBLIC_SUPPORT_WHATSAPP.
Si apuntas EXPO_PUBLIC_API_URL a un proxy local, debe replicar las rutas /<servicio>/api/v1.
Comprobación de tipos: cd mobile && npx tsc --noEmit -p .
Sistema de diseño: paleta Midnight & Gold en mobile/constants/palettes.ts, tokens (espaciado, radios, sombras,
tipografía) en mobile/constants/design.ts y componentes base en mobile/src/components (Button, Card, ListRow,
SectionHeader, Skeleton, EmptyState, RoleGuard…). Usa los colores del tema (useTheme()), no hex sueltos.
La app se distribuye como APK firmado (com.michicondrias.mobile) y recibe cambios de JavaScript por OTA (canal
production, runtimeVersion 1.0.0). Los cambios nativos (permisos, esquema de enlaces, versión) requieren un APK nuevo.
cd mobile/android
./gradlew assembleRelease # APK en app/build/outputs/apk/release/
El keystore de release (mobile/android/app/michicondrias-release.keystore) no está en el repositorio: guárdalo en un
lugar seguro, sin él no se pueden publicar actualizaciones de la misma app. android/ está en .gitignore.
Un git push a main que toque backend/** o deploy/** ejecuta deploy-oracle.yml: sincroniza el código a la VM
(rsync), actualiza el venv de cada servicio si cambió su requirements.txt, reinicia y comprueba la salud de los 17.
Las migraciones no corren solas. Antes de desplegar código que cambie el esquema, aplica alembic upgrade head del
servicio contra la base de producción (las migraciones del repositorio son aditivas e idempotentes).
Desde la máquina de desarrollo (con el alias SSH michicondrias-oracle): scripts/vm.sh migrate <servicio>;
scripts/vm.sh status revisa los 17 servicios y scripts/vm.sh logs <servicio> muestra sus logs.
La guía completa (puesta en marcha de la VM, Caddy, almacenamiento y cómo volver a AWS) está en
deploy/README.md. Secrets de CI: ORACLE_HOST, ORACLE_SSH_KEY y, opcional, ORACLE_USER.
/etc/michicondrias/common.env en la VM y como secrets de GitHub.INTERNAL_SERVICE_TOKEN.deploy/README.md: despliegue y operación.archivo/: código y reportes anteriores (solo historial). El estado y los pendientes viven en HANDOFF.md.