bolt Valebyte VPS от $4/мес — NVMe, запуск за 60 секунд.

Получить VPS arrow_forward
eco Начальный Туториал

Развёртывание AppFlowy на VPS: Свой аналог Notion с Docker и PostgreSQL

calendar_month Aug 08, 2026 schedule 22 мин. чтения visibility 45 просмотров
Развёртывание AppFlowy на VPS: Свой аналог Notion с Docker и PostgreSQL
info

Нужен сервер для этого гайда? Мы предлагаем выделенные серверы и VPS в 50+ странах с мгновенной настройкой.

Нужен сервер для этого гайда?

Разверните VPS или выделенный сервер за минуты.

Развёртывание AppFlowy на VPS: Свой аналог Notion с Docker и PostgreSQL

TL;DR

В этом подробном руководстве мы шаг за шагом настроим AppFlowy — мощную open-source альтернативу Notion — на вашем собственном VPS. Вы научитесь устанавливать и конфигурировать Docker, PostgreSQL, AppFlowy Server, а также обеспечивать безопасный доступ через HTTPS с помощью Caddy. По завершении туториала у вас будет полностью функционирующий и безопасный инструмент для управления знаниями и проектами, который находится под вашим полным контролем.

  • Установка AppFlowy Server с использованием Docker Compose для легкого развертывания.
  • Настройка выделенной базы данных PostgreSQL для хранения данных AppFlowy.
  • Обеспечение безопасного доступа к AppFlowy через HTTPS с автоматическим управлением SSL-сертификатами от Caddy.
  • Базовая подготовка VPS: настройка безопасности, фаервола и SSH-доступа.
  • Рекомендации по резервному копированию данных и обслуживанию системы для долгосрочной стабильности.

Что мы настраиваем и зачем

Схема: Что мы настраиваем и зачем
Схема: Что мы настраиваем и зачем

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

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

В этом руководстве мы развернем AppFlowy Server на виртуальном частном сервере (VPS), используя контейнеризацию с Docker и Docker Compose. В качестве базы данных будет использоваться PostgreSQL, что обеспечит надежное и масштабируемое хранение данных. Мы также настроим автоматическое получение и обновление SSL-сертификатов с помощью Caddy, чтобы ваш AppFlowy был доступен по защищенному HTTPS-соединению.

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

Альтернативы: Cloud-managed vs. Self-hosted

Прежде чем углубляться в настройку, важно понимать, почему self-hosted решение, такое как AppFlowy на VPS, может быть предпочтительнее облачных альтернатив:

  • Cloud-managed сервисы (например, Notion, Monday.com, ClickUp):
    • Плюсы: Простота старта, не требуется технический опыт, автоматическое масштабирование и бэкапы, поддержка от провайдера.
    • Минусы: Высокая стоимость при росте команды, отсутствие полного контроля над данными, зависимость от политики конфиденциальности провайдера, ограниченные возможности кастомизации.
  • Self-hosted на VPS (например, AppFlowy, GitLab Community Edition, Mattermost):
    • Плюсы: Полный контроль над данными и безопасностью, потенциально более низкая стоимость в долгосрочной перспективе (особенно для больших команд), высокая степень кастомизации, возможность интеграции с вашей собственной инфраструктурой.
    • Минусы: Требует технических знаний для установки и обслуживания, ответственность за бэкапы и обновления лежит на вас, первоначальная настройка может быть трудоемкой.

Выбор self-hosted AppFlowy на VPS идеален для тех, кто готов инвестировать время в настройку ради полной независимости и контроля, или для команд с чувствительными данными, которые не могут быть размещены на сторонних серверах.

Какой VPS-конфиг нужен под эту задачу

Схема: Какой VPS-конфиг нужен под эту задачу
Схема: Какой VPS-конфиг нужен под эту задачу

Выбор подходящего VPS-конфига критически важен для стабильной и быстрой работы AppFlowy. Хотя AppFlowy сам по себе не является чрезвычайно ресурсоемким приложением, работа с Docker, PostgreSQL и веб-сервером требует определенного запаса ресурсов. Приведенные ниже требования актуальны для 2026 года и рассчитаны на стабильную работу для небольшой команды (до 10-15 активных пользователей).

Минимальные требования

  • CPU: 2 ядра. Современные процессоры VPS обеспечивают достаточную производительность на ядро.
  • RAM: 4 ГБ. Из них 2 ГБ будет использоваться Docker-контейнерами (AppFlowy Server, PostgreSQL, Caddy) и еще 2 ГБ для операционной системы, кэширования и потенциального роста.
  • Диск: 80 ГБ NVMe SSD. Быстрый SSD значительно улучшает производительность базы данных. 80 ГБ достаточно для ОС, Docker-образов, данных AppFlowy и резервных копий на несколько недель. Для долгосрочного хранения бэкапов рекомендуется использовать внешнее хранилище.
  • Сеть: 100 Мбит/с или 1 Гбит/с порт. Для веб-приложения, такого как AppFlowy, важна стабильность, а не пиковая пропускная способность, если только вы не планируете передавать очень большие файлы.

Рекомендуемый VPS-план

Для комфортной работы и возможности небольшого масштабирования в будущем, а также для обеспечения стабильности при пиковых нагрузках, рекомендуются следующие характеристики:

  • CPU: 4 ядра.
  • RAM: 8 ГБ.
  • Диск: 160 ГБ NVMe SSD.
  • Сеть: 1 Гбит/с порт.

Такой конфиг обеспечит плавную работу AppFlowy даже при одновременной работе нескольких пользователей, активном использовании баз данных и индексации контента. Можно рассмотреть VPS с указанными характеристиками для аренды. Убедитесь, что провайдер предлагает надежную инфраструктуру и доступ к актуальным версиям операционных систем, например, Ubuntu Server 24.04 LTS.

Когда нужен Dedicated, а не VPS

Dedicated сервер становится необходим, когда:

  • Большое количество пользователей: Если вы планируете развертывание для более чем 50 активных пользователей или для корпоративного использования с критически важными данными.
  • Высокие требования к производительности: Для очень интенсивных рабочих нагрузок, таких как обработка больших объемов данных, машинное обучение или высоконагруженные базы данных, где даже самый мощный VPS может быть недостаточен.
  • Строгие требования к безопасности и соответствию: Некоторые регуляторные требования могут предписывать использование физически изолированного оборудования.
  • Кастомизация аппаратного обеспечения: Необходимость в специфических конфигурациях RAID, GPU или необычных сетевых картах.

Для большинства случаев развертывания AppFlowy для личного использования или небольшой/средней команды, хорошо сконфигурированного VPS будет более чем достаточно.

Локация: на что влияет

Выбор географического расположения VPS-сервера влияет на несколько ключевых аспектов:

  • Задержка (Latency): Чем ближе сервер к вашим пользователям, тем ниже задержка и быстрее отклик приложения. Для команды, распределенной по разным регионам, стоит выбрать центральное расположение.
  • Законодательство: Законы о защите данных (например, GDPR в ЕС) могут накладывать ограничения на то, где могут храниться данные. Выбирайте локацию, соответствующую вашим юридическим требованиям.
  • Стоимость: Цены на VPS могут значительно различаться в зависимости от региона из-за стоимости электроэнергии, недвижимости и сетевой инфраструктуры.
  • Доступность: Некоторые регионы могут иметь лучшую связность с мировыми магистралями интернета, что обеспечивает более стабильное соединение.

Для AppFlowy, как правило, достаточно выбрать сервер в стране, где находится большинство ваших пользователей, чтобы минимизировать задержки.

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

Схема: Подготовка сервера
Схема: Подготовка сервера

Прежде чем приступить к установке AppFlowy, необходимо выполнить базовую настройку и усиление безопасности вашего нового VPS. Мы будем использовать Ubuntu Server 24.04 LTS как основную операционную систему, так как она является одной из самых популярных и стабильных платформ для серверных развертываний.

1. Подключение по SSH

Сначала подключитесь к вашему VPS как пользователь root, используя IP-адрес, предоставленный вашим провайдером:


ssh root@ВАШ_IP_АДРЕС_VPS

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

2. Создание нового пользователя с правами sudo

Работа под пользователем root небезопасна. Создадим нового пользователя, который будет использоваться для повседневных задач, и предоставим ему права sudo.


# Замените 'appflowyuser' на желаемое имя пользователя
adduser appflowyuser

Следуйте инструкциям: введите и подтвердите пароль, а затем можете пропустить заполнение дополнительной информации, просто нажимая Enter.

Теперь добавьте нового пользователя в группу sudo, чтобы он мог выполнять команды с правами администратора:


usermod -aG sudo appflowyuser

3. Настройка аутентификации по SSH-ключам (рекомендуется)

Использование SSH-ключей значительно повышает безопасность по сравнению с парольной аутентификацией. Если у вас еще нет пары SSH-ключей, сгенерируйте их на вашем локальном компьютере:


# На вашем ЛОКАЛЬНОМ компьютере
ssh-keygen -t rsa -b 4096

Затем скопируйте публичный ключ на ваш VPS для нового пользователя:


# На вашем ЛОКАЛЬНОМ компьютере, замените 'appflowyuser' и 'ВАШ_IP_АДРЕС_VPS'
ssh-copy-id appflowyuser@ВАШ_IP_АДРЕС_VPS

После этого выйдите из сессии root и войдите под новым пользователем, используя SSH-ключ:


# На вашем ЛОКАЛЬНОМ компьютере
exit
ssh appflowyuser@ВАШ_IP_АДРЕС_VPS

Если вы можете войти без пароля, значит, ключи настроены правильно. Теперь отключим парольную аутентификацию для SSH и запретим вход для root.


# На VPS, под 'appflowyuser'
sudo nano /etc/ssh/sshd_config

Найдите и измените следующие строки (если их нет, добавьте):


# ...
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
# ...

Сохраните изменения (Ctrl+O, Enter) и выйдите (Ctrl+X). Затем перезапустите SSH-сервис:


sudo systemctl restart sshd

ВАЖНО: Убедитесь, что вы можете войти под новым пользователем с SSH-ключом ПЕРЕД тем, как отключать парольную аутентификацию и вход для root. Иначе вы рискуете потерять доступ к серверу.

4. Обновление системы

Всегда начинайте с обновления пакетной базы и установленных пакетов до актуальных версий.


# Обновление списка пакетов
sudo apt update
# Обновление всех установленных пакетов
sudo apt upgrade -y
# Удаление старых, ненужных пакетов
sudo apt autoremove -y

5. Настройка брандмауэра (UFW)

UFW (Uncomplicated Firewall) — это простой в использовании интерфейс для настройки правил iptables. Включим его и разрешим только необходимые порты.


# Разрешить SSH (порт 22)
sudo ufw allow OpenSSH
# Разрешить HTTP (порт 80)
sudo ufw allow http
# Разрешить HTTPS (порт 443)
sudo ufw allow https
# Включить брандмауэр
sudo ufw enable
# Проверить статус брандмауэра
sudo ufw status

Убедитесь, что статус active и порты 80, 443, 22 разрешены. Разрешение OpenSSH до включения UFW критично, чтобы не потерять доступ к серверу.

6. Установка Fail2Ban

Fail2Ban помогает защитить сервер от атак методом подбора пароля, блокируя IP-адреса, с которых происходят многократные неудачные попытки входа.


# Установка Fail2Ban
sudo apt install fail2ban -y
# Запуск и включение автозапуска
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Проверка статуса (опционально)
sudo systemctl status fail2ban

Fail2Ban по умолчанию защищает SSH. Для дополнительных сервисов можно настроить правила в файле /etc/fail2ban/jail.local.

Теперь ваш сервер готов к установке основного программного обеспечения.

Установка ПО — пошагово

Схема: Установка ПО — пошагово
Схема: Установка ПО — пошагово

На этом этапе мы установим все необходимое программное обеспечение: Docker и Docker Compose для контейнеризации AppFlowy Server и PostgreSQL, а также Caddy для веб-сервера и автоматического получения SSL-сертификатов.

1. Установка Docker Engine

Docker — это платформа для разработки, доставки и запуска приложений в контейнерах. Мы будем использовать официальный репозиторий Docker для получения самой свежей версии, актуальной для 2026 года (предполагаем Docker Engine v25.x или v26.x).


# Обновление списка пакетов
sudo apt update
# Установка необходимых пакетов для работы с HTTPS-репозиториями
sudo apt install ca-certificates curl gnupg -y
# Создание директории для ключей GPG
sudo install -m 0755 -d /etc/apt/keyrings
# Загрузка официального ключа GPG Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Изменение прав доступа к файлу ключа
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Добавление репозитория Docker в список источников APT
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Обновление списка пакетов с учетом нового репозитория Docker
sudo apt update
# Установка Docker Engine, Docker CLI и containerd
sudo apt install docker-ce docker-ce-cli containerd.io -y

Добавьте вашего пользователя в группу docker, чтобы выполнять команды Docker без sudo:


# Замените 'appflowyuser' на ваше имя пользователя
sudo usermod -aG docker appflowyuser
# Выйдите и снова войдите в SSH-сессию, чтобы изменения вступили в силу
exit
ssh appflowyuser@ВАШ_IP_АДРЕС_VPS

Проверьте, что Docker установлен корректно:


# Проверка версии Docker
docker --version
# Проверка работы Docker, запустив тестовый контейнер
docker run hello-world

Вывод hello-world подтвердит успешную установку.

2. Установка Docker Compose

Docker Compose позволяет определять и запускать многоконтейнерные Docker-приложения. Мы установим его из официального репозитория, обеспечивая актуальность для 2026 года (предполагаем Docker Compose v2.25.x или новее).


# Установка Docker Compose
sudo apt install docker-compose-plugin -y

Проверьте версию Docker Compose:


# Проверка версии Docker Compose
docker compose version

3. Установка Caddy

Caddy — это мощный, расширяемый веб-сервер с автоматическим HTTPS. Он прост в настройке и идеально подходит для обеспечения безопасного доступа к AppFlowy.


# Установка необходимых пакетов
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
# Загрузка ключа GPG Caddy
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
# Добавление репозитория Caddy
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
# Установка Caddy
sudo apt install caddy -y

Проверьте статус Caddy:


# Проверка статуса сервиса Caddy
sudo systemctl status caddy

Он должен быть активен и запущен. Если нет, запустите его: sudo systemctl start caddy.

4. Настройка доменного имени и DNS

Для работы HTTPS с Caddy вам потребуется доменное имя (например, appflowy.yourdomain.com), указывающее на IP-адрес вашего VPS. Перейдите в панель управления вашего доменного регистратора или DNS-провайдера и создайте A-запись:

  • Тип: A
  • Имя/Хост: appflowy (или другой поддомен, который вы хотите использовать)
  • Значение: Ваш_IP_адрес_VPS
  • TTL: 300 (или меньше для быстрого обновления)

Подождите несколько минут (до нескольких часов, в зависимости от TTL) для распространения DNS-записей. Проверить это можно с помощью команды dig (на вашем локальном компьютере):


# На вашем ЛОКАЛЬНОМ компьютере
dig appflowy.yourdomain.com

В ответе должна быть секция ANSWER SECTION, содержащая IP-адрес вашего VPS.

Теперь все необходимые компоненты установлены и готовы к дальнейшей конфигурации.

Конфигурация

Схема: Конфигурация
Схема: Конфигурация

На этом этапе мы настроим AppFlowy Server, PostgreSQL и Caddy, чтобы они работали вместе. Мы будем использовать Docker Compose для оркестрации всех сервисов.

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

Создадим корневую директорию для нашего проекта AppFlowy и поддиректории для хранения данных PostgreSQL и конфигурации Caddy.


# Создание основной директории проекта
mkdir -p ~/appflowy-server
cd ~/appflowy-server
# Создание директории для данных PostgreSQL
mkdir -p ./data/postgresql
# Создание директории для конфигурации Caddy
mkdir -p ./caddy/Caddyfile
mkdir -p ./caddy/data # Caddy будет хранить здесь сертификаты
mkdir -p ./caddy/config # Caddy будет хранить здесь свою конфигурацию

2. Создание файла .env для переменных окружения

Для управления секретами и конфигурационными параметрами, такими как пароли баз данных, мы будем использовать файл .env. Это безопаснее, чем жестко кодировать их в файле docker-compose.yml.


nano .env

Добавьте следующее содержимое, изменив значения YOUR_DB_PASSWORD, YOUR_APPFLOWY_SECRET_KEY и YOUR_APPFLOWY_JWT_SECRET на надежные, сгенерированные случайным образом строки. Используйте генератор паролей для этого.


# PostgreSQL Database Configuration
POSTGRES_DB=appflowy_db
POSTGRES_USER=appflowy_user
POSTGRES_PASSWORD=YOUR_DB_PASSWORD # Generate a strong password

# AppFlowy Server Configuration
APPFLOWY_SERVER_PORT=3060 # Default port for AppFlowy server
APPFLOWY_SERVER_HOST=0.0.0.0 # Listen on all interfaces
APPFLOWY_SERVER_SECRET_KEY=YOUR_APPFLOWY_SECRET_KEY # Generate a strong, random key
APPFLOWY_SERVER_JWT_SECRET=YOUR_APPFLOWY_JWT_SECRET # Generate a strong, random key for JWT
APPFLOWY_SERVER_DATABASE_URL=postgresql://appflowy_user:YOUR_DB_PASSWORD@db:5432/appflowy_db

# Optional: Set log level for AppFlowy server (e.g., info, debug, error)
# APPFLOWY_SERVER_LOG_LEVEL=info

# Caddy Configuration (for external access)
CADDY_DOMAIN=appflowy.yourdomain.com # Replace with your actual domain

Сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X).

3. Создание файла docker-compose.yml

Этот файл определит три сервиса: PostgreSQL, AppFlowy Server и Caddy.


nano docker-compose.yml

Вставьте следующее содержимое. Убедитесь, что версии образов актуальны для 2026 года (AppFlowy Server v0.4.0, PostgreSQL v16.x, Caddy v2.x).


version: '3.8'

services:
  db:
    image: postgres:16-alpine # Используем актуальную версию PostgreSQL для 2026 года
    restart: unless-stopped
    env_file:
      - .env
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - ./data/postgresql:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

  appflowy:
    image: appflowy/appflowy-server:0.4.0 # Предполагаемая актуальная версия AppFlowy Server для 2026 года
    restart: unless-stopped
    env_file:
      - .env
    environment:
      AF_SERVER_HOST: ${APPFLOWY_SERVER_HOST}
      AF_SERVER_PORT: ${APPFLOWY_SERVER_PORT}
      AF_SERVER_SECRET_KEY: ${APPFLOWY_SERVER_SECRET_KEY}
      AF_SERVER_JWT_SECRET: ${APPFLOWY_SERVER_JWT_SECRET}
      AF_SERVER_DATABASE_URL: ${APPFLOWY_SERVER_DATABASE_URL}
      # AF_SERVER_LOG_LEVEL: ${APPFLOWY_SERVER_LOG_LEVEL} # Раскомментировать для изменения уровня логирования
    ports:
      - "127.0.0.1:${APPFLOWY_SERVER_PORT}:${APPFLOWY_SERVER_PORT}" # Открываем порт только для localhost, Caddy будет проксировать
    depends_on:
      db:
        condition: service_healthy # AppFlowy запускается только после готовности БД
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:${APPFLOWY_SERVER_PORT}/health"]
      interval: 30s
      timeout: 10s
      retries: 5

  caddy:
    image: caddy:2.7.6-alpine # Актуальная версия Caddy для 2026 года
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile # Ваш Caddyfile
      - ./caddy/data:/data # Для хранения сертификатов TLS
      - ./caddy/config:/config # Для хранения конфигурации Caddy
    environment:
      CADDY_DOMAIN: ${CADDY_DOMAIN} # Передаем домен из .env
    depends_on:
      appflowy:
        condition: service_healthy # Caddy запускается только после готовности AppFlowy

Сохраните файл.

4. Настройка Caddyfile

Теперь создадим файл конфигурации для Caddy, который будет проксировать запросы к AppFlowy Server и автоматически управлять SSL-сертификатами.


nano ./caddy/Caddyfile

Вставьте следующее содержимое. Убедитесь, что {$CADDY_DOMAIN} будет заменен на ваше доменное имя из файла .env.


{$CADDY_DOMAIN} {
    # Включить автоматическое HTTPS
    tls {
        dns cloudflare {env.CLOUDFLARE_API_TOKEN} # Если используете Cloudflare DNS, иначе удалите или используйте HTTP-01
    }

    # Проксировать все запросы к AppFlowy Server
    reverse_proxy appflowy:3060 {
        # Дополнительные настройки для проксирования, если требуются
        header_up Host {host}
        header_up X-Real-IP {remote_ip}
        header_up X-Forwarded-For {remote_ip}
        header_up X-Forwarded-Proto {scheme}
    }

    # Включить сжатие данных для ускорения загрузки
    encode gzip zstd

    # Логирование
    log {
        output file /var/log/caddy/access.log
    }
}

Важное примечание по TLS: В примере выше используется DNS-провайдер Cloudflare для выдачи сертификатов Let's Encrypt (dns cloudflare). Это удобно, если ваш DNS управляется через Cloudflare, и вам не нужно открывать порты 80/443 на Caddy для ACME HTTP-01 вызова (хотя мы их уже открыли). Если вы не используете Cloudflare или предпочитаете HTTP-01 проверку (которая работает по умолчанию, если 80/443 открыты), просто удалите строку dns cloudflare {env.CLOUDFLARE_API_TOKEN}. Caddy автоматически попытается использовать HTTP-01. Если вы используете DNS-провайдера, отличного от Cloudflare, Caddy поддерживает множество плагинов для различных DNS-провайдеров. Вам может потребоваться собрать Caddy с нужным плагином или использовать HTTP-01.

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


# ... (в конец вашего .env файла)
CLOUDFLARE_API_TOKEN=YOUR_CLOUDFLARE_API_TOKEN # Только если используете DNS-вызов с Cloudflare

Сохраните Caddyfile.

5. Запуск AppFlowy с Docker Compose

Теперь, когда все файлы конфигурации готовы, можно запустить все сервисы.


# Убедитесь, что вы находитесь в директории ~/appflowy-server
cd ~/appflowy-server

# Запуск всех сервисов в фоновом режиме
docker compose up -d

Это скачает необходимые Docker-образы (если их нет), создаст контейнеры, настроит сети и запустит AppFlowy Server, PostgreSQL и Caddy.

6. Проверка работоспособности

Дайте сервисам несколько минут для запуска и инициализации. Вы можете следить за логами:


# Просмотр логов всех сервисов
docker compose logs -f

Ищите сообщения, указывающие на успешный запуск AppFlowy Server и Caddy. Если Caddy выдает ошибки, проверьте правильность вашего Caddyfile и настройки DNS.

После того как логи покажут, что все сервисы запущены без ошибок, проверьте статус контейнеров:


docker compose ps

Все контейнеры должны иметь статус running (healthy).

Наконец, откройте ваш веб-браузер и перейдите по адресу вашего домена (например, https://appflowy.yourdomain.com). Вы должны увидеть страницу регистрации/входа AppFlowy. Зарегистрируйте первого пользователя, и вы получите доступ к вашему собственному AppFlowy Workspace.

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

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

Регулярное резервное копирование и обслуживание системы — залог долгосрочной стабильности и безопасности вашего AppFlowy Server. Не пренебрегайте этим этапом.

1. Что бэкапить

Для полного восстановления AppFlowy вам потребуется сохранить следующие данные:

  • База данных PostgreSQL: Содержит все ваши проекты, страницы, блоки, пользователей и их данные. Это самый критичный компонент.
  • Конфигурационные файлы AppFlowy: Хотя большая часть конфигурации хранится в .env и docker-compose.yml, могут быть другие важные файлы (хотя для AppFlowy Server это менее критично, чем для других приложений).
  • Данные Caddy: В первую очередь, это SSL-сертификаты, которые Caddy автоматически получает и хранит. Они находятся в директории ./caddy/data.
  • Файлы Docker Compose: Файлы docker-compose.yml и .env, которые определяют вашу инфраструктуру.

2. Простой скрипт автобэкапа

Создадим простой скрипт, который будет выполнять резервное копирование базы данных PostgreSQL и ключевых файлов, а затем архивировать их.


# Создайте директорию для скриптов
mkdir -p ~/scripts
nano ~/scripts/backup_appflowy.sh

Вставьте следующее содержимое:


#!/bin/bash

# --- Конфигурация ---
BACKUP_DIR="/var/backups/appflowy" # Директория для хранения бэкапов
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
APPFLOWY_PROJECT_DIR="/home/appflowyuser/appflowy-server" # Путь к вашей директории AppFlowy
DB_CONTAINER_NAME="appflowy-server_db_1" # Имя контейнера базы данных (может отличаться)
DB_NAME=$(grep POSTGRES_DB ${APPFLOWY_PROJECT_DIR}/.env | cut -d '=' -f2)
DB_USER=$(grep POSTGRES_USER ${APPFLOWY_PROJECT_DIR}/.env | cut -d '=' -f2)

# --- Создание директории для бэкапов, если ее нет ---
mkdir -p ${BACKUP_DIR}

echo "--- Начинаем резервное копирование AppFlowy ---"

# --- 1. Бэкап базы данных PostgreSQL ---
echo "Создание дампа PostgreSQL..."
docker exec ${DB_CONTAINER_NAME} pg_dump -U ${DB_USER} -d ${DB_NAME} > ${BACKUP_DIR}/appflowy_db_backup_${TIMESTAMP}.sql
if [ $? -eq 0 ]; then
    echo "Дамп PostgreSQL успешно создан: ${BACKUP_DIR}/appflowy_db_backup_${TIMESTAMP}.sql"
else
    echo "Ошибка при создании дампа PostgreSQL. Проверьте логи."
    exit 1
fi

# --- 2. Копирование файлов конфигурации и сертификатов ---
echo "Копирование файлов конфигурации и сертификатов..."
cp ${APPFLOWY_PROJECT_DIR}/docker-compose.yml ${BACKUP_DIR}/
cp ${APPFLOWY_PROJECT_DIR}/.env ${BACKUP_DIR}/
cp ${APPFLOWY_PROJECT_DIR}/caddy/Caddyfile ${BACKUP_DIR}/
# Копирование данных Caddy (сертификатов)
cp -r ${APPFLOWY_PROJECT_DIR}/caddy/data ${BACKUP_DIR}/caddy_data_${TIMESTAMP}
cp -r ${APPFLOWY_PROJECT_DIR}/caddy/config ${BACKUP_DIR}/caddy_config_${TIMESTAMP}

# --- 3. Архивирование всех файлов бэкапа ---
echo "Архивирование бэкапа..."
tar -czf ${BACKUP_DIR}/appflowy_backup_full_${TIMESTAMP}.tar.gz \
    -C ${BACKUP_DIR} \
    appflowy_db_backup_${TIMESTAMP}.sql \
    docker-compose.yml \
    .env \
    Caddyfile \
    caddy_data_${TIMESTAMP} \
    caddy_config_${TIMESTAMP}

if [ $? -eq 0 ]; then
    echo "Полный архив бэкапа создан: ${BACKUP_DIR}/appflowy_backup_full_${TIMESTAMP}.tar.gz"
    # Удаление временных файлов
    rm ${BACKUP_DIR}/appflowy_db_backup_${TIMESTAMP}.sql
    rm ${BACKUP_DIR}/docker-compose.yml
    rm ${BACKUP_DIR}/.env
    rm ${BACKUP_DIR}/Caddyfile
    rm -rf ${BACKUP_DIR}/caddy_data_${TIMESTAMP}
    rm -rf ${BACKUP_DIR}/caddy_config_${TIMESTAMP}
else
    echo "Ошибка при архивировании бэкапа."
    exit 1
fi

# --- 4. Удаление старых бэкапов (хранить последние 7 дней) ---
echo "Удаление старых бэкапов..."
find ${BACKUP_DIR} -type f -name "appflowy_backup_full_.tar.gz" -mtime +7 -delete
echo "--- Резервное копирование завершено ---"

Сделайте скрипт исполняемым:


chmod +x ~/scripts/backup_appflowy.sh

Проверьте имя контейнера PostgreSQL с помощью docker compose ps в директории ~/appflowy-server. Оно обычно выглядит как appflowy-server_db_1, но может отличаться. Обновите переменную DB_CONTAINER_NAME в скрипте, если необходимо.

3. Настройка Cron для автоматического запуска бэкапа

Чтобы скрипт запускался автоматически, добавим его в расписание Cron.


crontab -e

Выберите текстовый редактор, если будет предложено. Добавьте следующую строку в конец файла, чтобы скрипт запускался ежедневно в 03:00 ночи:


0 3    /home/appflowyuser/scripts/backup_appflowy.sh >> /var/log/appflowy_backup.log 2>&1

Сохраните и выйдите. Теперь бэкапы будут создаваться автоматически.

4. Куда складывать бэкапы

Хранение бэкапов на том же сервере, что и основной сервис, крайне рискованно. Если сервер выйдет из строя, вы потеряете и сервис, и бэкапы. Рекомендуемые варианты:

  • Внешнее S3-совместимое хранилище: Такие сервисы, как AWS S3, Backblaze B2, DigitalOcean Spaces или любые другие провайдеры объектного хранилища. Вы можете модифицировать скрипт бэкапа для автоматической загрузки архивов в S3 с использованием aws cli или rclone.
  • Отдельный VPS или NAS: Если у вас есть другой сервер или сетевое хранилище, вы можете настроить rsync или scp для передачи заархивированных бэкапов туда.

Пример использования rclone для S3 (требует установки rclone и его настройки):


# Внутри backup_appflowy.sh, после создания архива:
# rclone copy ${BACKUP_DIR}/appflowy_backup_full_${TIMESTAMP}.tar.gz remote_s3_bucket:appflowy-backups/

5. Обновления: Rolling vs. Maintenance Window

Регулярные обновления критически важны для безопасности и получения новых функций.

  • Обновление ОС: Рекомендуется выполнять раз в месяц. Это можно сделать вручную или настроить автоматические обновления безопасности.
    
    sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
    sudo reboot # Если требуется обновление ядра или других критических компонентов
                
  • Обновление Docker-образов (AppFlowy, PostgreSQL, Caddy):
    • Maintenance Window (окно обслуживания): Предпочтительный подход. Запланируйте время, когда AppFlowy не используется активно.
      
      cd ~/appflowy-server
      docker compose pull # Скачать новые версии образов
      docker compose up -d # Пересоздать контейнеры с новыми образами
                          
      Это обеспечит минимальное время простоя и позволит проверить работоспособность после обновления.
    • Rolling Updates (для более сложных систем): Не применимо напрямую к нашему текущему Docker Compose файлу без дополнительных инструментов оркестрации (например, Kubernetes). Для одного сервера всегда лучше использовать окно обслуживания.

Перед каждым крупным обновлением всегда делайте полный бэкап!

Troubleshooting + FAQ

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

Не удается подключиться по SSH после настройки брандмауэра или SSH-ключей. Что делать?

Ошибка: SSH-соединение отклонено, или таймаут. Что проверить:

  1. Убедитесь, что вы разрешили порт SSH (по умолчанию 22) в UFW с помощью sudo ufw allow OpenSSH перед включением брандмауэра.
  2. Если вы отключили парольную аутентификацию и вход для root, убедитесь, что ваш публичный SSH-ключ корректно скопирован на сервер для вашего пользователя (~/.ssh/authorized_keys) и имеет правильные разрешения (chmod 600 ~/.ssh/authorized_keys).
  3. Проверьте, что сервис SSH (sshd) запущен: sudo systemctl status sshd.
Как фиксить: Если вы потеряли доступ, возможно, придется использовать консоль восстановления вашего VPS-провайдера для входа в систему и исправления настроек SSH или UFW. Будьте крайне внимательны при изменении настроек SSH и UFW.

AppFlowy недоступен по доменному имени, но контейнеры запущены.

Ошибка: Веб-браузер выдает ошибку "Сайт недоступен" или "Соединение отклонено". Что проверить:

  1. DNS-записи: Убедитесь, что ваша A-запись для домена (например, appflowy.yourdomain.com) корректно указывает на IP-адрес вашего VPS. Используйте dig appflowy.yourdomain.com (на локальном ПК).
  2. Брандмауэр VPS: Проверьте, что порты 80 и 443 разрешены в UFW: sudo ufw status.
  3. Caddy-сервис: Убедитесь, что Caddy запущен и не имеет ошибок: sudo systemctl status caddy и docker compose logs caddy. Проверьте Caddyfile на синтаксические ошибки.
  4. Сертификаты TLS: Caddy должен автоматически получить сертификаты. Если есть ошибки, проверьте логи Caddy. Убедитесь, что порты 80 и 443 доступны из интернета для HTTP-01 проверки, или что DNS-плагин Caddy настроен правильно, если вы его используете.
  5. Доступность AppFlowy внутри Docker: Убедитесь, что AppFlowy-контейнер здоров: docker compose ps. Проверьте его логи: docker compose logs appflowy.
Как фиксить: Исправьте DNS, откройте порты в UFW, исправьте Caddyfile, или перезапустите Caddy/Docker Compose.

Какой VPS-конфиг минимально подойдёт?

Для AppFlowy Server на Docker с PostgreSQL минимально рекомендуются 2 ядра CPU, 4 ГБ RAM и 80 ГБ NVMe SSD. Этого будет достаточно для личного использования или небольшой команды до 5 человек. Однако, для более комфортной работы и возможности роста, лучше ориентироваться на 4 ядра CPU, 8 ГБ RAM и 160 ГБ NVMe SSD. Это обеспечит лучшую производительность базы данных и общую отзывчивость системы.

Что выбрать — VPS или dedicated для этой задачи?

Для развертывания AppFlowy для личных нужд или небольшой/средней команды (до 50 пользователей) VPS является оптимальным выбором. Он предлагает отличный баланс между стоимостью, гибкостью и производительностью. Dedicated сервер рекомендуется только для очень крупных команд, корпоративных сред с высокими требованиями к производительности и безопасности, или в случаях, когда требуется специфическая аппаратная конфигурация. Для большинства пользователей AppFlowy VPS будет более чем достаточно.

PostgreSQL контейнер не запускается или unhealthy.

Ошибка: docker compose ps показывает unhealthy или exited для контейнера db. Что проверить:

  1. Логи контейнера: docker compose logs db. Ищите ошибки, связанные с запуском PostgreSQL, правами доступа к данным, или конфликтами портов.
  2. Права доступа к директории данных: Убедитесь, что директория ./data/postgresql имеет правильные права доступа для пользователя Docker. По умолчанию Docker управляет этим, но если вы вручную меняли права, могут возникнуть проблемы.
  3. Пароль: Проверьте, что POSTGRES_PASSWORD в .env соответствует требованиям PostgreSQL и не содержит специальных символов, которые могут быть неправильно интерпретированы.
Как фиксить: Исправьте ошибки в логах. Иногда помогает удалить тома Docker (если нет важных данных) и запустить заново: docker compose down -v (будьте осторожны, это удалит данные БД!) и затем docker compose up -d.

Как обновить AppFlowy Server до новой версии?

Шаги:

  1. Сделайте бэкап: Всегда выполняйте полный бэкап перед обновлением.
  2. Остановите сервисы: cd ~/appflowy-server && docker compose down.
  3. Измените версию образа: Отредактируйте docker-compose.yml и обновите тег образа AppFlowy (например, с 0.4.0 на 0.4.1).
  4. Запустите сервисы: docker compose up -d. Docker скачает новый образ и пересоздаст контейнер AppFlowy.
  5. Проверьте логи: Убедитесь, что все запустилось корректно.
Аналогичный процесс применяется и для обновления образа PostgreSQL, но с еще большей осторожностью и обязательным бэкапом, так как обновление БД может быть более сложным.

Выводы и следующие шаги

Схема: Выводы и следующие шаги
Схема: Выводы и следующие шаги

Поздравляем! Вы успешно развернули AppFlowy Server на своем VPS, создав мощную и безопасную платформу для управления знаниями и проектами, которая находится под вашим полным контролем. Вы освоили ключевые аспекты работы с Docker Compose, PostgreSQL и автоматическим HTTPS через Caddy, получив ценный опыт в самостоятельном администрировании серверов.

Теперь, когда ваша система работает, вот несколько следующих шагов для дальнейшего развития и оптимизации:

  • Мониторинг и логирование: Настройте систему мониторинга (например, Prometheus + Grafana) для отслеживания производительности VPS и контейнеров. Централизованное логирование (например, ELK Stack или Loki) поможет быстрее выявлять и устранять проблемы.
  • Масштабирование хранилища: Если вы планируете хранить очень большие объемы файлов, рассмотрите возможность монтирования сетевого хранилища (NFS, Ceph) или использования объектного хранилища для файлов, чтобы не перегружать основной диск VPS.
  • Интеграции и кастомизация: Исследуйте возможности AppFlowy для интеграции с другими сервисами или для расширения функциональности через плагины, если они станут доступны.

Был ли этот гайд полезен?

Ваш отзыв помогает нам улучшать гайды.

Поделиться записью:

Отправьте гайд тому, кому он может пригодиться.

Telegram VKVK WhatsApp Facebook LinkedIn XX

развёртывание appflowy на vps: свой аналог notion с docker и postgresql
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.