«Ручное» развертывание приложения: ошибки новичка и не полезные советы

Привет. Этот текст подойдет для новичков, коллегам с опытом статья может показаться неинтересной и скучной, а возможно вызвать ненормативную лексику.

Введение

Я не являюсь разработчиком и 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

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

отображение таблиц в 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)

По шагам:

  1. Зарегистрироваться в Grafana.

  2. Перейти в личный кабинет и выбрать раздел Loki.

ce5131f4c201c3d4a671b8f60aabaadd.JPG

  1. Получить URL, USER и PASSWORD.

  1. Придумать TAG для обращения к нему при создании отчета и записать его в виде словаря, например {«app»: «vk_manager»}.

  2. Запустить приложение несколько раз для заполнения Loki данными.

  3. Найти и настроить панель инструментов на свой вкус. Официальная документация содержит информацию о языке запросов. Пример на скриншоте.

настройка графика

настройка графика

пример дашборда с логами

пример дашборда с логами

Переносим файлы на сервер

Затем мне нужно перенести папки с визуальными элементами и файлы с кодом на сервер. Как упоминал ранее, решил не идти по пути автоматизации и не стал использовать Git. Нашел приложение, которое позволяет общаться с сервером через удобный интерфейс. Установил FileZilla и подключился через SSH. Затем перенес код и остальные файлы.

перенос контента на сервер

перенос контента на сервер

Запускаем docker и настраиваем таймер

Через командную строку подключился к серверу и установил Docker. Затем создал образ и попытался примонтировать папку с изображениями. По каким-то причинам у меня не получилось это сделать, поэтому пришлось загружать нужные файлы с визуальным контентом в существующий контейнер.

Контейнер запускается командой docker start <название_контейнера>. В моем случае необходимо запускать каждый час, в качестве таймера выбрал Systemd.

Ссылки:

  1. Установка Docker

  2. Монтирование папок

  3. Перенос данных в существующий контейнер

  4. Запуск контейнера

  5. Systemd

Заключение

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

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

Все приложение на GitHub

© Habrahabr.ru