CRM на shotam.tvorymo.com: env CRM_ORIGINS, frame-ancestors и стили CRM от корня (/css/...)

This commit is contained in:
EugeneTes
2026-10-16 07:41:22 +00:00
parent 6f73f90fa8
commit 8a19df7d23
6 changed files with 12 additions and 12 deletions

View File

@@ -12,7 +12,7 @@
- **Постоянный том обязателен:** файл SQLite и картинки должны лежать на named volume в Coolify, иначе пропадут при пересборке.
- .NET SDK есть локально (`dotnet --list-sdks`: 8, 9, 10). Сборка для продакшена выполняется в Dockerfile.
- Домен: `https://wiki-crm.tes.gd` (HTTPS, домены *.tes.gd на этом Coolify работают).
- CRM: `https://test.units.tvorymo.com`. Supabase: `https://yjxbkcqsquwbsyoonfkn.supabase.co`.
- CRM: `https://shotam.tvorymo.com` (с 2026-10-16; стили от корня: `/css/crm.css`, `/css/tvorymo-ui.css`, `/js/pagebridge.js`; `test.units.tvorymo.com` отдаёт 403). Supabase: `https://yjxbkcqsquwbsyoonfkn.supabase.co`.
## Деплой (сделан 2026-10-13)

View File

@@ -81,7 +81,7 @@ curl -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
## Заголовки
`Content-Security-Policy: frame-ancestors https://test.units.tvorymo.com https://units.tvorymo.com; …` (без `X-Frame-Options`). Список origin CRM задаётся `Crm__Origins` (через пробел или запятую): из них принимается `crm:auth` (плюс `ev.source === window.parent`) и они же попадают в `frame-ancestors`. Origin родителя фронтенд определяет по `location.ancestorOrigins` или `document.referrer` и шлёт `crm:ready` только ему; если родитель не определён — каждому origin из списка (браузер доставит лишь совпавшему). Домен стилей CRM — `Crm__AssetsOrigin`.
`Content-Security-Policy: frame-ancestors https://shotam.tvorymo.com https://units.tvorymo.com; …` (без `X-Frame-Options`). Список origin CRM задаётся env `CRM_ORIGINS` или `Crm__Origins` (через пробел или запятую): из них принимается `crm:auth` (плюс `ev.source === window.parent`) и они же попадают в `frame-ancestors`. Origin родителя фронтенд определяет по `location.ancestorOrigins` или `document.referrer` и шлёт `crm:ready` только ему; если родитель не определён — каждому origin из списка (браузер доставит лишь совпавшему). Домен стилей CRM — `Crm__AssetsOrigin`.
На экране ожидания есть диагностика: origin родителя, куда ушёл `crm:ready`, какие сообщения пришли (без токенов); через 10 секунд без `crm:auth` — подсказка. Интерфейс на украинском.
@@ -93,4 +93,4 @@ cd frontend && npm i && npm run dev # Vite, /api проксируетс
dotnet test backend/Wiki.Api.Tests # тесты проверки доступа к workspace
```
Настройки (env): `Storage__DataDir`, `Crm__Origins`, `Crm__AssetsOrigin`, `Supabase__Url`, `Supabase__PublishableKey`.
Настройки (env): `Storage__DataDir`, `CRM_ORIGINS` (`Crm__Origins`), `Crm__AssetsOrigin`, `Supabase__Url`, `Supabase__PublishableKey`.

View File

@@ -15,11 +15,11 @@ builder.Services.Configure<FormOptions>(o => o.MultipartBodyLengthLimit = Images
var app = builder.Build();
var cfg = app.Configuration;
// Origin CRM, из которых принимаем crm:auth и в которые разрешено встраивание (через пробел или запятую).
var crmOrigins = (cfg["Crm:Origins"] ?? cfg["Crm:Origin"] ?? "https://test.units.tvorymo.com https://units.tvorymo.com")
var crmOrigins = (cfg["CRM_ORIGINS"] ?? cfg["Crm:Origins"] ?? cfg["Crm:Origin"] ?? "https://shotam.tvorymo.com https://units.tvorymo.com")
.Split([' ', ',', ';'], StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Select(o => o.TrimEnd('/')).Distinct(StringComparer.OrdinalIgnoreCase).ToArray();
// Откуда грузятся стили CRM (ссылки в index.html).
var crmAssets = (cfg["Crm:AssetsOrigin"] ?? "https://test.units.tvorymo.com").TrimEnd('/');
var crmAssets = (cfg["Crm:AssetsOrigin"] ?? "https://shotam.tvorymo.com").TrimEnd('/');
// Ссылка на страницу в CRM для вики, открытой вне iframe: https://<crm>/#/module/<id>?path={path}&ws={ws}.
// Без шаблона (или без {path}) кнопки «Відкрити в CRM» нет. Авторедирект — только CRM_AUTO_REDIRECT=true.
var crmLinkTemplate = (cfg["CRM_LINK_TEMPLATE"] ?? cfg["Crm:LinkTemplate"])?.Trim();

View File

@@ -11,8 +11,8 @@
"DataDir": "data"
},
"Crm": {
"Origins": "https://test.units.tvorymo.com https://units.tvorymo.com",
"AssetsOrigin": "https://test.units.tvorymo.com"
"Origins": "https://shotam.tvorymo.com https://units.tvorymo.com",
"AssetsOrigin": "https://shotam.tvorymo.com"
},
"Supabase": {
"Url": "https://yjxbkcqsquwbsyoonfkn.supabase.co",

View File

@@ -10,9 +10,9 @@ services:
ASPNETCORE_ENVIRONMENT: Production
ASPNETCORE_URLS: "http://+:8080"
Storage__DataDir: /data
# origin CRM через пробел: из них принимается crm:auth, они же в frame-ancestors
Crm__Origins: "https://test.units.tvorymo.com https://units.tvorymo.com"
Crm__AssetsOrigin: "https://test.units.tvorymo.com"
# origin CRM через запятую или пробел: из них принимается crm:auth, они же в frame-ancestors
CRM_ORIGINS: ${CRM_ORIGINS:-https://shotam.tvorymo.com,https://units.tvorymo.com}
Crm__AssetsOrigin: "https://shotam.tvorymo.com"
Supabase__Url: "https://yjxbkcqsquwbsyoonfkn.supabase.co"
# publishable-ключ публичный по дизайну
Supabase__PublishableKey: "sb_publishable_TQaZAtnBpImL49A-o87bKg_q5sYvhPR"

View File

@@ -7,8 +7,8 @@
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- Стили CRM ссылками: сначала дизайн-система, затем crm.css (порядок важен). -->
<link rel="stylesheet" href="https://test.units.tvorymo.com/tvorymo-crm/css/tvorymo-ui.css">
<link rel="stylesheet" href="https://test.units.tvorymo.com/tvorymo-crm/css/crm.css">
<link rel="stylesheet" href="https://shotam.tvorymo.com/css/tvorymo-ui.css">
<link rel="stylesheet" href="https://shotam.tvorymo.com/css/crm.css">
</head>
<body class="side-off">
<div id="root"></div>