Развёртывание 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-конфига критически важен для стабильной и быстрой работы 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). Для одного сервера всегда лучше использовать окно обслуживания.
- Maintenance Window (окно обслуживания): Предпочтительный подход. Запланируйте время, когда AppFlowy не используется активно.
Перед каждым крупным обновлением всегда делайте полный бэкап!
Troubleshooting + FAQ
В этом разделе собраны ответы на часто задаваемые вопросы и решения типичных проблем, которые могут возникнуть при развертывании и эксплуатации AppFlowy на VPS.
Не удается подключиться по SSH после настройки брандмауэра или SSH-ключей. Что делать?
Ошибка: SSH-соединение отклонено, или таймаут. Что проверить:
- Убедитесь, что вы разрешили порт SSH (по умолчанию 22) в UFW с помощью
sudo ufw allow OpenSSHперед включением брандмауэра. - Если вы отключили парольную аутентификацию и вход для
root, убедитесь, что ваш публичный SSH-ключ корректно скопирован на сервер для вашего пользователя (~/.ssh/authorized_keys) и имеет правильные разрешения (chmod 600 ~/.ssh/authorized_keys). - Проверьте, что сервис SSH (
sshd) запущен:sudo systemctl status sshd.
AppFlowy недоступен по доменному имени, но контейнеры запущены.
Ошибка: Веб-браузер выдает ошибку "Сайт недоступен" или "Соединение отклонено". Что проверить:
- DNS-записи: Убедитесь, что ваша A-запись для домена (например,
appflowy.yourdomain.com) корректно указывает на IP-адрес вашего VPS. Используйтеdig appflowy.yourdomain.com(на локальном ПК). - Брандмауэр VPS: Проверьте, что порты 80 и 443 разрешены в UFW:
sudo ufw status. - Caddy-сервис: Убедитесь, что Caddy запущен и не имеет ошибок:
sudo systemctl status caddyиdocker compose logs caddy. ПроверьтеCaddyfileна синтаксические ошибки. - Сертификаты TLS: Caddy должен автоматически получить сертификаты. Если есть ошибки, проверьте логи Caddy. Убедитесь, что порты 80 и 443 доступны из интернета для HTTP-01 проверки, или что DNS-плагин Caddy настроен правильно, если вы его используете.
- Доступность AppFlowy внутри Docker: Убедитесь, что AppFlowy-контейнер здоров:
docker compose ps. Проверьте его логи:docker compose logs appflowy.
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.
Что проверить:
- Логи контейнера:
docker compose logs db. Ищите ошибки, связанные с запуском PostgreSQL, правами доступа к данным, или конфликтами портов. - Права доступа к директории данных: Убедитесь, что директория
./data/postgresqlимеет правильные права доступа для пользователя Docker. По умолчанию Docker управляет этим, но если вы вручную меняли права, могут возникнуть проблемы. - Пароль: Проверьте, что
POSTGRES_PASSWORDв.envсоответствует требованиям PostgreSQL и не содержит специальных символов, которые могут быть неправильно интерпретированы.
docker compose down -v (будьте осторожны, это удалит данные БД!) и затем docker compose up -d.
Как обновить AppFlowy Server до новой версии?
Шаги:
- Сделайте бэкап: Всегда выполняйте полный бэкап перед обновлением.
- Остановите сервисы:
cd ~/appflowy-server && docker compose down. - Измените версию образа: Отредактируйте
docker-compose.ymlи обновите тег образа AppFlowy (например, с0.4.0на0.4.1). - Запустите сервисы:
docker compose up -d. Docker скачает новый образ и пересоздаст контейнер AppFlowy. - Проверьте логи: Убедитесь, что все запустилось корректно.
Выводы и следующие шаги
Поздравляем! Вы успешно развернули AppFlowy Server на своем VPS, создав мощную и безопасную платформу для управления знаниями и проектами, которая находится под вашим полным контролем. Вы освоили ключевые аспекты работы с Docker Compose, PostgreSQL и автоматическим HTTPS через Caddy, получив ценный опыт в самостоятельном администрировании серверов.
Теперь, когда ваша система работает, вот несколько следующих шагов для дальнейшего развития и оптимизации:
- Мониторинг и логирование: Настройте систему мониторинга (например, Prometheus + Grafana) для отслеживания производительности VPS и контейнеров. Централизованное логирование (например, ELK Stack или Loki) поможет быстрее выявлять и устранять проблемы.
- Масштабирование хранилища: Если вы планируете хранить очень большие объемы файлов, рассмотрите возможность монтирования сетевого хранилища (NFS, Ceph) или использования объектного хранилища для файлов, чтобы не перегружать основной диск VPS.
- Интеграции и кастомизация: Исследуйте возможности AppFlowy для интеграции с другими сервисами или для расширения функциональности через плагины, если они станут доступны.