Summary
In this article, I want to share the experiments of React app deployed on Azure App Service. The two patterns work correctly, 1) Root folder with node_modules, 2) Build folder with Startup commands. The startup command should be carefully chosen depending on your zip folder structure that is deployed to Azure App Service.
Code samples
React on App Service deployment experiments
TOC
Successful configuration
The contents below show how you configure React and Azure App Service to make it work correctly.
Uploaded folder
root is React root folder. build is generated with npm run build for React app.
root
.
├── README.md
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
├── src
│ ├── App.css
│ ├── App.test.tsx
│ ├── App.tsx
│ ├── index.css
│ ├── index.tsx
│ ├── logo.svg
│ ├── react-app-env.d.ts
│ ├── reportWebVitals.ts
│ └── setupTests.ts
└── tsconfig.json
root + node_modules
.
├── node_modules
├── README.md
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
├── src
│ ├── App.css
│ ├── App.test.tsx
│ ├── App.tsx
│ ├── index.css
│ ├── index.tsx
│ ├── logo.svg
│ ├── react-app-env.d.ts
│ ├── reportWebVitals.ts
│ └── setupTests.ts
└── tsconfig.json
build
upload.zip
├── asset-manifest.json
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
├── robots.txt
└── static
├── css
│ ├── main.073c9b0a.css
│ └── main.073c9b0a.css.map
├── js
│ ├── 787.9750ae9a.chunk.js
│ ├── 787.9750ae9a.chunk.js.map
│ ├── main.e0162b9f.js
│ ├── main.e0162b9f.js.LICENSE.txt
│ └── main.e0162b9f.js.map
└── media
└── logo.6ce24c58023cc2f8fd88fe9d219db6c6.svg
Startup command and WEBSITE_RUN_FROM_PACKAGE
You can see the sample ARM template sample, whici sets up startup command npm install -g serve && serve -s . and appsettings "WEBSITE_RUN_FROM_PACKAGE":"1". The reason behind this is discussed later in this article.
{
"type": "Microsoft.Web/sites",
"kind": "app",
"properties": {
"siteConfig": {
"linuxFxVersion": "NODE|16-lts",
"appCommandLine": "npm install -g serve && serve -s ."
}
}
},
{
"type": "Microsoft.Web/sites/config",
"properties": {
"WEBSITE_RUN_FROM_PACKAGE":"1"
}
}
Experiments
In this chapter, I am trying describe what trials I did and what were those results.
Responses
Application Error
Hey, Node developers! (hostingstart.html)
404
Success
Run from files or ZIP package
When you set appsettings WEBSITE_RUN_FROM_PACKAGE=1, the uploaded zip file and packagename.txt are generated. When you update the deployment source, zip files are added but packagename.txt is updated so it points to the newest zip file.
home
└── Data
└── SitePackages
├── 20220110085830.zip
├── 20220110094211.zip
├── 20220110100120.zip
├── 20220110100833.zip
└── packagename.txt
packagename.txt
20220110100833.zip
Deployed folder inside App Service
Red mark means newly added after deployment. Deployment is done through Azure CLI.
Azure CLI Powershell command example
az webapp config appsettings set --resource-group {Resource Group name} --name {App Service name} --settings WEBSITE_RUN_FROM_PACKAGE="1"
az webapp deployment source config-zip --resource-group {Resource Group name} --name {App Service name} --src .\upload.zip
WEBSITE_RUN_FROM_PACKAGE=0
WEBSITE_RUN_FROM_PACKAGE=1
Experiments: Root folder
I expected Root folder without node_module works when setting up npm install as Azure App Service Startup command. However, it did not work. I tried npm install and npm install && npm start but neither worked. The only way is to deploy together with node_modules folder. Usually node_modules folder is large and you do not want to upload it as deployment. So, deploying Root folder is not an actual option as workflow.
Experiments: Build folder
In this experiment, I create upload.zip folder and deploy to Azure App Service by CLI command. upload.zip includes index.html directly under upload.zip level. So, serve -s . works correctly. serve -s build does not work like the official documentation. Also, from the stack over flow Default documents not serving on node web app hosted on Azure, pm2 serve /home/site/wwwroot --no-daemon --spa works too for Startup command.
When you do not set up any Startup command, it will show you "Hey, Node Developers!" page, because it points to /opt/startup/hostingstart.html.
opt
├── startup
│ └── hostingstart.html
home
└── site
└── wwwroot
└── hostingstart.html









Top comments (0)