{"id":22463254,"url":"https://github.com/enflujo/enflujo-cms-api","last_synced_at":"2026-02-19T01:32:12.834Z","repository":{"id":111605765,"uuid":"361465811","full_name":"enflujo/enflujo-cms-api","owner":"enflujo","description":":rocket: El administrador de contenidos para los diferentes sitios web del laboratorio.","archived":false,"fork":false,"pushed_at":"2025-03-30T17:37:08.000Z","size":1716,"stargazers_count":0,"open_issues_count":2,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-17T09:01:37.364Z","etag":null,"topics":["administrador","api","cms","directus"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/enflujo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-04-25T15:29:02.000Z","updated_at":"2025-03-30T17:37:12.000Z","dependencies_parsed_at":"2024-03-17T19:32:03.098Z","dependency_job_id":"1e1cb307-39f9-466a-a470-eedf603dc82b","html_url":"https://github.com/enflujo/enflujo-cms-api","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/enflujo/enflujo-cms-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enflujo%2Fenflujo-cms-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enflujo%2Fenflujo-cms-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enflujo%2Fenflujo-cms-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enflujo%2Fenflujo-cms-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/enflujo","download_url":"https://codeload.github.com/enflujo/enflujo-cms-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enflujo%2Fenflujo-cms-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29600752,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T00:59:38.239Z","status":"ssl_error","status_checked_at":"2026-02-19T00:59:36.936Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["administrador","api","cms","directus"],"created_at":"2024-12-06T09:12:37.130Z","updated_at":"2026-02-19T01:32:12.812Z","avatar_url":"https://github.com/enflujo.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EnFlujo CMS + API\n\n![Estilo Código](https://github.com/enflujo/enflujo-cms-api/actions/workflows/estilo-codigo.yml/badge.svg)\n![Despliegue](https://github.com/enflujo/enflujo-cms-api/actions/workflows/despliegue.yml/badge.svg)\n![Tamaño](https://img.shields.io/github/repo-size/enflujo/enflujo-cms-api?color=%235757f7\u0026label=Tama%C3%B1o%20repo\u0026logo=open-access\u0026logoColor=white)\n![Licencia](https://img.shields.io/github/license/enflujo/enflujo-cms-api?label=Licencia\u0026logo=open-source-initiative\u0026logoColor=white)\n\n\u003cimg src=\"./docs/EnFlujo-Logo.svg\" alt=\"EnFlujo Laboratorio\" width=\"400\"\u003e\n\nEl administrador de contenidos para los diferentes sitios web del laboratorio.\n\nEs un _headless CMS_ en [Directus](https://directus.io/) independiente de las aplicaciones que construyen los sitios web. La idea es que el CMS sea un sitio único para administrar los contenidos, y que este exponga los datos por medio de un API. Usamos la nueva versión de Directus **\u003e9** que esta hecha en NodeJS (antes era PHP).\n\n:octocat: Este repositorio contiene la instancia de desarrollo del CMS pero cualquiera lo puede descargar, modificar y usarlo para otros proyectos.\n\n:construction: Los desarrolladores de EnFlujo pueden hacer PR's para actualizar el CMS que usamos en producción. Las actualizaciones a este repositorio activan las acciones de despliegue en el servidor del laboratorio por medio de [Github Actions](https://docs.github.com/en/actions)\n\n## Desarrollo\n\n:heavy_exclamation_mark: Debe tener [Docker](https://docs.docker.com/get-docker/) instalado.\n\n### Descargar repositorio\n\nDebe descargar este repositorio en su computador. Desde el terminal, ir a la carpeta donde quiere descargar los archivos y desde allí clonar este repo:\n\n```bash\ngit clone https://github.com/enflujo/enflujo-cms-api.git\n```\n\nEntrar a la carpeta que acaba de clonar:\n\n```bash\ncd enflujo-cms-api\n```\n\n### Variables ambiente `.env`\n\nCrear un archivo que se llame `.env` y copiar en este el contenido del archivo `.env.ejemplo`. Aquí se ponen todas las claves e información privada. El archivo `.env` se omite en git (ver `.gitignore`).\n\n### Iniciar contenedores Docker\n\nEste es el comando que usamos cada vez que queremos iniciar la aplicación localmente:\n\n```bash\n# Si tiene problemas o quiere ver los \"Logs\" diretamente en el terminal,\n# puede borrar -d del comando.\ndocker compose up -d\n```\n\n### Cambiar permiso de carpetas (Sólo en Linux)\n\nCambiar los permisos de las carpetas que se usan en volúmenes de docker. En Linux estas carpetas tienden a quedar bloqueadas para Directus entonces no podemos subir imágenes al CMS y en los `logs` de docker vemos este error:\n\n![Error permiso carpetas](./docs/error-permiso-carpeta-docker.png)\n\nPara solucionarlo, usar:\n\n```bash\nsudo chown -R 1000:1000 ./uploads\n```\n\nEl CMS queda disponible en: http://localhost:8055/\n\nLas credenciales del usuario predeterminado son:\n\nemail: **admin@admin.com**\n\nclave: **admin**\n\nPara apagar los contenedores:\n\n```bash\ndocker compose down\n```\n\nLa primera vez que iniciamos los contenedores se puede demorar mientras descarga las imágenes necesarias de Docker Hub. Luego de esa primera descarga, las imágenes quedan guardadas en su computador y el inicio es más rápido. _En este caso, imágenes se refiere a imágenes de Docker._\n\nLas imágenes que usa esta aplicación son (ver la configuración y versiones en `docker-compose.yaml`):\n\n- [Directus](https://hub.docker.com/r/directus/directus) para el CMS.\n- [Postgres](https://hub.docker.com/_/postgres) para la base de datos.\n- [Redis](https://hub.docker.com/_/redis) para el cache.\n\n### Persistencia de datos y archivos\n\nEn Docker, cada vez que apagamos los contenedores se pierden los datos, pero para facilitar el desarrollo vamos a tener una estructura básica de inicio y algunos assets que construyen el administrador con esta configuración inicial.\n\nEn la primera iniciada de los contenedores se van a crear unas carpetas dentro de `/enflujo-cms-api` que estarán conectadas a los contenedores por medio de [Volumes](https://docs.docker.com/storage/volumes/). Que básicamente se encargan de crear un espejo entre los archivos dentro de los contenedores y unas carpetas locales. En el `docker-compose.yaml` esta conexión se ve así:\n\nLa lógica en Docker es primero la ruta local y luego la del contenedor\n\n**local:contenedor**\n\n```yaml\n# Base de datos\n# localmente en: ./datos\n# en el contenedor: /var/lib/postgresql/data\nbd:\n  # ...\n  volumes:\n    - ./datos:/var/lib/postgresql/data\n\n# CMS\ndirectus:\n  # ...\n  volumes:\n    - ./uploads:/directus/uploads\n    - ./extensions:/directus/extensions\n```\n\nCuando iniciamos por primera vez los contenedores, el proceso se encarga de crear las carpetas locales (si no existen) y se ve algo así:\n\n```md\n/enflujo-cms-api\n/datos\n/extensions\n/uploads\n```\n\nEstas carpetas se pueden eliminar si se quiere crear una instancia de esta aplicación completamente desde cero.\n\n## Desarrolladores de EnFlujo\n\nLa instancia básica que dejamos armada en este repositorio no va a reflejar exactamente la de producción, pero tiene algunos datos iniciales para trabajar sobre la misma base.\n\n### Datos\n\nLa carpeta local `/datos` tiene la copia de los datos del contenedor `postgres`. Esta carpeta es ignorada en este repositorio ya que contiene demasiados archivos que son innecesarios. Cada uno puede tener su propia versión de `enflujo-cms-api/datos/` que va a contener cualquier cambio que hagan dentro del CMS. Pueden borrar `enflujo-cms-api/datos/` en cualquier momento para volver al estado inicial.\n\nAl crear los contenedores desde cero con `docker-compose up` se van a copiar unos datos iniciales desde el archivo `dump/datos.sql`. Estos contienen:\n\n- Los registros de la configuración general que se hace en \"Settings-\u003eProject Setting\" dentro de Directus.\n- Registros del uso que le damos a las imágenes que tenemos en `/uploads`.\n- Estructura de los datos: registros, entradas con información general, etc.\n\nEl archivo `dump/datos.sql` se debe crear de nuevo cuando cambiamos alguna imagen o se modifica la estructura de los datos. De esta manera los otros desarrolladores pueden reiniciar sus contenedores y tener la base con la nueva estructura.\n\nPara crear un nuevo **dump**, ir en el terminal a esta carpeta y ejecutar el siguiente comando:\n\n```bash\ndocker exec -t enflujo-cms-bd pg_dump -U enflujo --clean --column-inserts --if-exists --on-conflict-do-nothing \u003e ./dump/datos.sql\n```\n\n### Extensiones\n\nLa carpeta local `/extensions` la usamos para modificar los usos predeterminados de Directus. Estos pueden ser al panel de administrador o al API (crear nuevos _endpoints_ o _hooks_, por ejemplo). Ver documentación de [extensiones en Directus](https://docs.directus.io/concepts/extensions/).\n\nLos cambios en este directorio si se van a ver reflejados en producción. Para hacer cambios en las extensiones, crear un branch para cada implementación y crear PR cuando se quieran proponer a revisión.\n\n### Ejecutar comandos directamente a base de datos (postgres)\n\nA veces toca ir al contenedor a ejecutar comandos. Este es un ejemplo de como instalar las extensiones de postgis luego de tener la base de datos creada (los contenedores deben estar corriendo para que funcionen los siguientes pasos):\n\nBuscar el `CONTAINER ID` del contenedor de la base de datos usando el siguiente comando que imprime la lista de contenedores que están corriendo:\n\n```bash\ndocker ps\n```\n\nSe ve así:\n\n![Lista contenedores de Docker](./docs/lista-contenedores.png)\n\nCon el ID podemos entrar al contenedor:\n\n```bash\ndocker exec -it f06a08457661 bash\n```\n\nYa dentro del contenedor estamos en el shell bash donde podemos ejecutar comandos en el terminal que se ejecutan dentro del Linux del contenedor. En este tenemos instalado Postgres así que podemos usar comandos `psql`.\n\nCon el siguiente comando nos conectamos con la base de datos, esto asume que el usuario es **enflujo** y el nombre de la base de datos es **bdenflujo**:\n\n```bash\npsql -h localhost -p 5432 -U enflujo -W -d bdenflujo\n```\n\nConectados al postgres, podemos ejecutar comandos de SQL:\n\n```bash\nCREATE EXTENSION postgis;\n```\n\n```bash\nCREATE EXTENSION postgis_topology;\n```\n\n```bash\nCREATE EXTENSION fuzzystrmatch;\n```\n\n```bash\nCREATE EXTENSION postgis_tiger_geocoder;\n```\n\nEstos comandos instalan Postgis y las extensiones básicas. Esto no es necesario pero sirve de ejemplo para entrar al contenedor y ejecutar cosas directamente en el ambiente de contenedor.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenflujo%2Fenflujo-cms-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fenflujo%2Fenflujo-cms-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenflujo%2Fenflujo-cms-api/lists"}