# Как вести семейный бюджет на своём сервере: установка Actual Budget и синхронизация с Android

> AI Release · @ai_release1 · https://ai-release.org/guides/kak-vesti-semeynyy-byudzhet-na-svoem-servere-ustanovka.html

Семейный бюджет в чужом облаке — это чужие серверы, чужие правила и подписка, которую однажды поднимут в цене. Этот гайд решает другую задачу: поставить Actual Budget — открытое приложение для учёта личных и семейных финансов — на собственный сервер и синхронизировать его с Android-телефоном, чтобы транзакции, счета и категории лежали у вас, а не у вендора. Подойдёт для любого Linux-сервера с Docker (домашний мини-ПК, NAS, VPS или просто постоянно включённый компьютер), веб-интерфейса в браузере на ПК и приложения Actual на Android. Никаких особых версий ОС не требуется — нужен лишь Docker и открытый порт.

## Требования и подготовка
![Иллюстрация к разделу «Требования и подготовка»](https://ai-release.org/guides/img/kak-vesti-semeynyy-byudzhet-na-svoem-servere-ustanovka-ru-1.jpg)

- Сервер или постоянно включённый компьютер с Linux (подойдёт Debian/Ubuntu). Важно: он должен быть включён в момент синхронизации.
- Docker — упаковщик приложений: программа собирается в «контейнер» и запускается одной командой. Плюс плагин Docker Compose для запуска по файлу-описанию.
- Свободный каталог на диске под данные бюджета. Тома переживают перезапуск контейнера, поэтому данные не потеряются.
- Свободный порт: по умолчанию сервер Actual слушает 5006.
- Локальный IP сервера (для дома) или доменное имя (для доступа извне).
- Браузер на ПК для первичной настройки.
- Android-приложение Actual из официального источника (магазин приложений или репозиторий проекта) на телефоне с Android.
- Менеджер паролей: пароль шифрования синхронизации нужно сохранить сразу.
- По желанию: обратный прокси (Caddy или Nginx) — посредник, который принимает HTTPS и передаёт запрос контейнеру.

**Пример:** чек-лист перед первым запуском.

- [ ] Сервер включён и не уходит в сон
- [ ] `docker --version` отвечает без ошибок
- [ ] Порт 5006 свободен (или заранее выбран другой)
- [ ] Каталог `./actual-data` создан, есть права на запись
- [ ] Пароль шифрования сохранён в менеджере паролей
- [ ] Домен указывает на сервер, HTTPS работает
- [ ] Настроена регулярная копия каталога с данными

## Пошаговая инструкция
![Иллюстрация к разделу «Пошаговая инструкция»](https://ai-release.org/guides/img/kak-vesti-semeynyy-byudzhet-na-svoem-servere-ustanovka-ru-2.jpg)

1. Установите Docker и Compose. На Debian/Ubuntu это делается пакетами из репозитория:

```bash
sudo apt update
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
docker --version
```

Ожидаемый результат: вывод вида `Docker version 27.x.x, build ...` — номер версии у вас будет свой. Почему это работает: пакет ставит движок контейнеров и включает службу, чтобы контейнеры поднимались сами после перезагрузки сервера.

2. Создайте каталог и файл описания запуска:

```bash
mkdir -p ~/actual && cd ~/actual
nano docker-compose.yml
```

Вставьте в файл:

```yaml
services:
  actual:
    image: actualbudget/actual-server:latest
    container_name: actual
    restart: unless-stopped
    ports:
      - "5006:5006"
    volumes:
      - ./actual-data:/data
```

Ожидаемый результат: файл `docker-compose.yml` сохранён в `~/actual`. Разбор: `image` — готовый образ сервера Actual; `ports` — какой порт сервера виден снаружи; `volumes` — куда сохраняются данные бюджета; `restart: unless-stopped` — сервер сам поднимется после сбоя или перезагрузки.

3. Запустите контейнер и посмотрите логи:

```bash
docker compose up -d
docker compose logs -f actual
```

Ожидаемый результат: в логах строка про прослушивание порта (например, `Listening on 0.0.0.0:5006`), а `docker compose ps` показывает статус `running`. Выход из логов — `Ctrl+C`, контейнер при этом продолжает работать. Если строки нет, а есть ошибка — она будет видна тут же, читайте её текст.

4. Проверьте веб-интерфейс с ПК в той же сети. Узнать IP сервера можно командой `ip a`, дальше откройте `http://IP-сервера:5006`.

Ожидаемый результат: страница Actual с предложением создать файл бюджета (budget file — файл, в котором лежат счета, транзакции и категории). Если страница не открывается — проблема с портом или фаерволом, смотрите раздел ниже.

5. Создайте бюджет и включите шифрование синхронизации. В настройках задайте пароль шифрования и сразу сохраните его в менеджере паролей.

Ожидаемый результат: бюджет создан, в настройках отображается, что синхронизация зашифрована. Почему это важно: сервер хранит только зашифрованные данные, поэтому даже доступ к серверу не даёт прочитать ваш бюджет без пароля.

6. Выставьте сервер наружу через домен и HTTPS. Пример минимального конфига Caddy:

```
budget.example.com {
    reverse_proxy 127.0.0.1:5006
}
```

Ожидаемый результат: `https://budget.example.com` открывает тот же интерфейс, что и локальный адрес. Почему так: обратный прокси принимает защищённое соединение и передаёт запрос контейнеру — мобильное приложение за пределами домашней сети подключается к вашему серверу именно так.

7. Подключите Android. Установите приложение Actual, укажите URL сервера (например, `https://budget.example.com`), логин и пароль, затем пароль шифрования. Дождитесь первой синхронизации.

Ожидаемый результат: в приложении появился тот же бюджет, счета и категории, что и на ПК. Если приложение пишет об ошибке соединения — проверьте домен и HTTPS (раздел ниже).

8. Проверьте синхронизацию в обе стороны. Добавьте тестовую транзакцию в приложении, дождитесь окончания синхронизации и обновите веб-интерфейс на ПК.

Ожидаемый результат: транзакция появилась в веб-версии. То же самое в обратную сторону: правка на ПК видна на телефоне после синхронизации.

## Возможные проблемы и решения
![Иллюстрация к разделу «Возможные проблемы и решения»](https://ai-release.org/guides/img/kak-vesti-semeynyy-byudzhet-na-svoem-servere-ustanovka-ru-3.jpg)

- Симптом: в Android-приложении ошибка вида «не удалось подключиться к серверу». Решение по шагам: 1) откройте адрес сервера в браузере телефона по мобильному интернету — если не открывается, домен указывает не туда; 2) проверьте, что используется `https://`, а не `http://`; 3) убедитесь, что контейнер запущен командой `docker compose ps`; 4) проверьте, что обратный прокси передаёт запрос на порт 5006.
- Симптом: контейнер не поднимается, в логах ошибка вида «address already in use» или «bind failed». Причина — порт 5006 занят другой программой. Решение: откройте `docker-compose.yml` и замените маппинг на `"5007:5006"`, затем выполните `docker compose up -d` и открывайте сервер по адресу `http://IP:5007`.
- Симптом: синхронизация не проходит, приложение просит пароль шифрования, а вы его не помните. Решение: сначала поищите пароль в менеджере паролей и на других устройствах, где бюджет уже открыт. Если пароль утерян безвозвратно, придётся сбросить шифрование на сервере и заново залить данные с устройства, где бюджет ещё читается; актуальную процедуру смотрите в документации проекта. Если такого устройства нет — зашифрованные данные восстановить нельзя.
- Симптом: правки «пропадают» или транзакции дублируются при одновременной работе двух человек. Причина — оба устройства синхронизировались почти одновременно. Решение: договоритесь не редактировать один счёт в одну минуту, а после конфликта проверьте список транзакций и удалите дубликат вручную.

## FAQ

**Нужен ли домен и HTTPS, если бюджет нужен только дома?**
Нет. Внутри домашней сети достаточно адреса `http://IP-сервера:5006`. Домен и HTTPS нужны, если вы хотите синхронизировать бюджет с телефона через мобильный интернет или из другого места.

**Что будет, если сервер выключится или сломается?**
Синхронизация просто приостановится, ничего не потеряется мгновенно: данные лежат в томе `./actual-data` рядом с файлом `docker-compose.yml`. Настройте регулярное копирование этого каталога — тогда восстановление сведётся к возврату папки на место и повторному `docker compose up -d`.

**Можно ли вести один бюджет на несколько человек?**
Да. Несколько устройств подключаются к одному серверу и открывают один файл бюджета, а изменения синхронизируются между ними. Удобный семейный сценарий: один сервер, телефон одного взрослого, телефон второго и браузер на общем ноутбуке.

**Можно ли поднять сервер прямо на Android-телефоне, без отдельного ПК?**
Технически — да, для этого есть окружение Linux на телефоне без root. Пошаговые варианты разобраны в гайде [Как запустить Linux на Android без root: Termux, PRoot и ИИ-инструменты](https://ai-release.org/guides/kak-zapustit-linux-na-android-bez-root-termux-proot-i-i.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide). Практический минус: сервер должен быть включён постоянно, поэтому для семейного бюджета удобнее отдельный мини-ПК или VPS.

**Как проверить приложение на Android, если телефона под рукой нет?**
Разверните Android-окружение на компьютере: эмулятор или Waydroid запускают Android-приложения на ПК, и приложение Actual можно поставить и протестировать там. Сравнение подходов — в гайде [Как запускать Android-приложения и игры на ПК: эмуляторы, Waydroid и облачные сервисы](https://ai-release.org/guides/kak-zapuskat-android-prilozheniya-i-igry-na-pk-emuly

## Глубокое погружение
- [Лучшие ИИ-приложения для Android в 2026 году](https://ai-release.org/guides/luchshie-ii-prilozheniya-dlya-android-v-2026-godu.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide)
