Sistema automatizado de invitaciones y promoción de usuarios para la organización GitHub de MeshChile.
- Invitaciones automáticas con asignación al equipo "Comunidad"
- Promoción automática a "Colaboradores" basada en contribuciones
- Rate limiting para prevenir abuso
- reCAPTCHA para protección contra bots
- Preview de usuario en tiempo real
- Audit logging completo
- Webhooks de GitHub para detección de contribuciones
git clone <tu-repositorio>
cd meshchile-github-bot
npm installCopiar el contenido del .env ejemplo y configurar:
touch .env
# Copiar contenido del ejemplo y configurar con valores reales- Ve a GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic)
- Click "Generate new token (classic)"
- Configurar:
- Note:
MeshChile Bot Token - Expiration:
No expiration(o según tu política de seguridad)
- Note:
✅ OBLIGATORIOS - Sin estos scopes el bot fallará:
-
repo- Full control of private repositories- ✅ Necesario para crear issues de felicitación
- ✅ Necesario para leer información de repositorios
- ✅ Necesario para detectar eventos de contribución
-
write:org- Write org and team membership, read and write org projects- ✅ Necesario para agregar usuarios a equipos
- ✅ Necesario para gestionar membresías de equipos
- ✅ Incluye automáticamente
read:org
-
admin:org_hook- Admin org hooks- ✅ Necesario para recibir webhooks de la organización
- ✅ Necesario para verificar firmas de webhook
📋 Scopes incluidos automáticamente:
read:org(incluido conwrite:org)read:user(incluido conrepo)user:email(incluido conrepo)
Para verificar que el token tiene los permisos correctos, ejecuta:
# Navegar al directorio del proyecto
cd meshchile-github-bot
# Ejecutar diagnóstico
node scripts/diagnostico-bienvenidos.js✅ Salida esperada:
🎯 7. Verificando scopes del token...
• Scopes disponibles: repo, write:org, admin:org_hook
✅ repo: Disponible
✅ write:org: Disponible
✍️ 6. Intentando crear issue de prueba...
✅ Issue creado exitosamente: #123
✅ Issue cerrado automáticamente
❌ Si ves esto, el token NO tiene los permisos correctos:
🎯 7. Verificando scopes del token...
❌ repo: No disponible
❌ write:org: No disponible
✍️ 6. Intentando crear issue de prueba...
❌ Error creando issue: Not Found
| Error | Causa | Solución |
|---|---|---|
Not Found al crear issues |
Falta scope repo |
Recrear token con scope repo |
Not Found al gestionar equipos |
Falta scope write:org |
Recrear token con scope write:org |
Unauthorized en webhooks |
Falta scope admin:org_hook |
Recrear token con scope admin:org_hook |
Resource not accessible |
Token sin permisos en la org | Verificar que el usuario sea admin/owner |
El usuario del token debe tener permisos de Admin u Owner en la organización:
- Ve a https://github.com/orgs/Mesh-Chile/people
- Buscar tu usuario
- Verificar que tenga role "Owner" o "Admin"
- Si es "Member", solicitar promoción a admin
# En el archivo .env
GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx- Ve a https://www.google.com/recaptcha/admin/create
- Crear sitio reCAPTCHA v2 "I'm not a robot"
- Añadir dominio (localhost para desarrollo)
- Copiar Site Key y Secret Key
- Añadir keys a
.env - IMPORTANTE: Reemplazar
TU_SITE_KEY_AQUIenindex.html
En la organización Mesh-Chile, crear equipos:
-
Equipo "Comunidad"
- Name:
Comunidad - Slug:
comunidad - Description:
Equipo base para todos los miembros nuevos
- Name:
-
Equipo "Colaboradores"
- Name:
Colaboradores - Slug:
colaboradores - Description:
Miembros activos con contribuciones
- Name:
# Crear repo 'bienvenidos' en la organización para mensajes automáticosnpm run dev
# Servidor en http://localhost:3000npm start- Ve a https://github.com/Mesh-Chile → Settings → Webhooks
- Click "Add webhook"
- Configurar:
- Payload URL:
https://tu-dominio.com/webhook/github - Content type:
application/json - Secret: Tu
GITHUB_WEBHOOK_SECRET(del .env) - SSL verification: Enable SSL verification
- Events: Seleccionar individual events:
- ✅ Repositories
- ✅ Pushes
- ✅ Pull requests
- ✅ Issues
- Active: ✅
- Payload URL:
- Rate limiting: 3 invitaciones por IP cada 15 minutos
- reCAPTCHA: Verificación obligatoria para invitaciones
- Webhook signature: Verificación de autenticidad de webhooks
- Input validation: Validación estricta de todos los inputs
- Audit logging: Log completo de todas las acciones
- CORS configurado: Solo dominios autorizados
- Error handling: Manejo seguro de errores sin exponer información sensible
POST /api/invite- Solicitar invitaciónGET /api/user/:username- Preview de usuarioGET /api/bot/status- Estado del botGET /api/stats- Estadísticas básicas
POST /webhook/github- Webhook de GitHub
POST /api/admin/promote/:username- Promoción manual
meshchile-github-bot/
├── server.js # Servidor principal
├── package.json # Dependencias
├── .env # Variables de entorno (NO SUBIR)
├── .gitignore # Archivos a ignorar
├── README.md # Documentación
└── public/ # Frontend
└── index.html # Página de invitaciones
docker/
├── Dockerfile # Imagen optimizada
├── docker-compose.yml # Producción (registry)
├── docker-compose.dev.yml # Desarrollo (build local)
└── README.md # Documentación Docker
Desarrollo:
npm run docker:dev # Build y ejecutar en foreground
npm run docker:dev:detached # Build y ejecutar en backgroundProducción:
npm run docker:prod # Usar imagen del registryGestión:
npm run docker:stop # Parar contenedores
npm run docker:logs # Ver logs en tiempo real
npm run docker:rebuild # Rebuild completo desde cerocd docker
# Desarrollo
docker-compose -f docker-compose.dev.yml up --build
# Producción
docker-compose up -d- Registry:
ghcr.io/mesh-chile/meshchile-github-invite-bot - Build automático: GitHub Actions en push a main/develop
- Multi-arch: linux/amd64, linux/arm64
npm install -g @railway/cli
railway login
railway link
railway up- Conectar repositorio en Render.com
- Configurar variables de entorno en el panel
- Deploy automático
heroku create meshchile-github-bot
heroku config:set GITHUB_TOKEN=tu_token
heroku config:set GITHUB_ORG=Mesh-Chile
heroku config:set RECAPTCHA_SECRET_KEY=tu_secret
# ... configurar todas las variables
git push heroku main# Usar PM2 para proceso en background
npm install -g pm2
pm2 start server.js --name meshchile-bot
pm2 startup
pm2 save
# Con nginx como reverse proxy- Ejecutar servidor:
npm run dev - Ir a
http://localhost:3000 - Ingresar username válido de GitHub
- Completar reCAPTCHA
- Verificar que llegue invitación
- Usuario acepta invitación y es añadido a "Comunidad"
- Usuario crea repo o hace commit en la organización
- Webhook debe promocionar a "Colaboradores"
- Verificar issue de felicitación creado
# Ver logs en tiempo real
tail -f logs/app.log
# O con PM2
pm2 logs meshchile-botGET /api/bot/status- Estado detallado del sistemaGET /api/stats- Estadísticas de la organización
- ✅ Invitaciones exitosas
- ❌ Errores de invitación
- 🚀 Promociones automáticas
⚠️ Rate limits alcanzados- 📡 Webhooks recibidos
- Verificar que el token tenga permisos
admin:org - Comprobar que el usuario existe en GitHub
- Revisar logs para errores específicos
- Verificar configuración del webhook
- Comprobar que los equipos existan con los slugs correctos
- Verificar que el webhook secret coincida
- Verificar que las keys estén correctas
- Comprobar que el dominio esté registrado en reCAPTCHA
- Verificar que el Site Key esté en el frontend
- Ajustar valores en el código
- Implementar whitelist para IPs confiables
- Usar Redis para rate limiting más sofisticado
- Fork del repositorio
- Crear rama feature:
git checkout -b feature/nueva-funcionalidad - Commit cambios:
git commit -am 'Añadir nueva funcionalidad' - Push a la rama:
git push origin feature/nueva-funcionalidad - Crear Pull Request
GNU Affero General Public License v3 License - ver archivo License para detalles
- Issues: GitHub Issues del repositorio
- Email: info@meshchile.cl
- Enlaces: https://links.meshchile.cl
- Documentación: https://foro.meshchile.cl