«Ручное» развертывание приложения: ошибки новичка и не полезные советы
Привет. Этот текст подойдет для новичков, коллегам с опытом статья может показаться неинтересной и скучной, а возможно вызвать ненормативную лексику.
Введение
Я не являюсь разработчиком и DevOps специалистом. Для личных целей понадобилось набросать небольшой скрипт и запускать его по таймеру. Когда разобрался со скриптом пришло время развернуть приложение. Я осознанно отказался от CI/CD. Мне было любопытно разобраться самому и реализовать вручную. Для новичков надеюсь мой негативный опыт будет полезен.
Однако, предупреждаю, что статья будет содержать множество ссылок. Не пугайтесь, это сделано для того, чтобы не превращать статью в огромный текст, но при необходимости иметь возможность найти подробную информацию.
Приложение
Пару слов про приложение. Это сервис для публикаций постов в VK. В процессе выполнения взаимодействует с PostgreSQL и Grafana Loki.
PostgreSQL — объектно-реляционная система управления базами данных.
Grafana Loki — это система логирования и мониторинга, которая позволяет собирать, хранить и анализировать большие объемы лог-файлов.
Подробнее про приложение можно почитать здесь
Сервер
Для целей деплоя я решил арендовать сервер. Аренда сервиса для развертывания приложения может показаться привлекательной идеей. Но так ли это выгодно и целесообразно для простого скрипта? (спойлер — нет). Разбирался в этой статье.
Для начала необходимо настроить SSH-подключение к серверу. Рекомендую посмотреть видео с 1:05:23 до 1:08:25 подробно рассказывается о настройке SSH-соединения.
После того как SSH-соединение настроено, можно приступать к развертыванию приложения на арендованном сервере.
PostgreSQL
После того, как вы подключитесь к серверу и установите PostgreSQL, проверьте его работоспособность командой «systemctl status postgresql»
Подробно тут
проверка активности БД
Создание и настройка таблиц
Необходимо создать нового пользователя, базу, схему, настроить таблицы. Вы можете сделать это в ручную из командной строки или использовать интерфейс PgAdmin для создания и управления таблицами.
Вариант 1
Все можно сделать «ручками» из командной строки, перейдя в PL/pgSQL.
psql
Пример создание базы:
CREATE DATABASE vk_manager_post
WITH
OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'Russian_Russia.1251'
LC_CTYPE = 'Russian_Russia.1251'
TABLESPACE = pg_default
CONNECTION LIMIT = -1
IS_TEMPLATE = False;
Информации в сети достаточно.
Вариант 2
Скачать PgAdmin и по SSH подключиться. Инструкция здесь
отображение таблиц в PgAdmin
Настройка PostgreSQL
Чтобы ваше приложение могло подключиться к PostgreSQL, вам нужно зайти на сервер и изменить параметры в файлах postgresql.conf и pg_hba.con
В файле postgresql.conf найдите параметр listen_addresses и измените его значение на *, чтобы разрешить подключения с любого IP-адреса.
Затем откройте файл pg_hba.conf и найдите строку, начинающуюся с md5, которая используется для аутентификации по паролю. Замените эту строку на следующую, чтобы использовать алгоритм scram-sha-256 для аутентификации:
local all scram-sha-256
После внесения изменений сохраните файлы и перезапустите службу PostgreSQL в командной строке «sudo service postgresql restart». Теперь ваше приложение должно успешно подключиться к базе данных. Подробности по ссылки.
Для инфо:
Если есть желание разобраться как работает PostgreSQL, рекомендую этот канал Postgres Professional. Там есть бесплатный курс лекций DBA1, DBA2, DBA3.
Grafana Loki
Решил не складывать отдельно логи, а использовать web приложения для быстрого отслеживания работы скрипта. Выбрал Grafana Loki для этой цели. Для Python уже существует библиотека python-logging-loki, которую можно использовать для работы с Loki. Настройка довольно проста:
import yaml
from yaml.loader import SafeLoader
import logging
import logging_loki
logging.basicConfig(level=logging.DEBUG)
with open("config.yaml", "r") as stream:
ConfigSystem = yaml.load(stream, Loader=SafeLoader)
ConfigGrafanaLoki = ConfigSystem['GrafanaLoki']
handler = logging_loki.LokiHandler(
url= ConfigGrafanaLoki.get('URL'),
tags=ConfigGrafanaLoki.get('TAG'),
auth=(ConfigGrafanaLoki.get('USER'), ConfigGrafanaLoki.get('PASSWORD')),
version=ConfigGrafanaLoki.get('VERSION')
)
logger = logger.addHandler(handler)
По шагам:
Зарегистрироваться в Grafana.
Перейти в личный кабинет и выбрать раздел Loki.
Получить URL, USER и PASSWORD.
Придумать TAG для обращения к нему при создании отчета и записать его в виде словаря, например {«app»: «vk_manager»}.
Запустить приложение несколько раз для заполнения Loki данными.
Найти и настроить панель инструментов на свой вкус. Официальная документация содержит информацию о языке запросов. Пример на скриншоте.
настройка графика
пример дашборда с логами
Переносим файлы на сервер
Затем мне нужно перенести папки с визуальными элементами и файлы с кодом на сервер. Как упоминал ранее, решил не идти по пути автоматизации и не стал использовать Git. Нашел приложение, которое позволяет общаться с сервером через удобный интерфейс. Установил FileZilla и подключился через SSH. Затем перенес код и остальные файлы.
перенос контента на сервер
Запускаем docker и настраиваем таймер
Через командную строку подключился к серверу и установил Docker. Затем создал образ и попытался примонтировать папку с изображениями. По каким-то причинам у меня не получилось это сделать, поэтому пришлось загружать нужные файлы с визуальным контентом в существующий контейнер.
Контейнер запускается командой docker start <название_контейнера>. В моем случае необходимо запускать каждый час, в качестве таймера выбрал Systemd.
Ссылки:
Установка Docker
Монтирование папок
Перенос данных в существующий контейнер
Запуск контейнера
Systemd
Заключение
Мне удалось достичь своей цели и получить опыт ручного развертывания приложения. Однако, небольшое изменение в коде или визуальных элементах влечет за собой новый перенос файлов на сервер и далее в контейнер.
Не рекомендую повторять мой опыт. При правильном подходе и использовании подходящих инструментов, этот процесс может быть выполнен быстро и эффективно.
Все приложение на GitHub