Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
63e793a
♻️(collaboration) switch collaboration server from hocuspocus to yhub
dmonad Aug 3, 2026
4e893ef
📄(collaboration) add license notice for yhub-server directory
dmonad Aug 4, 2026
7ea5247
✨(backend) add a service generating cached RS256 JWT tokens
lunika Aug 4, 2026
cb58076
✨(backend) publish the JWT public key on a JWKS endpoint
lunika Aug 4, 2026
58e577b
✨(backend) add a method to create a dedicated admin token
lunika Aug 4, 2026
1cb1c23
🔧(dev) generate the JWT signing key when bootstrapping the dev stack
lunika Aug 4, 2026
7cbee2f
🔥(ci) remove checking print statement in lint-git
lunika Aug 4, 2026
27c1f8d
🔥(backend) remove `CollaborationService` and `can-edit` endpoint
lunika Aug 4, 2026
49089c3
✨(collaboration) add admin reset-connections endpoint on yhub 0.4.0
dmonad Aug 5, 2026
2a46427
🛂(django) use jwt token for converter services
AntoLC Aug 4, 2026
23e03cc
🛂(y-provider) verify jwt token instead of the shared api key
AntoLC Aug 4, 2026
65e2730
🔥(helm) remove occurences of Y_PROVIDER_API_KEY
AntoLC Aug 4, 2026
921e4c3
🛂(backend) add audience to jwt
AntoLC Aug 5, 2026
349f092
✨(collaboration) add create-ydoc endpoint on yhub
dmonad Aug 5, 2026
dc76f90
🔒️(collaboration) harden the create-ydoc endpoint
dmonad Aug 5, 2026
6f0bdc7
🔥(frontend) remove "can-edit" mechanism
AntoLC Aug 5, 2026
c444096
🔥(project) remove occurences of COLLABORATION_SERVER_SECRET
AntoLC Aug 5, 2026
ba8630b
🔥(frontend) remove content GET PATCH
AntoLC Aug 5, 2026
a8ebe57
🙈(dev) ignore playwright-mcp browser artifacts
dmonad Aug 5, 2026
fe8165d
✨(collaboration) soft-migrate legacy S3 documents into yhub
dmonad Aug 5, 2026
d70a57b
📝(changelog) note that get-connections is dropped, not deferred
dmonad Aug 6, 2026
00ac755
🔒️(collaboration) reject admin jwts not issued for the yhub audience
dmonad Aug 6, 2026
4c60fc5
✨(collaboration) replay legacy s3 version history into yhub
dmonad Aug 7, 2026
3869fea
✅(collaboration) test the legacy migrations against a real yhub
dmonad Aug 10, 2026
ee2d1e4
⬆️(yhub) upgrade yhub to version 0.6.0
lunika Aug 12, 2026
49e4160
♻️(yhub) maintain database schema using npm run init-db
lunika Aug 12, 2026
e06bfa9
🔧(collaboration) adapt docker stack for development purpose
lunika Aug 12, 2026
d9294ef
🛂(y-provider) verify jwt token instead of the shared api key
AntoLC Aug 4, 2026
9d9c706
✨(backend) add a service to call the yhub REST API
lunika Aug 5, 2026
3b9318d
♻️(backend) audience is an enum to be used by the JWTService
lunika Aug 5, 2026
4d17b32
✨(backend) implement reset-connections and create-ydoc in YHubService
lunika Aug 5, 2026
b3ad1d1
⏪️(backend) reintroduce the reset connection mechanism
lunika Aug 5, 2026
e9bf22f
✨(backend) call YHubService to seed initial document content
lunika Aug 6, 2026
c3ef559
✨(collaboration) add a get-ydoc endpoint on yhub
lunika Aug 6, 2026
9301d06
✨(backend) duplicate a document through the collaboration server
lunika Aug 6, 2026
0ffb688
💥(backend) remove the `documents/{id}/content/` endpoint
lunika Aug 6, 2026
661a060
✨(backend) serve `documents/{id}/formatted-content/` from yhub
lunika Aug 6, 2026
57065e8
✨(collaboration) notify the backend when the worker persists new content
lunika Aug 7, 2026
e798232
♻️(backend) index the content of a document from updated_content endp…
lunika Aug 7, 2026
12af5fa
♻️(backend) duplicate the onboarding sandbox using YHub service
lunika Aug 7, 2026
bd4c6c0
♻️(backend) take adavantage of yhub 0.5.0 json encoding returns
lunika Aug 10, 2026
b4bc386
🔥(yhub) remove custom endpoint get-ydoc
lunika Aug 10, 2026
7376ba6
♻️(backend) seed the content of the demo documents using yhub
lunika Aug 10, 2026
da22054
♻️(backend) remove usage of s3 for document.content in tests
lunika Aug 10, 2026
a832ac2
✅(backend) correctly reload urls in tests
lunika Aug 10, 2026
a6fdc6d
✨(backend) add a `migrate_documents` command
lunika Aug 10, 2026
a3dec08
✨(yhub) add a restore endpoint
lunika Aug 12, 2026
37ec23d
✨(backend) wired soft deletion with yhub server
lunika Aug 12, 2026
9904667
🐛(frontend) stop reconnecting to the websocket based on the status code
lunika Aug 12, 2026
2aff9da
✨(collaboration) erase content in yhub from clean_document command
lunika Aug 12, 2026
ec002ae
✨(helm) deploy new infra using helm
lunika Aug 13, 2026
04a0b89
✨(yhub) add custom probes more efficient
lunika Aug 13, 2026
f59588c
✨(yhub) allow to configure yhub worker and server
lunika Aug 13, 2026
a423f05
🔧(thub) allow to configure task concurrency
lunika Aug 14, 2026
55c9b22
🔧(yhub) allow to configure every createYHub parameters
lunika Aug 14, 2026
a50374f
♻️(yhub) prefix S3 envirionment variables used by the migration
lunika Aug 14, 2026
3d27b84
♻️(yhub) create dedicated file for environment variables in development
lunika Aug 14, 2026
b949f7a
♻️(yhub) replace minio client by S3 sdk
lunika Aug 14, 2026
1d306e6
✨(backend) allow too migrate a specific document
lunika Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ __pycache__
**/*.pyc
venv
.venv
# the pattern above only matches at the root, and every image is built from
# there: without this one, the backend virtualenv travels to the daemon on
# every build
**/.venv

# System-specific files
.DS_Store
Expand Down Expand Up @@ -34,4 +38,7 @@ db.sqlite3

# Frontend
node_modules
# same as .venv above: nested ones are not matched by the pattern above, and no
# image copies them — every one of them runs its own install
**/node_modules
**/.next
15 changes: 15 additions & 0 deletions .github/workflows/docker-hub.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,26 @@ jobs:
should_push: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') }}
docker_user: 1001:127

build-and-push-yhub:
uses: ./.github/workflows/docker-publish.yml
permissions:
contents: read
secrets: inherit
with:
image_name: lasuite/impress-yhub
context: .
file: src/yhub-server/Dockerfile
target: yhub
should_push: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') }}
# no docker_user: the image defaults to uid 1000, the `node` user the
# base image already declares in /etc/passwd

notify-argocd:
needs:
- build-and-push-backend
- build-and-push-frontend
- build-and-push-y-provider
- build-and-push-yhub
runs-on: ubuntu-latest
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview')
steps:
Expand Down
47 changes: 47 additions & 0 deletions .github/workflows/ghcr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -158,3 +158,50 @@ jobs:
run: |
docker system prune -af
docker volume prune -f

build-and-push-yhub:
runs-on: ubuntu-latest
if: github.event.repository.fork == true
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Set up QEMU
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6
with:
images: ${{ env.REGISTRY }}/${{ github.repository }}/yhub
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=sha
- name: Login to GHCR
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
with:
context: .
file: ./src/yhub-server/Dockerfile
target: yhub
platforms: linux/amd64,linux/arm64
build-args: DOCKER_USER=${{ env.DOCKER_USER }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
- name: Cleanup Docker after build
if: always()
run: |
docker system prune -af
docker volume prune -f
76 changes: 72 additions & 4 deletions .github/workflows/impress.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,6 @@ jobs:
fetch-depth: 0
- name: show
run: git log
- name: Enforce absence of print statements in code
if: always()
run: |
! git diff origin/${{ github.event.pull_request.base.ref }}..HEAD -- src/backend ':(exclude)**/impress.yml' | grep "print("
- name: Check absence of fixup commits
if: always()
run: |
Expand Down Expand Up @@ -132,6 +128,13 @@ jobs:
# needed because the postgres container does not provide a healthcheck
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5

# message stream for the collaboration server (see the yhub steps below)
valkey:
image: valkey/valkey:alpine
ports:
- 6379:6379
options: --health-cmd "valkey-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5

env:
DJANGO_CONFIGURATION: Test
DJANGO_SETTINGS_MODULE: impress.settings
Expand All @@ -146,6 +149,12 @@ jobs:
AWS_S3_ENDPOINT_URL: http://localhost:9000
AWS_S3_ACCESS_KEY_ID: impress
AWS_S3_SECRET_ACCESS_KEY: password
# Collaboration server. The integration tests reach it over this url and
# skip themselves when nothing answers; yhub reads the JWKS back from the
# django server started alongside it, so both sides must share
# JWT_PRIVATE_KEY_FILE.
COLLABORATION_API_URL: http://localhost:3002/collaboration
JWT_PRIVATE_KEY_FILE: ${{ github.workspace }}/data/jwt/private.pem

steps:
- name: Checkout repository
Expand Down Expand Up @@ -207,8 +216,67 @@ jobs:
sudo apt-get install -y gettext pandoc shared-mime-info
sudo wget https://raw.githubusercontent.com/suitenumerique/django-lasuite/refs/heads/main/assets/conf/mime.types -O /etc/mime.types

# --- collaboration server -------------------------------------------
# The yhub integration tests drive a real collaboration server: it reads
# legacy documents out of MinIO and reads this backend's JWKS back to
# verify the admin token the tests mint, so the two must share the
# signing key. Tests skip themselves when nothing answers on
# COLLABORATION_API_URL.
- name: Generate the JWT signing key
working-directory: .
run: bin/generate-jwt-private-key.sh

- name: Generate a MO file from strings extracted from the project
run: uv run python manage.py compilemessages

- name: Set up Node
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: "22.x"

- name: Install the collaboration server
working-directory: src/yhub-server
run: npm ci --omit=dev

# yhub ships its own DDL and creates the database as well, so this needs
# the dependencies installed above — hence its place after them
- name: Create the collaboration server database
working-directory: src/yhub-server
env:
POSTGRES: postgres://dinum:pass@localhost:5432/yhub
run: npm run init-db

- name: Start the backend for the collaboration server to authenticate against
env:
DJANGO_ALLOWED_HOSTS: "*"
run: |
nohup uv run python manage.py runserver 0.0.0.0:8000 --noreload \
> /tmp/backend.log 2>&1 &
dockerize -wait http://localhost:8000/api/v1.0/jwks -timeout 60s

- name: Start the collaboration server
working-directory: src/yhub-server
env:
PORT: 3002
REDIS: redis://localhost:6379
POSTGRES: postgres://dinum:pass@localhost:5432/yhub
REDIS_PREFIX: yhub
COLLABORATION_BACKEND_BASE_URL: http://localhost:8000
COLLABORATION_SERVER_ORIGIN: http://localhost:3000
# the legacy Django bucket it migrates documents out of, named apart
# from the AWS_S3_* the job sets for django itself
SOFT_MIGRATION: "true"
LEGACY_S3_ENDPOINT_URL: http://localhost:9000
LEGACY_S3_ACCESS_KEY_ID: impress
LEGACY_S3_SECRET_ACCESS_KEY: password
LEGACY_S3_BUCKET_NAME: impress-media-storage
run: |
nohup node server.js > /tmp/yhub.log 2>&1 &
dockerize -wait tcp://localhost:3002 -timeout 30s

- name: Run tests
run: uv run pytest -n 2

- name: Collaboration server logs
if: failure()
run: cat /tmp/yhub.log /tmp/backend.log
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ env.d/terraform
compose.override.yml
docker/auth/*.local

# yhub server local install
src/yhub-server/node_modules/

# npm
node_modules

Expand Down Expand Up @@ -90,3 +93,4 @@ AGENTS.md
.aider*
.copilot/
.github/copilot-instructions.md
.playwright-mcp
Loading
Loading