MAATRIX / Блог / Как установить и настроить Focalboard на VPS

Как установить и настроить Focalboard на VPS

MAATRIX

Trello и Asana удобны, пока не упираешься в лимиты бесплатного тарифа, платную интеграцию или банальный вопрос — а где физически лежат данные команды. Focalboard закрывает этот вопрос: канбан-доски, таблицы и календарь в одном self-hosted инструменте, который вы полностью контролируете на своём VPS. Ниже — рабочая установка через Docker Compose, настройка HTTPS через реверс-прокси и то, что обычно упускают в инструкциях: бэкапы, обновления и типичные грабли.

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

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

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

Что такое Focalboard и когда он нужен

Focalboard — open-source проект (изначально от Mattermost, сейчас развивается сообществом как форк) для управления проектами: доски канбан, табличный вид, календарь и галерея — всё вокруг одной модели данных, между видами можно переключаться без потери структуры. По функциональности это ближе к Trello или Notion-lite, чем к тяжёлым таск-трекерам вроде Jira.

Берите Focalboard, если:

  • команда небольшая (до 20-30 человек) и не нужна сложная иерархия проектов с диаграммами Ганта;
  • важно, чтобы данные не покидали ваш сервер — юридические, финансовые или просто параноидальные соображения;
  • хочется одного инструмента вместо связки «Trello + Google Таблицы + календарь»;
  • есть уже развёрнутый Mattermost — Focalboard интегрируется с ним как плагин, но прекрасно работает и отдельно (standalone-режим, о котором эта статья).

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

Требования к серверу

Focalboard в standalone-режиме — приложение на Go с встроенной SQLite или подключаемым Postgres/MySQL. Ресурсоёмкость невысокая:

ПараметрМинимумРекомендуется
CPU1 vCPU2 vCPU
RAM1 ГБ2 ГБ
Диск10 ГБ SSD20-30 ГБ SSD
ОСUbuntu 24.04 / Debian 12Ubuntu 24.04

Для команды до 15-20 человек с активной работой в досках хватит 2 vCPU / 2 ГБ RAM с запасом под реверс-прокси и Postgres. Если сервер один и на нём же крутится ещё что-то (например, Nextcloud или CI), закладывайте на Focalboard отдельно 1-1.5 ГБ RAM — SQLite-режим прожорлив на конкурентных запросах, а Postgres съедает свою долю памяти на буферы.

Домен для сервиса не обязателен технически (можно ходить по IP:порт), но для нормального HTTPS и удобства команды лучше сразу привязать поддомен вроде board.example.com.

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

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

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

Установка через Docker Compose

Самый предсказуемый способ развернуть Focalboard — через Docker. Если Docker ещё не установлен, разверните его по шагам из статьи про установку Docker на Ubuntu 24.04 с нуля — там же есть версия для Debian 12.

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

mkdir -p ~/focalboard && cd ~/focalboard
nano docker-compose.yml

Вариант с Postgres (рекомендуется для продакшена — SQLite в контейнере плохо переживает параллельную запись при нескольких активных пользователях):

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

  focalboard:
    image: mattermost/focalboard:latest
    restart: unless-stopped
    depends_on:
      - focalboard-db
    environment:
      FOCALBOARD_DBTYPE: postgres
      FOCALBOARD_DBCONFIG: "postgres://focalboard:замените_на_свой_пароль@focalboard-db:5432/focalboard?sslmode=disable"
    ports:
      - "127.0.0.1:8000:8000"
    volumes:
      - ./files:/opt/focalboard/files
    networks:
      - focalboard-net

networks:
  focalboard-net:
    driver: bridge

Пароль подставьте свой и одинаковый в обеих секциях. Порт 8000 намеренно забинден только на 127.0.0.1 — наружу сервис будет смотреть через реверс-прокси с SSL, напрямую по HTTP наружу его лучше не выставлять.

Запускаем:

docker compose up -d
docker compose ps

Проверьте, что контейнер поднялся и не падает в рестарт-луп:

docker compose logs -f focalboard

В логах должна появиться строка о старте сервера на порту 8000 без ошибок подключения к базе. Если видите connection refused к focalboard-db — скорее всего, база ещё не успела инициализироваться при первом запуске; подождите 10-15 секунд и перезапустите контейнер приложения: docker compose restart focalboard.

Настройка реверс-прокси и SSL

Открывать порт 8000 напрямую наружу — плохая идея: без TLS логин и данные команды идут открытым текстом, плюс сервис становится легко просканировать. Правильный путь — Nginx или Traefik перед Focalboard с автоматическим Let's Encrypt.

Если у вас уже есть Traefik для других контейнеров — Focalboard встраивается в ту же схему, смотрите статью про Traefik как реверс-прокси для Docker. Для Traefik нужно добавить лейблы вместо публикации порта наружу:

  focalboard:
    image: mattermost/focalboard:latest
    restart: unless-stopped
    depends_on:
      - focalboard-db
    environment:
      FOCALBOARD_DBTYPE: postgres
      FOCALBOARD_DBCONFIG: "postgres://focalboard:замените_на_свой_пароль@focalboard-db:5432/focalboard?sslmode=disable"
    volumes:
      - ./files:/opt/focalboard/files
    networks:
      - focalboard-net
      - traefik-public
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.focalboard.rule=Host(`board.example.com`)"
      - "traefik.http.routers.focalboard.entrypoints=websecure"
      - "traefik.http.routers.focalboard.tls.certresolver=letsencrypt"
      - "traefik.http.services.focalboard.loadbalancer.server.port=8000"

Если проще на голом Nginx без Docker-интеграции — сначала настройте домен и DNS-запись A на IP сервера (см. настройку домена и DNS с нуля), затем конфиг:

server {
    listen 80;
    server_name board.example.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket для realtime-обновлений досок
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Важный момент, который часто забывают: Focalboard использует WebSocket для живого обновления досок между участниками (когда коллега двигает карточку, вы видите это без перезагрузки страницы). Без строк Upgrade/Connection "upgrade" в конфиге realtime просто не заработает — доска будет обновляться только по F5.

Дальше выпускаем сертификат — через certbot или acme.sh, разница описана в статье certbot или acme.sh — что выбрать для сервера:

sudo certbot --nginx -d board.example.com

После этого проверьте автообновление сертификата (certbot renew --dry-run) — просроченный TLS на внутреннем корпоративном инструменте обычно замечают в худший момент.

Первый вход и настройка команды

После разворачивания сервера откройте https://board.example.com. При первом заходе Focalboard предложит создать администратора — логин и пароль храните в менеджере паролей, это единственная учётка с полным доступом к настройкам сервера.

Базовые шаги после установки:

  1. Создайте рабочее пространство (workspace) — по умолчанию оно одно, но можно организовать несколько под разные команды или клиентов.
  2. Пригласите участников по email или ссылкой-приглашением — в настройках workspace включите или отключите открытую регистрацию (Enable open signup), по умолчанию лучше держать выключенной.
  3. Настройте роли: admin, member, viewer — на уровне доски можно давать доступ только на чтение, что удобно для внешних наблюдателей.
  4. Импортируйте существующие доски из Trello — в меню workspace есть встроенный импортёр, который переносит списки, карточки и чеклисты из экспорта Trello (JSON-файл).

Если планируете держать документацию рядом — Focalboard не заменяет вики, для этого лучше отдельный инструмент, например Wiki.js или BookStack на том же сервере.

Бэкапы и обновления

Данные Focalboard живут в двух местах: база (Postgres в нашей схеме) и папка с загруженными файлами (вложения к карточкам). Бэкапить нужно оба.

Дамп базы:

docker compose exec focalboard-db pg_dump -U focalboard focalboard > focalboard_$(date +%F).sql

Файлы вложений — это просто директория ./files, которую можно архивировать обычным tar или синхронизировать через rclone во внешнее хранилище:

tar czf focalboard_files_$(date +%F).tar.gz ./files

Для регулярного автоматического бэкапа проще завести cron-задачу с обоими шагами и ротацией старых архивов, либо использовать выделенный инструмент — например, restic или borgbackup, если у вас уже настроена такая схема на сервере.

Обновление до новой версии — стандартно для Docker-стека:

docker compose pull
docker compose up -d

Перед мажорным обновлением (смена номера версии слева от точки) сделайте свежий дамп базы — Focalboard, как и большинство активно развивающихся open-source проектов, иногда меняет схему данных между релизами, и откат назад после неудачной миграции без бэкапа будет болезненным.

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

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

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

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

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

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

Focalboard работает без Mattermost?

Да, есть отдельный standalone-режим (образ mattermost/focalboard), который не требует Mattermost вообще — именно его мы разворачивали в этой статье. Плагин-режим для Mattermost — отдельный вариант установки, если у вас уже есть корпоративный чат на Mattermost.

Можно обойтись без Postgres, только на SQLite?

Технически да — Focalboard по умолчанию использует встроенный SQLite и это работает для 1-3 пользователей. Но при параллельной записи нескольких людей одновременно SQLite начинает блокироваться, поэтому для команды лучше сразу Postgres.

Данные точно не уходят на сторонние серверы?

В standalone-режиме без Mattermost и без явной интеграции с внешними сервисами — нет, всё хранится локально в вашей базе и файловой системе. Проверить можно логами исходящих соединений на файрволе, если параноите — см. настройку UFW на VPS для контроля исходящего трафика.

Что делать, если после обновления доски не открываются?

Сначала смотрите логи (docker compose logs focalboard) — часто причина в несовместимости версии базы со схемой нового образа. Откатитесь на предыдущий тег образа (mattermost/focalboard:v7.x вместо latest) и восстановите бэкап базы, если миграция не прошла чисто.

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

Нет, сервис лёгкий и прекрасно уживается с другими Docker-контейнерами на одном VPS — важно только не забывать про суммарное потребление RAM, если на том же сервере крутится что-то более прожорливое вроде Elasticsearch или тяжёлой аналитики.

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

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

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