Перейти к содержанию

Руководство по правке фронтенда dix.su

Структура проектов

dixsu-infra/            ← единый монорепо, одна ветка prod (см. docs/DEPLOYMENT.md)
├── modulauth/          ← Spring Boot (Java) — основной сервис
├── dixu_proxy/         ← Elixir Phoenix — прокси туннелей
└── nginx/              ← конфиг обратного прокси

modulauth — шаблоны и статика

Где лежат файлы

modulauth/src/main/resources/
├── templates/                    ← HTML-шаблоны (Thymeleaf)
│   ├── landing.html              ← главная страница dix.su
│   ├── clarity.html              ← страница проверки /clarity
│   ├── protected-page.html       ← личный кабинет /auth/protected
│   ├── admin-catalog.html        ← панель управления /admin
│   ├── tunnels.html              ← tunnels.dix.su (проверка туннелей)
│   ├── link-info.html            ← link.dix.su (проверка ссылок)
│   ├── tunnel-landing.html       ← лендинг /tunnel
│   ├── profile-landing.html      ← лендинг /profile
│   ├── shortlinks-landing.html   ← лендинг /shortlinks
│   ├── otzovik.html              ← страница отзывика /otzovik
│   ├── privacy.html              ← политика конфиденциальности
│   └── fragments/
│       └── site-layout.html      ← шапка, футер, мобильное меню (nav, footer, navStyles, navScript)
├── static/
│   ├── css/                      ← стили (admin.css и др.)
│   ├── js/                       ← скрипты (admin-profile.js и др.)
│   └── img/                      ← картинки, favicon
└── db/migration/                 ← SQL-миграции Flyway (V1__, V2__...)

Как добавить пункт в главное меню

Файл: templates/fragments/site-layout.html

Десктоп-nav (строки ~52-57):

<div class="nav-links">
    <a href="https://dix.su/profile">Визитка</a>
    <a href="https://dix.su/shortlinks">Ссылки</a>
    <a href="https://dix.su/tunnel">Туннель</a>
    <a href="https://dix.su/clarity">Проверка</a>   <!-- ← новый пункт -->
    <a href="https://dix.su/otzovik">Отзовик</a>
</div>

Мобильный nav (строки ~64-70) — тот же список, продублировать туда же.

Как добавить новую страницу

  1. Создать templates/my-page.html — взять за основу любой *-landing.html
  2. Добавить метод в LandingController.java:
    @GetMapping("/my-page")
    public Mono<Rendering> myPage(ServerWebExchange exchange) {
        return render("my-page", exchange);
    }
    
  3. Если страница должна быть публичной — убедиться что путь есть в SecurityConfig.java в списке permitAll()
  4. Собрать и задеплоить

Нужна ли пересборка?

Да — всегда. Шаблоны и статика запекаются в JAR при сборке. Изменения в файлах на диске не применяются автоматически.

# На VPS:
bash /root/dixsu/rebuild_modulauth.sh

# Пересобирает modulauth, перезапускает контейнер.
# Flyway автоматически применяет новые SQL-миграции при старте.

Workflow правок

# 1. Отредактировать файл локально
#    Пример: modulauth/src/main/resources/templates/clarity.html

# 2. Закоммитить и запушить (один монорепо, ветка prod — см. docs/DEPLOYMENT.md)
git add modulauth/src/main/resources/templates/clarity.html
git commit -m "fix: описание правки"
git push origin prod

# 3. Применить на сервере
ssh -p 1022 root@217.114.43.49 \
  "cd /root/dixsu && git pull && docker compose build modulauth --no-cache && docker compose up -d modulauth"

Добавить SQL-миграцию

Создать файл с именем следующей версии (см. последнюю в modulauth/src/main/resources/db/migration/, на 2026-06-21 это V35):

db/migration/V36__My_change.sql
Flyway применит её автоматически при следующем старте контейнера.


dixu_proxy — шаблоны Elixir

Особенность: нет отдельных HTML-файлов

Прокси не использует Phoenix HEEx/EEx шаблонные файлы — весь HTML встроен прямо в функции контроллера в виде строк Elixir. Это сделано намеренно: прокси рендерит только несколько служебных страниц (заморозка туннеля, офлайн), и выносить их в файлы не было нужды.

Где найти HTML

Файл: dixu_proxy/lib/dixu_proxy_web/controllers/proxy_controller.ex

# Страница «Заморожен пользователем»
defp frozen_user_html(slug) do
  """
  <!DOCTYPE html>...
  """
end

# Страница «Заблокирован администратором»
defp frozen_admin_html(slug) do
  """
  <!DOCTYPE html>...
  """
end

Страница «Устройство офлайн» (текстовый ответ):

# В функции proxy/2:
|> text("Device #{device_slug} is not connected")

Как изменить HTML страниц прокси

  1. Открыть dixu_proxy/lib/dixu_proxy_web/controllers/proxy_controller.ex
  2. Найти нужную функцию (frozen_user_html, frozen_admin_html)
  3. Отредактировать HTML внутри тройных кавычек """
  4. Закоммитить, запушить, пересобрать
git add dixu_proxy/lib/dixu_proxy_web/controllers/proxy_controller.ex
git commit -m "fix: обновить страницу заморозки"
git push origin prod

ssh -p 1022 root@217.114.43.49 \
  "cd /root/dixsu && git pull && docker compose build dixu_proxy --no-cache && docker compose up -d dixu_proxy"

Нужна ли пересборка?

Да. Elixir компилирует код в BEAM-байткод. Изменение .ex файла требует перекомпиляции и перезапуска контейнера.

# На VPS:
bash /root/dixsu/rebuild_dixu_proxy.sh

nginx — конфиг

Где лежит

nginx/dixu.conf.template   ← шаблон конфига (с переменными $BASE_DOMAIN и т.д.)

При старте контейнера nginx envsubst подставляет переменные и кладёт результат в /etc/nginx/conf.d/dixu.conf.

Нужна ли пересборка?

Нет rebuild, но нужно пересоздать контейнер:

git add nginx/dixu.conf.template
git commit -m "fix: nginx правка"
git push origin prod

ssh -p 1022 root@217.114.43.49 \
  "cd /root/dixsu && git pull origin prod && docker compose up -d --force-recreate nginx"

Проверить применённый конфиг на сервере

ssh -p 1022 root@217.114.43.49 \
  "docker exec dixsu-nginx-1 cat /etc/nginx/conf.d/dixu.conf"