Персональный сайт-визитка

Как я собрал свой персональный профиль на Astro, GitLab и self-hosted Docker + Caddy — и как собрать свой.

● активен ↗ Репозиторий

О проекте

Я сделал этот профиль, чтобы представить себя как инженера: опыт, проекты и образ мышления. Вместо PDF-резюме или профиля на очередной платформе я хотел страницу, которой полностью владею — где можно писать о том, что я делаю, и делиться этим с другими.

В этой статье я покажу, как собрать похожую страницу для себя. В итоге у вас будет живой персональный сайт на своём домене, который деплоится автоматически при каждом пуше.

Архитектура

Стек: Astro 4 · статическая сборка · self-hosted Docker + Caddy

Astro был выбран вместо Next.js и Hugo, потому что по умолчанию отдаёт почти нулевой JavaScript (хорошо для SEO и первого впечатления), из коробки поддерживает Markdown/MDX для страниц проектов и включает нативные интеграции для RSS и sitemap. Сайт собирается в полностью статический бандл — без сервера и накладных расходов на гидратацию.

Контент-модель: каждый проект — это Markdown-файл в src/content/projects/. Фронтматтер содержит метаданные (заголовок, описание, теги, статус, ссылку на репозиторий); тело файла — сама статья. Маршруты — /<slug> в корне: чистые, удобные для шаринга URL.

Дизайн: везде используется JetBrains Mono. Моноширинный шрифт сигнализирует инженерной аудитории без визуальных трюков. Янтарный акцент (#cf7e1f) — единственный цвет. Всё остальное — почти нейтральные серые тона.

Как собрать свой

1. Создайте проект и инициализируйте Astro

Создайте репозиторий на GitLab или GitHub, затем инициализируйте Astro-проект:

npm create astro@latest

Добавьте свои данные: имя, роль, опыт, ссылки. Файловый роутинг Astro превращает src/pages/index.astro в вашу главную страницу.

Другой вариант — форкнуть мой проект или посмотреть раздел Советы и хитрости, чтобы инициализировать проект с помощью AI-агента.

2. Задеплойте на свой сервер

Соберите Docker-образ из Astro-сборки и раздавайте статику через Caddy — это даёт TLS из коробки и полный контроль над инфраструктурой без привязки к платформе.

Настройте GitLab CI: пайплайн собирает образ, пушит его в registry и разворачивает на сервере по SSH при каждом пуше в основную ветку.

3. Зарегистрируйте домен (опционально)

Выберите короткий домен, который отражает ваше имя, например almazmelnikov.ru. Свой я зарегистрировал на reg.ru примерно за 200 рублей в год. Подойдёт любой регистратор — важно владеть URL, который вы контролируете в долгосрочной перспективе.

4. Подключите домен (опционально)

Настройте DNS-записи домена на IP вашего сервера и укажите домен в Caddyfile — Caddy автоматически выпустит и обновит TLS-сертификат.

Этот шаг опциональный: можно обойтись IP-адресом сервера, но собственный домен выглядит более осмысленно и им проще делиться.

5. Итерируйте и публикуйте

Дальше рабочий процесс простой: правите локально, тестируете через npm run dev, затем пушите в основную ветку. GitLab CI подхватывает каждый пуш и передеплоивает сайт автоматически — обычно в течение минуты.

npm run dev   # откройте http://localhost:4321 для превью
git push      # GitLab CI пересобирает и деплоит автоматически

Развивайте сайт постепенно: добавляйте проекты, дорабатывайте дизайн, пишите статьи. Каждый пуш выкатывается без ручных шагов деплоя.

Советы и хитрости

Используйте Claude для генерации дизайна и кода. Я не писал этот сайт с нуля руками. Процесс был такой:

  1. Открыл claude.ai/design и описал нужную страницу — разметку, секции, цветовую палитру, шрифт. Claude сгенерировал визуальный дизайн и экспортировал его в один HTML-файл.
  2. Взял этот HTML-файл как отправную точку и скопировал в локальный репозиторий. Использовал Claude Code — AI-ассистента для разработки, который работает прямо в терминале.
  3. Попросил Claude Code превратить статический HTML в проект на Astro, подключить content collections, добавить sitemap и реализовать всё остальное, описанное в этой статье.

Весь проект — структура, стили, контент-модель, пайплайн сборки — был сгенерирован и доработан в диалоге с Claude Code. Как бэкенд-инженеру мне не пришлось осваивать фронтенд-тулинг с нуля: я описывал, что хочу, и итерировал по результату.

Это практичный способ для тех, кто не является фронтенд-специалистом, но хочет чистый, осмысленно выглядящий сайт без недель работы.