6 мин чтенияИнженерия

Elido на k3s: что Helm-чарт разворачивает, а что нет

Конкретный разбор Helm-чарта Elido на одном узле k3s: секреты, ingress, установка, первый пользователь, обновления, а также лицензия и то.

Marius Voß
DevRel · edge infra

Elido поставляется с Helm-чартом, который разворачивает весь стек на одном кластере Kubernetes, и этот материал проходит по нему на одном узле k3s. Перед командами - часть, которая решает, стоит ли читать дальше: Elido не открытый код, а self-hosting не продукт, который мы продаём. В репозитории нет файла лицензии, поэтому ни у кого за пределами компании нет лицензии запускать или изменять его. Чарт - инструмент развёртывания, который мы держим в репозитории, а команды ниже взяты из него и из руководства рядом с ним (дата обращения 2026-10-25). Пользуйтесь этим руководством, если вы работаете над Elido, если у вас есть письменная договорённость с нами или если хотите увидеть, что именно включает запуск платформы.

Если вы всё ещё выбираете между проектами, которые можно скачать на самом деле, начните со сравнения self-hosted сокращателей. Оно охватывает YOURLS, Shlink, Kutt и Dub и не повторяет ни одного шага отсюда.

Что такое чарт и чем он не является

Чарт находится в deploy/helm/elido. Его метаданные указывают на репозиторий GitHub в организации elidoapp; неаутентифицированный запрос по этому адресу 2026-10-25 вернул 404, поэтому не рассчитывайте клонировать его из интернета. Файл значений тянет образы из ghcr.io/elidoapp, а комментарий в нём называет реестр публичным. Анонимные загрузки я подтвердить не смог, так что считайте это непроверенным.

Чарт к тому же молодой. Его версия 0.1.0, а в собственном описании цель названа «single-region k3s cluster on a beefy VM». Нескольких вещей, которые люди считают входящими в чарт Kubernetes, в нём нет, и ранняя версия этого материала ошибочно описывала некоторые из них:

  • Нет высокой доступности. Каждый stateful-набор работает с одной репликой.
  • Нет заданий резервного копирования. Руководство так и говорит и советует Velero, k8up или снимки провайдера.
  • Нет объектов мониторинга, дашбордов и автомасштабирования.
  • Нет мультирегионального edge. Пресет сводит редиректы в один парк.

Если этого требует регулятор или ваша политика, заложите работу по самостоятельному добавлению.

Что разворачивает пресет self-host

values-selfhost.yaml урезает всё под хост на 4 ядра и 8 ГБ. Он запускает по одной реплике каждой прикладной нагрузки: api-core, analytics-api, click-ingester, url-scanner, notification, bio-renderer, billing, дашборд (web), маркетинговый сайт и один парк edge, отвечающий за все хосты. Сервис идентификации занимается регистрацией и сессиями.

За ними стоят шесть stateful-наборов с постоянными томами: Postgres (20Gi в пресете), Redis (2Gi), колоночное хранилище для событий кликов (30Gi), шина событий (10Gi), объектное хранилище (20Gi) и поисковый индекс (5Gi). Redis здесь - один экземпляр с постоянным хранением append-only, а не кластер. Несколько прежде отдельных сервисов, включая управление доменами, доставку вебхуков и индексацию поиска, теперь работают внутри api-core, поэтому список нагрузок короче, чем в старой документации.

Слои пресета self-host на одном узле k3s: ingress-контроллер, один парк edge-redirect, десять прикладных нагрузок с одной репликой и шесть stateful-наборов с одной репликой для хранилищ данных

Предварительные требования

Руководство требует Kubernetes 1.27 или новее, Helm 3.13 или новее и kubectl, нацеленный на кластер. Вам также нужны DNS-записи для имён хостов дашборда, API, редиректа и bio, SMTP-релей, доступный из кластера, и ingress-контроллер класса caddy.

k3s включает Traefik, который будет конкурировать за порты 80 и 443 с контроллером, который вы собираетесь установить. Отключите его при установке k3s:

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable traefik" sh -
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $UID ~/.kube/config
kubectl get nodes   # should show Ready

Установка шаг за шагом

Пять шагов установки чарта Elido на k3s: пространство имён и секреты, замена заполнителей, ingress-контроллер, helm upgrade install с пресетом self-host и назначение первого пользователя в Postgres

Создайте пространство имён и сгенерируйте секреты. Скрипт создаёт случайные значения для пароля базы данных, ключей cookie и шифрования сервиса идентификации, ключа обфускации slug и перца для ключей API, а для SMTP и LiqPay создаёт заполнители. Существующие секреты он пропускает, если не передать --rotate.

kubectl create namespace elido
./deploy/helm/elido/scripts/bootstrap-secrets.sh elido

В конце скрипт печатает пароль Postgres. Сохраните его. Затем замените заполнитель SMTP до того, как кто-то зарегистрируется; тот же шаблон работает для elido-liqpay, если вы принимаете платежи:

kubectl -n elido create secret generic elido-smtp \
  --from-literal=host=smtp.example.com \
  --from-literal=port=587 \
  [email protected] \
  --from-literal=pass=YOUR_SMTP_KEY \
  --from-literal=kratos_uri='smtps://postmaster%40your-domain.com:[email protected]:465/?disable_starttls=false' \
  --dry-run=client -o yaml | kubectl apply -f -

Установите ingress-контроллер с включённым TLS по требованию:

helm repo add caddy https://caddyserver.github.io/charts
helm -n caddy-system upgrade --install caddy caddy/caddy-ingress-controller \
  --create-namespace --set controller.config.onDemandTLS=true

Теперь установите сам Elido. Закрепите image.tag на выбранном вами релизе. В примере руководства используется latest, из-за чего обновления и откаты трудно предсказывать.

helm -n elido upgrade --install elido ./deploy/helm/elido \
  -f ./deploy/helm/elido/values-selfhost.yaml \
  --set image.tag=YOUR_TAG \
  --set ingress.hosts.dashboard=app.your-domain.com \
  --set ingress.hosts.api=api.your-domain.com \
  --set ingress.hosts.bio=bio.your-domain.com \
  --set 'ingress.hosts.redirect={r.your-domain.com}' \
  --set ingress.hosts.marketing=your-domain.com \
  --set auth.kratos.publicHost=app.your-domain.com
kubectl -n elido get pods -w

Миграции выполняются как init-контейнеры для сервисов, которым они нужны, и как задание pre-install для сервиса идентификации. Если миграция не удаётся, новые поды никогда не получают трафик.

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

Откройте https://app.your-domain.com/signup и зарегистрируйтесь. Сервис идентификации создаёт учётную запись, а api-core сохраняет строку пользователя. Пока ничто не делает этого пользователя владельцем, поэтому создайте рабочее пространство и членство вручную, как и советуют собственные заметки чарта по установке:

kubectl -n elido exec -it sts/postgres -- psql -U elido -d elido <<'SQL'
INSERT INTO workspaces (slug, name, plan_tier)
VALUES ('default', 'Default', 'business') RETURNING id;
INSERT INTO workspace_members (workspace_id, user_id, role)
SELECT 1, id, 'owner' FROM users WHERE email = '[email protected]';
SQL

Пользовательские домены используют TLS по требованию. Клиент добавляет links.brand.com в дашборде, затем направляет CNAME на хост, который вы задали в EDGE_CNAME_TARGET (переменная api-core, по умолчанию равная собственному граничному имени хоста Elido, так что измените её). При первом HTTPS-запросе ingress-контроллер вызывает GET /v1/caddy/ask у api-core. Ответ 200 выпускает сертификат; 403 означает, что домен не проверен. Отлаживайте командой kubectl -n elido logs deploy/api-core | grep caddy/ask.

Резервные копии, обновления и откат

Резервные копии - ваша забота. Руководство советует ежедневные снимки тома Postgres (data-postgres-0) и еженедельные для колоночного хранилища (data-clickhouse-0), так как данные кликов можно воспроизвести из шины событий в пределах её срока хранения. Том шины событий копировать не нужно. Чтобы использовать управляемый Postgres, задайте postgres.enabled=false и направьте url секрета elido-postgres на него. Выполните восстановление в тестовое пространство имён, прежде чем на что-либо из этого полагаться.

Обновление - одна команда с новым тегом:

helm -n elido upgrade elido ./deploy/helm/elido \
  -f ./deploy/helm/elido/values-selfhost.yaml --set image.tag=NEW_TAG

Скользящие обновления используют maxSurge: 1 и maxUnavailable: 0, а helm -n elido rollback elido <revision> возвращает Deployment назад, не трогая тома и секреты. При одной реплике на сервис ожидайте кратких сбоев у нагрузок, не являющихся stateless.

Известные подводные камни

СимптомВероятная причинаРешение
Задание миграции identity падает с database "kratos" does not existPostgres создал elido, но не эту базуCREATE DATABASE kratos; через psql, затем снова helm upgrade
api-core уходит в crash-loop, требуя KRATOS_PUBLIC_URLauth.kratos.enabled=false без переопределенияВключите сервис идентификации снова или задайте переменную на ваш IdP
Дашборд отвечает 502 при первой загрузкеСертификат ещё не выпущенСледите за логами ingress-контроллера; первый выпуск может занять около 30 секунд
Редиректы возвращают 503Граничный парк не может достучаться до RedisПроверьте, что URL секрета elido-redis указывает на сервис внутри кластера
Всё уходит в crash-loop после перезагрузкиPVC не привязаныkubectl get pv,pvc -n elido и убедитесь, что провайдер local-path запущен

Если вы здесь из-за DPO, хостируемого варианта может быть уже достаточно: его основные данные находятся в ЕС, а руководство по резидентности в ЕС перечисляет, что обрабатывается за его пределами. О стороне задержек при запуске собственных редиректов смотрите материал о граничных точках.

Читайте также в блоге

Частые вопросы

Можно ли развернуть Elido самому?

Не как продукт, который мы предлагаем сегодня. В репозитории есть Helm-чарт и руководство, которыми пользуемся мы сами, но файла лицензии нет, поэтому ни у кого за пределами Elido нет лицензии запускать или изменять код, а опубликованного тарифа для self-hosting и поддержки тоже нет. Если у вас жёсткое требование к расположению данных, свяжитесь с нами, и мы обсудим это как индивидуальную договорённость.

Открыт ли код Elido?

Нет. В репозитории нет файла лицензии, а значит, все права защищены. У некоторых клиентских пакетов (SDK, типы API и MCP-сервер) есть собственные файлы LICENSE, но у самой платформы, включая чарт, который описан в этом материале, нет. Любой текст на сайте, где для self-hosting указано Apache 2.0, ошибочен.

Что нужно для запуска пресета self-host?

Руководство требует Kubernetes 1.27 или новее, Helm 3.13 или новее, wildcard DNS для хостов дашборда, API, редиректа и bio, SMTP-релей и ingress-контроллер класса caddy. Виртуальной машины на 4 ядра и 8 ГБ достаточно для проверки работоспособности. Для продакшена, по тому же руководству, нужны три и более узла по 8 ядер и 16 ГБ каждый.

Включает ли чарт резервные копии, мониторинг или высокую доступность?

Нет. Чарт разворачивает Postgres, Redis, колоночное хранилище, шину событий, объектное хранилище и поиск как stateful-наборы с одной репликой и постоянными томами. Резервные копии остаются на инструментах вашего кластера вроде Velero или k8up, а в чарте нет объектов мониторинга, автомасштабирования и отказоустойчивости. Ранние версии этого материала их описывали, но в чарте их не было.

Как работают пользовательские домены в self-hosted установке?

Ingress-контроллер перед выпуском сертификата для неизвестного имени хоста обращается к api-core по /v1/caddy/ask, а api-core отвечает по своему списку проверенных доменов. CNAME клиентов вы направляете на хост, заданный в EDGE_CNAME_TARGET. Если этот эндпоинт возвращает 403, сертификат не выпускается, поэтому сначала смотрите логи api-core.

Как обновиться или откатиться?

Выполните helm upgrade с тем же файлом значений и новым image.tag. Deployment используют maxSurge 1 и maxUnavailable 0, а миграции базы данных выполняются до того, как новые поды начнут принимать трафик, поэтому неудачная миграция оставляет старые поды работающими. helm rollback на предыдущую ревизию подменяет Deployment и не трогает ваши тома данных и секреты.

Попробуйте Elido

Вставьте URL - получите короткую ссылку

Без регистрации. Ссылка живёт 30 дней. Зарегистрируйтесь, чтобы оставить её навсегда.

Без регистрации. Зарегистрируйтесь бесплатно и получите 50 ссылок в месяц.

Попробуйте Elido

URL-сокращатель с хостингом в ЕС: собственные домены, глубокая аналитика, открытый API. Бесплатный тариф - без банковской карты.

Теги
self host elido
k3s
helm chart
kubernetes url shortener
self hosted url shortener
data residency

Читать дальше