README.md

This commit is contained in:
2026-09-06 02:16:51 +03:00
parent a86ffe5741
commit 09f02208af
+149 -3
View File
@@ -1,6 +1,152 @@
До первого запуска, для создания таблиц в БД и пользователя admin необходимо раскоментировать строки 141-143
# SecretText — Сервис безопасной передачи одноразовых секретов
**SecretText** — это self-hosted веб-приложение на Flask, предназначенное для конфиденциальной передачи одноразовых паролей, ключей шифрования и защищенных текстовых заметок. Сервис работает по принципу «прочитано — удалено», минимизируя цифровой след.
## 🚀 Основные возможности
- **Одноразовые секреты**: Ссылка на секрет автоматически уничтожается в Redis сразу после первого просмотра получателем.
- **Двусторонний обмен (Запросы секретов)**: Возможность создать защищенную ссылку-запрос с уникальным токеном, перейдя по которой, сторонний пользователь может безопасно отправить секрет вам в личный кабинет.
- **Симметричное шифрование**: Все секреты шифруются «на лету» с помощью библиотеки `cryptography` (алгоритм Fernet/AES) перед отправкой в оперативную память.
- **Встроенная защита от атак**:
- Защита от перебора ссылок (Anti-Bruteforce) с прогрессивной блокировкой IP-адресов в Redis.
- Ограничение частоты запросов (Rate Limiting) для предотвращения DoS-атак и спама.
- Строгая санитизация входных данных (`bleach`) и защита от CSRF-атак.
- **Панель администратора**: Встроенный аудит событий безопасности, просмотр системных логов, управление пользователями (активация/деактивация) и просмотр статистики.
- **Мультиязычные шаблоны**: Готовые двуязычные блоки (RU/EN) с кнопками автоматического копирования в один клик.
- **Автономность**: Проект не использует внешние CDN. Все библиотеки (Bootstrap 5, Bootstrap Icons) упакованы локально в папке `static`.
---
## 🛠️ Подготовка к первому запуску
### 1. Системные требования
Для работы приложения необходимы:
- **Python 3.10** или выше
- **Redis Server** (для хранения зашифрованных секретов и сессий сессий)
- **MariaDB / MySQL** (для хранения учетных записей пользователей и логов безопасности)
### 2. Клонирование репозитория и окружение
```bash
git clone https://palchikov.name
cd secrettext
# Создание и активация виртуального окружения
python -m venv .venv
source .venv/bin/activate # Для Linux/macOS
# .venv\Scripts\activate # Для Windows
# Установка зависимостей
pip install -r requirements.txt
```
### 3. Настройка конфигурации (`.env`)
Создайте файл `.env` в корневом каталоге проекта и заполните его учетными данными:
```env
# Flask конфигурация
FLASK_ENV=production
DEBUG=False
SECRET_KEY=укажите_случайный_длинный_хеш
ENCRYPTION_PASSWORD=укажите_стойкий_пароль_для_шифрования_секретов
SALT=укажите_случайный_соленый_хеш
# Настройки MariaDB / MySQL
DB_HOST=localhost
DB_PORT=3306
DB_USER=secretuser
DB_NAME=secrettext
DB_PASSWORD=ваш_пароль_от_базы_данных
# Настройки Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=пароль_redis_если_есть
# Безопасность админки
ADMIN_USERNAME=admin
ADMIN_PASSWORD=придумайте_сложный_пароль_админа
ADMIN_ALLOWED_IPS=127.0.0.1,::1
ADMIN_ALLOW_ALL=False
```
⚠️ *Внимание: Обязательно добавьте `.env` в ваш `.gitignore`, чтобы случайно не опубликовать пароли в репозитории.*
---
## 🏁 Запуск приложения
### Шаг 1. Инициализация базы данных
Перед самым первым запуском раскомментируйте блок инициализации в `main.py` (примерно 121-123 строки):
```python
with app.app_context():
database.init_db()
create_admin()
```
Запустите приложение один раз, чтобы создались таблицы в MariaDB и сгенерировалась учетная запись администратора, указанная в `.env`. После успешного создания **закомментируйте этот блок обратно**, чтобы сервер не выполнял избыточные проверки при каждом перезапуске.
database.init_db()
create_admin()
### Шаг 2. Запуск в режиме разработки
```bash
python main.py
```
Приложение станет доступно по адресу `http://localhost:5000`.
---
## 🔒 Рекомендации по настройке в продакшене (Production)
Запуск напрямую через `python main.py` предназначен **только для разработки**. При развертывании в реальной сети строго следуйте правилам ниже:
### 1. Использование боевого WSGI-сервера
Для стабильной и многопоточной работы Flask-приложения в продакшене рекомендуется использовать чистый Python WSGI-сервер, например **Waitress**. Это исключает проблемы с потоками встроенного сервера разработки:
```bash
# Установка сервера
pip install waitress
# Запуск приложения через WSGI-интерфейс
waitress-serve --host=127.0.0.1 --port=5000 main:app
```
### 2. При использование HTTPS (Apache)
Поскольку сервис обрабатывает пароли, передача данных по незащищенному протоколу HTTP категорически запрещена. Настройте **Apache** в качестве Reverse Proxy (используя модули `mod_proxy` и `mod_proxy_http`) и установите SSL-сертификат (например, бесплатный от Let's Encrypt через `certbot`).
Пример конфигурации виртуального хоста (VirtualHost) в Apache:
```apache
<VirtualHost *:443>
ServerName ://yourdomain.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/://yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/://yourdomain.com/privkey.pem
# Запрет доступа к скрытым файлам и папкам в корне (включая .env)
<FilesMatch "^\.">
Require all denied
</FilesMatch>
# Настройка Reverse Proxy на локальный боевой WSGI-сервер (Waitress)
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0
ProxyPassReverse / http://127.0.0
# Логирование
ErrorLog \${APACHE_LOG_DIR}/secrettext_error.log
CustomLog \${APACHE_LOG_DIR}/secrettext_access.log combined
</VirtualHost>
```
### 3. Настройка заголовков за прокси-сервером
При работе за Nginx Proxy обязательно убедитесь, что в `main.py` корректно обрабатывается заголовок `X-Forwarded-For`. Это необходимо, чтобы встроенная система rate-limiting и блокировки брутфорса видела **реальные IP-адреса злоумышленников**, а не локальный адрес самого Nginx (`127.0.0.1`).
### 4. Ротация логов и очистка Redis
В файле `database.py` предусмотрена функция `cleanup_old_data()`. Рекомендуется настроить системный планировщик **Cron** для ежедневного вызова скрипта очистки старых логов безопасности и просроченных записей:
```bash
0 3 * * * /home/shurik/pass_toket/.venv/bin/python -c "import database; database.cleanup_old_data()"
```
---
## 📄 Лицензия
Этот проект является полностью свободным программным обеспечением и передан в общественное достояние. Вы можете копировать, изменять, публиковать, использовать, компилировать, продавать или распространять этот код как в исходном, так и в скомпилированном виде, в любых целях, коммерческих или некоммерческих, любыми способами.