diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ff19d32 --- /dev/null +++ b/Makefile @@ -0,0 +1,180 @@ +# If the first argument is one of the supported commands... +SUPPORTED_COMMANDS := restore-db _restore_db restore-db-dev _restore_db_dev +SUPPORTS_MAKE_ARGS := $(findstring $(firstword $(MAKECMDGOALS)), $(SUPPORTED_COMMANDS)) +ifneq "$(SUPPORTS_MAKE_ARGS)" "" + # use the rest as arguments for the command + COMMAND_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) + # ...and turn them into do-nothing targets + $(eval $(COMMAND_ARGS):;@:) +endif + + +# Build and development command + +clone-front: + git clone https://github.com/BibCnrs/bibcnrs-front.git + +clone-api: + git clone -b v4 https://github.com/BibCnrs/BibApi.git bibcnrs-api + +clone-admin: + git clone -b v4 https://github.com/BibCnrs/BibAdmin.git bibcnrs-admin + +update-front: + cd bibcnrs-front && \ + git pull && \ + cd .. + +update-api: + cd bibcnrs-api && \ + git pull && \ + cd .. + +update-admin: + cd bibcnrs-admin && \ + git pull && \ + cd .. + +update-aio: + git pull + +install-front: + cd bibcnrs-front && \ + make install && \ + cd .. + +install-api: + cd bibcnrs-api && \ + make install && \ + cd .. + +install-admin: + cd bibcnrs-admin && \ + make install && \ + cd .. + +build-front: + cd bibcnrs-front && \ + make build && \ + cd .. + +build-api: + cd bibcnrs-api && \ + make build && \ + cd .. + +build-admin: + cd bibcnrs-admin && \ + make build && \ + cd .. + +clone: clone-front clone-api clone-admin + +update: update-front update-api update-admin update-aio + +push-latest-docker-image: + docker push vxnexus-registry.intra.inist.fr:8083/bibcnrs/front:latest + docker push vxnexus-registry.intra.inist.fr:8083/bibcnrs/api:latest + docker push vxnexus-registry.intra.inist.fr:8083/bibcnrs/admin:latest + +build: build-front build-api build-admin + +install: install-front install-api install-admin + +build-push-preprod-inist: + make build + docker push vxnexus-registry.intra.inist.fr:8083/bibcnrs/front:preprod-inist-latest + docker push vxnexus-registry.intra.inist.fr:8083/bibcnrs/api:preprod-inist-latest + docker push vxnexus-registry.intra.inist.fr:8083/bibcnrs/admin:preprod-inist-latest + +cleanup-dev-docker: ## remove all bibcnrs-front docker image + test -z "$$(docker ps -a | grep bibcnrs-dev)" || \ + docker rm --force $$(docker ps -a | grep bibcnrs-dev | awk '{ print $$1 }') + +run-dev: + make cleanup-dev-docker + docker compose -f docker-compose.dev.yml up --force-recreate + +save-db-dev: ## create postgres dump for prod database in backups directory with given name or default to current date + docker exec bibcnrs-dev-api-postgres bash -c 'PGPASSWORD=secret pg_dump --username postgres bibapi-dev > /backups/$(shell date +%Y_%m_%d_%H_%M_%S).sql' + +restore-db-dev: ## restore a given dump to the postgres database list all dump if none specified +ifdef COMMAND_ARGS + @make _pre_restore_db_dev + @make _restore_db_dev $(COMMAND_ARGS) + @make _post_restore_db_dev +else + echo 'please specify backup to restore': + @ls -h ./backups +endif + +_pre_restore_db_dev: + docker compose -f docker-compose.dev.yml stop + docker compose -f docker-compose.dev.yml start bibcnrs-dev-api-postgres + +_post_restore_db_dev: + docker compose -f docker-compose.dev.yml stop + +_restore_db_dev: + docker exec bibcnrs-dev-api-postgres bash -c 'PGPASSWORD=secret dropdb --username postgres bibapi-dev' + docker exec bibcnrs-dev-api-postgres bash -c 'PGPASSWORD=secret createdb --username postgres bibapi-dev' || true + docker exec bibcnrs-dev-api-postgres bash -c 'ls && psql -f /backups/$(COMMAND_ARGS) postgres://postgres:secret@bibcnrs-dev-api-postgres:5432/bibapi-dev' + +cleanup-admin-docker: ## remove all bibcnrs-front docker image + test -z "$$(docker ps -a | grep bibcnrs-admin)" || \ + docker rm --force $$(docker ps -a | grep bibcnrs-front | awk '{ print $$1 }') + +cleanup-api-docker: ## remove all bibcnrs-front docker image + test -z "$$(docker ps -a | grep bibcnrs-api)" || \ + docker rm --force $$(docker ps -a | grep bibcnrs-front | awk '{ print $$1 }') + +cleanup-front-docker: ## remove all bibcnrs-front docker image + test -z "$$(docker ps -a | grep bibcnrs-front)" || \ + docker rm --force $$(docker ps -a | grep bibcnrs-front | awk '{ print $$1 }') + +cleanup-docker: cleanup-admin-docker cleanup-api-docker cleanup-front-docker + +create-test-alert: ## args: create alert for every search in history + docker exec -it bibcnrs-dev-api node bin/createAlertForTest.js $(COMMAND_ARGS) + +search_alert_dev: ## search alert cron command + docker exec bibcnrs-dev-api node bin/searchAlert.js + +# Production command + +start: + docker compose up -d + +stop: + docker compose down + +search_alert: ## search alert cron command + docker exec bibcnrs-api node bin/searchAlert.js + +clear_history: ## Clear search history entries older than 2 months + docker exec bibcnrs-api node ./bin/cleanOldHistoryEntries.js + +save-db: ## create postgres dump for prod database in backups directory with given name or default to current date + docker exec bibcnrs-api-postgres bash -c 'PGPASSWORD=$$POSTGRES_PASSWORD pg_dump --username $$POSTGRES_USER $$POSTGRES_DB > /backups/$(shell date +%Y_%m_%d_%H_%M_%S).sql' + +_pre_restore_db: + docker compose -f docker-compose.yml stop + docker compose -f docker-compose.yml start bibcnrs-api-postgres + +_post_restore_db: + docker compose -f docker-compose.yml stop + +_restore_db: save-db + docker exec bibcnrs-api-postgres bash -c 'PGPASSWORD=$$POSTGRES_PASSWORD dropdb --username $$POSTGRES_USER $$POSTGRES_DB' + docker exec bibcnrs-api-postgres bash -c 'PGPASSWORD=$$POSTGRES_PASSWORD createdb --username $$POSTGRES_USER $$POSTGRES_DB' || true + docker exec bibcnrs-api-postgres bash -c 'psql -f /backups/$(COMMAND_ARGS) postgres://$$POSTGRES_USER:$$POSTGRES_PASSWORD@bibcnrs-api-postgres:5432/$$POSTGRES_DB' + +restore-db: ## restore a given dump to the postgres database list all dump if none specified +ifdef COMMAND_ARGS + @make _pre_restore_db + @make _restore_db $(COMMAND_ARGS) + @make _post_restore_db_dev +else + echo 'please specify backup to restore': + @ls -h ./backups +endif diff --git a/README.md b/README.md new file mode 100644 index 0000000..d25701b --- /dev/null +++ b/README.md @@ -0,0 +1,126 @@ +# BibCNRS All-In-One / BibAIO + +Ce module permet installation, build, lancement des modules : + - bibcnrs-front + - bibcnrs-api (bibapi actuel baranche v4) + - bibcnrs-admin (bibadmin actuel branche v4) + +## Cartographie + +Sur production actuelle sur vpportail : 5 users applis : bibezproxy (inclus aussi bibbliomap ?) bibrp bibapi bibadmin bibcnrs +Sur pre-prod V4 en test sur vibibcnrs : 3 users applis : bibezproxy (inclus aussi bibbliomap ?) bibrp bibcnrs + +### Les données + +- dump + - backup bdd postgresql sous dossier backup + +### Les logs + +- logs bibapi sous /applis/bibapi/home/BibApi/logs/ + - ebsco.log // infos appels http ebsco + - bibapi_http.log // info clique sur lien oa, utilisée par ezMesure + - alert.log // infos traitement de nuit des alertes + - files.log // infos des fichier uploadés + +- logs ezproxy sous /applis/bibezproxy/home/BibEzProxy/logs/ + - insb.log inshs.log XXX.log // une log par domaine + - +- logs bibrp sous + + +### Les fichiers config + +### Les variables +- /applis/bibcnrs/home/etc/env.d/bibcnrs + //version images déployées + - BIBAPI_VERSION + - BIBFRONT_VERSION + - BIBADMIN_VERSION + + - NODE_ENV // pour le fichier de config bibapi + - SOURCE_MAP // utile en dev/debeug pour voir les sources + + // url API que le front appelle + - BIBAPI_HOST + - BIB_CONTENT_DELIVERY_HOST // url du serveur de fichier + - ebsco_host + - EZ_UNPAYWALL_URL + - DOAJ_URL // sur issn eissn pour info diamant + - crossref // url en dur sur doi recup info titre ... pour retry rech ebsco + - METADORE_URL + + // infos serveur mail + - MAIL_SERVER_PORT + - MAIL_SERVER_HOST + +- /applis/bibrp/home/etc/env.d/bibrp + - APPLI_APACHE_SERVERNAME + - APPLI_APACHE_SERVERADMIN + - APPLI_APACHE_LOGLEVEL + + - DOCKER_HOST_IP + + - ENTITY_ID // le sp de la decl renater + - bibrp_version // version de l'image déployée + +- /applis/bibezproxy/home/etc/env.d/bibezproxy + - NODE_ENV + + - bibezproxy_version + + - EZ_TICKET_SECRET + - EZ_TICKET_URL // route ezticket de bibapi + - GATE_SUFFIX + +### Les secrets + - DB_PASSWORD // plus utile le pwd base wordpress + + // info pour connexion base postgresql + - POSTGRES_USER + - POSTGRES_PASSWORD + - POSTGRES_DB + - POSTGRES_HOST + + // clé api (interne) ezUnpaywall et metadore + - EZ_UNPAYWALL_KEY + - METADORE_API_KEY + + // utile bibapi actuel crypto.randomBytes(32).toString('hex') + - header_secret + - cookie_secret + - admin_secret + - ticket_secret + +// info connexion interface menu ezproxy ? + - ADMIN_LOGIN + - ADMIN_PASSWORD + +### Les dossiers + +- backups + - Contient les copies de la base de donnée postgres +- logs + - Contient les logs de l'application en mode production +- uploads + - Contient les fichiers uploads via BibAdmin en mode production +- nginx + - Contient les configurations nginx + +### Les ports des applications + +- BibCNRS-Front + - dev : 5173 + - prod : 8080 +- BibCNRS-Admin + - dev : 3011 + - prod : 8081 +- BibCNRS-Content-Delivery + - prod : 8082 +- BibCNRS-Api : + - dev : 3000 + - prod : 3000 +- MailDev + - dev : 1080 +- Adminer + - dev : 8080 diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..6466bbd --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,126 @@ +version: "3.5" + +services: + bibcnrs-dev-proxy: + container_name: bibcnrs-dev-proxy + image: nginx:1.24-alpine + volumes: + - ./nginx/dev-proxy.nginx.conf:/etc/nginx/conf.d/default.conf + - ./bibcnrs-api/uploads:/usr/share/nginx/html + ports: + - "8000:8000" + depends_on: + bibcnrs-dev-api: + condition: service_healthy + bibcnrs-dev-front: + condition: service_started + bibcnrs-dev-admin: + condition: service_started + bibcnrs-dev-api-adminer: + condition: service_started + bibcnrs-dev-api-mail: + condition: service_started + networks: + - bib-frontend-network + + bibcnrs-dev-front: + container_name: bibcnrs-dev-front + extends: + file: bibcnrs-front/docker-compose.dev.aio.yml + service: bibcnrs-front-dev-server + working_dir: /app + ports: + - "5173:5173" + volumes: + - ./bibcnrs-front:/app + networks: + - bib-frontend-network + + bibcnrs-dev-admin: + container_name: bibcnrs-dev-admin + extends: + file: bibcnrs-admin/docker-compose.dev.aio.yml + service: bibcnrs-admin-dev-server + working_dir: /app + ports: + - "3011:3011" + volumes: + - ./bibcnrs-admin:/app + networks: + - bib-frontend-network + + bibcnrs-dev-api: + container_name: bibcnrs-dev-api + extends: + file: bibcnrs-api/docker-compose.dev.aio.yml + service: bibcnrs-api-dev-server + working_dir: /app + ports: + - "3000:3000" + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:3000/ebsco/domains" ] + interval: 10s + retries: 10 + volumes: + - ./bibcnrs-api:/app + depends_on: + - bibcnrs-dev-api-postgres + - bibcnrs-dev-api-mail + - bibcnrs-dev-api-redis + networks: + - bib-backend-network + - bib-frontend-network + + bibcnrs-dev-api-adminer: + container_name: bibcnrs-dev-api-adminer + depends_on: + - bibcnrs-dev-api-postgres + image: adminer:4 + ports: + - "8080:8080" + networks: + - bib-frontend-network + - bib-backend-network + + # Application database + bibcnrs-dev-api-postgres: + container_name: bibcnrs-dev-api-postgres + image: postgres:13 + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: secret + POSTGRES_DB: bibapi-dev + PGDATA: /var/lib/postgresql/data/pgdata + volumes: + - ./backups:/backups + - ./bibcnrs-api/postgresql-dev:/var/lib/postgresql/data/pgdata + ports: + - "5432:5432" + networks: + - bib-backend-network + + # Cache database + bibcnrs-dev-api-redis: + container_name: bibcnrs-dev-api-redis + image: redis:6.2.6 + networks: + - bib-backend-network + + # Mail dev server + bibcnrs-dev-api-mail: + image: maildev/maildev:2.0.5 + container_name: bibcnrs-dev-api-mail + ports: + - "1080:1080" + - "1025:1025" + networks: + - bib-frontend-network + - bib-backend-network + +networks: + bib-backend-network: + driver: bridge + name: bib-backend-network + bib-frontend-network: + driver: bridge + name: bib-frontend-network \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7ee4e5c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,110 @@ +version: "3.5" + +services: + # Application portal + bibcnrs-front: + image: vxnexus-registry.intra.inist.fr:8083/bibcnrs/front:${BIBFRONT_VERSION} + container_name: bibcnrs-front + ports: + - "8080:8080" + networks: + - bib-frontend-network + + # Application back office + bibcnrs-admin: + image: vxnexus-registry.intra.inist.fr:8083/bibcnrs/admin:${BIBADMIN_VERSION} + container_name: bibcnrs-admin + ports: + - "8081:8081" + restart: always + networks: + - bib-frontend-network + + # Content delivery + bibcnrs-content-delivery: + container_name: bibcnrs-content-delivery + image: nginx:1.24-alpine + volumes: + - ./nginx/content-delivery.nginx.conf:/etc/nginx/conf.d/default.conf + - ./uploads:/usr/share/nginx/html + ports: + - "8082:8082" + networks: + - bib-frontend-network + + # Application api + bibcnrs-api: + image: vxnexus-registry.intra.inist.fr:8083/bibcnrs/api:${BIBAPI_VERSION} + container_name: bibcnrs-api + volumes: + - ./uploads:/app/uploads + - ./logs:/app/logs + environment: + NODE_ENV: ${NODE_ENV} + http_proxy: ${http_proxy} + https_proxy: ${https_proxy} + BIBAPI_HOST: ${BIBAPI_HOST} + BIB_CONTENT_DELIVERY_HOST: ${BIB_CONTENT_DELIVERY_HOST} + ebsco_host: ${ebsco_host} + header_secret: ${header_secret} + cookie_secret: ${cookie_secret} + admin_secret: ${admin_secret} + ticket_secret: ${ticket_secret} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + MAIL_SERVER_HOST: ${MAIL_SERVER_HOST} + MAIL_SERVER_PORT: ${MAIL_SERVER_PORT} + EZ_UNPAYWALL_URL: ${EZ_UNPAYWALL_URL} + EZ_UNPAYWALL_KEY: ${EZ_UNPAYWALL_KEY} + DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@bibcnrs-api-postgres:5432/${POSTGRES_DB} + METADORE_URL: ${METADORE_URL} + METADORE_API_KEY: ${METADORE_API_KEY} + DOAJ_URL: ${DOAJ_URL} + # Database host is the name of the database services + POSTGRES_HOST: bibcnrs-api-postgres + REDIS_HOST: bibcnrs-api-redis + restart: always + ports: + - "3000:3000" + depends_on: + - bibcnrs-api-redis + - bibcnrs-api-postgres + networks: + - bib-backend-network + - bib-frontend-network + command: node launcher.js + + # Application database + bibcnrs-api-postgres: + container_name: bibcnrs-api-postgres + image: postgres:13 + restart: always + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + PGDATA: /var/lib/postgresql/data/pgdata + volumes: + - ./backups:/backups + - ./postgresql:/var/lib/postgresql/data/pgdata + ports: + - "60000:5432" + networks: + - bib-backend-network + + # Cache database + bibcnrs-api-redis: + container_name: bibcnrs-api-redis + image: redis:6.2.6 + restart: always + networks: + - bib-backend-network + +networks: + bib-backend-network: + driver: bridge + name: bib-backend-network + bib-frontend-network: + driver: bridge + name: bib-frontend-network \ No newline at end of file diff --git a/exp-env.sh b/exp-env.sh new file mode 100755 index 0000000..ddb3156 --- /dev/null +++ b/exp-env.sh @@ -0,0 +1,3 @@ +export BIBAPI_VERSION=latest +export BIBFRONT_VERSION=latest +export BIBADMIN_VERSION=latest \ No newline at end of file diff --git a/nginx/content-delivery.nginx.conf b/nginx/content-delivery.nginx.conf new file mode 100644 index 0000000..bb9fffd --- /dev/null +++ b/nginx/content-delivery.nginx.conf @@ -0,0 +1,14 @@ +server { + listen 8082; + sendfile on; + default_type application/octet-stream; + + gzip on; + gzip_comp_level 9; + gzip_proxied any; + gzip_vary on; + gzip_static on; + gzip_types *; + + root /usr/share/nginx/html; +} diff --git a/nginx/dev-proxy.nginx.conf b/nginx/dev-proxy.nginx.conf new file mode 100644 index 0000000..4d55820 --- /dev/null +++ b/nginx/dev-proxy.nginx.conf @@ -0,0 +1,36 @@ +server { + listen 8000; + + location / { + proxy_pass http://bibcnrs-dev-front:5173; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + } + + location /api { + rewrite /api/(.*) /$1 break; + proxy_pass http://bibcnrs-dev-api:3000; + } + + location /admin { + proxy_pass http://bibcnrs-dev-admin:3011; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + } + + location /dev/adminer { + rewrite /dev/adminer/(.*) /$1 break; + proxy_pass http://bibcnrs-dev-api-adminer:8080; + } + + location /dev/maildev { + rewrite /dev/maildev/(.*) /$1 break; + proxy_pass http://bibcnrs-dev-api-mail:1080; + } + + location /files { + root /usr/share/nginx/html; + } +}