Критический фикс: раньше safety-override срабатывал на host.EndsWith( ".admin.food-market.kz") — это ВКЛЮЧАЛО сам стейдж (test.admin.food-market.kz заканчивается на ".admin.food-market.kz"). Деплой на стенд это и показал: Warning в логе "test.admin.food-market.kz — это ПРОД" и /api/dev/quick- login/accounts возвращал 404. Теперь проверка: host == "admin.food-market.kz" (точное совпадение). Любой поддомен (test.admin.*, dev.admin.*) — стенд, быстрый вход включается. Если в будущем появится второй прод-хост — дописать условие явно. Также добавлено: - deploy/docker-compose.yml: пробрасывает QuickLogin__Enabled и QuickLogin__MasterPassword из env (default off). - docs/quick-login.md: как работает, предохранители, как выключить, как проверить прод. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
92 lines
3.8 KiB
YAML
92 lines
3.8 KiB
YAML
services:
|
||
postgres:
|
||
image: ${REGISTRY:-127.0.0.1:5001}/mirror/postgres:16-alpine
|
||
container_name: food-market-postgres
|
||
restart: unless-stopped
|
||
environment:
|
||
POSTGRES_DB: food_market
|
||
POSTGRES_USER: food_market
|
||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-food_market_dev}
|
||
PGDATA: /var/lib/postgresql/data/pgdata
|
||
# Stage VM already uses 5432 (host postgres) — map ours to 5434 to avoid clash.
|
||
ports:
|
||
- "127.0.0.1:5434:5432"
|
||
volumes:
|
||
- postgres-data:/var/lib/postgresql/data
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U food_market -d food_market"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 5
|
||
|
||
api:
|
||
image: ${REGISTRY:-127.0.0.1:5001}/food-market-api:${API_TAG:-latest}
|
||
container_name: food-market-api
|
||
restart: unless-stopped
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
environment:
|
||
ASPNETCORE_ENVIRONMENT: Production
|
||
ConnectionStrings__Default: Host=postgres;Port=5432;Database=food_market;Username=food_market;Password=${POSTGRES_PASSWORD:-food_market_dev}
|
||
# Публичный issuer токенов — обязателен за прокси, иначе берётся из запроса
|
||
# (или дефолт localhost из appsettings, что неверно для прод).
|
||
OpenIddict__Issuer: ${OPENIDDICT_ISSUER:-https://admin.food-market.kz/}
|
||
# Пароль PFX-сертификатов OpenIddict (пусто = сертификаты без пароля).
|
||
OpenIddict__CertPassword: ${OPENIDDICT_CERT_PASSWORD:-}
|
||
# Sprint 13: rate-limit на signup. На stage'е переопределяется в
|
||
# .env'е через RATE_SIGNUP_HOUR / RATE_SIGNUP_DAY для прохождения
|
||
# e2e/smoke; в prod'е оставляем дефолты 3/час, 10/сутки.
|
||
RateLimiting__SignupPerIpPerHour: ${RATE_SIGNUP_HOUR:-3}
|
||
RateLimiting__SignupPerIpPerDay: ${RATE_SIGNUP_DAY:-10}
|
||
# Sprint 30: «быстрый вход» на тестовом стенде. По умолчанию выключено.
|
||
# На stage включается через QUICK_LOGIN_ENABLED=true в .env. Code
|
||
# имеет safety-override: даже с Enabled=true, если OpenIddict__Issuer
|
||
# смотрит на admin.food-market.kz — быстрый вход принудительно выключен
|
||
# (см. QuickLoginOptions.EffectivelyEnabled).
|
||
QuickLogin__Enabled: ${QUICK_LOGIN_ENABLED:-false}
|
||
QuickLogin__MasterPassword: ${QUICK_LOGIN_MASTER_PASSWORD:-123456}
|
||
# Host port mapping: pick free ports on existing stage server (80/443 taken by
|
||
# legacy nginx, 5000/5002/5005 taken by legacy .NET apps).
|
||
ports:
|
||
- "8080:8080" # api
|
||
|
||
healthcheck:
|
||
# Готовность = БД отвечает + миграции применены (см. /health/ready).
|
||
test: ["CMD-SHELL", "curl -fsS http://localhost:8080/health/ready || exit 1"]
|
||
interval: 30s
|
||
timeout: 5s
|
||
retries: 5
|
||
start_period: 30s
|
||
|
||
volumes:
|
||
- api-data:/app/App_Data
|
||
- api-logs:/app/logs
|
||
- /opt/food-market-data/uploads:/app/uploads
|
||
|
||
web:
|
||
image: ${REGISTRY:-127.0.0.1:5001}/food-market-web:${WEB_TAG:-latest}
|
||
container_name: food-market-web
|
||
restart: unless-stopped
|
||
depends_on:
|
||
api:
|
||
condition: service_healthy
|
||
ports:
|
||
- "8081:80" # web SPA, not on 80 (legacy nginx holds it)
|
||
|
||
public:
|
||
image: ${REGISTRY:-127.0.0.1:5001}/food-market-public:${PUBLIC_TAG:-latest}
|
||
container_name: food-market-public
|
||
restart: unless-stopped
|
||
ports:
|
||
- "8082:80" # marketing astro static
|
||
|
||
volumes:
|
||
postgres-data:
|
||
name: food-market-postgres-data
|
||
api-data:
|
||
name: food-market-api-data
|
||
api-logs:
|
||
name: food-market-api-logs
|
||
|