CRM на shotam.tvorymo.com: env CRM_ORIGINS, frame-ancestors и стили CRM от корня (/css/...)
This commit is contained in:
@@ -12,7 +12,7 @@
|
|||||||
- **Постоянный том обязателен:** файл SQLite и картинки должны лежать на named volume в Coolify, иначе пропадут при пересборке.
|
- **Постоянный том обязателен:** файл SQLite и картинки должны лежать на named volume в Coolify, иначе пропадут при пересборке.
|
||||||
- .NET SDK есть локально (`dotnet --list-sdks`: 8, 9, 10). Сборка для продакшена выполняется в Dockerfile.
|
- .NET SDK есть локально (`dotnet --list-sdks`: 8, 9, 10). Сборка для продакшена выполняется в Dockerfile.
|
||||||
- Домен: `https://wiki-crm.tes.gd` (HTTPS, домены *.tes.gd на этом Coolify работают).
|
- Домен: `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)
|
## Деплой (сделан 2026-10-13)
|
||||||
|
|
||||||
|
|||||||
@@ -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` — подсказка. Интерфейс на украинском.
|
На экране ожидания есть диагностика: 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
|
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`.
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ builder.Services.Configure<FormOptions>(o => o.MultipartBodyLengthLimit = Images
|
|||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
var cfg = app.Configuration;
|
var cfg = app.Configuration;
|
||||||
// Origin CRM, из которых принимаем crm:auth и в которые разрешено встраивание (через пробел или запятую).
|
// 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)
|
.Split([' ', ',', ';'], StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
|
||||||
.Select(o => o.TrimEnd('/')).Distinct(StringComparer.OrdinalIgnoreCase).ToArray();
|
.Select(o => o.TrimEnd('/')).Distinct(StringComparer.OrdinalIgnoreCase).ToArray();
|
||||||
// Откуда грузятся стили CRM (ссылки в index.html).
|
// Откуда грузятся стили 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}.
|
// Ссылка на страницу в CRM для вики, открытой вне iframe: https://<crm>/#/module/<id>?path={path}&ws={ws}.
|
||||||
// Без шаблона (или без {path}) кнопки «Відкрити в CRM» нет. Авторедирект — только CRM_AUTO_REDIRECT=true.
|
// Без шаблона (или без {path}) кнопки «Відкрити в CRM» нет. Авторедирект — только CRM_AUTO_REDIRECT=true.
|
||||||
var crmLinkTemplate = (cfg["CRM_LINK_TEMPLATE"] ?? cfg["Crm:LinkTemplate"])?.Trim();
|
var crmLinkTemplate = (cfg["CRM_LINK_TEMPLATE"] ?? cfg["Crm:LinkTemplate"])?.Trim();
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
"DataDir": "data"
|
"DataDir": "data"
|
||||||
},
|
},
|
||||||
"Crm": {
|
"Crm": {
|
||||||
"Origins": "https://test.units.tvorymo.com https://units.tvorymo.com",
|
"Origins": "https://shotam.tvorymo.com https://units.tvorymo.com",
|
||||||
"AssetsOrigin": "https://test.units.tvorymo.com"
|
"AssetsOrigin": "https://shotam.tvorymo.com"
|
||||||
},
|
},
|
||||||
"Supabase": {
|
"Supabase": {
|
||||||
"Url": "https://yjxbkcqsquwbsyoonfkn.supabase.co",
|
"Url": "https://yjxbkcqsquwbsyoonfkn.supabase.co",
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ services:
|
|||||||
ASPNETCORE_ENVIRONMENT: Production
|
ASPNETCORE_ENVIRONMENT: Production
|
||||||
ASPNETCORE_URLS: "http://+:8080"
|
ASPNETCORE_URLS: "http://+:8080"
|
||||||
Storage__DataDir: /data
|
Storage__DataDir: /data
|
||||||
# origin CRM через пробел: из них принимается crm:auth, они же в frame-ancestors
|
# origin CRM через запятую или пробел: из них принимается crm:auth, они же в frame-ancestors
|
||||||
Crm__Origins: "https://test.units.tvorymo.com https://units.tvorymo.com"
|
CRM_ORIGINS: ${CRM_ORIGINS:-https://shotam.tvorymo.com,https://units.tvorymo.com}
|
||||||
Crm__AssetsOrigin: "https://test.units.tvorymo.com"
|
Crm__AssetsOrigin: "https://shotam.tvorymo.com"
|
||||||
Supabase__Url: "https://yjxbkcqsquwbsyoonfkn.supabase.co"
|
Supabase__Url: "https://yjxbkcqsquwbsyoonfkn.supabase.co"
|
||||||
# publishable-ключ публичный по дизайну
|
# publishable-ключ публичный по дизайну
|
||||||
Supabase__PublishableKey: "sb_publishable_TQaZAtnBpImL49A-o87bKg_q5sYvhPR"
|
Supabase__PublishableKey: "sb_publishable_TQaZAtnBpImL49A-o87bKg_q5sYvhPR"
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<!-- Стили CRM ссылками: сначала дизайн-система, затем crm.css (порядок важен). -->
|
<!-- Стили CRM ссылками: сначала дизайн-система, затем crm.css (порядок важен). -->
|
||||||
<link rel="stylesheet" href="https://test.units.tvorymo.com/tvorymo-crm/css/tvorymo-ui.css">
|
<link rel="stylesheet" href="https://shotam.tvorymo.com/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/crm.css">
|
||||||
</head>
|
</head>
|
||||||
<body class="side-off">
|
<body class="side-off">
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
|
|||||||
Reference in New Issue
Block a user