Как развернуть веб-приложение в Azure App Service
Практика4 минРедакция Innovialabs
Коротко
Создайте 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. Схема релиза:
- Создайте слот:
az webapp deployment slot create --name shop-app --resource-group shop-rg --slot staging. - Деплойте новую версию в
staging, проверьте её. - Выполните swap:
az webapp deployment slot swap --name shop-app --resource-group shop-rg --slot staging --target-slot production.
Перед переключением платформа прогревает инстансы, поэтому пользователи не видят холодного старта. Если что-то пошло не так, повторный swap возвращает старую версию.
Важная деталь: настройки, которые не должны переезжать вместе с кодом (например, строка подключения к тестовой базе), отмечайте как deployment slot setting — они останутся привязаны к слоту.
Шаг 5. Свой домен и бесплатный SSL
- В разделе Custom domains добавьте домен. Для
wwwсоздайте у регистратора CNAME наshop-app.azurewebsites.net, для корневого домена — A-запись на IP приложения. - Добавьте TXT-запись
asuid.<поддомен>с verification ID из портала — так Azure подтверждает, что домен ваш. - Создайте 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.