diff --git a/README_RU.md b/README_RU.md new file mode 100644 index 0000000..4137442 --- /dev/null +++ b/README_RU.md @@ -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. Для продакшена обязательно замените пароли и настройте защищённые секреты. + diff --git a/models.py b/models.py index 978cc28..7b496bd 100644 --- a/models.py +++ b/models.py @@ -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(): - db.connect() + """Инициализация БД с автоматическим фолбэком на 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