{"id":19325657,"url":"https://github.com/pacmancity/furrygallery","last_synced_at":"2026-04-12T13:03:56.195Z","repository":{"id":206268791,"uuid":"651712410","full_name":"pacmancity/FurryGallery","owner":"pacmancity","description":"FurrySnap Gallery 🐾 - проект о домашних питомцах и их достижениях 🏆. Делает каждый момент с нашими любимыми пушистиками незабываемым. 📸 Проект развёрнут на удалённом виртуальном сервере, с использованием контейнеров Docker 🐳, nginx 🌐, PostgreSQL 🐘 и Django + Gunicorn 🐍. Автоматизирован деплой с помощью CI/CD 🚀","archived":false,"fork":false,"pushed_at":"2023-11-08T17:08:06.000Z","size":326,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-06T06:43:45.405Z","etag":null,"topics":["ci-cd","docker","docker-compose","docker-hub","github-actions","gunicorn","linux","nginx","postgresql","python","sql"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pacmancity.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-06-09T22:08:51.000Z","updated_at":"2023-11-08T17:08:35.000Z","dependencies_parsed_at":null,"dependency_job_id":"c011d392-65b0-41c8-b506-3a13b123f456","html_url":"https://github.com/pacmancity/FurryGallery","commit_stats":null,"previous_names":["kluev-evga/furrygallery","pacmancity/furrygallery"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pacmancity%2FFurryGallery","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pacmancity%2FFurryGallery/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pacmancity%2FFurryGallery/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pacmancity%2FFurryGallery/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pacmancity","download_url":"https://codeload.github.com/pacmancity/FurryGallery/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240427328,"owners_count":19799471,"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":["ci-cd","docker","docker-compose","docker-hub","github-actions","gunicorn","linux","nginx","postgresql","python","sql"],"created_at":"2024-11-10T02:10:50.748Z","updated_at":"2025-02-24T06:17:23.227Z","avatar_url":"https://github.com/pacmancity.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FurryGallery\n\n\u003cbr/\u003e\n\n[![Nginx](https://img.shields.io/badge/Nginx-1.22-blue?style=for-the-badge\u0026labelColor=333333\u0026logo=NGINX\u0026logoColor=white)](https://nginx.org/ru/)\n[![Docker](https://img.shields.io/badge/Docker-20.10.18-blue?style=for-the-badge\u0026labelColor=333333\u0026logo=Docker\u0026logoColor=white)](https://www.docker.com/)\n[![Docker-compose](https://img.shields.io/badge/Docker%20compose-2.10.0-blue?style=for-the-badge\u0026labelColor=333333\u0026logo=Docker\u0026logoColor=white)](https://www.docker.com/)\n[![Docker Hub](https://img.shields.io/badge/Docker%20Hub-latest-blue?style=for-the-badge\u0026logo=Docker\u0026logoColor=white\u0026labelColor=333333)](https://www.docker.com/products/docker-hub)\n[![GitHub Actions](https://img.shields.io/badge/GitHub%20Actions-Workflow-blue?style=for-the-badge\u0026logo=GitHub%20actions\u0026logoColor=white\u0026labelColor=333333)](https://github.com/features/actions)\n[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-13.1-blue?style=for-the-badge\u0026labelColor=333333\u0026logo=PostgreSQL\u0026logoColor=white)](https://www.postgresql.org/)\n[![gunicorn](https://img.shields.io/badge/gunicorn-20.1.0-blue?style=for-the-badge\u0026labelColor=333333\u0026logo=gunicorn\u0026logoColor=white)](https://gunicorn.org/)\n[![Django](https://img.shields.io/badge/Django-3.2.16-blue?style=for-the-badge\u0026labelColor=333333\u0026logo=django\u0026logoColor=white\u0026color=blue)](https://www.djangoproject.com/)\n[![DRF](https://img.shields.io/badge/django--rest--framework-3.12.4-blue?style=for-the-badge\u0026labelColor=333333\u0026logo=django\u0026logoColor=white\u0026color=blue)](https://www.django-rest-framework.org/)\n[![SimpleJWT](https://img.shields.io/badge/simplejwt-4.7.2-blue?style=for-the-badge\u0026labelColor=333333\u0026logo=django\u0026logoColor=white\u0026color=blue)](https://github.com/davesque/django-rest-framework-simplejwt)\n[![PyJWT](https://img.shields.io/badge/PyJWT-2.1.0-blue?style=for-the-badge\u0026labelColor=333333\u0026logo=python\u0026logoColor=white\u0026color=blue)](https://github.com/jpadilla/pyjwt)\n[![Djoser](https://img.shields.io/badge/djoser-2.1.0-blue?style=for-the-badge\u0026labelColor=333333\u0026logo=django\u0026logoColor=white\u0026color=blue)](https://github.com/sunscrapers/djoser)\n[![Лицензия](https://img.shields.io/github/license/kluev-evga/FurryGallery?color=blue\u0026style=for-the-badge\u0026labelColor=333333\u0026logo=github)](https://github.com/kluev-evga/FurryGallery/blob/master/LICENSE)\n[![Размер кода](https://img.shields.io/github/languages/code-size/kluev-evga/FurryGallery?style=for-the-badge\u0026labelColor=333333\u0026logo=github)](https://github.com/kluev-evga/FurryGallery)\n\n## О проекте\n\nPrettyPets — это социальная сеть, созданная для обмена фотографиями и историями о вашей милой компании -\nваших питомцах. Проект объединяет бэкенд-приложение, основанное на Django, и фронтенд-приложение, разработанное на\nReact. Весь процесс развертывания проекта осуществляется на виртуальном удалённом сервере, используя три контейнера:\nnginx, PostgreSQL и Django+Gunicorn. Заготовленный контейнер с фронтендом активно используется для сборки файлов, и\nконтейнер с проектом обновляется на Docker Hub.\n\nPrettyPets предоставляет возможности:\n\n* Регистрации новых пользователей.\n* Добавления уникальных фотографий ваших питомцев.\n* Удаления изображений питомцев по вашему желанию.\n* Персонализации окраски и описания каждого питомца.\n* Поделиться особенностями и достижениями вашего друга на четыре лапы.\n* Указания года рождения каждого питомца.\n\nFurryGallery, с другой стороны, является уютным уголком для всех, кто обожает кошек. Это специализированная социальная\nсеть, где пользователи имеют возможность делиться фотографиями своих пушистых друзей и наслаждаться уникальными\nфотографиями, опубликованными другими участниками. Проект активно использует GitHub Actions для автоматизации\nтестирования и развертывания на сервере, что обеспечивает стабильное функционирование и удобство использования для\nпользователей.\n\n## Структура проекта 📁\n\n- `kittygram_workflow.yml`: Этот файл содержит настройки для непрерывной интеграции и доставки (CI/CD), которые\n  автоматизируют тестирование и развертывание проекта.\n\n\n- `docker-compose.production.yml`: Здесь определены настройки для запуска проекта в производственной среде с\n  использованием образов Docker из Docker Hub.\n\n\n- `docker-compose.yml`: Этот файл содержит настройки для локальной разработки и тестирования проекта с локальной сборкой\n  контейнеров Docker.\n\n\n- `backend`: В этой директории находится бекенд-часть проекта, отвечающая за серверную логику и взаимодействие с базой\n  данных.\n\n\n- `frontend`: Здесь расположена фронтенд-часть проекта, написанная на React, которая обеспечивает пользовательский\n  интерфейс и взаимодействие с бекендом.\n\n## Запуск проекта 🚀\n\nДля запуска проекта вам потребуется установить следующие компоненты: Node.js, Python и Pip.\n\n### Frontend:\n\nДля настройки фронтенд-части проекта выполните следующие шаги:\n\n1. Клонирование проекта:\n\n   ```shell\n   git clone https://github.com/kluev-evga/FurryGallery.git\n   ```\n\n2. Перейдите в директорию фронтенда:\n\n   ```shell\n   cd frontend\n   ```\n\n3. Установите зависимости:\n\n   ```shell\n   npm install\n   ```\n\n4. Запустите фронтенд:\n\n   ```shell\n   npm run dev\n   ```\n\nПосле успешного выполнения этих шагов, вы получите доступ к React-приложению по\nадресу [127.0.0.1:3000](https://127.0.0.1:3000).\n\n### Backend:\n\nЧтобы настроить бекенд-часть проекта, выполните следующие действия:\n\n1. Клонирование проекта:\n\n   ```shell\n   git clone https://github.com/kluev-evga/FurryGallery.git\n   ```\n\n2. Перейдите в директорию бекенда:\n\n   ```shell\n   cd backend\n   ```\n\n3. Создайте виртуальное окружение:\n\n   ```shell\n   python3 -m venv venv\n   ```\n\n4. Активируйте виртуальное окружение (для Linux/macOS):\n\n   ```shell\n   source venv/bin/activate\n   ```\n\n   Для Windows:\n\n   ```shell\n   source venv/scripts/activate\n   ```\n\n5. Установите зависимости:\n\n   ```shell\n   pip install -r requirements.txt\n   ```\n\n6. Выполните миграции базы данных:\n\n   ```shell\n   python manage.py migrate\n   ```\n\n7. Запустите бекенд-приложение:\n\n   ```shell\n   python manage.py runserver\n   ```\n\nПосле успешного выполнения этих шагов, вы сможете использовать бекенд-приложение по\nадресу [127.0.0.1:8000](https://127.0.0.1:8000).\n\n## Автоматизация развертывания: CI/CD\n\nПроцесс автоматизации развертывания построен на основе CI/CD. Workflow настроен таким образом, что каждое обновление\nветки `master` служит событием-триггером для запуска тестирования и деплоя.\n\nПри возникновении события-триггера, GitHub Actions считывает файл с описанием workflow и назначает отдельный раннер для\nкаждой задачи-job в этом workflow. Эти раннеры выполняют соответствующие задачи, включая настройку Docker, сборку\nобразов и их загрузку на Docker Hub. После этого, на боевом сервере, производится перезапуск контейнеров, чтобы они были\nобновлены из свежих образов.\n\nДля выполнения этих операций, раннеру требуется аутентификация на Docker Hub, чтобы загрузить образы, а также\nаутентификация на боевом сервере для перезапуска контейнеров. Конфиденциальные данные, такие как токены, пароли и другая\nприватная информация, могут быть безопасно храниться в специальном хранилище на платформе GitHub Actions.\n\nЭти конфиденциальные данные, называемые секретами (secrets), могут быть сохранены в разделе Secrets. Во время выполнения\nworkflow, значения из этого хранилища будут переданы в переменные, доступные только раннеру во время запуска workflow.\n\nДля более надежного контроля над выполнением workflow в GitHub Actions, также подключен Telegram-бот для уведомлений и\nмониторинга.\n\n## Лицензия 📜\n\nЭтот проект распространяется под лицензией `MIT`. Дополнительную информацию можно найти\nв [LICENSE](https://github.com/kluev-evga/FurryGallery/blob/master/LICENSE).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpacmancity%2Ffurrygallery","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpacmancity%2Ffurrygallery","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpacmancity%2Ffurrygallery/lists"}