У меня была задача «Собирать статистику постов в vk каждый час». Я не являюсь разработчиком или DevOps специалистом. Поэтому мой способ решения задачи сложился из поисковых запросов, личного опыта, советов друзей и коллег.
Код на python публикуем на сервер через github, устанавливаем docker. В crontab задаем интервал для запуска docker контейнера
Подготавливаем данные для Docker
Про Docker написано очень много статей, поэтому я не буду писать еще раз, что это и для чего используется. В контексте данной статьи Docker будет частью нашего решения. В следующем разделе будет ссылка на материал по теме Docker, который помог мне.
План действий:
* noted-point файл с расширением json, который используется в коде на python
requrements.txt
В папке с вашим кодом создаем файл с точно таким же именем requrements.txt Этим файлом мы говорим Docker, какие библиотеки нужно дополнительно установить и какой версии.
Как понять, что туда написать?
Обязательно вносим в файл библиотеки, которые вы устанавливали дополнительно. В моем случае все библиотеки, которые использованы в коде в самом начале.
import os
import requests
from pandas import json_normalize
import pandas as pd
from datetime import datetime
from datetime import *
import httplib2
from oauth2client.service_account import ServiceAccountCredentials
import apiclient.discovery
В IDE в консоле пишем pip freeze.
Видим список всех установленных пакетов в вашем виртуальном окружение и их версии
Пример вывода списка библиотек с и их версии
Выбираем библиотеки, которые мы с вами используем в коде и переносим в requrements.txt
На выходе это будет выглядеть так:
Наполнение файла requrements.txt
Dockerfile
заполненная структура докер файла
Создаем файл Dockerfile, без расширения. Открываем его и заносим данные
FROM python: «ваша версия python». Узнать ее можно набрав в терминале: python –V
Подробно останавливаться на всем не буду. Выше собранный requrements.txt будет использован в RUN.
ENV это переменное окружение, которые будут храниться внутри Docker. ENV TZ Europe/Moscow – установление московского времени.
Все остальные переменные необходимы для корректной работы кода. (см. статью https://habr.com/ru/post/720862/)
Конечно можно их и не прописывать и все оставить в коде. В моем случае, я решил, что оставлю все переменные в одном месте просто для своего удобства.
CMD указываем язык программирования и названия вашего файла с кодом в моем случае это vk_stat.py
Настраиваем переменное окружение в коде python
Мы удаляем значение переменных из кода, так как они у нас уже в Dockerfile.
Прописываем команду, которая будет забирать переменные окружения.
TOKEN_USER = os.getenv('TOKEN_USER')
VERSION = os.getenv('VERSION')
DOMAIN = os.getenv('DOMAIN')
Создаем сервер, публикуем код на GitHub
Я бы посоветовал прежде, чем перейти к этому шагу скачать отдельно docker desktop и провести тестирование на вашей локальной машине.
В этом видео вы найдете все что нужно по установки docker и кратко для чего он применяется. Мне данное видео очень помогло.
Для тех кто c Docker знаком предлагаю просмотреть фрагмент видео (ссылка выше) с 1:05:23 по 1:10:17
Добавлю лишь, если вы не хотите прописывать переменные внутри сервера, то сделайте закрытый репозиторий на GitHub!
Здесь не вижу смысла перечислять все шаги, если вы повторите за автором видео.
90% работы вами уже сделано. По итогам у вас:
- Создан сервер с опубликованном кодом через github + установленный docker
Отладка Cron
Далее через командную строку заходим на наш сервер.
Мне понравилась статья про cron здесь https://losst.pro/nastrojka-cron, но далее кратко напишу по сути. Набираем «crontab –e» в командной строке.
В самом конце набираем интервал для запуска контейнер. В моем случае каждый час. В помощь хороший сайт, который позволит сразу настроить интервал https://crontab.guru
Далее пишем команду Docker run –rm «имя вашего образа». Флажок –rm удаляет контейнер после его отработки. Не забываем сохранить наши изменения.
Cron перед сохранением. test - имя моего образа
Проверить, не падает ли контейнер при запуске можно в логах. Введите команду grep CRON /var/log/syslog
Заключение
Данное решение позволяет выполнить поставленную задачу. Конечно его можно улучшить. Например, добавить логирование, написать класс и завернуть все в функции что позволит в будущем расширять функционал. Возможно радикально пересмотреть в целом предлагаемое мной решение.
habr.com

Код на python публикуем на сервер через github, устанавливаем docker. В crontab задаем интервал для запуска docker контейнера
Подготавливаем данные для Docker
Про Docker написано очень много статей, поэтому я не буду писать еще раз, что это и для чего используется. В контексте данной статьи Docker будет частью нашего решения. В следующем разделе будет ссылка на материал по теме Docker, который помог мне.
План действий:
- Создаем файл requrements.txt
- Настраиваем Dockerfile
- Настраиваем переменное окружение в коде python
- Оставляем словарь, который использует google sheet api*
* noted-point файл с расширением json, который используется в коде на python
requrements.txt
В папке с вашим кодом создаем файл с точно таким же именем requrements.txt Этим файлом мы говорим Docker, какие библиотеки нужно дополнительно установить и какой версии.
Как понять, что туда написать?
Обязательно вносим в файл библиотеки, которые вы устанавливали дополнительно. В моем случае все библиотеки, которые использованы в коде в самом начале.
import os
import requests
from pandas import json_normalize
import pandas as pd
from datetime import datetime
from datetime import *
import httplib2
from oauth2client.service_account import ServiceAccountCredentials
import apiclient.discovery
В IDE в консоле пишем pip freeze.
Видим список всех установленных пакетов в вашем виртуальном окружение и их версии

Пример вывода списка библиотек с и их версии
Выбираем библиотеки, которые мы с вами используем в коде и переносим в requrements.txt
На выходе это будет выглядеть так:

Наполнение файла requrements.txt
Dockerfile

заполненная структура докер файла
Создаем файл Dockerfile, без расширения. Открываем его и заносим данные
FROM python: «ваша версия python». Узнать ее можно набрав в терминале: python –V
Подробно останавливаться на всем не буду. Выше собранный requrements.txt будет использован в RUN.
ENV это переменное окружение, которые будут храниться внутри Docker. ENV TZ Europe/Moscow – установление московского времени.
Все остальные переменные необходимы для корректной работы кода. (см. статью https://habr.com/ru/post/720862/)
Конечно можно их и не прописывать и все оставить в коде. В моем случае, я решил, что оставлю все переменные в одном месте просто для своего удобства.
CMD указываем язык программирования и названия вашего файла с кодом в моем случае это vk_stat.py
Настраиваем переменное окружение в коде python
Мы удаляем значение переменных из кода, так как они у нас уже в Dockerfile.
Прописываем команду, которая будет забирать переменные окружения.
TOKEN_USER = os.getenv('TOKEN_USER')
VERSION = os.getenv('VERSION')
DOMAIN = os.getenv('DOMAIN')
Создаем сервер, публикуем код на GitHub
Я бы посоветовал прежде, чем перейти к этому шагу скачать отдельно docker desktop и провести тестирование на вашей локальной машине.
В этом видео вы найдете все что нужно по установки docker и кратко для чего он применяется. Мне данное видео очень помогло.
Для тех кто c Docker знаком предлагаю просмотреть фрагмент видео (ссылка выше) с 1:05:23 по 1:10:17
Добавлю лишь, если вы не хотите прописывать переменные внутри сервера, то сделайте закрытый репозиторий на GitHub!
Здесь не вижу смысла перечислять все шаги, если вы повторите за автором видео.
90% работы вами уже сделано. По итогам у вас:
- Создан сервер с опубликованном кодом через github + установленный docker
Отладка Cron
Далее через командную строку заходим на наш сервер.
Мне понравилась статья про cron здесь https://losst.pro/nastrojka-cron, но далее кратко напишу по сути. Набираем «crontab –e» в командной строке.
В самом конце набираем интервал для запуска контейнер. В моем случае каждый час. В помощь хороший сайт, который позволит сразу настроить интервал https://crontab.guru
Далее пишем команду Docker run –rm «имя вашего образа». Флажок –rm удаляет контейнер после его отработки. Не забываем сохранить наши изменения.

Cron перед сохранением. test - имя моего образа
Проверить, не падает ли контейнер при запуске можно в логах. Введите команду grep CRON /var/log/syslog
Заключение
Данное решение позволяет выполнить поставленную задачу. Конечно его можно улучшить. Например, добавить логирование, написать класс и завернуть все в функции что позволит в будущем расширять функционал. Возможно радикально пересмотреть в целом предлагаемое мной решение.

Код на python, сервер и Cron. Запускаем код на сервере по времени
Введение У меня была задача «Собирать статистику постов в vk каждый час». Я не являюсь разработчиком или DevOps специалистом. Поэтому мой способ решения задачи сложился из поисковых запросов, личного...
