{"id":35060198,"url":"https://github.com/fumblerill/questly","last_synced_at":"2026-04-13T14:31:38.069Z","repository":{"id":327897335,"uuid":"1061667920","full_name":"fumblerill/questly","owner":"fumblerill","description":"Интерактивное приложение, которое генерирует ежедневные задания и превращает обычную рутину в игру.","archived":false,"fork":false,"pushed_at":"2025-12-09T08:32:10.000Z","size":102821,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-10T07:27:45.037Z","etag":null,"topics":["docker","docker-compose","drizzle-orm","gamification","nextjs","nodejs","pet-project","postgresql","react","typescript"],"latest_commit_sha":null,"homepage":"https://questly.site/","language":"TypeScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fumblerill.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-22T08:20:38.000Z","updated_at":"2025-12-09T08:56:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fumblerill/questly","commit_stats":null,"previous_names":["fumblerill/questly"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/fumblerill/questly","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fumblerill%2Fquestly","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fumblerill%2Fquestly/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fumblerill%2Fquestly/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fumblerill%2Fquestly/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fumblerill","download_url":"https://codeload.github.com/fumblerill/questly/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fumblerill%2Fquestly/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31757477,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T13:27:56.013Z","status":"ssl_error","status_checked_at":"2026-04-13T13:21:23.512Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["docker","docker-compose","drizzle-orm","gamification","nextjs","nodejs","pet-project","postgresql","react","typescript"],"created_at":"2025-12-27T10:23:54.756Z","updated_at":"2026-04-13T14:31:38.062Z","avatar_url":"https://github.com/fumblerill.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Questly 🎲\r\n\r\n**Questly** — это интерактивное приложение для генерации ежедневных заданий, призванное добавить разнообразие, спонтанность и игровые элементы в повседневную жизнь.\r\n\r\n## 🚀 Функционал\r\n\r\n- 🎲 **Генерация квестов**: Получайте случайные задания на каждый день, чтобы выйти из зоны комфорта.\r\n- 📂 **Разнообразные категории**: Спорт, творчество, социальные взаимодействия, саморазвитие, домашние дела и многое другое.\r\n- 📊 **Уровни сложности**: Выбирайте уровень под свое настроение — от легкого (Easy) до сложного (Hard).\r\n- 👤 **Профиль пользователя**: Регистрация, авторизация и отслеживание прогресса.\r\n- 💬 **Сообщество**: Публикуйте отчеты о выполненных квестах, делитесь впечатлениями и комментируйте достижения других пользователей.\r\n\r\n## 🛠️ Технологии\r\n\r\nПроект построен на современном стеке технологий, обеспечивающем производительность и масштабируемость.\r\n\r\n### Приложение\n- **Framework**: [Next.js 15](https://nextjs.org/) (App Router + server actions/API routes)\n- **Language**: TypeScript\n- **Styling**: [TailwindCSS](https://tailwindcss.com/) + [Framer Motion](https://www.framer.com/motion/)\n- **Data Layer**: [Drizzle ORM](https://orm.drizzle.team/)\n- **Tooling**: [Biome](https://biomejs.dev/) для форматирования и линтинга\n\n### Данные и инфраструктура\n- **Database**: SQLite (файл `dev.db`) в разработке, PostgreSQL 15+ в продакшене\n- **Migrations**: drizzle-kit (`npm run db:push`, задайте `DRIZZLE_DIALECT=postgres` для генерации продовых миграций)\n- **Containerization**: Docker (multi-stage image) + Docker Compose/any orchestrator\n- **Reverse proxy**: Nginx / Caddy на проде (по желанию)\n\r\n## 🏁 Начало работы\n\n### Предварительные требования\n\n- [Node.js](https://nodejs.org/) 18+\n- Локальный экземпляр PostgreSQL 15+ (можно через Docker)\n- [Docker](https://www.docker.com/) / Docker Compose — для развёртывания и удобного запуска\n\n### 🐳 Запуск с помощью Docker\n\n1. **Клонируйте репозиторий и настройте `.env`:**\n   ```bash\n   git clone \u003crepository-url\u003e\n   cd questly\n   cp .env.example .env\n   ```\n   Обновите `DATABASE_URL`, `AUTH_SECRET` и админские креды. Значения `POSTGRES_*` используются docker-compose для базы данных.\n\n2. **Поднимите базу данных (можно отдельно):**\n   ```bash\n   docker compose up -d postgres\n   ```\n\n3. **Примените миграции Drizzle (PostgreSQL):**\n   ```bash\n   DRIZZLE_DIALECT=postgres DATABASE_URL=postgres://questly:questly@localhost:5432/questly npm run db:push\n   ```\n   Используйте свой DSN, если вы поменяли логин/пароль.\n\n4. **Соберите и запустите приложение:**\n   ```bash\n   docker compose up --build web\n   ```\n   Next.js будет доступен по адресу [http://localhost:3000](http://localhost:3000).\n   Во время старта контейнера автоматически выполняется `npx drizzle-kit push`. Если миграции не нужны (например, в CI), установите `SKIP_DRIZZLE_MIGRATIONS=1` для сервиса `web`.\n\n\u003e ⚙️ В production схеме рекомендуется запускать `npm run db:push` в CI/CD перед деплоем контейнера, чтобы структура БД всегда была синхронизирована.\n\n\u003e 💡 Чтобы принудительно использовать PostgreSQL в любом окружении (например, в dev), задайте `DATABASE_DIALECT=postgres` и укажите `DATABASE_URL`/`POSTGRES_URL` с подключением к серверу.\n\n### 💻 Локальный запуск (без Docker для приложения)\n\n1. Установите зависимости:\n   ```bash\n   npm install\n   ```\n2. По умолчанию `DATABASE_URL=\"file:./dev.db\"` — SQLite создастся автоматически. Если хотите протестировать с PostgreSQL, запустите контейнер и задайте `DRIZZLE_DIALECT=postgres`.\n3. Обновите схему в локальной базе:\n   ```bash\n   npm run db:push\n   ```\n4. Стартуйте dev-сервер:\n   ```bash\n   npm run dev\n   ```\n   Приложение поднимется на [http://localhost:3000](http://localhost:3000).\n\n## 📂 Структура проекта\n\n```\nquestly/\n├── app/                # Маршруты, API-роуты и server components\n├── components/         # UI и бизнес-компоненты\n├── db/                 # Схема Drizzle (TypeScript)\n├── drizzle/            # Сгенерированные SQL-миграции\n├── lib/                # Утилиты (auth, db, helpers)\n├── public/             # Статические ассеты и загрузки\n├── backend_legacy/     # Старый Strapi-бэкенд (оставлен для истории)\n├── docker-compose.yml  # Оркестрация Next + PostgreSQL\n└── .env.example        # Базовый шаблон переменных окружения\n```\n\r\n## 🔐 Админская учётная запись\r\n\r\n- Задайте переменные `DEFAULT_ADMIN_USERNAME`, `DEFAULT_ADMIN_EMAIL` и `DEFAULT_ADMIN_PASSWORD` (а также `AUTH_SECRET`) в `.env` — по ним будет создан первый администратор.\r\n- При первом обращении к `/api/auth/local` (страница входа) сервер проверит наличие админа и при необходимости создаст или повысит пользователя с указанным email.\r\n- JWT теперь дополнительно сохраняется в HTTP-only cookie, поэтому доступ к `/admin` проверяется на стороне сервера без участия клиента.\r\n- Любой запрос к `/admin` автоматически перенаправляется на `/login`, если токен отсутствует, истёк или пользователь не является администратором.\r\n\r\n### Панель управления\r\n\r\n- `/admin/quests` — база квестов с созданием, редактированием текста, сложности, категории и веса.\n- `/admin/cards` — карточки пользователей. Их нельзя создать вручную, но можно поправить текст, сложность, категорию и seed.\n- `/admin/posts` — полный CRUD по постам: привязка автора, карточки, текста и статуса видимости.\n- `/admin/users` — создание, изменение профилей и выдача админских прав, сброс пароля.\n- `/admin/media` — просмотр загруженных файлов из `public/uploads` и удаление лишних ресурсов.\n- `/admin/feedbacks` — входящие сообщения обратной связи с возможностью менять статус.\n\r\n## 🤝 Вклад в проект\r\n\r\n1. Форкните репозиторий.\r\n2. Создайте ветку для новой фичи (`git checkout -b feature/amazing-feature`).\r\n3. Закоммитьте изменения (`git commit -m 'Add some amazing feature'`).\r\n4. Запушьте ветку (`git push origin feature/amazing-feature`).\r\n5. Откройте Pull Request.\r\n\r\n---\r\n🤖 Примечание: этот проект был разработан при использовании искусственного интеллекта.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffumblerill%2Fquestly","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffumblerill%2Fquestly","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffumblerill%2Fquestly/lists"}