demondehellis

Full-Stack Wizard, Tech Guru & Bash Evangelist.

← Назад к блогу

Firebase и облачные функции

Опубликовано: 19 апреля 2025 г.

  • #experiments
  • #tools
  • #journal
  • #dev
  • #firebase
  • #cloud

Firebase - прикольная штука, которая меня по-настоящему вдохновляет. Представь, можно не держать свой сервер, а просто запускать код по запросу. Или, например, безопасно писать в базу прямо из JS (да, Карл). Огромная гугловая инфраструктура под боком: хочешь, подключай файловое хранилище, хочешь нейронку, хочешь авторизацию.

Всё это уже упаковано так, что в несколько строк на питоне можно собрать рабочий прототип, и при этом стоить будет в разы меньше, чем если бы ты держал свой сервер. В моём случае, я пока не заплатил за Firebase ни копейки, т.к. у него довольно большие бесплатные квоты. В общем, халява и киберпанк. Для своих пет-проджектов - супер.

Порог входа

Порог входа не сказать что низкий: документация местами душная, местами непонятная, иногда всплывает возня с версиями SDK или самим деплоем. Но базово вкатиться можно за день-два и уже делать что-то полезное.

В чём прикол? Облачные функции и триггеры

Главная магия Firebase - облачные функции и триггеры на события. Пишешь себе скрипт на питоне, например функцию, которая делает запрос к RSS и парсит элементы:

import feedparser
from firebase_functions import https_fn

@https_fn.on_request()
def parse_rss(req: https_fn.Request) -> https_fn.Response:
    feed = feedparser.parse('https://news.com/rss')
    items = [{'title': entry.title, 'link': entry.link} for entry in feed.entries]
    return https_fn.Response(items)

Добавляешь к функции специальный декоратор @https_fn.on_request(), деплоишь одной консольной командой:

firebase deploy --only functions:parse_rss

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

А можно использовать другой декоратор и запускать функцию по расписанию, типа как по крону:

from firebase_functions import scheduler_fn

@scheduler_fn.on_schedule(schedule="every 24 hours")
def daily_rss_check(event: scheduler_fn.ScheduledEvent) -> None:
    # Твой код, который будет выполняться раз в сутки
    pass

И никакого сервера. Код крутится в облаке и скейлится на гугловой инфраструктуре, на которой работают остальные их сервисы.

Магия с базой данных

Захотел, например, сохранять эти RSS в базу? Пишешь две строчки кода с подключением Firestore (это NoSQL БД от Firebase). Никаких миграций не надо, просто кидаешь туда любой массив/объект в любой структуре:

from firebase_admin import initialize_app, firestore
initialize_app()

# Сохраняем данные в базу
firestore.Client().collection('rss_items').add({
    'title': 'Новая статья',
    'url': 'https://example.com/article',
    'date': firestore.SERVER_TIMESTAMP
})

И вот оно уже в базе, не нужно париться о схеме данных. Хочешь добавить новое поле? Просто добавь его в данные, и всё.

Событийная архитектура

А теперь самое интересное - триггеры. Допустим, ты хочешь, чтобы для каждого нового RSS-элемента выполнялась ещё какая-то логика, например отправка в телеграм.

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

В случае с Firebase можно использовать событие типа “элемент добавлен в базу” и запускать свой код по этому событию:

from firebase_functions import firestore_fn

@firestore_fn.on_document_created(document="rss_items/{itemId}")
def send_to_telegram(event: firestore_fn.Event[firestore_fn.DocumentSnapshot]) -> None:
    # Получаем данные из добавленного документа
    item_data = event.data.to_dict()
    
    # Отправляем в телеграм
    telegram_message = f"Новая статья: {item_data['title']}\n{item_data['url']}"
    send_telegram_message(telegram_message) # тут твой код для отправки сообщения

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

Теперь логика разделена, и так гораздо удобнее: никаких проверок и поиска по базе не надо. Если элемент уже в базе есть, то триггер не запустится (ну или можно сделать триггер на обновление, если нужно).

Что ещё прикольного

Помимо функций и базы данных, в Firebase есть:

  • Аутентификация (с готовыми UI-компонентами и поддержкой соцсетей)
  • Хостинг для статики (сюда можно задеплоить лендос и UI)
  • Облачное хранилище (для файлов/картинок)
  • Аналитику и мониторинг
  • Интеграцию с ML-сервисами Google

Пока что мне нравится этот опыт - меньше возни с инфраструктурой, больше времени на саму разработку.