Асинхронное файловое хранилище на основе TCP протокола с авторизацией пользователей.
Проект представляет собой клиент-серверное приложение для хранения и управления файлами пользователей. Сервер обрабатывает множественные подключения асинхронно, каждый пользователь имеет изолированное хранилище файлов.
- 🔐 Авторизация пользователей с хешированием паролей (bcrypt)
- 📁 Управление файлами: загрузка, скачивание, удаление, просмотр списка
- 📂 Поддержка подпапок
- 🔄 Асинхронная обработка множественных клиентов
- 📊 Прогресс-бар для больших файлов
- 🛡️ Валидация путей и защита от path traversal
- 📝 Логирование операций
- Python >= 3.13
- uv (рекомендуется) или pip
# С использованием uv
uv sync
# Или с использованием pip
pip install -e .python -m src.main serverСервер запустится на localhost:8000 (по умолчанию).
# Регистрация нового пользователя
python -m src.main register --login username --password password
# Авторизация
python -m src.main login --login username --password password
# Список файлов (можно передать --login и --password для автоматической авторизации)
python -m src.main list [path] [--login username] [--password password]
# Загрузка файла на сервер (можно передать --login и --password для автоматической авторизации)
python -m src.main put local_file.txt remote_file.txt [--login username] [--password password]
# Скачивание файла с сервера (можно передать --login и --password для автоматической авторизации)
python -m src.main get remote_file.txt local_file.txt [--login username] [--password password]
# Удаление файла или папки (можно передать --login и --password для автоматической авторизации)
python -m src.main delete path/to/file [--login username] [--password password]Для работы с сохранением соединения между командами:
python -m src.main interactiveВ интерактивном режиме доступны команды:
login <логин> <пароль>- авторизацияregister <логин> <пароль>- регистрацияlist [path]- список файловget <remote> <local>- скачать файлput <local> <remote>- загрузить файлdelete <path>- удалить файл/папкуhelp- справкаexit- выход
src/
├── client/ # Клиентская часть
│ ├── cli.py # CLI интерфейс (click)
│ ├── client.py # TCP клиент
│ └── protocol.py # Протокол обмена данными
├── server/ # Серверная часть
│ ├── __init__.py # Асинхронный TCP сервер
│ ├── server.py # TCP сервер
│ ├── auth.py # Авторизация пользователей
│ ├── storage.py # Файловое хранилище
│ └── protocol.py # Протокол обмена данными
└── utils/ # Утилиты
├── config.py # Конфигурация
├── constants.py # Константы
├── exceptions.py # Кастомные исключения
├── logger.py # Логирование
├── security.py # Безопасность (хеширование)
└── types.py # Типы данных
- JSON команды: Команды отправляются в формате JSON с полем
command - Бинарные данные: Файлы передаются бинарно после JSON метаданных
- Формат: Длина сообщения (4 байта) + данные
- Пользователи хранятся в
users.json(UUID, логин, хеш пароля) - Файлы пользователей в
storage/{user_uuid}/ - Каждый пользователь имеет изолированное хранилище
Настройки можно изменить через переменные окружения или в src/utils/config.py:
HOST- адрес сервера (по умолчанию: localhost)PORT- порт сервера (по умолчанию: 8000)CHUNK_SIZE- размер чанка для передачи файлов (по умолчанию: 65536 байт)MAX_FILE_SIZE- максимальный размер файла (по умолчанию: 1 GB)MIN_PASSWORD_LENGTH- минимальная длина пароля (по умолчанию: 6)MAX_LOGIN_LENGTH- максимальная длина логина (по умолчанию: 50)MAX_PATH_LENGTH- максимальная длина пути (по умолчанию: 4096)
# 1. Запустить сервер
python -m src.main server
# 2. В другом терминале - зарегистрироваться
python -m src.main register --login user1 --password pass123
# 3. Загрузить файл с авторизацией в команде
python -m src.main put ~/Documents/file.txt documents/file.txt --login user1 --password pass123
# 4. Посмотреть список файлов с авторизацией
python -m src.main list --login user1 --password pass123
# 5. Скачать файл с авторизацией
python -m src.main get documents/file.txt ~/Downloads/file.txt --login user1 --password pass123
# 6. Удалить файл с авторизацией
python -m src.main delete documents/file.txt --login user1 --password pass123python -m src.main interactive
> login user1 pass123
Авторизация успешна
> list
📄 file.txt (1024 байт)
📁 documents
> put ~/test.txt test.txt
Загрузка файла (512 байт)...
Файл загружен: test.txt
> list
📄 file.txt (1024 байт)
📄 test.txt (512 байт)
📁 documents
> exit- Пароли хранятся в виде bcrypt хешей
- Защита от path traversal атак
- Валидация входных данных
- Ограничение размера файлов
- Изоляция файлов пользователей
Логи сохраняются в:
- Консоль
- Файл
logs/app.log(при log_to_file в настройках)
# Установить зависимости
uv sync
# Запустить сервер
python -m src.main server
# В другом терминале запустить клиент
python -m src.main interactiveЕсли имеется установленный Just
# Запуск сервера
just run-server
# Запуск клиента в другом терминале (сразу в интерактивном режиме)
just run-cli