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

Отримати VPS arrow_forward
eco Початковий Туторіал

Розгортання AppFlowy

calendar_month Aug 08, 2026 schedule 22 хв. читання visibility 47 переглядів
Развёртывание 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
POSTGRES_DB=appflowy_db
POSTGRES_USER=appflowy_user
POSTGRES_PASSWORD=YOUR_DB_PASSWORD # Згенеруйте надійний пароль

# Конфігурація AppFlowy Server
APPFLOWY_SERVER_PORT=3060 # Порт за замовчуванням для AppFlowy server
APPFLOWY_SERVER_HOST=0.0.0.0 # Слухати на всіх інтерфейсах
APPFLOWY_SERVER_SECRET_KEY=YOUR_APPFLOWY_SECRET_KEY # Згенеруйте надійний, випадковий ключ
APPFLOWY_SERVER_JWT_SECRET=YOUR_APPFLOWY_JWT_SECRET # Згенеруйте надійний, випадковий ключ для JWT
APPFLOWY_SERVER_DATABASE_URL=postgresql://appflowy_user:YOUR_DB_PASSWORD@db:5432/appflowy_db

# Необов'язково: Встановіть рівень логування для AppFlowy server (наприклад, info, debug, error)
# APPFLOWY_SERVER_LOG_LEVEL=info

# Конфігурація Caddy (для зовнішнього доступу)
CADDY_DOMAIN=appflowy.yourdomain.com # Замініть на ваш фактичний домен

Збережіть файл (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). Для одного сервера завжди краще використовувати вікно обслуговування.

Перед кожним великим оновленням завжди робіть повну резервну копію!

Вирішення проблем + 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 для інтеграції з іншими сервісами або для розширення функціональності через плагіни, якщо вони стануть доступними.

Чи був цей гайд корисним?

Ваш відгук допомагає нам покращувати гайди.

Share this post:

Надішліть гайд тому, кому він може стати в пригоді.

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.