From e027252ce7711d3b1d0d1cd388fd0e0a8de7253d Mon Sep 17 00:00:00 2001
From: Brieuc Dubois <git@bhasher.com>
Date: Wed, 12 Feb 2025 11:07:50 +0100
Subject: [PATCH] Dev server

---
 .gitlab-ci.yml           | 26 ++++++++++++++++++++-
 backend/alembic.dev.ini  | 49 ++++++++++++++++++++++++++++++++++++++++
 backend/alembic.prod.ini | 49 ++++++++++++++++++++++++++++++++++++++++
 docker-compose.yaml      | 41 +++++++++++++++++++++++++++++++--
 scripts/update.dev.sh    | 20 ++++++++++++++++
 scripts/update.sh        |  7 ++++--
 6 files changed, 187 insertions(+), 5 deletions(-)
 create mode 100644 backend/alembic.dev.ini
 create mode 100644 backend/alembic.prod.ini
 create mode 100644 scripts/update.dev.sh

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7b759509..17bebf24 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -41,7 +41,31 @@ docker_deploy:
   stage: deploy
   only:
     - main
-    - feat/cd
   image: alpine:latest
   script:
     - echo "/mnt/data/languagelab/repo/scripts/update.sh" > /mnt/pipeline
+
+build-dev:
+  stage: build
+  only:
+    - dev
+  image: docker:latest
+  services:
+    - docker:dind
+  before_script:
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+  parallel:
+    matrix:
+      - COMPONENT: [frontend, backend]
+  script:
+    - docker build -t $CI_REGISTRY/sbibauw/languagelab:${COMPONENT}-dev $COMPONENT
+    - docker push $CI_REGISTRY/sbibauw/languagelab:${COMPONENT}-dev
+
+docker_deploy-dev:
+  stage: deploy
+  only:
+    - dev
+    - feat/cd
+  image: alpine:latest
+  script:
+    - echo "/mnt/data/languagelab/repo/scripts/update.dev.sh" > /mnt/pipeline
diff --git a/backend/alembic.dev.ini b/backend/alembic.dev.ini
new file mode 100644
index 00000000..1d465ade
--- /dev/null
+++ b/backend/alembic.dev.ini
@@ -0,0 +1,49 @@
+
+[alembic]
+script_location = alembic
+
+prepend_sys_path = .
+
+version_path_separator = os
+
+sqlalchemy.url = sqlite:////mnt/data/languagelab/db.dev.sqlite3
+
+[post_write_hooks]
+hooks = black
+black.type = console_scripts
+black.entrypoint = black
+black.options = -l 79
+
+[loggers]
+keys = root,sqlalchemy,alembic
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = WARNING
+handlers = console
+qualname =
+
+[logger_sqlalchemy]
+level = WARNING
+handlers =
+qualname = sqlalchemy.engine
+
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %H:%M:%S
diff --git a/backend/alembic.prod.ini b/backend/alembic.prod.ini
new file mode 100644
index 00000000..9b45a196
--- /dev/null
+++ b/backend/alembic.prod.ini
@@ -0,0 +1,49 @@
+
+[alembic]
+script_location = alembic
+
+prepend_sys_path = .
+
+version_path_separator = os
+
+sqlalchemy.url = sqlite:////mnt/data/languagelab/db.sqlite3
+
+[post_write_hooks]
+hooks = black
+black.type = console_scripts
+black.entrypoint = black
+black.options = -l 79
+
+[loggers]
+keys = root,sqlalchemy,alembic
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = WARNING
+handlers = console
+qualname =
+
+[logger_sqlalchemy]
+level = WARNING
+handlers =
+qualname = sqlalchemy.engine
+
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %H:%M:%S
diff --git a/docker-compose.yaml b/docker-compose.yaml
index f3907d43..f43f4dab 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -12,7 +12,6 @@ services:
     labels:
       - "traefik.enable=true"
       - "traefik.http.routers.frontend.rule=Host(`languagelab.be`)"
-      #- "traefik.http.routers.frontend.rule=Host(`languagelab.sipr.ucl.ac.be`)"
       - "traefik.http.routers.frontend.tls=true"
       - "traefik.http.services.frontend.loadbalancer.server.port=8080"
 
@@ -38,7 +37,45 @@ services:
       - "traefik.http.routers.backend.tls=true"
       - "traefik.http.services.backend.loadbalancer.server.port=8000"
       - "traefik.http.routers.backend.rule=Host(`languagelab.be`) && (PathPrefix(`/tmp-api`) || PathPrefix(`/docs`) || PathPrefix(`/openapi.json`))"
-      #- "traefik.http.routers.backend.rule=Host(`languagelab.sipr.ucl.ac.be`) && (PathPrefix(`/tmp-api`) || PathPrefix(`/docs`) || PathPrefix(`/openapi.json`))"
+
+  languagelab-frontend-dev:
+    container_name: languagelab-frontend-dev
+    image: registry.forge.uclouvain.be/sbibauw/languagelab:frontend-dev
+    volumes:
+      - /etc/timezone:/etc/timezone:ro
+      - /etc/localtime:/etc/localtime:ro
+    depends_on:
+      - languagelab-backend-dev
+    networks:
+      - external
+    labels:
+      - "traefik.enable=true"
+      - "traefik.http.routers.frontend.rule=Host(`beta.dev.languagelab.be`)"
+      - "traefik.http.routers.frontend.tls=true"
+      - "traefik.http.services.frontend.loadbalancer.server.port=8080"
+
+  languagelab-backend-dev:
+    container_name: languagelab-backend-dev
+    image: registry.forge.uclouvain.be/sbibauw/languagelab:backend-dev
+    environment:
+      - DATABASE_URL=sqlite:////data/db.dev.sqlite3
+      - JWT_SECRET_KEY=${LANGUAGELAB_JWT_SECRET_KEY}
+      - JWT_REFRESH_SECRET_KEY=${LANGUAGELAB_JWT_REFRESH_SECRET_KEY}
+      - ADMIN_EMAIL=${LANGUAGELAB_ADMIN_EMAIL}
+      - ADMIN_PASSWORD=${LANGUAGELAB_ADMIN_PASSWORD}
+      - CALCOM_SECRET=${LANGUAGELAB_CALCOM_SECRET}
+      - ALLOWED_ORIGINS=https://beta.dev.languagelab.be,https://api.dev.languagelab.be
+    volumes:
+      - /mnt/data/languagelab/backend:/data
+      - /etc/timezone:/etc/timezone:ro
+      - /etc/localtime:/etc/localtime:ro
+    networks:
+      - external
+    labels:
+      - "traefik.enable=true"
+      - "traefik.http.routers.backend.tls=true"
+      - "traefik.http.services.backend.loadbalancer.server.port=8000"
+      - "traefik.http.routers.backend.rule=Host(`beta.dev.languagelab.be`) && (PathPrefix(`/tmp-api`) || PathPrefix(`/docs`) || PathPrefix(`/openapi.json`))"
 
   traefik:
     container_name: traefik
diff --git a/scripts/update.dev.sh b/scripts/update.dev.sh
new file mode 100644
index 00000000..30504586
--- /dev/null
+++ b/scripts/update.dev.sh
@@ -0,0 +1,20 @@
+echo "STARTED DEV UPDATE AT $(date)" > /tmp/docker_update
+
+cd /mnt/data/languagelab/repo/
+git checkout dev
+git pull
+
+cd /mnt/data/languagelab/repo/
+source app/.env/bin/activate
+cd backend
+alembic -c alembic.dev.ini upgrade head
+
+cd /mnt/data/languagelab/repo/
+docker compose up -d
+
+cd /mnt/data/languagelab/repo/scripts/surveys
+python3 survey_maker.py < .creds
+
+git checkout main
+
+echo "END DEV UPDATE AT $(date)" >> /tmp/docker_update
diff --git a/scripts/update.sh b/scripts/update.sh
index 13f7acad..2532ce3e 100755
--- a/scripts/update.sh
+++ b/scripts/update.sh
@@ -1,12 +1,15 @@
 echo "STARTED UPDATE AT $(date)" > /tmp/docker_update
 
+cd /mnt/data/languagelab/repo/
+git checkout main
+git pull
+
 cd /mnt/data/languagelab/repo/
 source app/.env/bin/activate
 cd backend
-alembic upgrade head
+alembic -c alembic.prod.ini upgrade head
 
 cd /mnt/data/languagelab/repo/
-git pull
 docker compose up -d
 
 cd /mnt/data/languagelab/repo/scripts/surveys
-- 
GitLab