Skip to content

07Rinat07/myblog

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

46 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MyBlog

MyBlog - это блоговая платформа на Yii2 Basic с тремя интерфейсами в одном репозитории:

  • публичный сайт для читателей
  • административная панель и личный кабинет для авторов и администраторов
  • версионированный JSON API для интеграций

С архитектурной точки зрения это модульный монолит: один код, одна база данных, общий набор доменных моделей и отдельный консольный воркер для доставки webhook-ов. Это не SPA и не набор микросервисов.

Что это за Проект

Аспект Описание
Архитектура Модульный монолит на Yii2 Basic
Интерфейс Серверный рендеринг Yii Views + AssetBundle, без отдельного Node.js-пайплайна сборки
Основные модули Публичный веб-интерфейс, admin, api/v1, консольные команды
Хранилище MySQL/MariaDB, схема развивается через миграции
Интеграции OpenAPI/Swagger, входящие и исходящие webhook-и
Качество Модульные, функциональные и приемочные тесты на Codeception/PHPUnit
Рекомендуемый режим запуска Docker Compose с app, db и selenium

Что уже Реализовано

  • Публичные страницы: главная лента, страница статьи, страница категории, страницы "О проекте" и "Контакты".
  • Регистрация и вход на /auth/signup и /auth/login.
  • Подтверждение email: новый пользователь создаётся неактивным до перехода по ссылке из письма.
  • Личный кабинет на /cabinet/profile для смены профиля, пароля и аватара.
  • Админ-панель на /admin для управления статьями, категориями, тегами, комментариями, пользователями и сообщениями обратной связи.
  • Централизованные двуязычные контент-блоки (RU/EN) для публичных страниц, хедера и футера с CRUD в админке.
  • Комментарии и лайки статей для авторизованных пользователей.
  • Загрузка изображений для статей и аватаров.
  • Локализация интерфейса на английский и русский языки.
  • JSON API на /api/v1 с Bearer-аутентификацией.
  • Входящая точка приёма webhook-ов с HMAC-проверкой и идемпотентностью.
  • Исходящая outbox-очередь webhook-ов с повторными попытками и консольным диспетчером.

Архитектура

Архитектурный Стиль

Проект построен как одно Yii2-приложение с явными внутренними границами:

  • публичный HTTP-слой в controllers/ и views/
  • модуль админки и личного кабинета в modules/admin
  • API-модуль в modules/api/modules/v1
  • общие доменные модели в models/
  • сервисы общего назначения в components/
  • консольные точки входа в commands/

Такой подход даёт один артефакт развёртывания, одну схему БД, общий контур аутентификации и при этом сохраняет читаемые границы между подсистемами.

Поток Запросов и Событий

Браузер / API-клиент
    -> web/index.php
    -> контроллер или модульный контроллер
    -> модель ActiveRecord и/или сервис
    -> MySQL
    -> HTML или JSON-ответ

Публикация статьи / создание комментария / создание сообщения обратной связи
    -> событие модели
    -> WebhookEventPublisher
    -> таблица outbox `webhook_delivery`
    -> yii webhook/dispatch
    -> внешний эндпоинт

Внешний провайдер
    -> POST /api/v1/webhooks/incoming/{source}
    -> HMAC + проверка идемпотентности
    -> лог `webhook_incoming_delivery`

Внутренние Слои

Слой Ответственность Основные директории
HTTP-контроллеры Координация запроса и ответа, проверка доступа, редиректы, рендеринг controllers/, modules/admin/controllers/, modules/api/modules/v1/controllers/
Доменные модели Валидация, связи, сохранение, часть бизнес-логики models/
Сервисы Токены, webhook outbox, публикация доменных событий components/security/, components/webhook/
Представление Макеты, представления, partial-шаблоны и почтовые шаблоны views/, modules/admin/views/, mail/
Фронтенд-ассеты CSS/JS bundles и статическая тема assets/, web/css/, web/public/
Инфраструктура Конфиги, миграции, Docker, консольные команды config/, migrations/, docker/, commands/
Тестовый контур Наборы тестов, фикстуры и инициализация тестовой среды tests/

Архитектура Интерфейса

Фронтенд здесь серверный. Отдельной исполняемой SPA-части и npm-сборки нет.

  • views/layouts/main.php рендерит публичную часть.
  • views/layouts/admin.php рендерит админку и личный кабинет.
  • assets/PublicAsset.php подключает публичную тему из web/public/*.
  • assets/AppAsset.php подключает административные стили из web/css/*.

Это важно для поддержки проекта: маршрутизация, формы, авторизация и рендеринг живут внутри Yii, а не размазаны между несколькими приложениями.

Структура Репозитория

assets/                  Yii asset bundles для публичного и административного интерфейса
commands/                Консольные команды, включая воркер webhook-ов
components/              Повторно используемые сервисы и компоненты инициализации, включая ContentManager
config/                  Конфиги web, console, test, db и params
controllers/             Контроллеры публичной части и аутентификации
mail/                    Шаблоны писем
migrations/              Эволюция схемы базы данных
models/                  ActiveRecord модели, формы и модели поиска, включая ContentBlock
modules/admin/           Админ-панель и личный кабинет пользователя
modules/api/             API-модуль с версией `v1`
tests/                   Модульные, функциональные и приемочные тесты, а также фикстуры
views/                   Layouts и views публичной части
web/                     Корень веб-приложения, uploads, Swagger UI, спецификация OpenAPI и статические ассеты
docker/                  Docker-образ и стартовый скрипт

Доменная Модель

Сущность Назначение
User Идентичность пользователя, вход, флаг администратора, состояние подтверждения email, аватар
Article Основная сущность контента: автор, статус, категория, теги, изображение, просмотры
Category Категория статей, может иметь владельца
Tag Теги статей, поддерживают владение и создание прямо из формы
ArticleTag Связь многие-ко-многим между статьями и тегами
Comment Комментарии пользователей к статьям
ArticleLike Уникальная связка лайка между пользователем и статьёй
ContactMessage Сохранённые сообщения с формы /contact
ContentBlock Двуязычные (RU/EN) редактируемые текстовые блоки для хедера, футера и статических секций страниц
UserAccessToken Хешированные API-токены с ротацией и историей отзыва
WebhookEndpoint Конфигурация подписчика исходящих webhook-ов
WebhookDelivery Элемент очереди и журнал доставки исходящего webhook-а
WebhookIncomingDelivery Аудит-лог входящих webhook-ов

Границы Между Публичной Частью, Админкой и API

Публичная Часть

Публичные маршруты живут в корневом слое контроллеров:

  • SiteController отвечает за главную, статью, категорию, страницу контактов и переключение языка.
  • AuthController отвечает за вход, регистрацию, выход и подтверждение email.

Админка и Личный Кабинет

Модуль admin обслуживает две роли:

  • администраторов с полным доступом к пользователям, сообщениям обратной связи и всему контенту
  • обычных авторизованных пользователей с доступом только к собственным сущностям

Админский контент-менеджмент расположен на /admin/content-block:

  • только администратор может создавать, редактировать и удалять контент-блоки
  • каждый блок хранит value_en и value_ru, а вывод выбирается по текущему языку интерфейса
  • при пустом значении на активном языке используется fallback на второй язык или дефолт из шаблона

Доступ контролируется через modules/admin/controllers/AdminController:

  • assertAdmin() защищает разделы только для администраторов, например users и feedback
  • assertOwnerOrAdmin() не даёт не-админам редактировать чужие статьи, теги, категории, комментарии и профили

API

API версионирован и расположен в modules/api/modules/v1.

  • Все API-контроллеры наследуются от ApiController.
  • Ответы всегда JSON через ContentNegotiator.
  • CORS управляется через API_ALLOWED_ORIGINS.
  • Для защищённых эндпоинтов используется Bearer-аутентификация.

Это позволяет добавить v2 рядом, не ломая поведение v1.

Безопасность

Безопасность здесь реализована не одной настройкой, а через набор механизмов на разных слоях.

Безопасность браузера и Сессии

  • Для web-форм включён CSRF.
  • COOKIE_VALIDATION_KEY обязателен и должен быть уникальным для каждого окружения.
  • Identity и CSRF cookies помечены как httpOnly и sameSite=Lax.
  • Logout и destructive actions переведены на POST-only, где это уместно.
  • Переключение языка валидирует язык и редиректит только на относительные URL.

Аутентификация и Авторизация

  • Пароли хранятся в виде хеша через хелперы безопасности Yii.
  • Новые пользователи могут создаваться в статусе inactive и обязаны подтвердить email.
  • User::findIdentity() возвращает только активных пользователей.
  • Права администратора основаны на флаге isAdmin.
  • Проверки владения защищают пользовательский контент от редактирования чужими пользователями.

Безопасность API Токенов

  • API-токены выдаются через AccessTokenService.
  • В базе хранится только token_hash, а не сырой токен.
  • У токенов есть TTL, rotation, logout и logout-all.
  • Использование токена обновляет last_used_at.
  • Эндпоинт входа ограничен по частоте запросов по email и IP через кэш.
  • Временный резервный режим через user.access_token существует, но по умолчанию выключен.

Безопасность Upload и Контента

  • Загружаемые изображения валидируются по расширению, MIME type и размеру.
  • Ограничение размера учитывает и конфиг приложения, и PHP upload_max_filesize / post_max_size.
  • Имена файлов рандомизируются перед сохранением.
  • Загруженные файлы складываются в web/uploads/.
  • HTML в шаблонах экранируется через хелперы Yii там, где это требуется.

Безопасность Webhook-ов

  • Для входящих webhook-ов обязателен настроенный источник и его секрет.
  • Подпись проверяется через HMAC-SHA256.
  • Idempotency-Key обязателен для защиты от дублей.
  • Чувствительные входящие заголовки редактируются перед логированием.
  • Исходящие webhook-и подписываются через X-Webhook-Signature.

Ужесточение Схемы БД

Свежие миграции усиливают надёжность схемы:

  • ограничения NOT NULL и UNIQUE для ключевых полей пользователя
  • индексы под частые запросы к статьям, комментариям, тегам и webhook-таблицам
  • внешние ключи для владения и целостности связей
  • отдельная таблица для хешированных API-токенов

Поддерживаемость

Этот репозиторий поддерживаем, потому что границы системы видны в коде, а не только в договорённостях.

  • Изменения схемы отслеживаются в migrations/; это канонический источник правды по БД.
  • Логика фильтрации и поиска в админских грид-таблицах вынесена в *Search модели.
  • Чувствительная к безопасности логика централизована в сервисах, а не размазана по контроллерам.
  • Контракты API и сервисов задокументированы PHPDoc-блоками и аннотациями форм массивов в ключевых контроллерах и сервисах.
  • Версионирование API сделано явно через вложенность модулей.
  • У тестовой среды есть отдельный конфиг и отдельное подключение к тестовой БД.
  • Запуск в Docker воспроизводим и включает миграции, подготовку тестовой БД и опциональную загрузку фикстур.
  • Отсутствует отдельная цепочка фронтенд-сборки, которую пришлось бы синхронизировать с PHP-частью.

Управляемый Контент RU/EN

Для статических фрагментов интерфейса внедрён централизованный слой контент-блоков:

  • таблица БД content_block хранит ключ блока, секцию, описание и значения value_en/value_ru
  • компонент app\components\ContentManager даёт единый доступ в шаблонах через Yii::$app->contentManager->text(...)
  • публичные шаблоны (views/layouts/main.php, views/site/*, views/auth/*, views/partials/sidebar.php) используют эти блоки для управляемого текста
  • админский интерфейс /admin/content-block поддерживает полный CRUD и мгновенно сбрасывает in-request кэш после сохранения/удаления
  • шаблон всегда имеет безопасный fallback на текст по умолчанию, если блок или перевод отсутствует

Документирование Кода и Контрактов

В проекте есть два уровня документации:

  • PHPDoc в контроллерах, сервисах и ключевых моделях объясняет ответственность класса, инварианты и форму возвращаемых данных
  • web/openapi/swagger.json фиксирует внешний HTTP-контракт API v1 для Swagger UI, интеграций и регрессионных проверок

Расширяемость при желании можно --->

Текущая структура оставляет понятные точки расширения.

Добавить Новую Версию API

  • создать соседний модуль в modules/api/modules/
  • зарегистрировать маршруты в config/web.php
  • оставить v1 нетронутым для обратной совместимости

Добавить Новую Сущность в Админке

  • создать ActiveRecord и миграцию
  • при необходимости добавить Search модель для списка
  • создать контроллер и CRUD-представления внутри modules/admin
  • переиспользовать AdminController и его проверки роли администратора и владельца

Добавить Новое Исходящее Webhook Событие

  • публиковать его из модели или сервиса через WebhookEventPublisher
  • дать эндпоинтам возможность подписаться через WebhookEndpoint::events
  • доставлять через существующий outbox-воркер

Добавить Новый Источник Входящих Webhook-ов

  • определить новый секрет источника в config/params.php через переменные окружения
  • переиспользовать /api/v1/webhooks/incoming/{source}
  • при необходимости добавить последующую обработку после логирования

Добавить Новый Язык

  • расширить LanguageSelector
  • добавить файлы переводов в messages/
  • обновить partial-шаблоны переключателя языка

Честные Архитектурные Границы

Проект выглядит собранно, но его важно описывать без маркетингового шума.

  • Это не Clean Architecture и не DDD. Заметная часть бизнес-логики по-прежнему живёт в ActiveRecord моделях и местами в контроллерах.
  • Авторизация намеренно простая: isAdmin плюс проверки владения, а не полноценная RBAC-матрица.
  • Фоновая доставка реализована через опрос таблиц БД и консольную команду, а не через отдельный брокер очередей.
  • Кэш по умолчанию файловый и локальный; для горизонтального масштабирования его нужно заменить на общий backend.
  • Входящие webhook-и сейчас валидируются и логируются; бизнес-обработка после приёма остаётся следующей точкой расширения.

Требования

  • PHP >= 8.1
  • Composer 2
  • MySQL или MariaDB
  • pdo_mysql
  • gd или imagick для captcha

Docker-образ из репозитория использует:

  • PHP 8.3 + Apache
  • MySQL 8.4
  • Selenium standalone Chrome для приемочных тестов

Конфигурация

Важное Замечание про .env

Сам Yii-проект не читает .env автоматически на этапе bootstrap.

  • .env.example нужен в первую очередь для docker compose
  • для локального PHP/OSPanel переменные должны приходить из shell, веб-сервера или настроек ОС
  • если переменные окружения не заданы, config/db.php использует встроенные значения по умолчанию

Основные Переменные Окружения

Переменная Назначение
COOKIE_VALIDATION_KEY Секрет для валидации запросов и cookies
DB_DSN, DB_HOST, DB_PORT, DB_NAME Подключение к основной БД
DB_USERNAME, DB_PASSWORD Учётные данные основной БД
DB_TEST_DSN, DB_TEST_HOST, DB_TEST_PORT, DB_TEST_NAME Подключение к тестовой БД
YII_ENV, YII_DEBUG Режим окружения
AUTO_MIGRATE Автозапуск миграций основной БД в Docker
AUTO_MIGRATE_TEST_DB Автозапуск миграций тестовой БД в Docker
AUTO_LOAD_FIXTURES, FIXTURES_LIST Автозагрузка фикстур при пустой базе
WEBHOOK_INCOMING_GENERIC_SECRET Секрет для проверки входящих webhook-ов
WEBHOOK_OUTGOING_MAX_ATTEMPTS Количество повторных попыток для исходящих webhook-ов
API_ALLOWED_ORIGINS Список разрешённых источников для CORS
API_ACCESS_TOKEN_TTL Время жизни API-токена
API_REVOKE_EXISTING_TOKENS_ON_LOGIN Отзывать ли старые активные токены при входе
API_LEGACY_ACCESS_TOKEN_FALLBACK Временный режим совместимости со старой схемой токенов

Локальный Запуск

composer install
php yii migrate --interactive=0
php yii serve --port=8080

После этого приложение будет доступно на http://localhost:8080.

Важно:

  • корень сайта у реального веб-сервера должен указывать на web/
  • runtime/, web/assets/ и web/uploads/ должны быть доступны на запись
  • в dev-режиме mailer пишет письма в файлы, а не отправляет их наружу

Запуск в Docker

Copy-Item .env.example .env
docker compose up -d --build
docker compose logs -f app

После старта приложение доступно на http://localhost:8080, если APP_PORT не изменён.

Стартовый скрипт контейнера уже умеет:

  • проверять наличие pdo_mysql
  • ждать готовности базы данных
  • ставить зависимости Composer, если нужно
  • запускать миграции основной БД
  • запускать миграции тестовой БД
  • очищать кэш схемы
  • при необходимости загружать фикстуры в пустые базы

По умолчанию Docker-окружение может поднять не только схему, но и полноценный демо-набор данных для разработки, ручной проверки и тестов.

API

Базовый префикс: /api/v1

Документация

  • спецификация OpenAPI лежит в web/openapi/swagger.json
  • исходный JSON-файл после запуска доступен по /openapi/swagger.json
  • Swagger UI после запуска доступен по /docs/
  • swagger.json поддерживается вручную как контрактный артефакт и проверяется unit-тестом tests/unit/docs/OpenApiSpecTest.php
  • для API-эндпоинтов дополнительно поддерживаются PHPDoc-описания в modules/api/modules/v1/controllers/

Основные Эндпоинты

  • GET /api/v1/health
  • POST /api/v1/auth/login
  • POST /api/v1/auth/rotate
  • POST /api/v1/auth/logout
  • POST /api/v1/auth/logout-all
  • GET /api/v1/me
  • GET /api/v1/categories
  • GET /api/v1/articles
  • GET /api/v1/articles/{id}
  • GET /api/v1/articles/{id}/comments
  • POST /api/v1/articles/{id}/comments
  • POST /api/v1/articles/{id}/like
  • POST /api/v1/webhooks/incoming/{source}

Webhook-и

Исходящие Webhook-и

Исходящая доставка реализована по паттерну outbox.

  • события ставятся в очередь при публикации статьи, создании комментария и создании сообщения обратной связи
  • элементы очереди хранятся в webhook_delivery
  • диспетчер доставки - консольная команда php yii webhook/dispatch
  • повторные попытки используют экспоненциальную задержку
  • подписчики настраиваются в webhook_endpoint

Полезные команды:

php yii webhook/list-endpoints
php yii webhook/create-endpoint "crm" "https://example.com/webhook" "secret" "article.published,comment.created"
php yii webhook/dispatch 50

Входящие Webhook-и

Входящий эндпоинт сейчас работает как защищённая точка приёма и аудит-лог.

  • валидирует секрет источника
  • валидирует HMAC-SHA256 подпись
  • требует Idempotency-Key
  • сохраняет и успешные, и отклонённые доставки в webhook_incoming_delivery

База Данных, Миграции и Fixtures

  • migrations/ - каноническая история схемы
  • myblog.sql - устаревший SQL-дамп и справочный снимок, но не основной способ управления схемой
  • тестовые фикстуры лежат в tests/fixtures/ и tests/_data/
  • тестовая инициализация использует отдельную базу из config/test_db.php

Что загружают демо-фикстуры

Текущий набор фикстур делает проект визуально и функционально пригодным сразу после старта пустой базы:

  • 10 пользователей, из которых 1 администратор и 9 обычных авторов
  • 10 опубликованных статей с категориями, тегами, просмотрами и обложками
  • 20 комментариев с разными авторами и статусами модерации
  • 18 лайков на статьях, чтобы можно было проверить UI и API без ручного наполнения
  • аватарки пользователей и изображения постов, уже сохранённые в web/uploads/ как fixture-avatar-* и fixture-post-*

Тестовые учётные данные

  • администратор: admin@example.com / admin12345
  • обычный пользователь: user@example.com / user12345
  • остальные демо-пользователи: email из фикстур tests/_data/user.php, пароль demo12345

Автозагрузка фикстур в Docker

Если включены AUTO_LOAD_FIXTURES=1 и непустой FIXTURES_LIST, стартовый контейнер загружает связанные фикстуры в пустую базу.

Типовой список по умолчанию:

User,Category,Tag,Article,ArticleTag,Comment,ArticleLike

Этого достаточно, чтобы после docker compose up получить готовую демо-среду с контентом, пользователями, комментариями и лайками без ручного сидирования.

Никогда не запускайте тестовые наборы на production- или development-данных.

Тесты

Тестовый стек построен на Codeception с PHPUnit-проверками.

Наборы Тестов

  • tests/unit проверяет мелкие единицы: модели, виджеты, вспомогательные классы
  • tests/functional проверяет веб-сценарии, разграничение владения в админке, API, подтверждение email и webhook-сценарии
  • tests/acceptance проверяет браузерные сценарии через Selenium WebDriver

Репрезентативное Покрытие

  • tests/unit/models/UserTest.php
  • tests/unit/components/LanguageSelectorTest.php
  • tests/unit/components/ContentManagerTest.php
  • tests/unit/docs/OpenApiSpecTest.php
  • tests/functional/ApiMvpCest.php
  • tests/functional/AdminAccessOwnershipCest.php
  • tests/functional/ContentBlockCrudCest.php
  • tests/functional/SignupEmailConfirmationCest.php
  • tests/functional/WebhookFlowCest.php
  • tests/acceptance/LoginCest.php

Отдельно важно:

  • tests/unit/docs/OpenApiSpecTest.php валидирует swagger.json, обязательные пути и отсутствие битых $ref
  • tests/functional/ApiMvpCest.php проверяет не только happy path API, но и ротацию/отзыв токенов, а также 429 Too Many Requests для login rate limit

Запуск Тестов Локально

Для локального прогона с хостовой машины должны быть запущены Docker-сервисы app, db и selenium, потому что тестовая БД и браузерный драйвер поднимаются через docker compose.

Команды ниже рассчитаны на PowerShell и используют %TEMP%, чтобы локальный PHP не писал в закрытые каталоги tests/_output, runtime и системный session.save_path OSPanel:

$env:DB_HOST='127.0.0.1'
$env:DB_PORT='3307'
$env:DB_USERNAME='myblog'
$env:DB_PASSWORD='myblog_password'
$env:DB_NAME='myblog'
$env:DB_TEST_NAME='myblog_test'
$env:DB_TEST_DSN='mysql:host=127.0.0.1;port=3307;dbname=myblog_test'
$env:DB_DSN=$env:DB_TEST_DSN
$env:TEST_RUNTIME_PATH="$env:TEMP\myblog-test-runtime"
$env:TEST_ASSET_BASE_PATH="$env:TEMP\myblog-test-assets"
$env:TEST_MAIL_PATH="$env:TEMP\myblog-test-mail"
$env:TEST_SESSION_SAVE_PATH="$env:TEMP\myblog-test-sessions"
$env:UPLOAD_STORAGE_PATH="$env:TEMP\myblog-test-uploads"

php -d session.save_path="$env:TEMP\myblog-test-sessions" vendor/bin/codecept run unit -o "paths: output: $env:TEMP/myblog-codecept-output/unit"
php -d session.save_path="$env:TEMP\myblog-test-sessions" vendor/bin/codecept run functional -o "paths: output: $env:TEMP/myblog-codecept-output/functional"
php vendor/bin/codecept run acceptance --env host -o "paths: output: $env:TEMP/myblog-codecept-output/acceptance"

Полный локальный прогон одним вызовом:

php -d session.save_path="$env:TEMP\myblog-test-sessions" vendor/bin/codecept run --env host -o "paths: output: $env:TEMP/myblog-codecept-output/local-full"

Запуск Тестов в Docker

docker compose exec --user=www-data app php vendor/bin/codecept run unit
docker compose exec --user=www-data app php vendor/bin/codecept run functional
docker compose exec --user=www-data app php vendor/bin/codecept run acceptance

Прогон всех наборов одной командой:

docker compose exec --user=www-data app php vendor/bin/codecept run

Если запускать тесты с хоста без Docker-сервисов, большинство тестов упадёт по инфраструктурным причинам:

  • нет подключения к myblog_test (MySQL)
  • нет подключения к Selenium WebDriver

Важно для приемочных тестов:

  • сервис selenium должен быть запущен
  • контейнер app резолвит сайт как http://web.local/
  • локальный запуск с хоста использует профиль tests/_envs/host.yml, который направляет Codeception в Selenium по 127.0.0.1:4444, но оставляет URL приложения контейнерным http://web.local/
  • тестовая точка входа находится в web/index-test.php

Скриншоты Интерфейса

Ниже превью экранов. Нажмите на изображение, чтобы открыть полный размер в новой вкладке.

Лицензия и Авторство

Этот репозиторий не является open-source проектом в смысле MIT, BSD или Apache.

  • Проект лицензирован как proprietary.
  • Автор и правообладатель: Rinat Sarmuldin <ura07srr@gmail.com>.
  • Исходный код, документация, структура БД, фикстуры, дизайн и медиа проекта защищены авторским правом.
  • Копирование, публикация, переработка, перепродажа, ребрендинг и выдача проекта за собственную работу без письменного разрешения правообладателя запрещены.
  • Даже при согласованном использовании должны сохраняться уведомления об авторстве и файл лицензии.

Файлы с юридическими условиями:

  • LICENSE.md - основная лицензия проекта
  • NOTICE.md - явное уведомление об авторстве и правовом статусе репозитория

Важно: сторонние зависимости и ассеты внутри проекта сохраняют собственные лицензии. Это относится к Yii2, Bootstrap, jQuery, Font Awesome, Swagger UI и другим внешним компонентам.

About

Website development using the Yii framework (Yii2 --> Yes It Is -2) Обновлённый стек зависимостей (Yii 2.0.54 и актуальные пакеты ветки 2.x

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors