https://github.com/wh4tisl0ve/cloud_file_storage
Многопользовательское файловое облако. Пользователи сервиса могут использовать его для загрузки и хранения файлов.
https://github.com/wh4tisl0ve/cloud_file_storage
cloud-storage django docker html-css-javascript minio nginx poetry postgresql python3 redis s3
Last synced: 15 days ago
JSON representation
Многопользовательское файловое облако. Пользователи сервиса могут использовать его для загрузки и хранения файлов.
- Host: GitHub
- URL: https://github.com/wh4tisl0ve/cloud_file_storage
- Owner: Wh4tisl0ve
- Created: 2025-01-04T17:33:30.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-02-04T20:44:13.000Z (over 1 year ago)
- Last Synced: 2025-03-01T17:28:44.312Z (over 1 year ago)
- Topics: cloud-storage, django, docker, html-css-javascript, minio, nginx, poetry, postgresql, python3, redis, s3
- Language: Python
- Homepage:
- Size: 983 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Облачное хранилище файлов
Многопользовательское файловое облако. Пользователи сервиса могут использовать его для загрузки, хранения файлов и работы с ними.
Проект создан в рамках **Python Roadmap Сергея Жукова** -> [ссылка](https://zhukovsd.github.io/python-backend-learning-course/)
## Запуск проекта
- Выполните клонирование проекта
git clone https://github.com/Wh4tisl0ve/Cloud_file_storage.git
- Выполните установку Docker
- Создайте .env файл в директории
cloud_storage и заполните переменные окружения
**Для dev-версии проекта:**
- Выполните команду
docker-compose up -d --build
- Выполните команду
poetry run python manage.py runserver из директории cloud_storage
- Приложение доступно по адресу localhost:8000
**Для prod-версии проекта:**
- Выполните команду
docker-compose up -f docker-compose.prod.yaml -d --build
- Приложение доступно по адресу ${your_ip}:8000
## Пример .env
```env
#### Django-App
DEBUG=Режим отладки(False - выключен, True - включен)
SECRET_KEY=Cекретный ключ для Django
ALLOWED_HOSTS=Список доменов, которые может обслуживать приложение
#### DB-config
POSTGRES_DB=cloud_storage
POSTGRES_USER=Имя пользователя от БД
POSTGRES_PASSWORD=Пароль от БД
POSTGRES_HOST=Хост, используемый для подключения к PostgreSQL
POSTGRES_PORT=Порт, используемый для подключения к PostgreSQL(по умолчанию 5432)
#### Redis-config
REDIS_PASSWORD=Пароль от Redis
REDIS_HOST=Хост, используемый для подключения к Redis
REDIS_PORT=Порт, используемый для подключения к Redis (по умолчанию 6379)
#### Minio config
MINIO_HOST=Хост, используемый для подключения к Minio
MINIO_PORT=Порт, используемый для подключения к Minio (по умолчанию 9000)
MINIO_BUCKET_NAME=user-files
MINIO_ACCESS_KEY=Логин для доступа к пользовательскому интерфейсу MinIO
MINIO_SECRET_KEY=Пароль для доступа к пользовательскому интерфейсу MinIO
```
## Структура приложений Django
* [cloud_storage/config](cloud_storage/config) - Приложение, содержащее настройки Django
* [cloud_storage/users](cloud_storage/users) - Приложение, отвечающее за работу с пользователями
* [cloud_storage/cloud](cloud_storage/cloud) - Приложение, отвечающее за работу с основной логикой облачного хранилища
## Архитектура проекта
Проект состоит из 5 сервисов:
1. nginx - служит для обработки статических файлов и проксирования запросов
2. Django + gunicorn - служит для реализации основной логики проекта и корректной обработки запросов
3. Redis - используется для хранения пользовательских сессий
4. Minio - используется для хранения файловых объектов
5. PostgreSQL - содержит в себе служебные таблицы Django и хранит информацию о пользователях приложения

## Структура S3 хранилища
Для хранения файлов всех пользователей в проекте существует бакет user-files. В корне бакета для каждого пользователя создана папка с именем в формате user-${id}-files, где id является идентификатором пользователя.
Каждая из таких папок является корнем для хранения папок данного пользователя.

## Основные операции с объектами хранилища
* Создание файлов/папок
* Переименовывание файлов/папок
* Загрузка файлов/папок
* Скачивание файлов/папок(в виде .zip архива)
* Удаление файлов/папок
## Описание страниц проекта
### Страница авторизации
Адрес - `/accounts/login`.
Представляет собой форму для авторизации пользователей.

### Страница регистрации
Адрес - `/accounts/register`.
Представляет собой форму для регистрации пользователей.

### Главная страница
Адрес - `/?path=$path_to_subdirectory`.
Представляет собой главную страницу приложения. Параметр $path задаёт путь просматриваемой папки. Если параметр отсутствует, подразумевается корневая папка.

### Страница поиска файлов
Адрес - `/search/?query=$search_query`.
Параметр $query представляет собой текстовый запрос пользователя для поиска по имени.
Представляет собой страницу результата поиска файлов.

## Тесты
В качестве фреймворка для тестирования был использован unittest.
Юнит тестами был покрыт основной функционал приложения.
Основные тест-кейсы:
* Проверка корректности создания файла/папки
* Если файл/папка уже существует, то этот объек не будет перезаписан и пользователь получит понятное описание ошибки
* Удаление файла/папки
* Переименование файла/папки
* Поиск файла/папки
* Проверка доступа только к разрешенным объекта хранилища
## Стек
* Python 3.12
* Poetry
* Django 5.1.2
* PostgreSQL
* Minio
* Redis
* Docker
* unittest
* HTML/CSS(Bootstrap5)/JS