IT-инфраструктура для бизнеса и творчества
Разработка
Selectel

ИТ-гайд: как запустить первое приложение

Инструкция по запуску вашего первого мобильного приложения c автоматически масштабируемым бэкендом

Обратная сторона приложения — ИТ-инфраструктура. С бессерверными технологиями реально писать код, не думая о поддержке. Serverless-технологии помогают автоматизировать рутинные операции и быстрее производить вычисления. Редакция Selectel подготовила пошаговое руководство по запуску вашего первого приложения на базе Serverless-технологий, которые подходят для пиковых нагрузок и экономят средства в периоды спада активности, сокращая потребление ресурсов.

В чем особенность serverless-технологий? Бессерверные вычисления дают возможность создавать приложения, не заботясь о поддержке инфраструктуры. Не нужно настраивать сервер — можно просто писать код.

В инструкции расскажем, как на примере Flask-приложения начать использовать бессерверные технологии и запустить первое мобильное приложение.

Подготовка окружения

Все нижеперечисленные команды нужно выполнять на виртуальной машине.

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

С вас — код.

С нас — все остальное.

Selectel

Готовим виртуальную машину

Установка и запуск Docker

Обновите репозитории:

sudo apt-get update

Удалите пакеты Docker, установленные по умолчанию:

sudo apt-get remove docker docker-engine docker.io

Инсталлируйте Docker:

sudo apt install docker.io

Запустите Docker в качестве демона:

sudo systemctl start docker

Установка образа

Скачайте Docker образ CouchDB:

docker pull couchdb

Скачайте наш пример Flask-приложения:

docker pull selectel/shiny-flask-app

Запустите контейнер с CouchDB:

docker run -e COUCHDB_USER=user -e COUCHDB_PASSWORD=password -p0.0.0.0:5984:5984/tcp -d couchdb

Запустите контейнер с shiny-flask-app:

docker -v run --rm -e server_url=XXX.XXX.XXX.XXX:5984 -e admin_username=user -e admin_password=password -p0.0.0.0:2020:2020/tcp -d selectel/shiny-flask-app

Где server_url — это Floating IP вашей виртуальной машины и порт, на котором слушает CouchDB, а admin_username и admin_password эквиваленты COUCHDB_USER и COUCHDB_PASSWORD соответственно.

Готовим базу данных

Создайте в CouchDB новую базу данных под названием Products, для чего используйте следующую команду:

curl -u user:password -X PUT http://<couchdb_ip>:5984/products

Где couchdb_ip — Floating IP виртуальной машины, на которой запущены контейнеры.

Используя API приложения создайте в CouchDB запись:

curl -v -X POST -d '{"_id": "xxxx", "name": "product1"}' -H "Content-Type: application/json" -u user:password XXX.XXX.XXX.XXX:2020/v1.0/products/createProduct

Где XXX.XXX.XXX.XXX — IP адрес виртуальной машины, на которой поднят Docker контейнер.

Проверить, что запись в базе создана, можно используя этот запрос:

curl -v -H "Content-Type: application/json" XXX.XXX.XXX.XXX:2020/v1.0/products/xxxx

Работа с проектом

Создайте новый проект в Облачной платформе или используйте существующий.

Назовите проект.

Перейдите в созданный проект.

Перейдите на вкладку Функции.

Нажмите Создать функцию.

Укажите имя функции и нажмите Создать функцию.

Нажмите Редактировать, чтобы загрузить код и настроить функцию.

Скачайте репозиторий с кодом.

Создайте архив с кодом функции, находясь в корневой директории репозитория:

tar -cvf shiny_flask_app.tar

Загрузите архив с кодом приложения из нескольких файлов или файл с кодом функции.

Укажите путь к файлу с кодом в архиве: /shiny_flask_app/api/products.py

Укажите название вызываемой функции.

Добавьте переменные окружения с помощью кнопки Добавить.

Первая переменная, которая нам необходима, admin_username. Присвойте ей значение user.

Таким же образом присвойте еще две необходимые переменные: admin_password и server_url со значениями password и XXX.XXX.XXX.XXX:5984 соответственно.

Остановимся подробнее на server_url — это IP-адрес виртуального сервера с запущенным CouchDB и порт, на котором CouchDB слушает запросы.

Далее сохраните введенную информацию и разверните функцию с помощью кнопки Сохранить и развернуть.

Чтобы вызвать функцию с помощью HTTP-запроса, сделайте ее публичной.

Скопируйте URL.

Вызовите функцию, добавив к запросу URL из панели.

curl -k -X POST --data '{"args": ["xxxx"], "kwargs": {}}' -H "Content-Type: application/json" URL

Где хххх такой же, как в запросе в начале руководства, а URL взят из настроек функции.

Готово. Вы запустили свое первое Serverless-приложение!

Пока мы готовим для вас новые материалы в блог Selectel, приходите обсуждать в комментарии. Запускали приложения? Как все прошло?

║Пробовали запускать приложения?
ⓎⒺⓈ, регулярно запускаю.
ⓃⓄ, а что так можно было?
👣 — теперь подумаю об этом.
Пробовал, но не все так ♯гладко.
Показать результаты
Переголосовать
Проголосовать
{ "author_name": "Selectel", "author_type": "editor", "tags": ["\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430","\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f","selectel","it"], "comments": 3, "likes": 7, "favorites": 45, "is_advertisement": false, "subsite_label": "dev", "id": 133267, "is_wide": true, "is_ugc": false, "date": "Tue, 16 Jun 2020 15:59:41 +0300", "is_special": false }
(function () { let cdnUrl = `https://specialsf378ef5-a.akamaihd.net/SelectelBranding/images/` let previousArticleNumber = null let currentArticleNumber = 0 let platform = 'Desktop' let articles = [ { name: 'camera', url: `${cdnUrl}CameraCat`, text: 'умную камеру для\u00A0наблюдения за\u00A0котиками', link: 'https://vc.ru/selectel/306690', num: 3 }, { name: 'chill', url: `${cdnUrl}ChillCat`, text: 'трекер, который подскажет, когда пора отдохнуть', link: 'https://vc.ru/promo/288561-eye-tracker', num: 1 }, { name: 'cloud', url: `${cdnUrl}CloudCat`, text: 'котика: даёшь ему «пять», а\u00A0он делает бэкап в облако', link: 'https://vc.ru/dev/294799-maneki-neko', num: 2 } ] let buttonCycle = document.querySelector('.button--cycle') let buttonChoose = document.querySelector('.button--choose') let buttonMobile = document.querySelector('.button--mobile') let textField = document.querySelector('.selectel-footer-subtitle') let imageAgent = document.querySelector('.image--agent') let banner = document.querySelector('.selectel-footer') buttonCycle.addEventListener('click', cycleClick) buttonChoose.addEventListener('click', () => sendEvent(`Promo ${articles[currentArticleNumber].num} Left`, 'Click')) buttonMobile.addEventListener('click', () => sendEvent(`Promo ${articles[currentArticleNumber].num} Left`, 'Click')) let media = window.matchMedia("(max-width: 570px)") media.addEventListener('change', matchMedia) function matchMedia() { if (media.matches) { platform = 'Mobile' } else { platform = 'Desktop' } update() } matchMedia() function cycleClick(event) { sendEvent(`Promo ${articles[currentArticleNumber].num} Right`, 'Click') if (event) { event.preventDefault() event.stopPropagation() } window.open('https://vc.ru/tag/selectelDIY', '_blank') //cycle(event) } function cycle(event) { // incrementArticleNumber() textField.innerHTML = generatedText() imageAgent.src = articles[currentArticleNumber].url + platform + '.svg?3' imageAgent.setAttribute("class", "") imageAgent.classList.add('image--agent', articles[currentArticleNumber].name) banner.href = articles[currentArticleNumber].link } function update() { banner.href = articles[currentArticleNumber].link imageAgent.src = articles[currentArticleNumber].url + platform + '.svg' textField.innerHTML = generatedText() } function incrementArticleNumber() { previousArticleNumber = currentArticleNumber if (currentArticleNumber >= articles.length - 1) { currentArticleNumber = 0 } else { currentArticleNumber++ } } const sendEvent = (label, action = 'Click') => { const value = `SelectelDIY — loc: Footer — ${label} — ${action}`; if (window.dataLayer !== undefined) { window.dataLayer.push({ event: 'data_event', data_description: value, }); } }; function generatedText() { let defaultText if (platform === 'Desktop') { defaultText = `Мы тут собрали %text%. Хотите научим?` } else { defaultText = `Мы тут собрали %text%.` } return defaultText.replace('%text%', articles[currentArticleNumber].text) } function getRandom(min, max) { min = Math.ceil(min) max = Math.floor(max) return Math.floor(Math.random() * (max - min + 1)) + min } (function create() { currentArticleNumber = getRandom(0, articles.length - 1) cycle() let page = document.querySelector('.page--entry') if (page) { function insertAfter() { let parents = page.querySelectorAll('[data-id="7"]') let referenceNode = parents[0] referenceNode.parentNode.insertBefore(banner, referenceNode.nextSibling); loaded() } setTimeout(() => insertAfter(), 0) } }()) function loaded() { banner.classList.add('loaded') } loadImages([ `${cdnUrl}CameraCatDesktop.svg`, `${cdnUrl}ChillCatDesktop.svg`, `${cdnUrl}CloudCatDesktop.svg`, `${cdnUrl}CameraCatMobile.svg`, `${cdnUrl}ChillCatMobile.svg`, `${cdnUrl}CloudCatMobile.svg?3`, ]) function loadImages(urls) { return Promise.all(urls.map(function (url) { return new Promise(function (resolve) { var img = document.createElement('img'); img.onload = resolve; img.onerror = resolve; img.src = url; }); })); } }())
0
3 комментария
Популярные
По порядку

Добрый день и спасибо за комментарий! Мы внесли некоторые правки в статью, чтобы более точно выразить её суть.
Хотелось дать универсальное решение, которое подойдёт стартапам. Поэтому выбрали CouchDB и простую инструкцию с докером. Хотя там может быть и MongoDB, и Postgres, и всё, с чем удобно работать.
Еще у нас есть DBaaS (https://selectel.ru/services/cloud/managed-databases/) с управляемыми базами в облаке. Тогда решением будет True Serverless. ред.

2

Странно видеть в самом же начале инструкции бессерверного приложения  необходимость создавать виртуальную машину. Например, у Azure, AWS, AliCloud уже есть нужные сервисы в облаках, в том числе различные сервисы хранения данных.

0
Читать все 3 комментария
Почему «без ТЗ результат ХЗ». Разбираем на примере CRM-систем

К нам пришел клиент, который уже пробовал внедрять CRM-систему, и принес наработки предыдущих интеграторов. У него была вроде бы работающая система, но никто ей не пользовался. В статье разберемся, почему так получается, и как делать так, чтобы такого не было.

Пример нотации согласовательного уровня Библиотека примеров BPMN
Travers – поиск инструкторов по активным видам спорта

Мы сделали второе приложение, раскатили сервис на всю Россию и изменили бизнес-модель. Многое благодаря пользователям vc.ru!

Дизайн-джем #42: мифы и легенды о русалках, японские рассказы, космические приключения и азы точных наук

В красочном дайджесте, посвящённом детским книжным иллюстрациям, от Futura by red_mad_robot.

Как не попасть в карьерную ловушку тимлида: личный опыт

Кажется, что тимлиду просто некуда расти: дальше надо либо идти в менеджмент, либо наоборот, становиться узконаправленным разработчиком. По просьбе «Лаборатории Касперского» Евгений Мацюк, который прошел в компании неординарный путь, рассказал о своих карьерных развилках во время и после тимлидства, а также поделился опытом горизонтального роста.

Курс доллара упал ниже 70 рублей впервые с лета 2020 года после повышения ключевой ставки Статьи редакции

Евро подешевел до 81,3 рубля впервые за год.

Шпаргалка для инвестора: сделки РЕПО

Рассказываем об одном из важнейших инструментов рынка ценных бумаг — сделках РЕПО.

Робот повысил конверсию продаж в B2B

В изменчивой реальности (для которой даже придумали специальной термин «VUCA-мир») компании ищут свои точки опоры. Важно не просто следовать трендам, но и предугадывать их. Особенно когда клиентское поведение и бизнес-процессы трансформируются так стремительно.

«Яндекс.Маркет»: в моем заказе вместо наушников оказалась бутылка из-под водки

Я давно хотела беспроводные наушники и наконец заказала себе Apple AirPods. Оформила заказ 15.10.2021 через Яндекс.Маркет в магазине Superbia.ru

Исследование: сотрудники хотели бы иметь комнату отдыха, бесплатный сок, а работодатели уже готовы покупать ЗОЖ-снеки

Онлайн-сервис доставки продуктов и товаров СберМаркет и исследовательское агентство Research Me спросили сотрудников, как они хотели бы питаться в офисе и что в нем видеть. В опросе приняли участие более 1500 работающих людей по всей России. Сервис также спросил работодателей – В2В-клиентов СберМаркета: что они покупают в офис, что точно никогда…

ПСБ запустил личный кабинет для предпринимателей. Там можно следить онлайн за каждым своим терминалом

Сервис предоставляется бесплатно.

Сооснователь «Кухни на районе» Олег Козырев покинул компанию Статьи редакции

Но сохранил долю в бизнесе.

null