docs: refactor docs structure
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
# Настройка окружения
|
||||
|
||||
Проект поддерживает два слоя конфигурации:
|
||||
|
||||
- `.env` - bootstrap, инфраструктура, стабильные секреты и базовые доступы к Remnawave;
|
||||
- Web App админка - основной рекомендуемый способ менять продуктовые настройки после первого запуска.
|
||||
|
||||
Админка сохраняет overrides в базе данных и применяет их поверх `.env`. Это удобно для платежей, внешнего вида, поддержки, уведомлений, legacy-цен и большинства пользовательских параметров. Тарифы редактируются отдельно в разделе **Система -> Тарифы** и сохраняются в JSON-файл `TARIFFS_CONFIG_PATH`.
|
||||
|
||||
Полный справочник всех переменных вынесен в [configuration/env-vars.md](../configuration/env-vars.md).
|
||||
|
||||
## Минимальный `.env`
|
||||
|
||||
Начните с короткого примера:
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
```
|
||||
|
||||
Минимально заполните:
|
||||
|
||||
| Переменная | Зачем нужна |
|
||||
| --- | --- |
|
||||
| `BOT_TOKEN` | Токен Telegram-бота. |
|
||||
| `ADMIN_IDS` | Telegram ID администраторов через запятую; без этого не попасть в Web App админку. |
|
||||
| `WEBHOOK_BASE_URL` | Публичный URL webhook-домена backend. |
|
||||
| `POSTGRES_USER`, `POSTGRES_PASSWORD`, `POSTGRES_DB` | Доступы PostgreSQL для Compose и backend. |
|
||||
| `WEBAPP_ENABLED` | Включает Web App и админку. Для первого запуска держите `True`. |
|
||||
| `WEBAPP_SESSION_SECRET` | Стабильный секрет сессий Web App. |
|
||||
| `WEBHOOK_SECRET_TOKEN` | Стабильный секретный токен вебхука Telegram. |
|
||||
| `SUBSCRIPTION_MINI_APP_URL` | Публичный HTTPS URL Mini App/frontend, например `https://app.domain.com/`. Это URL, который открывают кнопки Telegram и который указывается в BotFather; не добавляйте сюда `/api` или webhook-пути. |
|
||||
| `SUBSCRIPTION_GUIDES_ENABLED`, `SUBSCRIPTION_GUIDES_BOT_MENU_ENABLED` | Встроенные инструкции установки в Web App и кнопках бота. По умолчанию включены; обычно их достаточно менять в админке. |
|
||||
| `PANEL_API_URL`, `PANEL_API_KEY`, `PANEL_WEBHOOK_SECRET` | Базовая интеграция с Remnawave. Эти значения стоит хранить в `.env`, но при необходимости их можно переопределить из админки. |
|
||||
|
||||
`WEBAPP_SESSION_SECRET` и `WEBHOOK_SECRET_TOKEN` можно сгенерировать так:
|
||||
|
||||
```bash
|
||||
openssl rand -hex 32
|
||||
```
|
||||
|
||||
Если оставить эти секреты пустыми, приложение сгенерирует их на процесс, но после рестарта Web App-сессии станут невалидными, а вебхук Telegram получит новый `secret_token`.
|
||||
|
||||
## Если Web App выключен
|
||||
|
||||
`WEBAPP_ENABLED=False` отключает пользовательский Web App и вместе с ним админ-панель. В таком состоянии нельзя зайти в **Система -> Настройки** и включить Web App обратно через UI.
|
||||
|
||||
Чтобы восстановить доступ:
|
||||
|
||||
1. В `.env` выставьте `WEBAPP_ENABLED=True`.
|
||||
2. Перезапустите backend/frontend контейнеры, например `docker compose up -d --force-recreate backend frontend`.
|
||||
3. Откройте `SUBSCRIPTION_MINI_APP_URL` под Telegram-аккаунтом из `ADMIN_IDS` и при необходимости проверьте настройку в админке.
|
||||
|
||||
## Настройка через админку
|
||||
|
||||
После запуска откройте Mini App под аккаунтом, чей Telegram ID указан в `ADMIN_IDS`, и перейдите в админ-панель.
|
||||
|
||||
Рекомендуемый порядок первичной настройки:
|
||||
|
||||
1. **Система -> Настройки -> Remnawave**: проверьте `PANEL_API_URL`, `PANEL_API_KEY`, `PANEL_WEBHOOK_SECRET`, базовые squads.
|
||||
2. **Система -> Тарифы**: создайте JSON-каталог тарифов, выберите Internal Squads, настройте модели на срок/по трафику, premium-сквады и HWID-пакеты.
|
||||
3. **Система -> Настройки -> Инструкции подключения**: проверьте, что Remnawave Panel отдает нужный конфиг Subscription Page. JSON-переопределение включайте только если нужно временно заменить конфиг панели.
|
||||
4. **Система -> Настройки -> Платежи**: включите нужные провайдеры и заполните их ключи.
|
||||
5. **Внешний вид**: настройте название, тему, логотип, favicon и accent.
|
||||
6. **Система -> Настройки -> Поддержка / Уведомления**: настройте тикеты, лог-чат, email-уведомления и напоминания.
|
||||
7. **Общие настройки**: заполните ссылки на поддержку, документы, статус сервиса и обязательный канал, если он нужен.
|
||||
|
||||
Изменения из админки пишутся в таблицу `app_setting_overrides`. При сбросе override снова используется значение из `.env` или дефолт из кода.
|
||||
|
||||
## Что оставить только в `.env`
|
||||
|
||||
Не все настройки стоит переносить в базу. В `.env` остаются:
|
||||
|
||||
- токен бота и `ADMIN_IDS`;
|
||||
- параметры PostgreSQL, Redis, портов и Compose;
|
||||
- `WEBHOOK_BASE_URL`, потому что вебхук Telegram устанавливается при старте;
|
||||
- стабильные секреты `WEBAPP_SESSION_SECRET` и `WEBHOOK_SECRET_TOKEN`;
|
||||
- `WEBAPP_THEMES_DIR`, `TARIFFS_CONFIG_PATH` и низкоуровневые TTL/pool/worker-параметры;
|
||||
- Remnawave-доступы как базовый источник правды, даже если для удобства они доступны в админке.
|
||||
|
||||
Конфиг инструкций установки обычно не нужно хранить в локальном `data`-файле: по умолчанию приложение читает конфиг Subscription Page из Remnawave Panel. `SUBSCRIPTION_PAGE_CONFIG_PATH` и `SUBSCRIPTION_PAGE_CONFIG_JSON` нужны как резервный путь или явное переопределение из админки.
|
||||
|
||||
## Файловые данные
|
||||
|
||||
В штатном `docker-compose.yml` данные хранятся в named volume `shop-data`. Внутри него лежат тарифы, темы, логотипы и прочие файловые данные приложения.
|
||||
|
||||
Если для локальной разработки включаете bind mount `./data:/app/data`, заранее создайте каталоги и отдайте их пользователю контейнера:
|
||||
|
||||
```bash
|
||||
mkdir -p data/themes data/webapp-logo data/webapp-emoji data/tariffs
|
||||
touch data/locales-overrides.json
|
||||
chown -R 10001:10001 data
|
||||
chmod -R u+rwX data
|
||||
docker compose up -d --force-recreate backend worker
|
||||
```
|
||||
|
||||
Проверить права можно так:
|
||||
|
||||
```bash
|
||||
docker compose exec backend sh -lc 'id; touch /app/data/themes/test && rm /app/data/themes/test'
|
||||
```
|
||||
|
||||
## Дополнительные разделы
|
||||
|
||||
- [configuration/env-vars.md](../configuration/env-vars.md) - полный справочник переменных `.env`.
|
||||
- [features/admin-panel.md](../features/admin-panel.md) - как устроены overrides и allowlist настроек.
|
||||
- [features/tariffs.md](../features/tariffs.md) - JSON-каталог тарифов и редактор тарифов.
|
||||
- [Веб-приложение / Mini App](../features/web-app.md) - домен Mini App, Telegram OAuth и вход по email.
|
||||
- [Поддержка пользователей / тикеты](../features/support.md) - тикеты поддержки и уведомления.
|
||||
- [Развертывание](deployment.md) - Docker Compose, обратный прокси, Caddy/Nginx и обновления.
|
||||
@@ -0,0 +1,411 @@
|
||||
# Развертывание
|
||||
|
||||
Документ описывает продакшен-запуск после разделения проекта на `backend`, `frontend` и `worker`.
|
||||
Перед стартом заполните минимальный `.env` по [configuration.md](configuration.md). Полный справочник переменных лежит в [configuration/env-vars.md](../configuration/env-vars.md); после первого входа большинство продуктовых настроек удобнее менять через Web App админку.
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
docker compose up -d --build
|
||||
docker compose ps
|
||||
docker compose logs -f backend worker frontend
|
||||
```
|
||||
|
||||
Обычный `docker compose up -d --build` поднимает:
|
||||
|
||||
- `postgres` и `redis` с проверками здоровья;
|
||||
- `migrate` как одноразовый сервис на backend-образе;
|
||||
- `backend` только после успешных миграций;
|
||||
- `worker` только после успешных миграций;
|
||||
- `frontend` как отдельный nginx-образ без Python runtime.
|
||||
|
||||
Основной путь миграций — отдельный сервис `migrate`. `backend` и `worker` также выполняют
|
||||
безопасную проверку схемы на старте под PostgreSQL advisory lock, поэтому прямой запуск сервиса
|
||||
без compose тоже применит недостающие миграции и не создаст гонку на схеме БД.
|
||||
|
||||
## Готовые папки запуска
|
||||
|
||||
Для продакшена удобнее использовать не корневой compose, а отдельные Docker Compose-примеры из папки `deploy/examples`. В каждой папке лежат свой `docker-compose.yml`, `.env.example` и нужный конфиг прокси.
|
||||
|
||||
Предпочтительный вариант для обычного публичного сервера - **Caddy**: он сам выпускает и продлевает HTTPS-сертификаты, а конфигурация получается короче, чем с ручным Nginx.
|
||||
|
||||
| Папка | Когда использовать |
|
||||
| --- | --- |
|
||||
| [`deploy/examples/caddy`](https://github.com/3252a8/remnawave-minishop/tree/main/deploy/examples/caddy) | Нужен простой публичный HTTPS с автоматическими сертификатами Let's Encrypt. |
|
||||
| [`deploy/examples/nginx`](https://github.com/3252a8/remnawave-minishop/tree/main/deploy/examples/nginx) | Уже используете Nginx и готовы положить TLS-сертификаты рядом с примером. |
|
||||
| [`deploy/examples/newt`](https://github.com/3252a8/remnawave-minishop/tree/main/deploy/examples/newt) | Публикуете сервисы через Pangolin/Newt без входящих портов на сервере приложения. |
|
||||
| [`deploy/examples/no-proxy`](https://github.com/3252a8/remnawave-minishop/tree/main/deploy/examples/no-proxy) | Нужно напрямую открыть HTTP-порты backend/frontend или проверить стек за внешним TLS-терминатором. |
|
||||
|
||||
## Caddy (рекомендуемый вариант)
|
||||
|
||||
Caddy подходит, если DNS-записи `WEBHOOK_HOST` и `MINIAPP_HOST` смотрят на сервер приложения, а входящие `80/tcp` и `443/tcp` открыты.
|
||||
|
||||
```bash
|
||||
cd deploy/examples/caddy
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
docker compose up -d
|
||||
docker compose logs -f caddy backend worker frontend
|
||||
```
|
||||
|
||||
Минимально поменяйте в `.env`:
|
||||
|
||||
- `WEBHOOK_HOST` и `MINIAPP_HOST`;
|
||||
- `BOT_TOKEN`, `ADMIN_IDS`;
|
||||
- `POSTGRES_PASSWORD`;
|
||||
- `WEBAPP_SESSION_SECRET`, `WEBHOOK_SECRET_TOKEN`;
|
||||
- `PANEL_API_URL`, `PANEL_API_KEY`, `PANEL_WEBHOOK_SECRET`.
|
||||
|
||||
Если нужна нестандартная логика Caddy, правьте `Caddyfile` рядом с compose и перезапускайте:
|
||||
|
||||
```bash
|
||||
docker compose up -d --force-recreate caddy
|
||||
```
|
||||
|
||||
## Nginx
|
||||
|
||||
Nginx-вариант поднимает Nginx в той же Docker-сети, что и приложение:
|
||||
|
||||
- `WEBHOOK_HOST` проксируется в `backend:8080`;
|
||||
- `MINIAPP_HOST` проксируется в `frontend:80`;
|
||||
- `frontend` сам проксирует внутренние `/api`, `/auth` и ассеты тем в `backend:8081`.
|
||||
|
||||
```bash
|
||||
cd deploy/examples/nginx
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
```
|
||||
|
||||
Положите TLS-сертификаты в `ssl/`:
|
||||
|
||||
```text
|
||||
ssl/
|
||||
webhooks.example.com/
|
||||
fullchain.pem
|
||||
privkey.pem
|
||||
app.example.com/
|
||||
fullchain.pem
|
||||
privkey.pem
|
||||
```
|
||||
|
||||
Имена папок должны совпадать с `WEBHOOK_HOST` и `MINIAPP_HOST` в `.env`.
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
docker compose logs -f nginx backend worker frontend
|
||||
```
|
||||
|
||||
Если нужно поменять заголовки, лимиты или TLS-настройки, правьте `nginx.conf.template` и перезапускайте Nginx:
|
||||
|
||||
```bash
|
||||
docker compose up -d --force-recreate nginx
|
||||
```
|
||||
|
||||
## Pangolin / Newt
|
||||
|
||||
Этот вариант не открывает входящие порты на сервере приложения. Newt подключается к Pangolin, а публичные домены настраиваются ресурсами в панели Pangolin.
|
||||
|
||||
```bash
|
||||
cd deploy/examples/newt
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
В `.env` заполните:
|
||||
|
||||
- `WEBHOOK_HOST` и `MINIAPP_HOST` - публичные домены ресурсов в Pangolin;
|
||||
- `PANGOLIN_ENDPOINT`, `NEWT_ID`, `NEWT_SECRET` - значения из настроек site/client в Pangolin;
|
||||
- обычные переменные приложения: `BOT_TOKEN`, `ADMIN_IDS`, `POSTGRES_PASSWORD`, секреты и доступ к Remnawave.
|
||||
|
||||
В Pangolin создайте два HTTP-ресурса для этого Newt site:
|
||||
|
||||
| Публичный домен | Upstream |
|
||||
| --- | --- |
|
||||
| `https://webhooks.example.com` | `http://backend:8080` |
|
||||
| `https://app.example.com` | `http://frontend:80` |
|
||||
|
||||
Проверка:
|
||||
|
||||
```bash
|
||||
docker compose ps
|
||||
docker compose logs -f newt backend worker frontend
|
||||
```
|
||||
|
||||
## Без обратного прокси
|
||||
|
||||
Этот вариант напрямую публикует два HTTP-порта:
|
||||
|
||||
- backend/вебхуки: `WEB_SERVER_BIND`, по умолчанию `0.0.0.0:8080`;
|
||||
- frontend/Mini App: `FRONTEND_BIND`, по умолчанию `0.0.0.0:8082`.
|
||||
|
||||
```bash
|
||||
cd deploy/examples/no-proxy
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Важно: контейнеры приложения сами не выпускают TLS-сертификаты. Для реального вебхука Telegram и Mini App публичные URL должны быть HTTPS. Используйте этот вариант для локальной проверки, внутренней сети или ситуации, когда HTTPS завершается внешней платформой и дальше трафик приходит на эти порты.
|
||||
|
||||
Проверка локально:
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:8080/healthz
|
||||
curl http://127.0.0.1:8082/health
|
||||
docker compose logs -f backend worker frontend
|
||||
```
|
||||
|
||||
Корневой `docker-compose.yml` оставлен для локальной сборки из исходников. Примеры в `deploy/examples` используют готовые GHCR-образы и не требуют указывать `-f`.
|
||||
|
||||
## Миграции
|
||||
|
||||
При обычном старте миграции применяются автоматически:
|
||||
|
||||
```bash
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Для ручного повторного запуска:
|
||||
|
||||
```bash
|
||||
docker compose run --rm migrate
|
||||
```
|
||||
|
||||
Проверить логи миграций:
|
||||
|
||||
```bash
|
||||
docker compose logs migrate
|
||||
```
|
||||
|
||||
`backend` и `worker` зависят от `migrate` через `service_completed_successfully`; если миграции
|
||||
падают, приложение не стартует поверх неподготовленной БД. При прямом запуске `backend` или
|
||||
`worker` без compose тот же `init_db` применяет недостающие миграции перед стартом логики сервиса.
|
||||
|
||||
## Сервисы
|
||||
|
||||
- `backend`: aiohttp API, вебхук Telegram, платежные вебхуки, вебхуки панели, проверка здоровья `/healthz`.
|
||||
- `worker`: TariffTrafficWorker, задачи синхронизации с панелью, обработка рассылок, потребители очереди вебхуков.
|
||||
- `frontend`: статические Svelte-ассеты через nginx.
|
||||
- `postgres`: PostgreSQL 17.
|
||||
- `redis`: Redis 7 для FSM, кеша, rate-limit, очередей и locks.
|
||||
|
||||
В продакшен-примерах внешний доступ добавляют `caddy`, `nginx`, `newt` или прямые `ports` в соответствующем варианте из `deploy/examples`.
|
||||
|
||||
## Логи и проверка
|
||||
|
||||
```bash
|
||||
docker compose ps
|
||||
docker compose logs -f backend
|
||||
docker compose logs -f worker
|
||||
docker compose logs -f frontend
|
||||
```
|
||||
|
||||
Эндпоинты проверки здоровья:
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:8080/healthz
|
||||
curl http://127.0.0.1:8080/health
|
||||
```
|
||||
|
||||
В обычном compose backend публикуется на `127.0.0.1:${WEB_SERVER_PORT:-8080}`, frontend на
|
||||
`127.0.0.1:${FRONTEND_PORT:-8082}`. В новых продакшен-примерах проверяйте bind-переменные
|
||||
конкретной папки: `HTTP_BIND`, `HTTPS_BIND`, `WEB_SERVER_BIND` или `FRONTEND_BIND`.
|
||||
|
||||
## Обновление
|
||||
|
||||
Локальная сборка из репозитория:
|
||||
|
||||
```bash
|
||||
git pull
|
||||
docker compose up -d --build
|
||||
docker compose logs -f migrate backend worker
|
||||
```
|
||||
|
||||
Если нужно пересобрать только образы приложения:
|
||||
|
||||
```bash
|
||||
docker compose build frontend backend worker
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## Образы GHCR и Docker Hub
|
||||
|
||||
Образы приложения называются единообразно:
|
||||
|
||||
```text
|
||||
ghcr.io/3252a8/remnawave-minishop-backend:<tag>
|
||||
ghcr.io/3252a8/remnawave-minishop-worker:<tag>
|
||||
ghcr.io/3252a8/remnawave-minishop-frontend:<tag>
|
||||
docker.io/3252a8/remnawave-minishop-backend:<tag>
|
||||
docker.io/3252a8/remnawave-minishop-worker:<tag>
|
||||
docker.io/3252a8/remnawave-minishop-frontend:<tag>
|
||||
```
|
||||
|
||||
Чтобы собрать и сразу опубликовать все три образа в GHCR и Docker Hub, сначала выполните логин в оба registry:
|
||||
|
||||
```bash
|
||||
docker login ghcr.io
|
||||
docker login docker.io
|
||||
IMAGE_TAG=v3.4.3 bash scripts/docker-build-push-images.sh
|
||||
```
|
||||
|
||||
PowerShell-вариант:
|
||||
|
||||
```powershell
|
||||
$env:IMAGE_TAG = "v3.4.3"
|
||||
docker login ghcr.io
|
||||
docker login docker.io
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\docker-build-push-images.ps1
|
||||
```
|
||||
|
||||
По умолчанию скрипты используют:
|
||||
|
||||
- `IMAGE_REGISTRIES=ghcr.io docker.io`
|
||||
- `IMAGE_NAMESPACE=3252a8`
|
||||
- `IMAGE_PREFIX=remnawave-minishop`
|
||||
- `TARGETS=backend worker frontend`
|
||||
- `DOCKERFILE=deploy/docker/Dockerfile`
|
||||
|
||||
Если нужен только один registry или другой namespace, переопределите переменные:
|
||||
|
||||
```bash
|
||||
IMAGE_REGISTRIES=ghcr.io IMAGE_TAG=v3.4.3 bash scripts/docker-build-push-images.sh
|
||||
IMAGE_REGISTRIES="ghcr.io docker.io" IMAGE_NAMESPACE=other IMAGE_TAG=v3.4.3 bash scripts/docker-build-push-images.sh
|
||||
```
|
||||
|
||||
Старые раздельные команды тоже остаются:
|
||||
|
||||
```bash
|
||||
IMAGE_TAG=v3.4.3 scripts/docker-build-images.sh
|
||||
IMAGE_TAG=v3.4.3 scripts/docker-push-images.sh
|
||||
```
|
||||
|
||||
Для PowerShell есть варианты `scripts/docker-build-images.ps1` и
|
||||
`scripts/docker-push-images.ps1`. Если публикуете образы в другой registry, namespace или с другим
|
||||
префиксом имени, переопределите `IMAGE_NAMESPACE`, `IMAGE_REGISTRY` или `IMAGE_PREFIX`.
|
||||
|
||||
Для совместимости оставлены Docker Hub-only скрипты:
|
||||
|
||||
```bash
|
||||
docker login
|
||||
IMAGE_TAG=v3.4.3 bash scripts/dockerhub-build-push-images.sh
|
||||
```
|
||||
|
||||
PowerShell-вариант:
|
||||
|
||||
```powershell
|
||||
$env:IMAGE_TAG = "v3.4.3"
|
||||
docker login
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\dockerhub-build-push-images.ps1
|
||||
```
|
||||
|
||||
Если PowerShell блокирует локальные скрипты ошибкой `PSSecurityException` / Execution Policy,
|
||||
запустите те же скрипты с обходом политики только для текущего процесса:
|
||||
|
||||
```powershell
|
||||
$env:IMAGE_TAG = "v3.4.3"
|
||||
docker login ghcr.io
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\docker-build-images.ps1
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\docker-push-images.ps1
|
||||
```
|
||||
|
||||
Этот bypass действует только для запущенного процесса `powershell` и не меняет системную политику.
|
||||
|
||||
## Масштабирование
|
||||
|
||||
В текущих Compose-файлах заданы явные `container_name`, поэтому `docker compose --scale` для
|
||||
`backend`, `frontend` и `worker` не используется: Docker не может создать несколько контейнеров с
|
||||
одним именем. Если понадобится горизонтальное масштабирование, уберите `container_name` у
|
||||
масштабируемых сервисов или перенесите конфигурацию в orchestrator.
|
||||
|
||||
Состояние FSM, rate-limit и краткоживущие кеши вынесены в Redis, а tariff tick защищен Redis
|
||||
distributed lock; код подготовлен к нескольким репликам, но текущие Compose-файлы ориентированы на
|
||||
фиксированные имена контейнеров.
|
||||
|
||||
## Данные и volumes
|
||||
|
||||
Продакшен compose использует именованные volumes:
|
||||
|
||||
- `postgres-data`;
|
||||
- `redis-data`;
|
||||
- `shop-data`;
|
||||
В Caddy-варианте также используются `caddy-data` и `caddy-config`.
|
||||
|
||||
`shop-data` монтируется целиком в `/app/data`; внутри него лежат тарифы, темы, логотипы и прочие
|
||||
файловые данные приложения.
|
||||
|
||||
Если вместо именованного volume включаете bind mount `./data:/app/data`, на сервере заранее дайте права
|
||||
пользователю контейнера `10001`:
|
||||
|
||||
```bash
|
||||
mkdir -p data/themes data/webapp-logo data/webapp-emoji data/tariffs
|
||||
touch data/locales-overrides.json
|
||||
chown -R 10001:10001 data
|
||||
chmod -R u+rwX data
|
||||
docker compose up -d --force-recreate backend worker
|
||||
```
|
||||
|
||||
Проверка прав:
|
||||
|
||||
```bash
|
||||
docker compose exec backend sh -lc 'id; touch /app/data/themes/test && rm /app/data/themes/test'
|
||||
```
|
||||
|
||||
## Резервная копия PostgreSQL
|
||||
|
||||
```bash
|
||||
docker compose exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB"' > backup.sql
|
||||
```
|
||||
|
||||
Восстановление в чистую БД:
|
||||
|
||||
```bash
|
||||
docker compose stop backend worker
|
||||
docker compose exec postgres sh -c 'dropdb -U "$POSTGRES_USER" --if-exists "$POSTGRES_DB"'
|
||||
docker compose exec postgres sh -c 'createdb -U "$POSTGRES_USER" "$POSTGRES_DB"'
|
||||
docker compose exec -T postgres sh -c 'psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -d "$POSTGRES_DB"' < backup.sql
|
||||
docker compose run --rm migrate
|
||||
docker compose up -d backend worker
|
||||
```
|
||||
|
||||
## Обратный прокси
|
||||
|
||||
Готовые reverse-proxy примеры описаны выше:
|
||||
|
||||
- [Caddy](#caddy-рекомендуемый-вариант) - автоматический HTTPS;
|
||||
- [Nginx](#nginx) - сертификаты кладутся рядом в `ssl/`;
|
||||
- [Newt/Pangolin](#pangolin--newt) - без входящих портов на сервере приложения.
|
||||
|
||||
Во всех вариантах схема одинаковая:
|
||||
|
||||
- webhook/backend-домен целиком идет в `backend:8080`;
|
||||
- Mini App/frontend-домен целиком идет в `frontend:80`;
|
||||
- API/auth/theme routes Mini App дальше проксируются frontend nginx в `backend:8081`.
|
||||
|
||||
Минимальная логика Caddy:
|
||||
|
||||
```caddyfile
|
||||
webhooks.example.com {
|
||||
reverse_proxy backend:8080
|
||||
}
|
||||
|
||||
app.example.com {
|
||||
reverse_proxy frontend:80
|
||||
}
|
||||
```
|
||||
|
||||
Минимальная логика Nginx такая же: `webhooks.example.com` проксируется в `backend:8080`,
|
||||
`app.example.com` - в `frontend:80`. В `deploy/examples/nginx/nginx.conf.template` уже есть
|
||||
заголовки `X-Forwarded-*`, редирект HTTP -> HTTPS и пути сертификатов.
|
||||
|
||||
## Переменный env-файл
|
||||
|
||||
По умолчанию compose читает `.env`. Для smoke-тестов или отдельного окружения можно подставить
|
||||
другой файл:
|
||||
|
||||
```bash
|
||||
APP_ENV_FILE=.env.staging docker compose --env-file .env.staging up -d --build
|
||||
```
|
||||
@@ -10,17 +10,9 @@ Remnawave Minishop состоит из Telegram-бота, backend API, worker-п
|
||||
- **PostgreSQL** - пользователи, платежи, настройки, поддержка, промокоды и служебные данные.
|
||||
- **Redis** - FSM, кеши, rate limit, очередь вебхуков и distributed locks.
|
||||
|
||||
## Сценарии
|
||||
|
||||
- пользователь открывает Mini App, видит подписку и оплачивает тариф;
|
||||
- платежный провайдер отправляет webhook в backend;
|
||||
- worker применяет фоновые задачи и синхронизацию;
|
||||
- Remnawave Panel хранит пользователя, подписку и ссылку подключения;
|
||||
- администратор управляет тарифами, поддержкой, пользователями и настройками через админку.
|
||||
|
||||
## Куда идти дальше
|
||||
|
||||
- [Установка](setup.md) - базовый запуск через Compose.
|
||||
- [Развертывание](../deployment.md) - Docker Compose, Caddy, Nginx, Pangolin/Newt и запуск без обратного прокси.
|
||||
- [Развертывание](deployment.md) - Docker Compose, Caddy, Nginx, Pangolin/Newt и запуск без обратного прокси.
|
||||
- [Архитектура](../architecture.md) - структура каталогов и сервисов.
|
||||
- [Mini App](../features/web-app.md) - публичный frontend, Telegram OAuth и инструкции установки.
|
||||
|
||||
@@ -22,7 +22,7 @@ docker compose logs -f backend worker frontend
|
||||
|
||||
## Как выбрать Compose-вариант
|
||||
|
||||
Для продакшена по умолчанию берите [Caddy](../deployment.md#caddy-рекомендуемый-вариант): это самый короткий путь к публичному HTTPS без ручной раскладки сертификатов.
|
||||
Для продакшена по умолчанию берите [Caddy](deployment.md#caddy-рекомендуемый-вариант): это самый короткий путь к публичному HTTPS без ручной раскладки сертификатов.
|
||||
|
||||
```bash
|
||||
cd deploy/examples/caddy
|
||||
@@ -31,11 +31,11 @@ nano .env
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Остальные варианты описаны в [разделе развертывания](../deployment.md#готовые-папки-запуска):
|
||||
Остальные варианты описаны в [разделе развертывания](deployment.md#готовые-папки-запуска):
|
||||
|
||||
- [Nginx](../deployment.md#nginx) - если у вас уже есть TLS-сертификаты и нужен Nginx в Docker-сети;
|
||||
- [Pangolin/Newt](../deployment.md#pangolin--newt) - если нельзя открывать входящие порты на сервере приложения;
|
||||
- [без обратного прокси](../deployment.md#без-обратного-прокси) - для локальной проверки или внешнего TLS-терминатора.
|
||||
- [Nginx](deployment.md#nginx) - если у вас уже есть TLS-сертификаты и нужен Nginx в Docker-сети;
|
||||
- [Pangolin/Newt](deployment.md#pangolin--newt) - если нельзя открывать входящие порты на сервере приложения;
|
||||
- [без обратного прокси](deployment.md#без-обратного-прокси) - для локальной проверки или внешнего TLS-терминатора.
|
||||
|
||||
## После первого входа
|
||||
|
||||
@@ -45,4 +45,4 @@ docker compose up -d
|
||||
4. Проверьте инструкции подключения.
|
||||
5. Сделайте тестовую покупку или пробную активацию.
|
||||
|
||||
Подробности: [настройка окружения](../configuration.md) и [развертывание](../deployment.md).
|
||||
Подробности: [настройка окружения](configuration.md) и [развертывание](deployment.md).
|
||||
|
||||
Reference in New Issue
Block a user