feat(db): add Postgres→SQLite fallback and Russian README

This commit is contained in:
2025-09-04 11:50:57 +03:00
parent c1a75f783a
commit 287cc916c4
2 changed files with 103 additions and 2 deletions

78
README_RU.md Normal file
View File

@@ -0,0 +1,78 @@
# Опросник (Quiz for Mont)
Веб‑приложение на Flask + Peewee для проведения опросов и сравнения платформ.
## Запуск
Есть два основных способа запуска: локально с SQLite или через Docker Compose с Postgres.
### 1) Локально (SQLite)
По умолчанию приложение пытается подключиться к Postgres. Если он недоступен, код автоматически переключится на SQLite. Чтобы явно форсировать SQLite:
- PowerShell (Windows):
```
$env:USE_SQLITE = '1'
$env:SQLITE_PATH = 'survey.db' # необязательно, по умолчанию survey.db
python main.py # или flask --app main run
```
### 2) Docker Compose (Postgres)
В проекте есть `docker-compose.yml` c сервисами `db` (Postgres) и `flask-app`.
```
docker-compose up -d
```
После поднятия контейнеров приложение доступно на `http://localhost:3333`.
Переменные окружения для подключения к Postgres уже прописаны в `docker-compose.yml`:
- `POSTGRES_HOST=db`
- `POSTGRES_DB=survey`
- `POSTGRES_USER=servey`
- `POSTGRES_PASSWORD=utOgbZ09servey`
## База данных и фолбэк
В `models.py` используется следующая логика инициализации БД:
- Если установлено `USE_SQLITE=1`, используется SQLite (файл `survey.db`).
- Иначе выполняется попытка подключения к Postgres. Если соединение не удалось (например, приложение запущено вне Docker и хост `db` недоступен), приложение автоматически переключается на SQLite.
При первом запуске таблицы создаются автоматически.
## Миграция данных из SQLite в Postgres
В проекте есть скрипт `migrate_sqlite_to_postgres.py` (используйте его при необходимости переноса данных). Перед миграцией убедитесь, что Postgres доступен и параметры подключения верны.
## Полезные команды
- Установка зависимостей:
```
pip install -r requirements.txt
```
- Запуск Flask локально:
```
flask --app main run --debug
```
## Переменные окружения
- `USE_SQLITE` — если `1`, принудительно использовать SQLite.
- `SQLITE_PATH` — путь к файлу базы SQLite (по умолчанию `survey.db`).
- `POSTGRES_HOST` — хост Postgres (по умолчанию `db`).
- `POSTGRES_PORT` — порт Postgres (по умолчанию `5432`).
- `POSTGRES_DB` — имя БД (по умолчанию `survey`).
- `POSTGRES_USER` — пользователь Postgres (по умолчанию `servey`).
- `POSTGRES_PASSWORD` — пароль Postgres.
## Замечания по безопасности
Текущие значения по умолчанию для доступа к Postgres предназначены для локальной разработки и Docker. Для продакшена обязательно замените пароли и настройте защищённые секреты.

View File

@@ -14,7 +14,7 @@ else:
user=os.environ.get("POSTGRES_USER", "servey"),
password=os.environ.get("POSTGRES_PASSWORD", "utOgbZ09servey"),
host=os.environ.get("POSTGRES_HOST", "db"),
port=5432
port=int(os.environ.get("POSTGRES_PORT", 5432))
)
class BaseModel(Model):
@@ -89,7 +89,30 @@ class SurveyResult(BaseModel):
# Можно добавить поле для процента или JSON с ответами, если нужно
def initialize_db():
"""Инициализация БД с автоматическим фолбэком на SQLite.
Логика:
- Если установлен USE_SQLITE=1, используем SQLite.
- Иначе пытаемся подключиться к Postgres; при ошибке — переключаемся на SQLite.
"""
global db
try:
db.connect()
except Exception as exc:
# Если Postgres недоступен и режим SQLite не принудительный — делаем фолбэк
if not USE_SQLITE:
sqlite_db = SqliteDatabase(os.environ.get("SQLITE_PATH", "survey.db"))
# Перепривязываем модели к SQLite
sqlite_db.bind([
User, SurveyType, Product, Feature, Platform, PlatformFeature,
UserSurvey, SurveyInvite, SurveyResult
], bind_refs=False, bind_backrefs=False)
db = sqlite_db
db.connect()
else:
raise
db.create_tables([
User, SurveyType, Product, Feature, Platform, PlatformFeature,
UserSurvey, SurveyInvite, SurveyResult