Справочник

Все маршруты публичной части, REST-эндпоинты панели, параметры конфигурации, ограничения полей и структура каталога медиафайлов — для быстрого поиска.

Страница для сверки, а не для чтения подряд. Всё собрано по исходникам версии из ветки main.

Публичные страницы#

МетодАдресЧто делает
GET/главная: 5 последних постов и 2 последних альбома
GET/recordsлента постов, на одну больше размера страницы
GET/records/pageJSON-порция ленты для подгрузки
GET/records/read?id=Nстраница поста
GET/mediaлента альбомов
GET/media/pageJSON-порция лент альбомов
GET/media/album?id=Nфотоальбом; для видеоальбома сам переадресует
GET/media/video_album?id=Nвидеоальбом
GET/author?id=Nстраница автора со всеми его работами
GET/tag?id=Nстраница тега
GET/history«Летопись» — статическая
GET/about«О нас» — статическая
GET/projects«Проекты» — статическая
GET/education«Образовательные программы» — статическая
GET/authформа входа
POST/process_loginобработка входа, под лимитом попыток
POST/auth/logoutвыход, сброс сессии и cookie
GET/go/{path}короткая ссылка, внутренняя переадресация
GET/sitemap.xmlкарта сайта, кешируется на час
GET/robots.txtстатический файл
GET/media/**медиафайлы: за nginx отдаются с диска
*/errorстраница ошибки

Параметры лент page (с нуля) и type необязательны. Неизвестное значение type не вызывает ошибку — фильтр просто не применяется. Допустимые значения: NEWS, STORY, ANNOUNCEMENT для постов и PHOTO, VIDEO для альбомов; регистр не важен.

Панель: контент#

Требуется роль ROLE_ADMIN или ROLE_MODERATOR. Изменяющие запросы требуют CSRF-токен в заголовке X-CSRF-TOKEN.

МетодАдресЧто делаетВ журнале
GET/dashboardглавная панели
GET/dashboard/tagsстраница менеджера тегов
POST/dashboard/tags/createсоздать тегда
GET/dashboard/tags/edit?id=Nданные тега
PUT/dashboard/tags/editизменить тегда
DELETE/dashboard/tags/delete?id=Nудалить тегда
GET/dashboard/authorsстраница менеджера авторов
POST/dashboard/authors/createсоздать авторада
GET/dashboard/authors/edit?id=Nданные автора
PUT/dashboard/authors/editизменить авторада
DELETE/dashboard/authors/delete?id=Nудалить автора и весь его контентда
GET/dashboard/postsстраница менеджера постов
GET/dashboard/posts/requiredсписки авторов и тегов для формы
POST/dashboard/posts/createсоздать постда
GET/dashboard/posts/edit?id=Nданные поста
PUT/dashboard/posts/editизменить постда
DELETE/dashboard/posts/delete?id=Nудалить постда
GET/dashboard/mediaстраница менеджера медиа
GET/dashboard/media/pageJSON-порция списка медиа
POST/dashboard/media/uploadзагрузить один файл в каталог batchId
DELETE/dashboard/media/uploadудалить один файл по публичному пути
POST/dashboard/media/createсоздать запись альбомада
GET/dashboard/media/edit?id=Nданные альбома
PUT/dashboard/media/editизменить альбомда
DELETE/dashboard/media/delete?id=Nудалить альбом и файлы с дискада

Панель: администрирование#

Требуется роль ROLE_ADMIN.

МетодАдресЧто делаетВ журнале
GET/dashboard/usersменеджер пользователей
POST/dashboard/users/createсоздать пользователяда
GET/dashboard/users/edit?id=Nданные пользователя
PUT/dashboard/users/editизменить пользователяда
DELETE/dashboard/users/delete?id=Nудалить пользователяда
GET/dashboard/journalстраница журнала аудита
GET/dashboard/journal_dataзаписи журнала с пагинацией
GET/dashboard/seoменеджер SEO
GET/dashboard/seo/edit?path=…текущие title и описание адреса
POST/dashboard/seo/editизменить title и описаниеда
POST/dashboard/protectionвключить или выключить режим защиты, задать токенда
GET/dashboard/postprotectionxssпереключить санитизацию постовда
POST/dashboard/global_notificationтекст и видимость баннерада
POST/dashboard/contacts/addressадрес организациида
POST/dashboard/contacts/phoneтелефонда
POST/dashboard/contacts/emaile-mailда
POST/dashboard/shortcutдобавить короткую ссылкуда
DELETE/dashboard/shortcut?key=…удалить короткую ссылкуда
POST/dashboard/social_mediaдобавить соцсетьда
DELETE/dashboard/social_media?name=…удалить соцсеть по названиюда
POST/dashboard/clear_cacheсбросить все кешида
GET/actuator/health, /metrics, /infoтелеметрия Spring Boot

Ограничения полей#

СущностьПолеПравило
Пользовательлогинне короче 4 символов, уникальный
Пользовательпарольне короче 8 символов, минимум 1 латинская буква и 1 цифра
Пользовательроль, имяне пустые
Постзаголовок4–50 символов
Поствведениеот 4 символов
Посттекстне пустой
ПосттипNEWS, STORY или ANNOUNCEMENT
Поставторровно один, обязателен при создании
Альбомназвание4–50 символов
АльбомbatchIdобязателен при создании, уникальный
АльбомтипPHOTO или VIDEO
Альбомавторровно один, обязателен при создании
Тегимя2–30 символов, уникальное
Тегописаниеот 4 символов
Авторимя2–30 символов
Автор«о себе»без ограничений, необязательно

При редактировании пользователя пустой пароль означает «оставить прежний».

Ограничения на загрузку в интерфейсе панели: превью — только .jpg, один файл, до 15 МБ; содержимое альбома — изображения и видео, до 20 ГБ на файл. Реальный максимум определяется меньшим из spring.servlet.multipart.max-file-size и client_max_body_size в nginx.

Параметры конфигурации#

Знаком ! отмечены те, что обязательно менять при развёртке.

ПараметрПо умолчаниюСмысл
server.port${SERVER_PORT:80}! порт приложения
server.forward-headers-strategyвыключен! учитывать заголовки прокси; нужен для правильных абсолютных адресов
system.storage.pathC:/Users/Electron/Downloads/! корень хранилища медиафайлов
web.storage.url-prefix/media/префикс публичных адресов файлов
web.storage.default-preview/media/author.jpgобложка для альбомов без превью
web.storage.local-servingtrue! отдавать файлы силами Spring; за nginx — false
spring.servlet.multipart.max-file-size10GB! предел на файл
spring.servlet.multipart.max-request-size50GB! предел на запрос
spring.datasource.urljdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:otryadwebsite}адрес базы
spring.datasource.username${DB_USER:postgres}! пользователь базы
spring.datasource.password${DB_PASSWORD:postgres}! пароль базы
spring.jpa.hibernate.ddl-autoupdateавтосоздание схемы
spring.jpa.open-in-viewfalseсессия закрыта до рендеринга; менять не нужно
page-size6размер страницы в лентах
app.cache.lifetime60минуты жизни записи кеша с последнего обращения
app.cache.maxsize500записей на кеш
server.compression.enabledtrueсжатие html, xml, текста и JSON
security.admin.loginotryad! логин первого администратора
security.admin.passwordnadezda123! пароль первого администратора
security.attempts.limit5нигде не читается, значения лимитов заданы в коде
management.endpoints.web.exposure.includehealth,metrics,infoкакая телеметрия открыта
devtrueпо замыслу — девелоперский режим; фактически ни на что не влияет
spring.thymeleaf.prefixвыключенчитать шаблоны из каталога на диске вместо jar

Переменные окружения SERVER_PORT, DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD подставляются в соответствующие свойства.

Структура каталога медиафайлов#

<system.storage.path>/
├── 3f9c1b2e-.../          каталог одного альбома, имя = batchId
│   ├── preview.jpg        обложка; всегда это имя, в галерею не попадает
│   ├── 01-first.jpg       содержимое; порядок в галерее — алфавитный
│   ├── 02-second.jpg
│   └── 03-video.mp4
└── 7a1d4c8f-.../
    ├── preview.jpg
    └── 01-clip.mp4

Публичный адрес файла собирается как web.storage.url-prefix + batchId + / + имя файла, то есть /media/3f9c1b2e-.../01-first.jpg.

Таблицы базы данных#

ТаблицаСодержимое
postsпосты; индекс по типу и дате
media_collectionsальбомы; path — это batchId, уникален
content_authorsавторы материалов
content_tagsтеги
post_tags_mapсвязь постов и тегов
collection_tags_mapсвязь альбомов и тегов
usersсотрудники панели
action_logsжурнал аудита

Кеши#

ИмяЧтоВремя жизни
postпосты по id60 минут с последнего обращения
mediumальбомы по id60 минут с последнего обращения
authorавторы с их работами60 минут с последнего обращения
tagтеги с их материалами60 минут с последнего обращения
sitemapадреса карты сайта60 минут с момента записи
bucketsсчётчики лимитов запросов24 часа, до 10 000 записей

Технологии и версии#

ЧтоВерсия или роль
Java17 в настройках сборки, работает и на новее
Spring Boot4.0.2
СтартерыWeb MVC, Data JPA, Security, Validation, Cache, Actuator, Thymeleaf, DevTools
PostgreSQLдрайвер в зависимостях, версия сервера любая поддерживаемая
Caffeineкеш в памяти
Bucket4j8.10.0, ограничение частоты запросов
AspectJаудит и лимиты
Lombokгеттеры, сеттеры, логгер
Thymeleafсерверные шаблоны
EasyMDEредактор Markdown в панели
Marked.jsрендеринг Markdown в браузере
Dropzone.jsзагрузка файлов перетаскиванием
SweetAlert2диалоги и уведомления
H2только для тестов

Сборка — Maven, есть wrapper (./mvnw). Пакет — исполняемый jar target/OtryadWebsite-1.0.jar. Фронтенд-сборки нет: все библиотеки лежат готовыми файлами в статике.