Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
1c49eec
feat: add isolated white label configuration and short program signup
Nov 10, 2026
f6c5fcd
feat: prepare closed client pilot and isolated file storage
Nov 10, 2026
0dcbc88
ci: build portable pilot artifact without deployment
Nov 10, 2026
05053b2
ops: inspect hosted pilot compatibility without exposing secrets
Nov 10, 2026
f1ba4cd
feat: add single-process pilot profile and exportable runtime
Nov 10, 2026
4866fc5
ops: stream pilot image import with a disk reserve
Nov 10, 2026
83ca9a9
ops: stage isolated pilot with resource guards and reversible routing
Nov 10, 2026
f260c12
fix(pilot): use existing sites-enabled HTTP include
Nov 11, 2026
676870e
fix(pilot): do not require optional React services
Nov 11, 2026
abb93ed
test(pilot): confirm isolated QA accounts from local mail
Nov 11, 2026
13306e0
fix(pilot): invite email-only participants within program scope
Nov 11, 2026
95f8375
docs(pilot): record live team and submission acceptance
Nov 11, 2026
8650113
feat: add percentage weights for case evaluation
Nov 11, 2026
7657082
feat(pilot): prepare isolated weighted-criteria upgrade with rollback
Nov 11, 2026
65dd642
docs(pilot): record live weighted-criteria acceptance
Nov 11, 2026
2498c0d
fix: publish pilot auth frontend without restarting shared services
Nov 12, 2026
2796b99
fix: compare pilot Docker mounts independently of inspect order
Nov 12, 2026
a17eb0f
docs: record live pilot auth acceptance and cleanup
Nov 12, 2026
515862c
feat: add organizer case-plus-quiz ranking out of 200
Nov 12, 2026
9a97a5a
docs: record approved overall rating UI acceptance
Nov 12, 2026
3c21fbc
build: pin pilot package to verified overall rating frontend
Nov 12, 2026
7a8e6c6
deploy: add isolated overall ranking upgrade for live pilot
Nov 12, 2026
0552b79
docs: record live overall ranking deployment acceptance
Nov 12, 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
67 changes: 67 additions & 0 deletions .github/workflows/pilot-package.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: Build pilot package

on:
pull_request:
branches: [dev]
paths:
- ".github/workflows/pilot-package.yml"
- "deploy/pilot/**"
workflow_dispatch:

permissions:
contents: read

concurrency:
group: pilot-package-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
package:
name: Build pilot artifact (no deployment)
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
with:
path: api

- name: Read pinned frontend revision
id: frontend
shell: bash
run: |
PILOT_FRONTEND_REF="$(cat api/deploy/pilot/frontend-revision.txt)"
[[ "$PILOT_FRONTEND_REF" =~ ^[a-f0-9]{40}$ ]]
printf 'revision=%s\n' "$PILOT_FRONTEND_REF" >> "$GITHUB_OUTPUT"

- uses: actions/checkout@v4
with:
repository: PROCOLLAB-github/procollab
ref: ${{ steps.frontend.outputs.revision }}
path: frontend

- uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm
cache-dependency-path: frontend/package-lock.json

- name: Install frontend dependencies
working-directory: frontend
run: npm ci

- name: Build pilot frontend
working-directory: frontend
env:
NG_CLI_ANALYTICS: "false"
NG_BUILD_MAX_WORKERS: "2"
run: ./node_modules/.bin/ng build social_platform --configuration=pilot --output-path=../frontend-build

- name: Package committed API, frontend and templates without secrets
run: python3 api/deploy/pilot/package.py --api api --frontend frontend-build/browser --target bundle/procollab-pilot

- uses: actions/upload-artifact@v4
with:
name: procollab-pilot-candidate
path: bundle/procollab-pilot.tar.gz
if-no-files-found: error
retention-days: 7
89 changes: 89 additions & 0 deletions .github/workflows/pilot-runtime.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
name: Build pilot runtime image

on:
pull_request:
branches: [dev]
paths:
- ".github/workflows/pilot-runtime.yml"
- "procollab/settings_pilot_inline.py"
workflow_dispatch:

permissions:
contents: read

concurrency:
group: pilot-runtime-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
runtime:
name: Export pilot runtime image (no deployment)
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false

- name: Build from tracked source without checkout credentials
shell: bash
run: |
mkdir -p "$RUNNER_TEMP/pilot-source" runtime-artifact
git archive HEAD | tar -x -C "$RUNNER_TEMP/pilot-source"
PILOT_IMAGE="procollab-white-label-pilot-build:$(git rev-parse --short=12 HEAD)"
docker build --label "org.opencontainers.image.revision=$(git rev-parse HEAD)" --tag "$PILOT_IMAGE" "$RUNNER_TEMP/pilot-source"
printf 'PILOT_IMAGE=%s\n' "$PILOT_IMAGE" >> "$GITHUB_ENV"

- name: Check isolated inline profile
run: |
docker run --rm \
-e DJANGO_SETTINGS_MODULE=procollab.settings_pilot_inline \
-e DJANGO_SECRET_KEY=ci-only-profile-check \
-e DATABASE_NAME=procollab_white_label_pilot_ci \
-e DATABASE_HOST=db \
-e WHITE_LABEL_ENABLED=True \
-e WHITE_LABEL_PROGRAM_ID=1 \
-e WHITE_LABEL_BRAND_NAME=Pilot \
-e WHITE_LABEL_FRONTEND_URL=https://pilot.procollab.ru \
"$PILOT_IMAGE" python manage.py check

- name: Export streaming rootfs with provenance and checksum
shell: bash
run: |
PILOT_EXPORT_CONTAINER="$(docker create "$PILOT_IMAGE")"
docker export "$PILOT_EXPORT_CONTAINER" | gzip -1 > runtime-artifact/pilot-api-rootfs.tar.gz
docker rm "$PILOT_EXPORT_CONTAINER"
docker image inspect "$PILOT_IMAGE" > "$RUNNER_TEMP/pilot-image-inspect.json"
python3 - <<'PYINFO'
import hashlib, json, os
from pathlib import Path
import subprocess
info=json.loads(Path(os.environ['RUNNER_TEMP'],'pilot-image-inspect.json').read_text())[0]
archive=Path('runtime-artifact/pilot-api-rootfs.tar.gz')
metadata={
'format':'docker-export-v1',
'image':os.environ['PILOT_IMAGE'].replace('-pilot-build:', '-pilot-api:'), 'image_size_bytes':info['Size'],
'architecture':info['Architecture'], 'config':info['Config'],
'api_revision':subprocess.check_output(['git','rev-parse','HEAD'],text=True).strip(),
'archive_sha256':hashlib.file_digest(archive.open('rb'),'sha256').hexdigest(),
}
Path('runtime-artifact/runtime.json').write_text(json.dumps(metadata,indent=2)+'\n')
PYINFO
(cd runtime-artifact && sha256sum pilot-api-rootfs.tar.gz runtime.json > SHA256SUMS)

- name: Verify streaming import restores image configuration
run: |
python3 deploy/pilot/runtime_import.py --runtime runtime-artifact
PILOT_IMPORTED_IMAGE="$(python3 -c 'import json;print(json.load(open("runtime-artifact/runtime.json"))["image"])')"
docker run --rm \
-e DJANGO_SETTINGS_MODULE=procollab.settings_ci \
-e DJANGO_SECRET_KEY=ci-only-import-check \
"$PILOT_IMPORTED_IMAGE" python manage.py check

- uses: actions/upload-artifact@v4
with:
name: procollab-pilot-runtime
path: runtime-artifact/
compression-level: 0
if-no-files-found: error
retention-days: 7
3 changes: 3 additions & 0 deletions core/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@
class CoreConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "core"

def ready(self):
from procollab import white_label # noqa: F401
4 changes: 2 additions & 2 deletions courses/admin_config/helpers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django import forms

from files.models import UserFile
from files.service import CDN, SelectelSwiftStorage
from files.service import CDN, configured_storage

from courses.models.file_validation import looks_like_image_file

Expand All @@ -20,7 +20,7 @@ def validate_image_upload(


class UserFileUploadAdminMixin:
cdn = CDN(storage=SelectelSwiftStorage())
cdn = CDN(storage=configured_storage())

def create_user_file(self, request, uploaded_file):
info = self.cdn.upload(uploaded_file, request.user, quality=100)
Expand Down
Loading
Loading