Установка и настройка Appwrite на VPS: развёртывание Self-hosted альтернативы Firebase
TL;DR
В данном руководстве мы рассматриваем полный цикл развёртывания Appwrite — мощной open-source платформы Backend-as-a-Service (BaaS) — на собственном виртуальном сервере. Мы пройдем путь от выбора архитектуры и подготовки ОС до тонкой настройки безопасности, автоматизации бэкапов и оптимизации производительности для условий эксплуатации в 2026 году.
- Цель: Полная независимость от проприетарных облачных решений (Firebase, AWS Amplify).
- Стек: Docker, Docker Compose, Ubuntu 24.04/26.04 LTS, Let's Encrypt.
- Результат: Готовый к продакшену бэкенд с базой данных, аутентификацией, хранилищем файлов и Serverless-функциями.
- Время настройки: 30–45 минут при наличии готового сервера.
- Сложность: Средняя (требуются базовые навыки работы в терминале Linux).
1. Что мы настраиваем и зачем
Схема: 1. Что мы настраиваем и зачем
Appwrite — это комплексная платформа, которая абстрагирует сложность разработки бэкенда, предоставляя разработчикам набор API для решения типовых задач. В 2026 году, когда стоимость облачных ресурсов в экосистемах Google и AWS продолжает расти, а требования к суверенитету данных становятся жестче, self-hosted решения выходят на первый план.
Основная проблема Firebase и аналогичных SaaS-решений заключается в "vendor lock-in" (привязке к поставщику). Если ваше приложение внезапно станет популярным, счета за базу данных NoSQL могут вырасти экспоненциально. Перенос данных из Firebase — это всегда сложный и болезненный процесс. Appwrite решает эту проблему, предлагая аналогичный функционал, но на вашем собственном железе.
Основные возможности Appwrite:
- Database: Документоориентированная база данных с поддержкой сложных запросов, фильтрации и управления правами доступа на уровне документа.
- Authentication: Поддержка более 30 OAuth-провайдеров (Google, GitHub, Apple и др.), вход по магическим ссылкам, телефону и классическим парам логин/пароль.
- Storage: Управление загрузкой файлов с автоматическим сжатием, изменением размера изображений и антивирусным сканированием.
- Functions: Возможность запускать кастомный код на различных языках (Node.js, Python, PHP, Ruby, Go, Rust) в ответ на события в системе или по расписанию.
- Realtime: Мгновенная синхронизация данных через WebSockets.
Развёртывание Appwrite на VPS дает вам полный контроль над ресурсами. Вы сами решаете, сколько оперативной памяти выделить под Redis для кэширования или какой объем дискового пространства отдать под медиа-файлы пользователей.
2. Какой VPS-конфиг нужен под эту задачу
Схема: 2. Какой VPS-конфиг нужен под эту задачу
Appwrite — это микросервисная архитектура, упакованная в Docker-контейнеры. В стандартной поставке запускается около 20–25 контейнеров (MariaDB, Redis, InfluxDB, Telegraf, Traefik, Worker-ы и сам API). Это требует определенных ресурсов для стабильной работы, особенно если вы планируете использовать Serverless-функции.
| Характеристика |
Минимум (Dev/Test) |
Рекомендуется (Production) |
Enterprise / High Load |
| CPU |
1 Core (x86_64 / ARM) |
2-4 Cores (High frequency) |
8+ Cores |
| RAM |
2 GB |
4-8 GB |
16 GB+ |
| Disk |
20 GB SSD |
50-100 GB NVMe |
500 GB+ RAID 10 |
| OS |
Ubuntu 22.04+ |
Ubuntu 24.04 LTS |
Debian 12 / RHEL 9 |
Для небольших проектов, стартапов на стадии MVP или личных пет-проектов идеально подойдет подходящий VPS с 4 ГБ оперативной памяти. Appwrite потребляет около 1.5–2 ГБ RAM в состоянии покоя, остальное необходимо для кэширования базы данных и работы Docker-демона.
Когда стоит выбрать Dedicated сервер? Если ваше приложение предполагает интенсивную работу с изображениями (обработка тысяч фото в час) или если база данных разрастается до сотен гигабайт. В остальных случаях современный VPS на NVMe дисках обеспечит достаточную производительность за счет высокой скорости ввода-вывода (IOPS).
Локация сервера: Выбирайте локацию, максимально близкую к вашей целевой аудитории. Для Appwrite это критично из-за использования Realtime API (WebSockets) — чем ниже задержка (RTT), тем "отзывчивее" будет интерфейс вашего приложения.
3. Подготовка сервера
Схема: 3. Подготовка сервера
После покупки сервера и получения доступа по SSH, первым делом необходимо обеспечить безопасность и актуальность системы. Мы будем использовать Ubuntu 24.04 LTS как наиболее сбалансированный дистрибутив для Docker-сред.
Обновление системы и создание пользователя
Не рекомендуется работать под пользователем root. Создадим отдельного пользователя с привилегиями sudo.
# Обновляем индексы пакетов и систему
apt update && apt upgrade -y
# Создаем пользователя (замените 'deploy' на ваше имя)
adduser deploy
# Добавляем пользователя в группу sudo
usermod -aG sudo deploy
# Переключаемся на нового пользователя
su - deploy
Настройка брандмауэра (UFW)
Appwrite требует открытых портов 80 (HTTP) и 443 (HTTPS) для работы веб-интерфейса и API, а также порт 22 для SSH.
# Разрешаем SSH (важно сделать это первым!)
sudo ufw allow ssh
# Разрешаем веб-трафик
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Включаем брандмауэр
sudo ufw enable
Установка базовых утилит
Нам понадобятся инструменты для диагностики и работы с сетью.
sudo apt install -y curl git vim htop software-properties-common apt-transport-https ca-certificates
4. Установка Docker и Docker Compose
Схема: 4. Установка Docker и Docker Compose
Appwrite полностью полагается на Docker. В 2026 году мы используем Docker Engine и плагин Docker Compose V2 (команда docker compose без дефиса).
Добавление официального репозитория Docker
# Добавляем GPG ключ Docker
sudo install -m 0755 -d /etc/apt/keyrings
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
# Настраиваем репозиторий
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
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Проверка установки и настройка прав
Чтобы запускать Docker без sudo, добавим нашего пользователя в соответствующую группу:
sudo usermod -aG docker ${USER}
# Примените изменения групп без перезагрузки
newgrp docker
# Проверяем версию
docker compose version
5. Установка Appwrite: пошаговый процесс
Схема: 5. Установка Appwrite: пошаговый процесс
Разработчики Appwrite предоставляют удобный скрипт-установщик, который в интерактивном режиме генерирует файл docker-compose.yml и .env переменные.
Запуск инсталлятора
docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:latest
Ответы на вопросы инсталлятора:
- Choose your server hostname: Введите ваш домен (например,
api.myapp.com) или IP-адрес сервера. Лучше сразу использовать домен для автоматической генерации SSL.
- Choose your HTTP port: Оставьте
80.
- Choose your HTTPS port: Оставьте
443.
- Choose your Secret API Key: Нажмите Enter, чтобы сгенерировать случайный ключ (обязательно сохраните его позже из файла .env).
- Choose your Appwrite Root Domain: Снова ваш домен.
- Choose your DNS Records: Здесь можно оставить значение по умолчанию.
После завершения работы скрипта в текущей директории появится папка appwrite. Перейдите в неё и запустите контейнеры:
cd appwrite
docker compose up -d
Процесс первого запуска может занять 2–5 минут, так как Docker должен скачать все необходимые образы (общий объем около 1.5 ГБ).
Проверьте статус контейнеров:
docker compose ps
Все контейнеры должны иметь статус Up (healthy).
6. Тонкая настройка: переменные окружения и SMTP
Схема: 6. Тонкая настройка: переменные окружения и SMTP
По умолчанию Appwrite работает, но для полноценного использования (например, отправки писем для подтверждения регистрации) нужно отредактировать файл .env.
Настройка SMTP (Почта)
Без этого ваши пользователи не смогут восстанавливать пароли. Откройте файл: nano .env и найдите секцию почты. Пример настройки для использования внешнего сервиса (например, SendGrid, Mailgun или собственного SMTP):
_APP_SMTP_HOST=smtp.sendgrid.net
_APP_SMTP_PORT=587
_APP_SMTP_SECURE=tls
_APP_SMTP_USERNAME=apikey
_APP_SMTP_PASSWORD=your_super_secret_key
[email protected]
_APP_EMAIL_NAME=My App Support
Настройка лимитов загрузки
Если ваше приложение работает с тяжелым контентом, увеличьте лимиты:
_APP_STORAGE_LIMIT=52428800 # Лимит в байтах (здесь 50MB)
_APP_STORAGE_PREVIEW_LIMIT=20971520 # Лимит для превью
Безопасность
Убедитесь, что переменная _APP_ENV установлена в значение production. Это отключит детальные сообщения об ошибках, которые могут помочь злоумышленникам.
_APP_ENV=production
После внесения изменений в .env, необходимо перезапустить контейнеры:
docker compose up -d
7. Настройка домена и SSL/TLS
Схема: 7. Настройка домена и SSL/TLS
Appwrite поставляется с встроенным прокси-сервером Traefik, который умеет автоматически получать сертификаты Let's Encrypt. Однако для этого должны быть выполнены два условия:
- Ваш домен (A-запись) должен указывать на IP-адрес вашего VPS.
- Порты 80 и 443 должны быть открыты и не заняты другими процессами (например, Nginx или Apache).
Если вы хотите использовать собственный Nginx в качестве Reverse Proxy (например, если на сервере уже живут другие сайты), вам нужно изменить порты Appwrite в .env:
_APP_OPTIONS_FORCE_HTTPS=disabled # Если SSL терминируется на внешнем Nginx
_APP_HTTP_PORT=8080
_APP_HTTPS_PORT=8443
Затем в конфиге Nginx пробросьте трафик:
server {
listen 80;
server_name api.myapp.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name api.myapp.com;
ssl_certificate /etc/letsencrypt/live/api.myapp.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.myapp.com/privkey.pem;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
8. Бэкапы и обслуживание системы
Схема: 8. Бэкапы и обслуживание системы
Self-hosted решение накладывает на вас ответственность за сохранность данных. В Appwrite нужно бэкапить три основные вещи:
- Файл
.env (там ключи шифрования, без них данные в БД станут бесполезны).
- Дамп базы данных MariaDB.
- Содержимое папки
storage (загруженные файлы).
Простой скрипт бэкапа
Создайте файл backup.sh:
#!/bin/bash
BACKUP_DIR="/home/deploy/backups/$(date +%Y-%m-%d)"
mkdir -p $BACKUP_DIR
# Бэкап конфига
cp /home/deploy/appwrite/.env $BACKUP_DIR/
# Бэкап базы данных (через docker exec)
docker exec appwrite-mariadb mysqldump -u root --password=$(grep _APP_DB_ROOT_PASS /home/deploy/appwrite/.env | cut -d'=' -f2) appwrite > $BACKUP_DIR/db_dump.sql
# Бэкап файлов (архивация)
tar -czf $BACKUP_DIR/storage.tar.gz /home/deploy/appwrite/storage
# Удаление бэкапов старше 7 дней
find /home/deploy/backups/ -mtime +7 -exec rm -rf {} \;
Добавьте скрипт в crontab для ежедневного запуска в 3 часа ночи:
0 3 /bin/bash /home/deploy/backup.sh
Обновление Appwrite
Обновления выходят часто. Чтобы обновиться, выполните:
# Зайдите в папку
cd ~/appwrite
# Сделайте бэкап! (см. выше)
# Запустите установщик той же версии или latest
docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:latest
Скрипт увидит существующую установку и предложит обновить образы, сохранив ваши данные.
9. Troubleshooting + FAQ
Контейнеры постоянно перезагружаются (Restarting)
Чаще всего это происходит из-за нехватки оперативной памяти. Appwrite требует минимум 2 ГБ, но на практике при 2 ГБ MariaDB может "вылетать" по OOM (Out of Memory). Убедитесь, что у вас настроен Swap-файл, если памяти впритык.
# Создание swap на 2ГБ
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Ошибка "Invalid Custom Domain"
Проверьте, что в .env переменная _APP_DOMAIN совпадает с тем, что вы вводите в браузере. Также убедитесь, что DNS записи обновились (может занять до 24 часов, используйте dig yourdomain.com для проверки).
Как сбросить пароль администратора?
В Appwrite первый зарегистрированный пользователь автоматически становится администратором. Если вы потеряли доступ, проще всего создать нового пользователя через API или консоль и вручную изменить его роль в базе данных MariaDB, но официальный путь — использование CLI Appwrite.
Какой VPS-конфиг минимально подойдёт?
Для разработки достаточно 1 vCPU и 2 ГБ RAM. Однако для стабильной работы панели управления и хотя бы нескольких параллельных запросов к API, мы настоятельно рекомендуем 2 vCPU и 4 ГБ RAM. Это обеспечит плавную работу Docker-контейнеров и предотвратит задержки при записи в базу данных.
Что выбрать — VPS или Dedicated для этой задачи?
Для 95% приложений на стадии роста достаточно VPS. Виртуализация позволяет легко масштабировать ресурсы (добавить RAM или CPU) без переезда. Dedicated сервер стоит выбирать только если вам нужно хранить терабайты данных локально или если у вас очень специфические требования к безопасности (изоляция на уровне железа).
Не приходят письма для подтверждения почты
Проверьте логи контейнера worker-mails:
docker compose logs appwrite-worker-mails
Частая проблема — блокировка порта 25 или 587 провайдером VPS. Убедитесь, что исходящий почтовый трафик разрешен в панели управления провайдера.
10. Выводы и следующие шаги
Мы успешно развернули self-hosted альтернативу Firebase на собственном сервере. Теперь у вас есть полный контроль над данными, отсутствие скрытых платежей за количество запросов и мощный инструмент для разработки мобильных и веб-приложений.
Что делать дальше:
- Настройте мониторинг: Подключите внешнюю систему мониторинга (например, UptimeRobot или Grafana), чтобы знать, если сервер упадет.
- Оптимизируйте безопасность: Настройте 2FA в панели управления Appwrite и ограничьте доступ к портам базы данных.
- Изучите SDK: Начните интеграцию с вашим фронтендом, используя официальные SDK для Flutter, React, Vue или Swift.
Помните, что обслуживание собственного бэкенда требует регулярного внимания к обновлениям безопасности ОС и самого Appwrite. Раз в месяц проверяйте наличие новых релизов и делайте контрольные восстановления из бэкапов, чтобы быть уверенными в их работоспособности.