Индекс журналаDockup / заметка с места
Note / self-host-vikunja

Как разместить Vikunja на собственном сервере в 2026 году: публичный URL, база данных и файловое хранилище

Разместите Vikunja на собственном сервере с правильными портами, постоянным хранилищем, HTTPS, секретами, резервными копиями и проверками обновлений. Узнайте, как исправить неверный публичный URL API.

Если вы уже пытались разместить Vikunja на собственном сервере, вам наверняка знакома неприятная ситуация: UI открывается, но публичный URL API указан неверно или загруженные файлы не сохраняются в volume. Пересоздание контейнера редко устраняет несоответствие между URL, состоянием и зависимостями.

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

От чего зависит Vikunja

Обозначьте вокруг Vikunja три границы: ingress к порту 3456, постоянное состояние и вспомогательные требования. Контейнер можно заменить, но для двух других компонентов нужно явно определить ответственных. Сетевой контракт Vikunja в production-среде включает Postgres или MySQL и SMTP для рабочих команд. Приватные endpoints следует размещать во внутреннем DNS, разрешать только необходимые исходящие вызовы и выдавать Vikunja service credential с ограниченными правами.

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

Volumes — только первый уровень восстановления

До создания первой настоящей записи перечислите состояние системы: базу данных, загруженные файлы и конфигурацию. Подключите /app/vikunja/files до bootstrap, запишите безопасные тестовые данные и замените контейнер, чтобы убедиться, что этот путь действительно сохраняется. Проверьте mount: запишите безопасные тестовые данные, замените Vikunja и прочитайте их обратно.

Snapshots удобны для быстрого rollback, но при потере хоста или volume необходима независимая backup-копия. Восстановите данные в пустом окружении с зафиксированным образом и проверьте, что проекты, история задач, вложения, напоминания и пользователи вернулись, а запланированное уведомление по-прежнему отправляется. Используйте persistent volumes and snapshots, чтобы разделять эти два механизма восстановления.

Защитите ценные данные Vikunja

После первого входа проверьте, что могут делать анонимный посетитель, обычный пользователь и администратор. Ошибка Vikunja, которой следует избежать, — использование неизменённого JWT secret или случайно открытая регистрация. Предусмотренная политика: использовать стабильный JWT secret, закрыть регистрацию после завершения набора пользователей и разделить обычных участников и администраторов проектов.

Сгенерируйте VIKUNJA_SERVICE_JWTSECRET как длинное случайное значение; его смена обычно делает сессии или токены недействительными, поэтому заранее спланируйте влияние на пользователей и не рассматривайте эту операцию как миграцию шифрования. Разделяйте аккаунты зависимостей и аккаунты людей, по возможности запрещайте неиспользуемый egress и ограничивайте нагрузку, связанную с трафиком вложений, запросами к базе данных, фоновыми задачами и исходящей почтой, а не только небольшим API-процессом.

Превратите smoke test Vikunja в проверку релиза

Release candidate Vikunja получает право обслуживать трафик после выполнения фиксированного сценария: создать проект, задачу, вложение и напоминание, переместить задачу на доске и проверить событие в календаре и уведомление. Зафиксируйте digest образа, эффективную конфигурацию без секретов, public origin и timestamps этого сценария. Тестовые данные должны быть одноразовыми, но достаточно реалистичными, чтобы задействовать тот же путь, что и пользовательские операции.

Запустите этот тест после замены runtime, а затем пересоберите сервис из базы данных, загруженных файлов и конфигурации. Восстановление считается успешным, если проекты, история задач, вложения, напоминания и пользователи вернулись, а запланированное уведомление по-прежнему отправляется. Сравните с предыдущим релизом измерения ресурсов для трафика вложений, запросов к базе данных, фоновых задач и исходящей почты, а не только для небольшого API-процесса, и до продвижения релиза исследуйте существенные отклонения.

Наконец, выполните контролируемую проверку сбоя: временно запретите тестовой identity доступ к Postgres или MySQL и SMTP для рабочих команд. Убедитесь, что Vikunja объясняет причину сбоя, не повреждает существующее состояние и возобновляет работу после восстановления корректного условия. Сохраните редактированный фрагмент лога и время восстановления. Вместе эти проверки охватывают поведение, сохранность данных и эксплуатацию, а не только доступность процесса.

Соберите заменяемый контейнер Vikunja

Следующая команда показывает границы контейнера, не создавая видимость, будто она разворачивает все внешние сервисы.

docker run -d \
  --name vikunja \
  --restart unless-stopped \
  -p 127.0.0.1:3456:3456 \
  -v vikunja-data:/app/vikunja/files \
  -e VIKUNJA_SERVICE_JWTSECRET=replace-with-a-long-random-value \
  vikunja/vikunja:latest

До открытия ingress проверьте итоговые environment variables, mounts и listener. Добавьте проверенные настройки подключения к Postgres или MySQL и SMTP для рабочих команд; для приватных сервисов используйте приватные имена. Успешный запуск завершается не тогда, когда docker ps выводит Up, а когда вы можете создать проект, задачу, вложение и напоминание, переместить задачу на доске и проверить событие в календаре и уведомление.

Маршрутизируйте Vikunja, не искажая HTTPS

Не используйте для Vikunja временные и постоянные public origins. Вместо этого задайте VIKUNJA_SERVICE_PUBLICURL как точный HTTPS origin, направьте выбранное DNS-имя на route платформы и проксируйте запросы только на порт 3456.

Выполните это действие извне хоста: создайте проект, задачу, вложение и напоминание, переместите задачу на доске и проверьте событие в календаре и уведомление. Если ingress не работает, в руководстве по устранению неполадки 502 описаны ошибки портов и listener. Если Vikunja получает запрос, но публичный URL API указан неверно или загруженные файлы не сохраняются в volume, теперь есть основания искать проблему за пределами proxy.

Диагностируйте Vikunja, который выглядит работоспособным

Для Vikunja отслеживайте транзакцию, а не процесс: создайте проект, задачу, вложение и напоминание, переместите задачу на доске и проверьте событие в календаре и уведомление. Сопоставляйте latency и error rate этой транзакции с трафиком вложений, запросами к базе данных, фоновыми задачами и исходящей почтой, а не только с небольшим API-процессом, чтобы alert указывал на компонент, который ограничивает производительность.

Репетиция обновления должна учитывать, что database migrations и совместимость frontend/API необходимо проверять до смены версии Vikunja. Выполните восстановление, миграцию и транзакцию до замены production-окружения. Если публичный URL API указан неверно или загруженные файлы не сохраняются в volume, не стирайте данные ради успешного запуска; последовательно сравните версию, переменные, mounts и доступность зависимостей.

Разверните Vikunja в Dockup, сохранив границы ответственности

Dockup может взять на себя заменяемые компоненты платформы: направлять трафик на порт 3456, выдавать домен и сертификат, передавать secrets, подключать persistent storage и соединять Vikunja с managed-сервисами или сервисами, подключёнными приватно. Это можно сделать на инфраструктуре Dockup или на подключённом вами сервере.

Ответственность за приёмку Vikunja остаётся явной. После one-click deployment задайте VIKUNJA_SERVICE_PUBLICURL как точный HTTPS origin, подключите и проверьте Postgres или MySQL и SMTP для рабочих команд и выполните этот сценарий: создайте проект, задачу, вложение и напоминание, переместите задачу на доске и проверьте событие в календаре и уведомление. Такое разделение намеренно: Dockup устраняет повторяющуюся настройку инфраструктуры, но не делает вид, будто роли приложения, credentials провайдеров или политика восстановления выбираются автоматически.

Часто задаваемые вопросы

Что нужно Vikunja для production-развёртывания?

Направьте контейнер Vikunja на порту 3456 через один HTTPS origin. Сетевые требования для вспомогательных сервисов — Postgres или MySQL и SMTP для рабочих команд. Не объявляйте Vikunja готовым, пока не сможете создать проект, задачу, вложение и напоминание, переместить задачу на доске и проверить событие в календаре и уведомление.

Какие данные Vikunja должны входить в backup?

Сохраняйте /app/vikunja/files и включайте базу данных, загруженные файлы и конфигурацию в единый recovery manifest. Восстановление Vikunja в чистом окружении считается успешным только тогда, когда возвращаются проекты, история задач, вложения, напоминания и пользователи, а запланированное уведомление по-прежнему отправляется.

Требуется ли Vikunja HTTPS за reverse proxy?

Используйте HTTPS для публичного origin Vikunja, а порт 3456 оставьте во внутреннем route. Корректно примените настройку Vikunja: задайте VIKUNJA_SERVICE_PUBLICURL как точный HTTPS origin. Для Vikunja HTTPS защищает credentials и пользовательский контент при передаче и обеспечивает согласованное поведение клиента, зависящее от origin.

Как тестировать обновление Vikunja?

Восстановите текущее состояние Vikunja в изолированном deployment, примените candidate version и повторите транзакцию приёмки. Уделите этому особое внимание, поскольку database migrations и совместимость frontend/API необходимо проверять до смены версии Vikunja. Не удаляйте предыдущий образ Vikunja, пока не будут понятны границы миграции данных и rollback.