MAATRIX / Блог / Vikunja на Ubuntu 24.04: пошаговая установка

Vikunja на Ubuntu 24.04: пошаговая установка

MAATRIX

Todoist и Trello удобны, пока не упираетесь в лимиты бесплатного тарифа или не начинаете переживать, кому именно принадлежат данные о ваших задачах. Vikunja — открытый менеджер задач с списками, канбан-досками, метками и напоминаниями, который можно поднять на своём сервере за 20-30 минут и больше не думать о подписках. Ниже — рабочая установка на Ubuntu 24.04 через Docker Compose с PostgreSQL и SSL-сертификатом.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Vikunja и кому он подойдёт

Vikunja — open-source проект на Go (бэкенд) и Vue (фронтенд), лицензия AGPL. По функциям это что-то среднее между Todoist и Trello: есть списки задач, канбан-доски с колонками, метки, приоритеты, повторяющиеся задачи, напоминания, вложения и общие проекты с командой.

Для кого имеет смысл self-hosted вариант:

  • команды из 3-15 человек, которым нужны общие проекты без месячной платы за каждого пользователя;
  • те, кто держит клиентские данные и не хочет заводить задачи вида «созвон по контракту с ООО Ромашка» на чужом сервере;
  • энтузиасты, которым важно, чтобы инструмент жил столько, сколько нужно им, а не пока жив стартап-разработчик.

Минусы тоже стоит проговорить честно: мобильных пуш-уведомлений в самостоятельном хостинге по умолчанию нет (нужна отдельная настройка через собственный APN/FCM или email-напоминания), а экосистема интеграций заметно скромнее, чем у Todoist или ClickUp. Если вам критичны нативные приложения с пушами из коробки — Vikunja это даст с оговорками, а не сразу.

Системные требования скромные: 1 vCPU и 1-2 ГБ RAM хватает на команду до 10-20 человек с запасом. Для базы данных лучше PostgreSQL, а не встроенный SQLite — так проще делать бэкапы и не упереться в блокировки при параллельной записи.

Подготовка сервера

Понадобится VPS с Ubuntu 24.04, доменное имя (или поддомен), направленное на IP сервера, и открытые порты 80/443. Если у вас ещё нет настроенного домена, сначала разберитесь с DNS — это отдельная тема, не будем повторять её здесь.

Подключаемся по SSH и обновляем систему:

ssh root@your-server-ip
apt update && apt upgrade -y
apt install -y curl ca-certificates gnupg

Заводим отдельного пользователя без root — держать сервисы под root не стоит:

adduser vikunja
usermod -aG sudo vikunja
su - vikunja

Дальше все команды выполняем от этого пользователя, добавляя sudo там, где нужны права root.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка Docker и Docker Compose

Vikunja официально поддерживает установку через Docker — это самый предсказуемый способ развернуть бэкенд, фронтенд и базу данных согласованно, без ручной сборки из исходников.

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker compose version

Последние две команды должны вывести версии без ошибок. Если docker compose version ругается на отсутствие плагина — доустановите его отдельно (sudo apt install docker-compose-plugin), в актуальных сборках Docker Engine он обычно уже идёт в комплекте.

Docker Compose: PostgreSQL и Vikunja

Создаём рабочую директорию и файл docker-compose.yml:

mkdir -p ~/vikunja/{db,files}
cd ~/vikunja
nano docker-compose.yml

Содержимое файла:

services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: vikunja
      POSTGRES_PASSWORD: замените_на_свой_надёжный_пароль
      POSTGRES_DB: vikunja
    volumes:
      - ./db:/var/lib/postgresql/data
    networks:
      - vikunja

  api:
    image: vikunja/vikunja
    restart: unless-stopped
    environment:
      VIKUNJA_DATABASE_HOST: db
      VIKUNJA_DATABASE_TYPE: postgres
      VIKUNJA_DATABASE_USER: vikunja
      VIKUNJA_DATABASE_PASSWORD: замените_на_свой_надёжный_пароль
      VIKUNJA_DATABASE_DATABASE: vikunja
      VIKUNJA_SERVICE_JWTSECRET: замените_на_случайную_строку_32+_символа
      VIKUNJA_SERVICE_PUBLICURL: https://tasks.example.com/
      VIKUNJA_SERVICE_ENABLEREGISTRATION: "false"
    volumes:
      - ./files:/app/vikunja/files
    depends_on:
      - db
    networks:
      - vikunja
    expose:
      - "3456"

networks:
  vikunja:

Обратите внимание на три момента:

  • VIKUNJA_SERVICE_JWTSECRET — обязательно случайная строка, её можно сгенерировать командой openssl rand -hex 32;
  • VIKUNJA_SERVICE_PUBLICURL — итоговый адрес с https, иначе фронтенд будет собирать неправильные ссылки для вложений и уведомлений;
  • VIKUNJA_SERVICE_ENABLEREGISTRATION — по умолчанию Vikunja разрешает саморегистрацию любому, кто найдёт ваш адрес; для приватного инстанса лучше выключить и заводить пользователей вручную через админку.

С версии Vikunja 0.24+ фронтенд и API объединены в один образ vikunja/vikunja, который отдаёт и UI, и API на одном порту — раздельные контейнеры vikunja-api и vikunja-frontend из старых мануалов уже не актуальны. Проверьте актуальный docker-compose.yml в официальном репозитории на момент установки — переменные окружения между релизами иногда переименовывают.

Запускаем:

docker compose up -d
docker compose ps
docker compose logs -f api

В логах должно появиться сообщение о старте сервера и успешном подключении к базе. Если контейнер api падает сразу после старта — почти всегда дело в неверном пароле к БД или опечатке в имени переменной окружения.

Reverse-proxy и SSL-сертификат

Открывать Vikunja напрямую по порту 3456 без TLS не стоит — логин и пароль будут идти открытым текстом. Проще всего поставить перед контейнером Caddy: он сам получает и обновляет сертификат Let's Encrypt без ручной возни с certbot. Подробный процесс установки Caddy с автоматическим SSL описан в отдельной статье про установку Caddy с авто-SSL на Ubuntu 24.04 — здесь только конфиг под конкретно Vikunja.

Устанавливаем Caddy и правим Caddyfile:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy

Файл /etc/caddy/Caddyfile:

tasks.example.com {
    reverse_proxy localhost:3456
}

Но контейнер api слушает порт только внутри docker-сети vikunja, а не на хосте — нужно либо пробросить порт наружу в compose-файле (ports: ["127.0.0.1:3456:3456"] вместо expose), либо подключить Caddy к той же docker-сети. Проще всего добавить проброс порта на localhost, чтобы наружу порт не торчал, а Caddy на хосте до него дотягивался:

  api:
    ports:
      - "127.0.0.1:3456:3456"

После правки перезапускаем контейнер и Caddy:

docker compose up -d
sudo systemctl reload caddy

Caddy сам выпустит сертификат при первом обращении к домену — убедитесь, что DNS-запись A уже указывает на IP сервера, иначе валидация ACME не пройдёт.

Первый вход и базовая настройка

Открываем https://tasks.example.com в браузере. Если саморегистрацию не отключали заранее — первый созданный аккаунт стоит сразу пометить как администратора через настройки, а после завести нужных пользователей и выключить регистрацию (VIKUNJA_SERVICE_ENABLEREGISTRATION: "false" в compose-файле, затем docker compose up -d).

Базовые вещи, которые стоит настроить в первый час:

  • Проекты и списки — создайте отдельный проект под каждую область (работа, личное, конкретный клиент), внутри — списки задач или канбан-доску.
  • Метки (labels) — заведите короткий набор меток заранее (срочно, ждёт ответа, блокер), иначе через месяц будет 40 меток с пересекающимся смыслом.
  • Уведомления по email — если хотите получать напоминания о дедлайнах на почту, настройте SMTP-блок в переменных окружения (VIKUNJA_MAILER_HOST, VIKUNJA_MAILER_USERNAME и так далее) — без этого система тихо промолчит о просроченных задачах.
  • API-токен — в настройках профиля можно выпустить токен для мобильных приложений или сторонних интеграций через REST API.

Мобильные приложения Vikunja для iOS и Android умеют подключаться к своему инстансу — при первом запуске приложение попросит указать адрес сервера вместо облака по умолчанию.

Бэкапы и обслуживание

Данные хранятся в двух местах: PostgreSQL (задачи, пользователи, настройки) и папка files (вложения к задачам). Backup-скрипт можно сделать элементарным:

#!/bin/bash
BACKUP_DIR=/home/vikunja/backups
DATE=$(date +%Y%m%d-%H%M)
mkdir -p $BACKUP_DIR

docker compose -f /home/vikunja/vikunja/docker-compose.yml exec -T db \
  pg_dump -U vikunja vikunja | gzip > $BACKUP_DIR/vikunja-db-$DATE.sql.gz

tar -czf $BACKUP_DIR/vikunja-files-$DATE.tar.gz -C /home/vikunja/vikunja files

find $BACKUP_DIR -type f -mtime +14 -delete

Сохраните как ~/vikunja/backup.sh, дайте права на выполнение (chmod +x) и добавьте в cron на ежедневный запуск ночью. Для более серьёзного подхода к резервному копированию — с шифрованием и хранением вне сервера — пригодится обзор PostgreSQL на Ubuntu 24.04, там разобраны нюансы дампов и восстановления подробнее.

Обновление до новой версии Vikunja — обычно просто docker compose pull && docker compose up -d, но перед этим стоит сделать свежий бэкап: миграции базы данных в редких случаях требуют отката, и без дампа откат будет мучительным.

Firewall стоит настроить так, чтобы порт 3456 не был доступен извне вообще (мы и так привязали его к localhost), а наружу смотрели только 80 и 443 через Caddy. Если UFW ещё не настроен — есть отдельный разбор настройки файрвола UFW на VPS.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

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

Vikunja поддерживает SQLite вместо PostgreSQL?

Да, для тестового окружения или личного использования одним человеком SQLite подойдёт — меньше настройки, не нужен отдельный контейнер БД. Для команды и параллельной работы лучше PostgreSQL: SQLite блокирует базу на запись при конкурентных операциях.

Можно ли импортировать задачи из Todoist или Trello?

Да, в настройках есть импорт из нескольких популярных сервисов, включая Todoist, Trello и Vikunja-экспорт другого инстанса. Формат разметки задач при импорте иногда упрощается — сложные подзадачи и вложенные чек-листы стоит проверить вручную после переноса.

Нужен ли отдельный сервер только под Vikunja?

Нет, для команды до 15-20 человек хватает бюджетного VPS на 1-2 vCPU и 2 ГБ RAM. Тот же сервер спокойно потянет ещё пару лёгких сервисов вроде мониторинга или вики.

Как перенести Vikunja на другой сервер?

Достаточно скопировать папку с docker-compose.yml, db и files, поднять Docker на новом сервере и выполнить docker compose up -d — база и вложения переедут вместе с директориями, если сохранить их структуру.

Что делать, если после обновления фронтенд не грузится?

Обычно причина в закешированной старой версии JS в браузере — сначала жёсткая перезагрузка страницы (Ctrl+Shift+R), затем проверка логов контейнера api на ошибки миграции базы данных.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →