TinyURL - простой сервис сокращения ссылок.
Подстановка переменых окружения:
Пример данных находиться в файле .env.example, вам остаёться только подставить свои значения. Впринципе данные в примере вполне сойдут, вы можете просто переименовать файл в .env
Развертывание :
docker-compose up --build -d
После развертывания будут доступны следующие адресса:
- localhost:8000/docs -
OpenAPI
(Swager
) интерфейс дляAPI
- localhost:8080 - Фронтенд часть
Backend-часть проекта разделена на несколько частей:
- Развертывание БД и приминение миграций(
Postgres
) - Compressor(
FastAPI
+pydantic
) - Redirect(
FastAPI
)
Простая база данных развертываямая с параметрами из env-файла. Миграции применяються из каталога migrations/versions.
Те в свою очередь были созданы из sqlalchemy-модейлей лежащих по путям app/backend/components/*/models.py
(все настройки alembic
лежат в alembic.ini
и migrations/env.py
). Для дальнейшей работы с БД создан генератор сессий в файле app/backend/base/database.py
.
В ходе данного проета была создана всего одна таблица(links
), содержащая:
id
short
- ключ присваеваемый записи для подстановку в url-адрес для переадресации, состоит из цифр, латинских букв верхнего и нижнего регистра(минимум 8 символов)full
- полная ссылка на перенаправляемый ресурсcreate_at
- время создания ссылки
На этом этапе был создан компонент app/backend/compressor/
отвечающий за сокращение ссылок и добавления из в БД. Включает следущие файлы:
models.py
- sqlalchemy-модель для таблицыlinks
router.py
- роутерFastAPI
, содержащий endpoint/add
принимающийAddLinkScheme
иsession
изdepends
(явно сессию передавать не обезательно) и служащий для перенаправление данных в utils(add_link
). Возвращает схемуLinkScheme
.schemes.py
- содержит две схемыAddLinkScheme
иLinkScheme
services.py
- содержит функцию определения short для новой ссылкиutils.py
- содержит функции обращающиеся к базе данных, в данном случаи написаны 2 функцииadd_link
иget_latest_url
(используемая преимущественно вservices.py
)
На этом этапе был создан компонент app/backend/redirect/
отвечающий за получение полной ссылки из короткой включает следущие файлы:
router.py
- содержит endpoint/{short}
. Возвращает либо ссылку либо перенаправления в зависимости от места вызова.utils.py
- содержит функциюget_link_by_short
Простая архитектура из html
, css
и js
, без использования каких либо фреймворков. Запросы выполняються через axios
, имееться сообщение об ошибке в случаи её наличия и кнопка копирования результата.
Из сложного - пришлось настроить CORS
в FastAPI
.
Для даного проекта было использовано 2 dockerfile
и 1 docker-compose
:
dockerfile
- файл для backend-части использующий python и устанавливающий зависимостиdockerfile_frontend
- файл для frontend-части использующийjs
и устанавливающийlive-server
docker-compose.yaml
- загружает стороние образы и собирающий образы проекта:postgres
- развёртывание БДalembic
- приминение миграцийfastapi
- поднятие сервераfrontend
- запуск клиентской частиnetworks:main
- общая сеть для всех образов