О чём, зачем и почему?
Эту небольшую заметку я решил написать после собственного опыта разворачивания личной "инфраструктуры", состоящей из нескольких приложений для повседневных дел.
Здесь я расскажу, как развернуть сервисы для контроля финансов (FireFly3), заметок и чего покрупнее (BookStack) и контроля времени, уходящего на задачи в opensource проектах или на работе (Titra) всё это на Vultr с защитой с помощью firewall групп и доступа только с нужных ip, например, домашней статики или vpn (ещё развернём для этого Pritunl).
Vultr я выбрал, так как достаточно давно с ним работаю и уже знаю, что он может, а что нет в моём случае он подошёл идеально.
Надеюсь, что это окажется для кого-то полезным.
Разворачиваем сервисы
Для сервисов (всех трёх) я выбрал простой инстанс на Vultr + автоматические бэкапы, так как все они не особо требовательны к ресурсам.
Прим.: Предполагается, что у вас есть свой домен с DNS, где вы можете настроить субдомены для всего ниже описанного и получения сертификатов (certbot), исходя из этого, для удобства, в статье я буду писать про personal.io, а вы представляйте личный :)
Прим. 2: Ещё небольшое предупреждение я буду писать про сервисы в docker, однако, все они прекрасно разворачиваются и без контейнеров.
Финансы FireFly3
Собственно я люблю вести фин. учёт по всем своим доходам и расходам: видеть на что вы тратите ваши деньги и как возможно, что-то оптимизировать, по-моему достаточно важно.
Для моих целей вполне подходит FireFly3 в нём вы можете отслеживать все свои счета, регулярные транзакции, долги и т.д. и т.п.
На наше счастье разработчики firefly3 сделали удобную документацию с описанием развёртывания приложения, как с помощью docker, так и без оного. Приведу свой docker-compose файл c firefly и БД для него:
version: '3.3'services: fireflyiii: image: jc5x/firefly-iii:latest volumes: - firefly_iii_upload:/var/www/html/storage/upload env_file: - .env restart: unless-stopped ports: - 127.0.0.1:34567:8080 depends_on: - fireflyiiidb fireflyiiidb: image: yobasystems/alpine-mariadb:latest restart: unless-stopped env_file: - .env.db volumes: - firefly_iii_db:/var/lib/mysqlvolumes: firefly_iii_upload: driver: local firefly_iii_db: driver: local
Так же, весьма важен env-файл для самого сервиса, так как в нём настраиваются все базовые моменты для развёртываемого инстанса, как то: тип используемой БД, с помощью чего отправлять вам письма счастья (SMTP или MAILGUN), логи, аутентификация (если, вдруг, вам вместо стандартного eloquent понадобится LDAP), ну и доменное имя на котором будет сервис, в нашем случае настроим его на finance.personal.io. Оставляю пример этого самого env-файла (с комментами от разработчиков) на pastebin с выставленными значениями под нашу статью.
С firefly3 на этом всё, после того как мы сделаем nginx proxypass и получим сертификат вам нужно зарегистрироваться в сервисе, после чего вы сможете отключить эту возможность.
Заметки, документация и т.д. BookStack
У меня часто возникает желание/необходимость, что-нибудь написать по работе или личное, поэтому для меня такой сервис, как BookStack показался крайне удобен возможность создавать отдельные полки, регулировать права, наглядный markdown редактор (приложу скриншот, как пишу это именно в нём), понятная иерархия: полки-книги-листы.
Такой сервис может подойти как для личного пользования, так и для командного в небольших компаниях.
docker-compose.yml:
version: "3.1"services: bookstack: image: linuxserver/bookstack container_name: bookstack volumes: - bookstack-volume:/config ports: - 127.0.0.1:34568:80 env_file: - .env.bookstack restart: unless-stopped depends_on: - bookstack_db bookstack_db: image: linuxserver/mariadb container_name: bookstack_db volumes: - bookstack-db:/config env_file: - .env.db restart: unless-stoppedvolumes: bookstack-volume: driver: local bookstack-db: driver: local
Тут с предварительной конфигурацией всё намного проще, чем у firefly, так как почти всё можно настроить через web интерфейс.
.env.bookstack:
DB_HOST=bookstack_dbDB_USER=bookstackDB_PASS=bookstackpasswordDB_DATABASE=bookstackappAPP_URL=https://notes.personal.io
При первом входе, вам также понадобиться зарегистрировать admin юзера, но это позже.
В bookstack так же доступна аутентификация по LDAP, а так же по SAML или через социальные сети всё это настраиваемо. Так же есть экспорт опусов в pdf и html, публичный доступ к полкам или отдельным книгам, т.е. без пользователя.
Учёт потраченного времени Titra
У меня есть как личные, так и рабочие проекты, поэтому мне важно знать, сколько времени я потратил на ту или иную задачу. В Titra вы можете разграничить всё на разные проекты, проектные задачи, назначить стоимость вашей работы (например, за час), указать со скольки вы работаете и во сколько у вас перерыв (оплачиваемый или нет), ну и статистические отчёты за разное время тоже присутствуют с фильтрацией по отдельным проектам и т.д.
docker-compose.yml:
version: "3.1"services: titra: image: kromit/titra container_name: titra depends_on: - mongodb ports: - "127.0.0.1:34569:3000" env_file: - .env.titra restart: always mongodb: image: mongo:4.2 container_name: mongodb restart: always volumes: - titra_db:/data/dbvolumes: titra_db: driver: local
.env.titra:
ROOT_URL=https://titra.personal.ioMONGO_URL=mongodb://mongodb/titra
Бонус: страница со ссылками на ваши сервисы Homer
Чтобы не потерять ссылки на все ваши сервисы особенно, если их станет больше, лучше всего иметь страницу, которая бы показывала, где и что у вас развёрнуто. Я когда задумался об этом, выбирал между heimdall и homer, остановился на последнем, так как его легче настроить и он вполне удовлетворяет условиям поставленной задачи.
На странице Homer вы сможете настроить ссылки на ваши сервисы, разнести их по разным группам, кастомизировать их отображение (например, присвоить каждому иконку).
docker-compose.yml:
version: "3.3"services: homer: image: b4bz/homer:latest volumes: - ./assets:/www/assets ports: - "127.0.0.1:34570:8080" restart: unless-stopped
Для работы homer вам придётся создать assets директорию с файлом config.yml, где вы и укажите, что и как отображать.
Давайте первоначально напишем его таким образом:
title: "Infrastructure"subtitle: "Personal"documentTitle: "Personal/Infrastructure"icon: "fas fa-skull-crossbones"header: truecolumns: "3"theme: defaultcolors: dark: highlight-primary: "#3367d6" highlight-secondary: "#4285f4" highlight-hover: "#5a95f5" background: "#131313" card-background: "#2b2b2b" text: "#eaeaea" text-header: "#ffffff" text-title: "#fafafa" text-subtitle: "#f5f5f5" card-shadow: rgba(0, 0, 0, 0.4) link-hover: "#ffdd57"services: - name: "Main" icon: "fas fa-code-branch" items: - name: "Titra" icon: "fas fa-clock" subtitle: "time-tracking" url: "https://titra.personal.io" - name: "FireFly3" icon: "fas fa-piggy-bank" subtitle: "finance" url: "https://finance.personal.io" - name: "BookStack" icon: "fas fa-book" subtitle: "notes-articles-book" url: "https://notes.personal.io"
Страница будет выглядеть так:
Разместим её на home.personal.io
Домены и сертификаты
После того, как мы всё написали и запустили нам нужно настроить nginx и попросить пару сертификатов у certbot. Я приведу пример общего для сервисов файла настройки, который можно и нужно разделить на несколько: apps.conf
Запустим nginx:
systemctl start nginx
Далее, предварительно создав необходимые A-записи в настройках DNS у вашего домена, чтобы поддомены home, notes, finance, titra ссылались на ip машины на Vultr, мы запросим с помощью certbot сертификаты Let's Encrypt, чтобы соединение было безопасным:
certbot run --nginx
После получения сертификатов, вы можете заходить на ваши сервисы и регистрироваться.
Защищаемся
Чтобы быть уверенным, что никто не зайдёт туда, куда не следует я сделал следующее:
- Развернул Prtinul сервер
- Создал firewall группу в панели управления Vultr
Собственно, как быстро (обещают за 60 секунд) pritunl на vultr уже написано.
Я расскажу лишь, как можно быстро настроить firewall правила для vultr машины (или нескольких)
- Заходим на страницу ваших огненных стен
-
Жмём плюсик и в выпавшем меню "Add firewall group".
-
Добавляем правила, например, я решил, что лучше всего оставить открытым 22 порт, а остальные сделать доступными только из-под VPN. Например, так:
-
Ждём, так как правила накатятся не мгновенно, а примерно за две минуты.
-
Наслаждаемся
своей непохожестьюбезопасностью и контролем за важными для вас данными.