Хостим OneScript.Web приложение

23.08.18

Разработка - OneScript

Удобная возможность для размещения своего OneScript.Web приложение, это завернуть его в docker. Остается вопрос: где разместить контейнер, сделать это можно на vscale или DO, но хочется упростить и не делать установку самого docker на хосте. Один из вариантов - это сервис now https://zeit.co/.

Вводная

Сервис now позволяет хостить node.js, docker или статику и есть бесплатный план, на котором можно разместить до 3 инстансев. Для развертывания своего приложение как контейнер, достаточно добавить в проект файл Dockerfile такого содержания:

FROM evilbeaver/oscript-web:dev

COPY src /app

и потом в командной строке выполнить

now

Но лучше более развернуто сказать, что мы хотим

now /pach/to/project/ --docker --public --token MyToken --nane MyProjectName -l --regions bru1

в консоли нам будет написан адрес 3го уровня, по которому надо развернуть наше приложение. Адрес будет состоять из MyProjectName-НекийНаборСлучайныхСимволов.now.sh. При каждом развертывании у нас будет новый адрес приложения, но есть возможность назначить этот инстанс для домена в виде MyProjectName.now.sh. Для этого в консоли надо выполнить:

now alias --token MyToken set MyProjectName-НекийНаборСлучайныхСимволов.now.sh MyProjectName.now.sh

Помним, что на бесплатном плане у нас есть возможность развернуть только 3 инстраса, Что же делать с ранее развернутыми?

now rm --token MyToken MyProjectName -s -y

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

Также лучше отключить автоматическое скалирование приложения, так как одно развертывание может так же быть увеличено по количеству инстансев.

rem скажем что для региона sfo1 нам вообще не нужен скейл

now scale --token MyToken MyProjectName.now.sh sfo1 0 0

rem а для региона bru1 минимум 1 и максимум 1 инстанс

now scale --token MyToken MyProjectName.now.sh bru1 1 1

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

В итоге мы получаем сервис, имеющий домен с защищенным сертификатом. Такое приложение можно использовать, например, для навыков Алисы, ботов и тому подобного.

У бесплатного плана есть еще ряд особенностей, весь код приложения доступен по адресу MyProjectName.now.sh/_src, там же можно увидеть лог работы приложения, лог также имеет ограничение, после определенного количества выводов информации в него, сообщения заменяются информацией о том, что лимит лога исчерпан и надо подумать о приобретении платного плана, зато ошибки, вызванные исключением, нормально выводятся даже несмотря на исчерпанный лимит. Еще неприятной особенностью является то, что инстанс уходит в режим сна после того, как в течение какого-то времени к нему никто не обращался, но после очередного обращения, сервис быстро пробуждается. Но пробуждается он в том состоянии, в котором был развернут, т.е. если в процессе работы были накоплены какие то данные в памяти или в файле, после ухода в сон и пробуждения, они будут потеряны.

Сквозной пример

Идея для примера взята из статьи Проверка билетов на сайте ФИФА на чемпионат мира 2018, адрес развернутого сервиса - https://tickets-fifa.now.sh, репозиторий проекта - https://gitlab.com/pallid/tickets-fifa.

Для начала надо решить проблему с засыпанием. Варианты:

  • периодически делать обращение к сервису самом
  • сделать задачу в планировщике
  • добавить приложение в систему для мониторинга
  • реализовать обращение внутри самого сервиса

Последние два варианта самое то, тем более если у нас несколько приложений в экосистеме, то предпоследний просто необходим. Но давайте сделаем последний вариант.

Предположим, что ранее уже была реализована задача для мониторинга, и приложение отвечает некой информацией по адресу https://tickets-fifa.now.sh/status

status

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

Процедура ВыполнитьНастройкиНезасыпания()

    СчетчикДляЗапросаСтатуса = 0;
    АдресПриложения = ПолучитьПеременнуюСреды("ADDRESS_APP");
    Если АдресПриложения = Неопределено Тогда
        АдресПриложения = "localhost";
    КонецЕсли;

    Лог.Информация("АДРЕС ПРИЛОЖЕНИЯ - %1", АдресПриложения);
    ПортПриложения = ПолучитьПеременнуюСреды("PORT_APP");
    Если ПортПриложения = Неопределено Тогда
        ПортПриложения = 5000;
    КонецЕсли;

    Лог.Информация("ПОРТ ПРИЛОЖЕНИЯ - %1", ПортПриложения);

КонецПроцедуры

далее в комадне развертывания указать эти переменные, добавив

-e ADDRESS_APP=https://MyProjectName.now.sh -e PORT_APP=443

так же в методе основного регламентного задания добавить вызов ПолезнаяНагрузкаДляНезасыпания()

Процедура ПолезнаяНагрузкаДляНезасыпания()

    СчетчикДляЗапросаСтатуса = НастройкиПриложения.СчетчикДляЗапросаСтатуса;
    Лог.Отладка("СчетчикДляЗапросаСтатуса - %1", СчетчикДляЗапросаСтатуса);

    Если СчетчикДляЗапросаСтатуса >= 30 Тогда
        Лог.Отладка("ПолезнаяНагрузкаДляНезасыпания - будет выполнен запрос статуса");
        ПолучитьСтатусПриложения();
        СчетчикДляЗапросаСтатуса = 0;
    КонецЕсли;

    СчетчикДляЗапросаСтатуса = СчетчикДляЗапросаСтатуса + 1;
    НастройкиПриложения.СчетчикДляЗапросаСтатуса = СчетчикДляЗапросаСтатуса;

КонецПроцедуры

Процедура ПолучитьСтатусПриложения() Экспорт

    Адрес = НастройкиПриложения.АдресПриложения;
    Порт = НастройкиПриложения.ПортПриложения;
    HTTPСоединение = Новый HTTPСоединение(Адрес, Порт);
    Ресурс = "/status";
    Запрос = Новый HTTPЗапрос;
    Запрос.АдресРесурса = Ресурс;
    Ответ = HTTPСоединение.Получить(Запрос);

    Результат = ОбщегоНазначения.ПрочитатьОтветЗапроса(Ответ);

КонецПроцедуры

Таким образом после каждых 30 итераций основного регламента будет выполнено получение статуса приложения, так как к нашему сервису будет постоянное обращение, приложение не уйдет в сон.

Непрерывная сборка и доставка

Рецепт для Gitlab-ci

image: "pallid/now-for-oscript:latest"

stages:
  - build
  - deploy
 
build:
  stage: build

  script:
  - grep '%ver' -P -R -I -l ./src/packagedef | xargs sed -i 's/%ver/'$CI_COMMIT_REF_NAME'/g'
  - mkdir ./build
  - opm build . -mf ./src/packagedef -out ./build
  - mv ./build/$CI_PROJECT_NAME-$CI_COMMIT_REF_NAME.ospx ./$CI_PROJECT_NAME-$CI_COMMIT_REF_NAME.ospx
  artifacts:
    name: "$CI_PROJECT_NAME-$CI_COMMIT_REF_NAME"
    paths:
    - $CI_PROJECT_NAME-$CI_COMMIT_REF_NAME.ospx
  only:
    - tags  

"deploy to now":
  stage: deploy
  variables:
    GIT_STRATEGY: none
  script:
  - opm install -f $CI_PROJECT_NAME-$CI_COMMIT_REF_NAME.ospx -dest .
  - cd ./$CI_PROJECT_NAME/src && opm install -l && cd ..
  - NOW_URL=$(now --docker -p --token ${NOW_TOKEN} -n ${CI_PROJECT_NAME} -l --regions bru1 -e ADDRESS_APP=https://${CI_PROJECT_NAME}.now.sh -e PORT_APP=443)
  - echo "app deploy to $NOW_URL"
  - echo "create alias for ${NOW_URL} to ${CI_PROJECT_NAME}.now.sh"
  - now ls ${CI_PROJECT_NAME} -t ${NOW_TOKEN} | head -6
  - now alias -t ${NOW_TOKEN} set ${NOW_URL} ${CI_PROJECT_NAME}.now.sh
  - now rm -t ${NOW_TOKEN} ${CI_PROJECT_NAME} -s -y
  artifacts:
    when: on_failure
    paths:
    - .
    expire_in: 1 day
  only:
    - tags  

При установке тега будет выполняться сборка пакета и его развертывание в now. Для работы взят образ “pallid/now-for-oscript:latest” на основе “evilbeaver/onescript:latest” с добавление cli для now. При развертывании будет выполнено переподключение домена к новому инстансу и удаление неиспользуемых.

 

UPD  от 23.08.2018

К сожалению данный вариант развертывания на сервисе now больше не пригоден, так как теперь в сервисе появились ограничения на размер образа. Максимальный размер 100mb, размер образа evilbeaver/oscript-web:dev ~190mb

См. также

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    2322    vkrivov@yandex.ru    8    

17

DevOps и автоматизация разработки OneScript Системный администратор Программист Стажер Бесплатно (free)

Рассмотрим создание самоформирующейся документации через комментарии и соглашения: как это сделать и зачем, с описанием полного цикла от исходников конфигурации до странички в интернете

17.06.2024    3754    bayselonarrend    2    

60

OneScript Программист Стажер Бесплатно (free)

Поговорим про меню, спиннеры, прогресс-бары и прочие свистелки для CLI приложений на OneScript

20.05.2024    2422    bayselonarrend    18    

70

Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Бесплатно (free)

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    2027    bayselonarrend    3    

41

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

17.01.2024    3902    kamisov    19    

62

OneScript Программист Бесплатно (free)

Думаете, на OneScript неудобно создавать сложные инфраструктурные приложения? Ошибаетесь. Благодаря фреймворку ОСень за последний год экосистема библиотек, упрощающих написание собственных приложений, существенно выросла. Расскажем о самых передовых технологиях OneScript. Спойлер: будет много рефлексии, мета-аннотаций, желудей, напильников и дубов с завязями.

21.11.2023    3724    NikitaIvanchenko    16    

48

Инструментарий разработчика Работа с интерфейсом OneScript Программист Россия Бесплатно (free)

Представленная библиотека позволяет создать многопоточный TCP сервер, к которому может одновременно подключиться множество TCP клиентов с удаленных компьютеров. Эти клиенты могут вызывать методы скриптов как на сервере, так и на других клиентах. Методы будут выполнены в контексте скрипта на удаленной машине. Возможна передача параметров в метод и получение результата. Для TCP клиента можно создать графический интерфейс с большим набором элементов управления, модальными диалоговыми окнами и с обработкой событий.

31.07.2023    2332    ahyahy    8    

32

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Программист Бесплатно (free)

Итак! Представим, что наступил момент, когда разработка через исходный код реализована на предприятии в полном объеме. Мы разрабатываем в EDT или конфигураторе (но выгружаем конфигурацию в исходный код), версионируем внешние отчеты и обработки и расширения, собираем релизы, проверяем код статическим анализом, в разработке царит гармония и мир. Красота! Но менеджерам этого мало, всегда хочется чего-то еще, и вот мне прилетает задача - дай статистику по вкладу в код каждого разработчика.

13.03.2023    4576    ardn    3    

27
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Evil Beaver 8170 04.07.18 15:56 Сейчас в теме
Отдельное спасибо за пост по os.web

Небольшое уточнение:

https://gitlab.com/pallid/tickets-fifa/blob/master/src/main.os#L18

Вот тут у вас второй маршрут работать не будет, т.к. он перекрывается первым. Адрес /status подпадает под шаблон "{controller=home}/{action=index}", поскольку home - это значение по умолчанию. При переходе по адресу /status контроллер примет значение status и отдельный маршрут под него не нужен.

В остальном - классно, спасибо!
2. pallid 272 04.07.18 16:01 Сейчас в теме
(1) Большое спасибо за os.web

Понял, исправлю
ZhdanovR; +1 Ответить
3. pallid 272 23.08.18 12:48 Сейчас в теме
К сожалению данный вариант развертывания на сервисе now больше не пригоден, так как теперь в сервисе появились ограничения на размер образа. Максимальный размер 100mb, размер образа evilbeaver/oscript-web:dev ~190mb
troubleshooter; +1 Ответить
Оставьте свое сообщение