Добро пожаловать на День 4 12 дней DigitalOcean! Вчера мы добавили SMS-уведомления Twilio в наш сервис напоминаний о днях рождения, что сделало его способным отправлять текстовые сообщения о днях рождения, которые отмечаются сегодня. 🎂
Сегодня мы поднимем уровень и развернем наш скрипт на DigitalOcean Functions. Это позволит нашему сервису работать в облаке без необходимости в выделенном сервере, сделав наше приложение легковесным, масштабируемым и готовым к автоматизации.
С этой настройкой вы будете получать напоминания о днях рождения даже тогда, когда ваш компьютер выключен или не подключен к интернету — больше не нужно вручную запускать скрипт на вашем компьютере. 🎉
✨ Почему DigitalOcean Functions?
Иногда все, что вам нужно, это простой скрипт, который выполняется время от времени. Управление инфраструктурой для чего-то подобного может быть излишним. Здесь на помощь приходят Functions. Это серверная платформа, что означает, что вы можете развернуть код, который выполняется только по мере необходимости, и вы платите только за то, что используете. Идеально подходит для нашего случая — проверки дней рождения и отправки напоминаний ежедневно.
🚀 Что вы узнаете
К концу сегодняшнего дня вы будете знать, как:
- Настроить
doctl
CLI инструмент от DigitalOcean. - Создать и подключиться к серверному пространству имен (способ DigitalOcean организовать функции).
- Упаковать и развернуть ваш Сервис Напоминания о Днях Рождения в DigitalOcean Functions.
- Проверить вашу развернутую функцию в облаке.
🛠 Что вам понадобится
Перед началом убедитесь, что у вас есть:
- Аккаунт DigitalOcean.
- Файл
.env
с вашими учетными данными для базы данных PostgreSQL и учетными данными Twilio
🧑🍳 Рецепт на День 4: Развертывание в DigitalOcean Functions
Шаг 1: Настройка CLI doctl
Если вы уже настроили doctl на своем компьютере, можете пропустить этот шаг. Для тех, кто нуждается в настройке, следуйте этим инструкциям:
Прежде чем мы начнем, давайте быстро поговорим о doctl
. Это официальный инструмент командной строки DigitalOcean, который позволяет управлять вашими облачными ресурсами прямо из вашего терминала. Мы будем использовать его для создания пространства имен (папки для наших безсерверных функций), развертывания нашего Python-скрипта и тестирования функции.
Настройка является простой:
-
Установите
doctl
: Следуйте руководству по установке для вашей операционной системы. -
Аутентификация
doctl
: Подключите его к вашему аккаунту DigitalOcean, выполнив: -
Проверьте установку: Убедитесь, что все работает, выполнив:
Если команда выполнена успешно, вы получите информацию о своей учетной записи DigitalOcean, такую как ваш email и ID учетной записи.
Шаг 2: Установите серверное программное обеспечение
DigitalOcean Functions требует программного обеспечения для поддержки безсерверной архитектуры, которое вам нужно установить. Это одноразовая настройка, поэтому после установки вам не нужно будет делать это снова для будущих проектов.
Запустите следующую команду:
Вы можете проверить статус установки с помощью:
Если вы видите ошибку, например:
Не беспокойтесь — это просто означает, что мы ещё не создали или не подключились к пространству имен. Мы займёмся этим на следующем шаге.
Шаг 3: Создайте и подключитесь к пространству имен
Пространства имён похожи на папки для организации серверных функций. Давайте создадим одно для нашего сервиса напоминания о днях рождения:
-
Создайте новое пространство имён:
-
Подключитесь к пространству имён:
-
Проверьте подключение:
Теперь вы должны видеть подтверждение о подключении к пространству имён.
Совет профессионала: Чтобы увидеть список всех доступных пространств имен, используйте следующую команду:
Это может быть полезно, если вы управляете несколькими проектами или хотите подтвердить пространство имен, которое вы только что создали.
Шаг 4: Инициализация и настройка структуры проекта
DigitalOcean Functions ожидает определенную структуру проекта для безсерверных развертываний. Вы можете начать с этой структуры, используя doctl serverless init
, создать ее вручную или даже клонировать стартовый репозиторий. Чтобы упростить задачу, мы настроим его с помощью doctl serverless init
:
-
Выполните следующую команду для инициализации проекта:
Это создаст локальный каталог проекта с именем
my-birthday-reminder-service
со следующей стандартной структурой: -
Перейдите в директорию проекта:
-
Переименуйте папки, чтобы они соответствовали нашему случаю использования:
-
Создайте необходимые файлы:
- Создайте пустой файл .env в корне проекта:
Этот файл будет содержать ваши учетные данные для базы данных и Twilio. Файл будет расположен в корне папки
my-birthday-reminder-service
.- Создайте файл
requirements.txt
в папкеbirthdays
:
Этот файл будет содержать список зависимостей Python, необходимых для вашей функции. Он будет находиться в папке
packages/reminders/birthdays
.- Создайте файл build.sh в папке birthdays:
Скрипт
build.sh
необходим для развертывания функций с внешними зависимостями. Командаchmod
гарантирует, что скрипт будет исполняемым на системах Mac/Linux.
Обновленная структура: После выполнения этих шагов ваша структура проекта должна выглядеть так:
Совет: Если вы случайно неправильно назвали папку, вы можете снова выполнить команду или вручную переименовать ее в вашем файловом менеджере.
Шаг 5: Обновить файлы
Теперь, когда структура на месте, давайте заполним ее необходимыми файлами. Откройте директорию my-birthday-reminder-service в вашем любимом редакторе кода
1. Обновите project.yml
Файл project.yml
является конфигурационным файлом, который определяет структуру вашего безсерверного проекта, переменные окружения и функции. Замените его содержимое на:
Этот файл настраивает пакет напоминаний и связывает переменные окружения с функциями DigitalOcean. Каждая переменная соответствует учетным данным, необходимым для вашей базы данных и интеграции с Twilio.
2. Обновите ваш файл .env
Смотрите День 1: Настройка базы данных PostgreSQL для напоминаний о днях рождения для получения учетных данных базы данных и День 3: Проверка дней рождения и отправка SMS-уведомлений для получения учетных данных Twilio, чтобы заполнить следующие значения:
Примечание: Файл .env
используется для безопасного хранения конфиденциальных учетных данных. Эти значения будут прочитаны вашим файлом project.yml
и сопоставлены с безсерверной средой во время развертывания, что сделает их доступными для вашей функции в облаке.
3. Добавьте зависимости
Обновите файл requirements.txt
следующими зависимостями:
pg8000
: Чистая библиотека клиента PostgreSQL на Python.
python-dotenv
: Используется для загрузки переменных окружения из файла .env
.
twilio
: Библиотека Twilio для Python для отправки SMS-сообщений.
4. Обновите build.sh
Добавьте следующий скрипт в файл build.sh
:
Этот скрипт гарантирует, что все зависимости упакованы правильно с вашей функцией. Команда chmod +x
из Шага 4 гарантирует, что он исполняемый.
5. Обновите __main__.py
Это основной скрипт для вашего Сервиса Напоминания о Дне Рождения. Мы по сути используем скрипт, который мы создали на 3-й день для отправки уведомлений о днях рождения. Однако, чтобы сделать его совместимым с DigitalOcean Functions, нам нужно внести несколько небольших изменений.
Обновите файл __main__.py
следующим содержимым:
Вот что мы изменили:
-
Добавлена функция
main(params)
: DigitalOcean Functions ожидает функцию входной точки с именемmain
, которая принимает аргументparams
. Здесь начинается выполнение функции. -
Логика скрипта перемещена внутрь функции
main
:
Код третьего дня был обернут внутри функцииmain
, чтобы соответствовать этому требованию. -
Все остальное остается прежним:
Логика подключения к базе данных, проверки дня рождения и логика уведомлений по SMS не изменились.
Шаг 5: Упаковка и развертывание
С учетом всего, разверните ваш проект в DigitalOcean Functions:
- Развернуть проект:
Чтобы проверить, что ваша функция была успешно развернута в пространстве имен:
- Посетите панель управления DigitalOcean и перейдите в раздел Functions в боковой панели.
- Найдите ваше пространство имен (например, my-birthday-reminder-namespace).
- Убедитесь, что ваша функция отображается в пространстве имен, обычно она указана как
reminders/birthdays
. - Нажмите на название функции, чтобы увидеть детали, включая логи, конфигурацию и историю вызовов.
Шаг 6: Протестируйте вашу развернутую функцию
После развертывания вашей функции пришло время ее протестировать. Вы можете вручную вызвать функцию, чтобы убедиться, что она работает как ожидается. Существует два способа сделать это:
Вариант 1: Использование CLI DigitalOcean
Если все настроено правильно, ваша функция будет запускаться в облаке, проверяя сегодняшние дни рождения и отправляя уведомления по SMS.
Вариант 2: Использование панели управления DigitalOcean
- Перейдите в Панель управления DigitalOcean.
- Перейдите к Функциям и найдите вашу функцию напоминаний/дней рождения.
- Нажмите Запустить, чтобы запустить ее вручную.
- Просматривайте вывод и журналы непосредственно в консоли.
Этот метод особенно полезен, если вы предпочитаете визуальный интерфейс или хотите проверить журналы в чистом, легко читаемом формате.
Советы по тестированию
Когда вы вызываете функцию, она будет проверять дни рождения, совпадающие с сегодняшней датой. Если есть совпадение, вы получите текстовое сообщение с деталями. Чтобы эффективно протестировать функцию:
- Добавьте одно или несколько дней рождения в вашу базу данных, которые совпадают с текущей датой.
- Проверьте консоль или логи CLI, чтобы подтвердить успешное выполнение функции.
🎁 Итоги
Вот что мы сделали сегодня:
✅ Настроили doctl
и создали пространство имен для нашего проекта.
✅ Рефакторили Python-скрипт для развертывания.
✅ Упаковали и развернули Службу Напоминания о Днях Рождения в DigitalOcean Functions.
✅ Протестировали функцию в облаке, используя как CLI, так и панель управления DigitalOcean.
Далее: Хотя это большой шаг вперёд, мы всё еще запускаем функцию вручную. В следующем посте мы автоматизируем этот процесс, чтобы Служба Напоминания о Днях Рождения работала автоматически каждый день в определенное время. Представьте, что вы просыпаетесь с текстовым напоминанием, ничего не делая—давайте сделаем это завтра! 🚀