{"id":23802034,"url":"https://github.com/gray-advantage/datanar-django","last_synced_at":"2025-09-06T15:32:35.483Z","repository":{"id":213820873,"uuid":"734477749","full_name":"Gray-Advantage/Datanar-Django","owner":"Gray-Advantage","description":"Datanar - сервис по сокращению ссылок на базе Django и Bootstrap","archived":false,"fork":false,"pushed_at":"2024-11-30T18:39:33.000Z","size":50199,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-30T19:30:07.209Z","etag":null,"topics":["bootstrap","celery","chartjs","css","datanar","db-ip","django","django-rest-framework","html","javascript","python","redis","segno","shorten-urls","sqids","url-shortener","web-application"],"latest_commit_sha":null,"homepage":"https://datanar.ru","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Gray-Advantage.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-21T19:32:59.000Z","updated_at":"2024-11-25T08:22:04.000Z","dependencies_parsed_at":"2024-11-30T19:35:20.381Z","dependency_job_id":null,"html_url":"https://github.com/Gray-Advantage/Datanar-Django","commit_stats":null,"previous_names":["gray-advantage/datanar-django"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gray-Advantage%2FDatanar-Django","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gray-Advantage%2FDatanar-Django/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gray-Advantage%2FDatanar-Django/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gray-Advantage%2FDatanar-Django/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Gray-Advantage","download_url":"https://codeload.github.com/Gray-Advantage/Datanar-Django/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":232130476,"owners_count":18476792,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bootstrap","celery","chartjs","css","datanar","db-ip","django","django-rest-framework","html","javascript","python","redis","segno","shorten-urls","sqids","url-shortener","web-application"],"created_at":"2025-01-01T22:18:04.517Z","updated_at":"2025-01-01T22:18:05.013Z","avatar_url":"https://github.com/Gray-Advantage.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [Datanar](https://datanar.ru) - сайт по сокращению ссылок\n\n## Содержание\n- [Введение](#введение)\n  - [Полезность](#для-чего-может-быть-полезно-сокращать-ссылки)\n  - [Существующие решения](#существующие-решения)\n  - [Возможности datanar](#с-datanar-вы-можете)\n- [Структура проекта](#структура-проекта)\n  - [Стек технологий](#используемые-фреймворки--библиотеки)\n  - [База данных](#база-данных)\n  - [Контейнеры docker](#контейнеры-docker)\n- [Развёртывание](#развёртывание)\n  - [Нативная установка](#нативная-установка)\n  - [Контейнеризация docker](#контейнеризация-docker)\n- [Авторы](#авторы---эти-прекрасные-люди)\n\n## Введение\n[Datanar](https://datanar.ru) представляет собой сервис для сокращения ссылок,\nкоторый позволяет пользователям преобразовывать длинные URL-адреса в короткие \nи удобные для использования ссылки.\n\n### Для чего может быть полезно сокращать ссылки:\n- Для визуальной привлекательности\n- Для удобства передачи ссылки не по сети (в разговоре или в выводе на экран)\n- Для отслеживания статистики переходов\n- Для защиты конечного ресурса с помощью пароля\n\n### Существующие решения\nЭто не новая идея и уже существуют множество сервисов с похожим функционалом,\nвот их небольшой срез: \n\n| Сервис                                      | Регистрация | Кастомизация ссылки | QR-code | Статистика | Русский язык | Пароль  | API     |\n|---------------------------------------------|-------------|---------------------|---------|------------|--------------|---------|---------|\n| [clck.ru](https://clck.ru/)                 | Нет (+)     | Нет (-)             | Да (+)  | Нет (-)    | Да (+)       | Нет (-) | Да (+)  |\n| [goo.su](https://goo.su/)                   | Нет (+)     | Нет (-)             | Да (+)  | Да (+)     | Да (+)       | Нет (-) | Да (+)  |\n| [bitly.com](https://bitly.com/)             | Да (-)      | Да (+)              | Да (+)  | Да ($)     | Нет (-)      | Нет (-) | Да ($)  |\n| [Innkin.com](https://www.lnnkin.com)        | Да (-)      | Да ($)              | Нет (-) | Да ($)     | Нет (-)      | Да ($)  | Да ($)  |\n| [rebrandly.com](https://www.rebrandly.com/) | Нет (+)     | Да (+)              | Да (+)  | Да (+)     | Нет (-)      | Нет (-) | Да (+)  |\n| [tinyurl.com](https://tinyurl.com)          | Нет (+)     | Да (+)              | Да (+)  | Да ($)     | Нет (-)      | Нет (-) | Да ($)  |\n| [urlog.ru](https://urlog.ru/)               | Нет (+)     | Нет (-)             | Нет (-) | Да (+)     | Да (+)       | Да (+)  | Нет (-) |\n\n(+) - функция есть; (-) - функции нет; ($) - функция платна\n\nНо все они реализуют только часть функционала, цель же \n[Datanar](https://datanar.ru) предоставить пользователю его весь и сразу!\n\n### С [Datanar](https://datanar.ru) вы можете:\n- Сократить ссылку\n- Получить сразу сгенерированный QR-code\n- Указать свой собственный короткий url-адрес\n- Отслеживать статистику переходов по ссылке\n- Выгружать статистику в удобном формате\n- Установить пароль для сокращённой ссылки\n- Указывать до какой даты будет работать ссылка\n- Указывать сколько переходов можно совершить по ссылке\n- Связать свой сервис с нашим по API\n\n## Структура проекта\n### Используемые фреймворки / библиотеки\n- [Bootstrap](https://getbootstrap.com/) - популярная (html / css / js) \n  библиотека для фронтенда\n- [Celery](https://docs.celeryq.dev/en/stable/) - очередь задач \n  (в качестве брокера сообщений выступает [Redis](https://redis.io/))\n- [Chart.js](https://www.chartjs.org/) - отрисовка диаграмм в статистике\n- [DB-IP](https://db-ip.com) - определение страны и города переходящего по IP\n- [Django](https://www.djangoproject.com/) - основной фреймворк web сервиса\n- [Docker](https://www.docker.com/) - развёртывание сайта на удалённом сервере\n- [Segno](https://github.com/heuer/segno/) - генерация QR-кодов\n- [Sqids](https://sqids.org/) - для помощи в генерации сокращённых ссылок\n\n### База данных\nФункциональная структура базы данных следующая:\n![scheme](docs/for_readme/scheme.png)\n\nОсновных моделей три - `Redirect`, `Click` и `BlockedDomain`\n- `Redirect` - хранит в себе связь между длинным URL-адресом и короткой ссылкой\n- `Click` - хранит информацию о переходе по `Redirect`\n  (для введения статистики)\n- `BlockedDomain` - регулярное выражение, описывающие URL-адреса, которые\n  запрещены для сокращения \n\n### Контейнеры docker\nПроект развёрнут с помощью технологии контейнеризации docker compose и имеет \nследующие [контейнеры](docker-compose.yml):\n\n- [Postgres](https://hub.docker.com/_/postgres) - мощная и современная СУБД,\n  используется как основная БД проекта\n- [Django](Dockerfile) - собственный контейнер на базе \n  [python 3.12](https://hub.docker.com/_/python) c исходным кодом проекта\n- [Nginx-prod](https://hub.docker.com/r/jonasal/nginx-certbot) - \n  модифицированная версия классического nginx контейнера, добавлен certbot для\n  автоматического создания и продления SSL сертификатов для https соединения\n- [Nginx-dev](https://hub.docker.com/_/nginx) - обратный прокси-сервер, нужен \n  для обслуживания статических запросов, применяется только во время разработки\n- [Redis](https://hub.docker.com/_/redis) - быстрый сервер баз данных типа \n  ключ-значение. Требуется для celery\n- [Celery](Dockerfile) - контейнер, созданный на базе `Django`, но с \n  изменённой командой запуска, является очередью задач для массового сокращения\n  ссылок и динамического отслеживания за сроком годности перенаправлений\n\n## Развёртывание\nДанная документация предлагает два основных способа запуска (развёртывания)\nприложения:\n### [Нативная установка](docs/native-install.md)\n- подразумевает загрузку всего необходимого ПО непосредственно на локальную\n  машину, с последующей ручной установкой и настройкой каждого компонента.\n  Долгий и трудный путь, зато вы имеете полный контроль над всем происходящим\n\n### [Контейнеризация docker](docs/docker-install.md)\n- подразумевает загрузку одной единственной программы Docker и её настройку,\n  а дальше запуск всего приложения в полной комплектации с помощью одной\n  команды. Быстрый и простой путь, большая часть вопросов уже решена, остальное\n  дело техники\n\n## Авторы - эти прекрасные люди:\n\u003cdiv style=\"display: flex; align-items: center;\"\u003e\n  \u003cimg src=\"datanar/static_dev/img/authors/sergey.jpg\" width=\"30\" height=\"30\" alt=\"sergey\"\u003e\n  \u003cspan style=\"margin-left: 10px;\"\u003eАндреев Сергей (\u003ca href=\"https://github.com/Gray-Advantage\"\u003eGithub\u003c/a\u003e | \u003ca href=\"https://t.me/Gray_Advantage\"\u003eTelegram\u003c/a\u003e)\u003c/span\u003e\n\u003c/div\u003e\n\u003cbr\u003e\n\u003cdiv style=\"display: flex; align-items: center;\"\u003e\n  \u003cimg src=\"datanar/static_dev/img/authors/vladimir.jpg\" width=\"30\" height=\"30\" alt=\"vladimir\"\u003e\n  \u003cspan style=\"margin-left: 10px;\"\u003eКлименко Владимир (\u003ca href=\"https://github.com/brandonzorn\"\u003eGithub\u003c/a\u003e | \u003ca href=\"https://t.me/brandonzorn\"\u003eTelegram\u003c/a\u003e)\u003c/span\u003e\n\u003c/div\u003e\n\u003cbr\u003e\n\u003cdiv style=\"display: flex; align-items: center;\"\u003e\n  \u003cimg src=\"datanar/static_dev/img/authors/artem.jpg\" width=\"30\" height=\"30\" alt=\"artem\"\u003e\n  \u003cspan style=\"margin-left: 10px;\"\u003eТретьяков Артем (\u003ca href=\"https://github.com/Artem037\"\u003eGithub\u003c/a\u003e | \u003ca href=\"https://t.me/piper273\"\u003eTelegram\u003c/a\u003e)\u003c/span\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgray-advantage%2Fdatanar-django","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgray-advantage%2Fdatanar-django","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgray-advantage%2Fdatanar-django/lists"}