{% extends 'workflows/base_shell.html' %} {% load static i18n %} {% block title %}{% trans "Release Checklist" %}{% endblock %} {% block extra_css %} {% endblock %} {% block shell_body %} {% include 'workflows/includes/app_header.html' with header_show_home=1 header_inside_shell=1 %}
{% trans "Release" %}

{% trans "Release Checklist" %}

{% trans "Back to Handbook" %}

{% trans "Single runbook for preparing, validating, and evidencing a safe application release. Use it for both local production-like rollouts and future CI/CD handoffs." %}

{% trans "1. Pre-release checks" %}

  • {% trans "Confirm git working tree is clean or intentionally scoped." %}
  • {% trans "Read the latest Project Wiki and Developer Handbook updates for architecture changes." %}
  • {% trans "Check environment changes in .env.example and deployment secrets if integrations changed." %}
  • {% trans "If dependencies changed, rebuild web and worker images before validation." %}
git status --short
docker compose up -d --build web worker

{% trans "2. Validation commands" %}

  • {% trans "Run Django system checks." %}
  • {% trans "Run tests or a targeted verification command for the changed area." %}
  • {% trans "Compile translations after UI/content changes." %}
  • {% trans "If dependencies changed, verify imports do not emit warnings." %}
  • {% trans "Verify the latest backup bundle before release if operational tooling, storage, or restore behavior changed." %}
  • {% trans "Prefer the single local release gate command so local validation matches CI." %}
make release-validate

# individual commands if needed:
docker compose exec -T web python manage.py check
docker compose exec -T web python manage.py test
docker compose exec -T web python manage.py verify_latest_backup --create-if-missing
make i18n-compile
docker compose exec -T web python -c "import requests"

{% trans "3. Data and asset steps" %}

  • {% trans "Create and apply migrations if models changed." %}
  • {% trans "Run collectstatic if UI assets changed." %}
  • {% trans "Generate fresh PDFs if PDF templates or document logic changed." %}
  • {% trans "Confirm file outputs appear under backend/media/pdfs/." %}
docker compose exec -T web python manage.py makemigrations
docker compose exec -T web python manage.py migrate
docker compose exec -T web python manage.py collectstatic --noinput

{% trans "4. Integration checks" %}

  • {% trans "Verify the health endpoint returns status ok." %}
  • {% trans "Verify MailHog in test mode or SMTP in production mode." %}
  • {% trans "Verify Nextcloud upload if synchronization behavior changed." %}
  • {% trans "Verify welcome-email scheduling or notification rules if email routing changed." %}
curl --max-time 8 http://127.0.0.1:8088/healthz/
docker compose exec -T web python manage.py run_staging_e2e_check

{% trans "5. Release evidence" %}

  • {% trans "Record which checks were run and their result." %}
  • {% trans "Take a snapshot commit before moving to the next change phase." %}
  • {% trans "If a release introduces new operations or engineering behavior, update both handbooks." %}
  • {% trans "Keep at least one successful onboarding and one offboarding smoke example during major workflow changes." %}

{% trans "6. Rollback basics" %}

  • {% trans "If rollout fails after code-only changes, redeploy the previous snapshot commit." %}
  • {% trans "If rollout includes schema changes, verify backward compatibility before rollback." %}
  • {% trans "If integrations fail, switch email mode/test settings conservatively before wider retry." %}
  • {% trans "Use logs from web and worker containers to isolate whether the issue is request, task, or integration related." %}
docker compose logs --no-color --tail=200 web
docker compose logs --no-color --tail=200 worker
{% trans "Project rule: German remains the primary/fallback language. English is secondary. If a release adds new dynamic text, add the German source first and then the English value." %}
{% endblock %}