Descripción • Instalación • Mocks • Deployment • Equipo • Contribuidores • Licencia
Este es el hogar para el desarrollo del nuevo Planner de Ingeniería UC, hecho por estudiantes para estudiantes.
Tras varios años en ideación, este proyecto se lanzó como una propuesta conjunta entre la Consejería Académica de Ingeniería y Open Source UC, con el propósito de reemplazar el actual planner de Ingeniería. La propuesta, tras ser aprobada por la Escuela de Ingeniería, dió comienzo al proyecto en modalidad de marcha blanca. A principios del 2023, y con un MVP listo, la Dirección de Pregrado oficialmente aprobó la continuación del desarrollo del proyecto.
- Hacer un fork de este repositorio.
- Realizar los cambios en tu repo forkeado, trabajando en la rama
dev
. - Crear un Pull Request (PR) desde la rama
dev
de tu repo hacia la ramadev
de este repo. - Esperar a que el equipo del Nuevo Planner + OSUC acepte tu solicitud.
- Una vez aceptado, el equipo del Nuevo Planner + OSUC abre un PR desde
dev
haciamain
en este mismo repositorio. - Luego, el equipo del Nuevo Planner + OSUC podrá hacer un PR desde
main
haciamain
del repositorio controlado por la universidad: spavea/mallas.ing.uc.cl. - Finalmente, solo queda esperar a que la universidad apruebe los cambios. El deploy se hará automáticamente al recibir la aprobación 🚀
El proyecto está configurado para ser desarrollado en Visual Studio Code con Dev Containers. Puedes instalar VSCode aquí. Existen 2 maneras de correr Dev Containers: GitHub Codespaces y localmente.
Codespaces es un servicio de GitHub que permite correr VSCode en la nube. Provee una cantidad limitada de horas de uso, que puede ser expandida activando la cuenta Pro gratis a estudiantes.
- Instala la extensión de GitHub Codespaces.
- Crea o abre un Codespace desde el botón en la esquina superior derecha de este repositorio (o desde el menú de VSCode). Si no lo has creado, ingresa
open-source-uc/planner
como el repositorio a abrir.
Sigue en la sección Desarrollo general.
- Una vez terminado de desarrollar, detén el Codespace para no consumir horas de uso. También puedes usar un timeout para que se detenga automáticamente.
- Instala Docker. Asegurate que esté corriendo.
- Instala la extensión Dev Containers.
- Clona este repositorio y abre el proyecto en VSCode.
- Corre el comando
Dev Containers: Open Folder in Container
o has click en el popup que saldrá al abrir el proyecto.
Sigue en la sección Desarrollo general.
- El Dev Container correrá automaticamente el setup necesario con
just init
. Espera que termine para continuar. - Utiliza
Run and Debug
de VSCode conLaunch all 🚀
para correr todos los servicios al mismo tiempo. Espera que el backend (que puedes inspeccionar enPython Debug Console
) termine de correr para continuar (cuando se muestre "Aplication startup complete").
Una vez listo, podrás entrar a la app en http://localhost:3000 🎉
Necesitaras un nombre de usuario para acceder a CAS. Puedes acceder con testuser
o con otros usuarios definidos en cas-mock-users.json
.
Para realizar acciones sobre el repositorio (migraciones, generación de código, etc) puedes usar:
- el task runner de VSCode (Ctrl/Cmd + Shift + P -> "Tasks: Run Task").
just
en la linea de comandos. Para ver comandos disponibles, correjust
desde cualquier carpeta.
Es importante que cuando:
- Cambias la estructura de la API, corras la tarea "Generate client" (también disponible en modo watch).
- Cambies el esquema de la base de datos, corras la tarea "Create/apply migrations" para que los cambios se reflejen en la base de datos.
Para realizar contribuciones, revisa contributing.md.
Nota: Este proyecto usa Linear para rastrear el progreso del proyecto. Por ahora, el Linear no es público, pero de todas formas se revisan los issues y features creados en GitHub.
La app aún está en una etapa muy temprana del desarrollo por lo que podrían haber cosas que no funcionan correctamente o difieren de la documentación, por lo que cualquier lector siéntase libre a colaborar 🚀. Toda ayuda es bienvenida :)
El proyecto se integra con dos servicios externos: SIDING (para acceder a mallas y datos de estudiantes) y CAS (para el login UC). Ambos son configurables por medio de variables de entorno, y se proveen mocks para ambos servicios en caso de no tener credenciales para acceder a ellos.
- Para SIDING se provee un mock que se activa automáticamente en ausencia de credenciales. El mock es limitado, y solo permite probar algunas combinaciones de malla.
- Para CAS, se provee el servicio
cas-server-mock
que corre automáticamente junto a la app. Las cuentas de usuario disponibles son configurables en el archivocas-mock/data/cas-mock-users.json
.
Para deployments a producción, se provee un playbook de Ansible que permite levantar la app completa de principio a fin, pensado para su uso en un entorno de producción, en particular en un servidor corriendo Rocky Linux 9.
Teniendo acceso SSH a un servidor, solo se necesita correr (desde un entorno de desarrollo ya configurado):
$ ansible-playbook infra/playbook.yml -i <IP>, -u <USUARIO>
Asumiendo que ya se tenga una llave SSH al servidor. El playbook es completamente idempotente, por lo que también puede ser utilizado para corregir configuration drift en un servidor de producción.
El playbook opcionalmente provee prompts para entregar credenciales de Tailscale, Netdata y SIDING. Por defecto el playbook no levanta un mock de CAS, que es necesario para instalaciones sin acceso al SSO UC.
También se provee un script más ligero en just, que principalmente está pensado para su uso en junto al sistema de Continuous Deployment del repositorio. Sin embargo, dado un entorno ya configurado de Docker Compose, este puede ser utilizado para levantar un servidor independiente, incluyendo uno que utilice un SSO mock.
Abajo se entregan instrucciones manuales de deploy.
El ambiente de staging está diseñado para testear las nuevas versiones del planner en un ambiente real antes de pasar a producción.
En primer lugar, es necesario generar manualmente los archivos .env
y reemplazar los valores según corresponda para cada servicio utilizando los ejemplos ubicados en cada carpeta:
- API →
backend/.env.staging.template
- servidor web →
frontend/.env.staging.template
- base de datos →
database/.env.staging.template
Luego, se debe crear el volumen de Caddy con docker volume create caddy_data
.
Ahora, para correr la aplicación utilizando un servidor mock de CAS externo se debe:
- Definir las variables
CAS_SERVER_URL
yCAS_LOGIN_REDIRECTION_URL
enbackend/.env
con la URL del servidor externo. - Levantar los contenedores con
docker compose up planner -d --build
desde la raíz del repositorio.
Alternativamente, para correr la aplicación utilizando un servidor mock de CAS local:
- Dejar las variables
CAS_SERVER_URL
yCAS_LOGIN_REDIRECTION_URL
enbackend/.env
con los valores predeterminados del archivo de ejemplo.env.staging.template
. - Luego, es necesario generar el archivo
cas-mock-users.json
encas-mock/data
a partir del ejemplocas-mock-users.json.example
. - Levantar los contenedores con
docker compose up -d --build
desde la raíz del repositorio.
Finalmente, se puede detener la app con docker compose down
desde la raíz del repositorio.
El ambiente de producción es manejado por la universidad de forma interna, por lo que aquí se detallan las instrucciones para desplegar el planner de forma manual:
-
Se debe crear el archivo
.env
para la API. En particular, crearbackend/.env
a partir del ejemplobackend/.env.production.template
. -
Reemplazar los valores de las variables de entorno según corresponda en todos los archivos
.env
creados. IMPORTANTE: no olvidar modificar la variableJWT_SECRET
enbackend/.env
y otras variables que puedan contener secretos para evitar vulnerabilidades de seguridad.
- Para generar una clave
JWT_SECRET
segura y aleatoria se puede utilizar el comandoopenssl rand -base64 32
.
- Se debe crear el volumen donde Caddy guardará los certificados SSL con
docker volume create caddy_data
. - Levantar los contenedores con
docker compose up planner -d --build
desde la raíz del repositorio. Requiere Docker y Docker Compose instalados en la máquina. - Revisar el estado de los contenedores con
docker ps
odocker container ls
. - Finalmente, se puede detener la app con
docker compose down
desde la misma ubicación.
Nota: los comandos podrían variar ligeramente dependiendo del sistema operativo y versión de Docker Compose. En particular, podría ser necesario utilizar docker-compose
en vez de docker compose
y sudo docker compose
en vez de docker compose
.
Shantal Fabri 📋💻 |
Diego Prudencio 💻 |
Martín Andrighetti ⚙️ |
Franco Giannoni Humud ⚙️ |
Agustín Covarrubias 💻 ⚙️ |
Además del equipo núcleo, nos apoyan los contribuidores al proyecto. Puedes ver la lista completa de contribuidores aquí.