Update frontend image in .env.example for contour compatibility

This commit is contained in:
emelinda 2026-07-23 18:21:11 +03:00
parent cb37ba000e
commit 8551d58d08
5 changed files with 81 additions and 12 deletions

View File

@ -13,6 +13,8 @@ SAREX_POSTGRES_PASSWORD=sarex
# Приложения ходят в БД под ними, а не под суперпользователем. Без одинарных кавычек.
SAREX_DJANGO_DB_USER=django
SAREX_DJANGO_DB_PASSWORD=django-secret
# Расширения PostgreSQL для базы django (создаёт postgres-init суперпользователем)
SAREX_DJANGO_DB_EXTENSIONS=ltree
SAREX_PROCESSING_DB_USER=processing
SAREX_PROCESSING_DB_PASSWORD=processing-secret
SAREX_BIM_DB_USER=bim

View File

@ -36,6 +36,8 @@ deploy-check = "ansible-playbook deploy.yml --check --diff"
gen-env = "ansible-playbook deploy.yml --tags env"
# docker login в приватный реестр по ключу json_key
login = "ansible-playbook deploy.yml --tags login"
# сгенерировать логин+пароль и создать Django-суперпользователя в backend
superuser = "ansible-playbook deploy.yml --tags superuser"
lint = "ansible-lint"
# Полная подготовка окружения: uv sync + установка коллекций

View File

@ -125,3 +125,51 @@
chdir: "{{ deploy_dir }}"
when: sarex_compose_up | bool
changed_when: true
# --- Django-суперпользователь: генерация логина+пароля, создание -----------
# Логин и пароль генерируются один раз и персистятся в secrets_store
# (переиспользуются при повторе — идемпотентно).
- name: Сгенерировать логин суперпользователя
ansible.builtin.set_fact:
superuser_name: "{{ lookup('password', secrets_store ~ '/' ~ inventory_hostname ~ '/SAREX_SUPERUSER_NAME chars=ascii_lowercase,digits length=10') }}"
no_log: true
tags: [superuser]
- name: Сгенерировать пароль суперпользователя
ansible.builtin.set_fact:
superuser_password: "{{ lookup('password', secrets_store ~ '/' ~ inventory_hostname ~ '/SAREX_SUPERUSER_PASSWORD chars=ascii_letters,digits length=' ~ secret_length) }}"
no_log: true
tags: [superuser]
- name: Создать/обновить Django-суперпользователя в backend
ansible.builtin.command:
argv:
- "{{ compose_cmd.split()[0] }}"
- exec
- -e
- "SU_NAME={{ superuser_name }}"
- -e
- "SU_PASS={{ superuser_password }}"
- -e
- "SU_EMAIL={{ superuser_name }}@{{ platform_domain }}"
- sarex-backend
- python
- manage.py
- shell
- -c
- >-
import os;
from django.contrib.auth import get_user_model;
U = get_user_model();
u, c = U.objects.get_or_create(username=os.environ['SU_NAME'], defaults={'email': os.environ['SU_EMAIL']});
u.is_staff = True; u.is_superuser = True; u.set_password(os.environ['SU_PASS']); u.save();
print('created' if c else 'updated')
register: superuser_result
changed_when: true
no_log: true
tags: [superuser]
- name: Показать учётные данные суперпользователя
ansible.builtin.debug:
msg: "Django superuser → login: {{ superuser_name }} password: {{ superuser_password }}"
tags: [superuser]

View File

@ -147,6 +147,13 @@ services:
provision "$$PROC_DB" "$$PROC_USER" "$$PROC_PASSWORD"
provision "$$BIM_DB" "$$BIM_USER" "$$BIM_PASSWORD"
provision "$$WORKSPACE_DB" "$$WORKSPACE_USER" "$$WORKSPACE_PASSWORD"
# Расширения PostgreSQL в базе django: CREATE EXTENSION может только
# суперпользователь. Django-миграции (CreateExtension) идут с IF NOT
# EXISTS → после этого станут no-op и не упадут на правах.
for ext in $$DJANGO_EXTENSIONS; do
q -c "CREATE EXTENSION IF NOT EXISTS \"$$ext\"" && echo "extension $$ext ready in $$DJANGO_DB"
done
environment:
PGPASSWORD: ${SAREX_POSTGRES_PASSWORD:-sarex}
SUPER_USER: ${SAREX_POSTGRES_USER:-sarex}
@ -155,6 +162,7 @@ services:
DJANGO_DB: ${SAREX_POSTGRES_DB:-sarex_db}
DJANGO_USER: ${SAREX_DJANGO_DB_USER:-django}
DJANGO_PASSWORD: ${SAREX_DJANGO_DB_PASSWORD:-django-secret}
DJANGO_EXTENSIONS: ${SAREX_DJANGO_DB_EXTENSIONS:-ltree}
# processing
PROC_DB: ${SAREX_PROCESSING_DB:-workflow_db}
PROC_USER: ${SAREX_PROCESSING_DB_USER:-processing}

View File

@ -27,7 +27,7 @@ map $http_upgrade $connection_upgrade {
}
upstream backend { server backend:8000; }
# upstream frontend { server frontend:80; } # frontend пока не поднят
upstream frontend { server frontend:80; }
upstream minio_s3 { server minio:9000; }
upstream minio_console { server minio:9001; }
upstream rabbitmq_mgmt { server rabbitmq:15672; }
@ -55,6 +55,15 @@ server {
return 200 "ok\n";
}
# Рантайм-конфиг фронта. Прод-сборка по умолчанию уходит в zitadel, которого
# тут нет, — форсим классический вход через backend (auth_type=original).
# Отдаём сами: в образе frontend этого файла нет (был бы 404).
location = /static/config.json {
default_type application/json;
add_header Cache-Control "no-store";
return 200 '{"auth_type":"original"}';
}
# Django backend: REST API + админка
location /api/ { proxy_pass http://backend; }
location /admin/ { proxy_pass http://backend; }
@ -96,17 +105,17 @@ server {
# proxy_pass http://minio_s3;
# }
# Frontend SPA (host-приложение само отдаёт статику и роутинг) (TODO: в работе)
# location / {
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto $scheme;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection $connection_upgrade;
# proxy_pass http://frontend;
# }
# Frontend SPA (host-приложение само отдаёт статику и роутинг)
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://frontend;
}
}
# ======================= Admin: RabbitMQ management UI ======================