# Miniflux on Heroku

В качестве feed reader использую [miniflux](https://miniflux.app/). Считаю его одним из самых удобных и функциональных. При этом размещал его на своем сервере. А тут решил вынести его на отдельный хостинг, чтобы не хранить все в одной карзине.

Долго выбирал, куда его можно перенести. Рассматривал бесплатные варианты. Так как нести дополнительные расходы не хотелось. Были варианты организовать новые сервера в облаке Oracle или Google. Но поднимать отдельный сервер под такой простой сервис затратно по времени и усилиям. И тут вспомнил про [Heroku](https://www.heroku.com/home). Тарифные планы у них уже несколько раз менялись. И на [сегодняшний день](https://www.heroku.com/pricing) есть возможность использования приложений бесплатно до 550 часов в месяц для обычного аккаунта и до 1000 часов в месяц для аккаунта с платежной информацией.

Единственное ограничение для бесплатного аккаунта в том, что Dyno уходят в сон, если в течение 30 минут к ним не было обращений. При следующем обращении они довольно быстро поднимаются, но в случае с Miniflux нам необходимо чтобы приложение работало 24x7. И таким образом нам необходимо будет создать автоматические обращения на свой домен.

## Heroku CLI

Изначально необходимо провести регистрацию на сайте Heroku и затем установить консольный клиент.

Установка приложение описана в [официальной документации](https://devcenter.heroku.com/articles/heroku-cli#download-and-install) , где приводяться необходимые действия, для MacOS выполняем установку из homebrew:

```bash
brew tap heroku/brew && brew install heroku
heroku autocomplete
```

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

Теперь все готово к работе.

## Minilux

В официальной документации [Miniflux](https://miniflux.app/docs/howto.html#heroku) приводятся необходимые шаги для того, чтобы запустить свое приложение в окружении Heroku:

```bash
git clone https://github.com/miniflux/v2.git miniflux
git checkout 2.0.26
heroku apps:create
heroku addons:create heroku-postgresql:hobby-dev
```

Кратко, клонируем репозиторий в директорию miniflux, переходим в нее, переключаемся на последнюю стабильную версию, создаем Heroku приложение и подключаем к нему Postgres дополнение.

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

```bash
heroku config:set RUN_MIGRATIONS=1
heroku config:set CREATE_ADMIN=1
heroku config:set ADMIN_USERNAME=admin
heroku config:set ADMIN_PASSWORD=test123
# additional settings
heroku config:set BASE_URL=https://miniflux.domain.org
heroku config:set POLLING_FREQUENCY=10
heroku config:set POCKET_CONSUMER_KEY=sdfjkjhksdfkjh
```

Дополнительно задаем `BASE_URL` для использования собственного домена, меняем `POLLING_FREQUENCY` на опрос фидов раз в 10 минут, против стандартных раз в час. И задаем `POCKET_CONSUMER_KEY`, который берем из параметров getpocket, если планируем его использовать в своем веб-приложении.

Осталось запустить приложение:

```bash
git push heroku master
```

И по завершении операции, у меня на это ушло порядка 5 минут, удаляем уже ненужные переменные из окружения:

```bash
heroku config:unset CREATE_ADMIN
heroku config:unset ADMIN_USERNAME
heroku config:unset ADMIN_PASSWORD
```

Осталось только прикрутить домен к своему приложению:

```bash
heroku domains:add miniflux.domain.org
```

И в совем доменном регистраторе изменить CNAMR для данного поддомена на значение из параметров, которое можно получить из команды:

```bash
heroku domains
```

## Постоянная работа

Как уже указывал выше бесплатное приложение, если не используется в течение 30 минут, будет засыпать до момента следующего обращения к нему. Чтобы этого избежать, необходимо организовать периодические обращения от внешнего сервиса. К примеру с сервиса [uptimerobot](https://uptimerobot.com/).

Регистрируемся, добавляем домен для проверки, стандартных 5 минут вполне достаточно.

Таким образом, во-первых, это не даст уснуть приложению, и во-вторых даст понимание по стабильности работы приложения на протяженнии времени.


