Перейти к содержанию
Innovialabs

Как развернуть веб-приложение в Azure App Service

Практика4 мин

Коротко

Создайте App Service plan (он задаёт регион, ОС и тариф), в нём веб-приложение с нужным runtime, разверните код через GitHub Actions или zip deploy, вынесите секреты в app settings, а релизы делайте через staging-слот и swap — так обновление проходит без простоя.

Коротко: как это устроено

Azure App Service — управляемый хостинг для веб-приложений: вы загружаете код, а серверы, ОС, балансировка и обновления платформы остаются на стороне Azure. Работа строится из двух сущностей:

  • App Service plan — «железо»: регион, операционная система (Linux или Windows), тариф и число инстансов. Вы платите именно за план.
  • Web App — само приложение внутри плана: runtime, код, настройки, домены. В одном плане может жить несколько приложений, и они делят его ресурсы.

Порядок такой: группа ресурсов → план → приложение → деплой → настройки → домен и SSL → слоты для релизов.

Шаг 1. Создайте план и приложение

Удобнее всего через Azure CLI — команды можно сохранить и повторить:

az group create --name shop-rg --location westeurope
az appservice plan create --name shop-plan --resource-group shop-rg --sku B1 --is-linux
az webapp create --name shop-app --resource-group shop-rg --plan shop-plan --runtime "NODE:20-lts"

Имя приложения должно быть уникальным: оно станет адресом shop-app.azurewebsites.net. Список доступных runtime для Node.js, .NET и других стеков покажет az webapp list-runtimes — версии со временем меняются, поэтому сверяйтесь с ним.

Шаг 2. Разверните код

Zip deploy — самый быстрый способ для первого запуска или ручного релиза. Соберите проект, упакуйте и отправьте:

az webapp deploy --resource-group shop-rg --name shop-app --src-path app.zip --type zip

Если в архиве исходники без node_modules, включите сборку на стороне платформы настройкой SCM_DO_BUILD_DURING_DEPLOYMENT=true. Для .NET обычно архивируют уже готовый результат dotnet publish.

GitHub Actions — правильный вариант для постоянной работы. Мастер в разделе Deployment Center сам создаёт workflow-файл и секрет с учётными данными. Ключевой шаг выглядит так:

- uses: azure/webapps-deploy@v3
  with:
    app-name: shop-app
    slot-name: staging
    publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
    package: .

Для production-проектов вместо publish profile лучше настроить вход через OpenID Connect: тогда в репозитории не хранится долгоживущий секрет.

Шаг 3. Настройте app settings

Строки подключения, ключи API и режим работы не кладите в код. В App Service они задаются как app settings и попадают в приложение как переменные окружения:

az webapp config appsettings set --resource-group shop-rg --name shop-app --settings NODE_ENV=production API_URL=https://api.example.com

Что ещё стоит включить сразу:

  • HTTPS Only — принудительный редирект на HTTPS;
  • Always On (на платных тарифах) — чтобы приложение не «засыпало» без трафика;
  • Health check — путь вроде /health, по которому платформа понимает, что инстанс жив;
  • логи приложения — без них ошибки после деплоя придётся угадывать.

Шаг 4. Релизы без простоя через слоты

Deployment slot — это отдельная копия приложения со своим адресом, например shop-app-staging.azurewebsites.net. Схема релиза:

  1. Создайте слот: az webapp deployment slot create --name shop-app --resource-group shop-rg --slot staging.
  2. Деплойте новую версию в staging, проверьте её.
  3. Выполните swap: az webapp deployment slot swap --name shop-app --resource-group shop-rg --slot staging --target-slot production.

Перед переключением платформа прогревает инстансы, поэтому пользователи не видят холодного старта. Если что-то пошло не так, повторный swap возвращает старую версию.

Важная деталь: настройки, которые не должны переезжать вместе с кодом (например, строка подключения к тестовой базе), отмечайте как deployment slot setting — они останутся привязаны к слоту.

Шаг 5. Свой домен и бесплатный SSL

  1. В разделе Custom domains добавьте домен. Для www создайте у регистратора CNAME на shop-app.azurewebsites.net, для корневого домена — A-запись на IP приложения.
  2. Добавьте TXT-запись asuid.<поддомен> с verification ID из портала — так Azure подтверждает, что домен ваш.
  3. Создайте App Service Managed Certificate и привяжите его к домену с типом SNI SSL. Сертификат бесплатный и продлевается автоматически, но не поддерживает wildcard-домены.

Как выбрать тариф

УровеньКогда подходит
Free / SharedЭксперименты и демо: общие ресурсы, без SLA и многих функций
BasicНебольшой production без слотов и автомасштабирования
StandardНужны слоты, автомасштабирование, резервные копии
PremiumВысокая нагрузка, больше памяти и слотов, приватные сети

Ориентируйтесь на функции, а не только на цену: если нужны релизы без простоя, Basic не подойдёт. Начинайте с минимального подходящего уровня — план можно поднять или опустить без переустановки приложения. Актуальные цены зависят от региона и ОС, их удобно считать в официальном калькуляторе Azure.

Частые ошибки

  • Приложение слушает фиксированный порт. Node.js-приложение должно брать порт из process.env.PORT.
  • Секреты в репозитории вместо app settings.
  • Деплой сразу в production без слота — любая ошибка видна пользователям.
  • Слишком много приложений в одном плане — они конкурируют за память и CPU.

Частые вопросы

На виртуальной машине вы сами обновляете ОС, настраиваете веб-сервер и балансировку. App Service берёт это на себя, а вы отвечаете только за код и настройки. Взамен меньше контроля над окружением.

Поможем с этим

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

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.