VoxViet — наш второй проект: площадка для русскоязычных, которые живут во Вьетнаме или собираются туда. Аренда и продажа жилья, транспорт и туры, услуги, форум, база знаний про визы и жизнь в шести городах. Сайт написала другая команда, и к нам он пришёл работающим, но не готовым к людям. Живой сайт — voxviet.com, в подвале — наша подпись.
Что было на входе
Начали с аудита: прошли сайт руками под гостем, клиентом, партнёром, агентством и администратором, прочитали код и базу. Ядро — каталог недвижимости с заявками — работало. Остальное — нет: пароль администратора совпадал с паролем из инструкции по запуску, сервер чата верил любому, кто назвался чужим номером пользователя, бесплатный переводчик был открыт всему интернету без входа.
Робот каждый час публиковал заголовки вьетнамского новостного сайта — 13 547 страниц, 63 % так и остались на вьетнамском, и все были открыты поисковикам. Для молодого домена это минус, а не плюс. Наша оценка готовности: инфраструктура 6 из 10, код 5 из 10, продукт 2 из 10.
Сначала — безопасность и индекс
До любой рекламы закрыли дыры: чат и обмен сообщениями выключили до проверки подлинности, переводчик убрали, вебхуки оплаты стали принимать только подписанные запросы, хэши паролей больше не покидают базу, вход через Google не продлевает чужую сессию. Закрытые дыры сторожат автотесты — вернуть их незаметно не выйдет.
Новостной мусор убрали из индекса, у каждой страницы появились свои заголовок и описание, заработали карта сайта и robots. Новостной робот переписан: вместо ленты всего подряд — три англоязычных источника, фильтр по темам экспата и одна новость в день с переводом на русский.
Переезд и выкатка одной командой
Сайт жил на сервере прежней команды: четыре процесса Node под pm2, переменные в разных файлах, секрет планировщика открытым текстом. Сняли полную копию — код, базу, 13 550 загруженных файлов, настройки — сверили по числу файлов и таблиц и перевезли на свой сервер в Docker. Перед сайтом Cloudflare, фото и ночные копии базы — во внешнем хранилище.
Дальше — конвейер: push в основную ветку, проверки, сборка образа, миграции, перезапуск. Если новый контейнер не поднялся за 90 секунд, скрипт сам возвращает прошлый образ. Правка доходит до сайта примерно за семь минут, руками на сервере никто ничего не делает.
Дизайн-система вместо разнобоя
Старые страницы делались по одной, и это было видно: свои отступы, кнопки и шрифты на каждой. Сначала собрали систему — цвета, шрифты, сетку и общие блоки: шапку раздела, карточку, хлебные крошки, галерею, панель с фактами. Потом перевели на неё сайт четырьмя заходами — списки, лендинги, детальные страницы, формы с кабинетом и админкой — с показом каждого захода и выкаткой целиком.
Каждый заход проверялся замером: доступность 1,00 по Lighthouse на ключевых страницах, страница не прыгает при загрузке, скорость не хуже, чем была до.
Три языка — по-настоящему
Переключатель языков был и раньше, но переведено было меньше половины текста. Теперь русский, английский и вьетнамский — на всех публичных страницах и в кабинете; тест падает, если у строки нет перевода хотя бы на один язык. Для вьетнамских собственников жилья — отдельная страница на их языке: как сдать квартиру русскоязычным арендаторам.
Словарь при этом не грузится целиком: страница получает только свои разделы — 41–47 КБ на публичных страницах вместо 150 КБ везде.
Контент, которому можно верить
Площадка не ведёт сделок — люди публикуют объявления сами и договариваются напрямую. Поэтому тексты написаны как для площадки: без обещаний «ответим за час» и «проверенных объявлений», которых никто не проверял. База знаний про визы, налоги, медицину и аренду сверена с официальными источниками Вьетнама, у статей о визах — ссылки на них; у шести городов — климат, районы, где жить.
Телефон — основной экран
Экспат открывает сайт с телефона — в такси, в кафе, в очереди за визой. Каждая страница проверяется на ширине 375 пикселей: меню, формы, таблицы цен, карты, которые не перехватывают прокрутку пальцем. Автотесты гоняют сценарии в Chromium, Firefox и в мобильном профиле.
Результат
Шесть недель от снятия копии с чужого сервера до нового дизайна в бою; всего с начала работы — 600 с лишним коммитов, каждый через автотесты. Сверху уже достроены раздел знакомств с взаимным интересом и модерацией и страница цен с офертой — оплату размещения подключаем следующей.
Это и есть «разработка под ключ», как мы её понимаем: не только написать код, но принять чужой проект, честно сказать, что с ним, и довести до состояния, когда правка выезжает на сайт за семь минут и ничего не ломает.