Biogard
Първият ми проект: сайтът на фирмата на баща ми за борба с вредители в Русе, изграден наново на собствен сървър
- Роля
- Сам, ръководя екипи от агенти
- Статус
- Работи
- Код
- Частно хранилище
- Технологии
- Next.js 16React 19TypeScriptTailwind CSS 4PrismaPostgreSQL 17Docker ComposeCaddygVisorUmamiResendTailscale

В числа
100
точки в PageSpeed на мобилни устройства във всичките четири категории (началната страница)
1,5s
LCP на мобилни устройства, подобрен от 2,7 s
122
страници, обходени автоматично с 0 проблема
38
ръчно нарисувани SVG изображения: 27 вредителя, 9 места, 2 сцени
55
маршрута на два езика, всеки свързан с една основна ключова дума, за да не се конкурират страниците помежду си
13
вида в скритата игра с буболечки, със златна муха и бос „Кралят на хлебарките“
Проблемът
Biogard е първото нещо, което съм изграждал. Най-старият ми запазен чат за него е за React приложение, което не искаше да тръгне, а скритата игра с муха вече беше в плана от самото начало. След това сайтът мина на Next.js 14 в Netlify с база данни Neon. Когато стигнах до преработката, личеше, че е остарял. Безплатното ниво на базата данни изчерпа квотата си и блогът на работещия сайт спря да показва съдържание (страниците на публикациите връщаха грешка 500). Иконите бяха автоматично векторизирани, а в раздела с въпроси имаше бутон „Питайте AI“.
Подходът
Написах задание в едно изречение: да се направи наново по днешните стандарти, да се запазят информацията и всеки URL адрес, без вид на AI, с ръчно нарисувани илюстрации и на двата езика. Агентът първо написа основата на приложението (многоезичност, прокси за маршрутите, помощни функции за SEO, design tokens, горна и долна част на страницата), после пусна осем агента паралелно по страниците, блога, правните текстове, API, илюстрациите и SEO. Скриптът, който обхожда целия сайт и е написан по време на тази фаза, стана проверката за качество. След това DNS на работещия сайт беше насочен към новия сървър.

Как работи
Договореност за адресите
Българските страници са без префикс, а английските са под /en. Прокси препраща вътрешно и двата вида към app/[lang], а старите пътища с /bg/ пренасочва с код 308. Ръководството за изграждане забранява преименуването на slug (частта от адреса, която назовава страницата), защото тези адреси вече са индексирани. При преминаването към новия сайт обходът отчете 122 страници и 0 проблема.
Ръчно нарисувани SVG изображения
27 икони на вредители, 9 места и 2 сцени, нарисувани върху мрежа 64 на 64 с линии в currentColor, заместиха автоматично векторизирания набор. Махнах генерираното видео в горната част на началната страница и на негово място сложих нарисуван разрез на къща, в който вредителите се връщат пред червена бариера. Правилата за текстовете забраняват дългото тире и изтърканите фрази, характерни за AI.
Изолиран на споделен сървър
Docker Compose стартира Caddy, Next.js и Postgres 17, а портове към външния свят отваря само Caddy. Файловата система на контейнерите е само за четене, всички Linux capabilities са отнети, има no-new-privileges и ограничения за процесор, памет и брой процеси (PID). Образите са фиксирани по хеш (digest), а gVisor е наличен за услугите, достъпни от интернет. Верига от правила за изходящия трафик не позволява на контейнерите да отварят връзки към tailnet (частната мрежа на Tailscale), към метаданните на облачния доставчик или към частни адресни диапазони. Всяка версия е директория с времева отметка, а активната се сочи от символна връзка current, като има скрипт за връщане към предишна. При всяко пускане се изпълняват бързи тестове, които проверяват изолацията на контейнерите от сървъра, а базата данни се архивира всяка нощ.
SEO и съответствие с нормите като отделна фаза
SEO планът свързва 55 маршрута на два езика с по една основна ключова дума, така че страниците да не се конкурират за едно и също търсене, със заглавия до 60 знака, описания от 140 до 160, llms.txt и четири карти на сайта (sitemaps). Сайтът не публикува цени, защото всяка обработка се оферира поотделно. Твърденията, че биоцидите са безопасни, нетоксични или „еко“, бяха премахнати, за да се спази чл. 72 от Регламента на ЕС за биоцидните продукти.
Игра с буболечки, която сайтът не споменава
По подразбиране е изключена. Въвеждането на „biogard“ или на кода на Konami, или седем натискания на логото събуждат 13 вида, сред които златна муха и бос „Кралят на хлебарките“; „ddd“ пуска дезинсекция по страницата, а между 21:00 и 05:00 се роят молци. Статистиката отчита кой я открива и кой играе. Така сайтът остава личен и не пречи на клиента.

Какво избрах и какво отпадна
Избрах
На собствен сървър, който вече имам, изолиран с контейнери и защитна стена за изходящия трафик
Пред
Отделен малък сървър, който самото ръководство за експлоатация (runbook) определя като по-безопасния вариант
Не исках втори сървър. Ръководството записва приетия риск (изпълнение на код в уеб контейнера все още изисква излизане от контейнера, за да се стигне до самия сървър) и изхода: преместването на сайта на собствена машина не променя нищо в приложението.
Избрах
Реклами в търсачката на Google
Пред
Реклами в Meta, след тест със 7 реклами и 9 077 показвания
Рекламите в търсачката донесоха телефонно обаждане и съобщение във Viber още в първия ден, а тестът с Meta не донесе нито едно обаждане. Рекламите в Meta бяха спрени.
Избрах
Без AI в продукта: бутонът „Питайте AI“ в раздела с въпроси, неговият API маршрут и клаузите за AI в правните страници бяха премахнати
Пред
Запазване на поле за отговори от AI в раздела с въпроси
Не исках въпросите на посетителите да се изпращат към модел.
Резултатът
Работи на biogard.bg от преминаването на DNS към новия сървър. След pull request #39 Google PageSpeed Insights оцени мобилната начална страница със 100 във всичките четири категории, като LCP падна от 2,7 s на 1,5 s (пускането е на самия агент и не е повторено за тази страница на проекта). Umami на собствен сървър и без бисквитки брои посетителите, като филтрира по българско време или език, откакто се появи трафик от чужди ботове. Недовършено: блокът с отзиви от Google е изграден и остава изключен, докато профилът в Google събере три оценки, двойното потвърждение за бюлетина беше махнато като излишна пречка и стои като неактивен код, а единичните тестове са само 24, така че основната проверка е обходът на сайта. Методът за реклами вече е записан като наръчник в хранилището на ValoxVSL.
Какво следва
Ще включа блока с отзиви, когато профилът в Google събере три оценки.
Галерия
Ръчно нарисувана сцена към услугата: дрон над тръстики.
Ръчно нарисувана сцена към услугата: кухня.
Ръчно нарисувана сцена към услугата: парк.
Ръчно нарисувана сцена към услугата: жилищен блок.
Ръчно нарисувана сцена към услугата: хамбар и оранжерия.
Изграден наново като втора версия.