I'm trying to deploy production build of React app (created using create-react-app) to gcloud app engine flexible enviroment.
After running npm run build
, the build folder has been created:
This is my app.yaml:
# [START runtime]
runtime: nodejs
env: flex
# [END runtime]
# [START handlers]
handlers:
- url: /
static_files: build/index.html
upload: build/index.html
- url: /
static_dir: build
# [END handlers]
When deployed to App Engine, the version configuration shows:
runtime: nodejs
api_version: '1.0'
env: flexible
threadsafe: true
handlers:
- url: /
application_readable: false
static_files: build/index.html
require_matching_file: false
upload: build/index.html
- url: '/(.*)'
application_readable: false
static_files: "build/\\1"
require_matching_file: false
upload: 'build/.*'
automatic_scaling:
min_num_instances: 2
max_num_instances: 20
cpu_utilization:
target_utilization: 0.5
The development app is being served instead of the production version from the build folder. What am I doing wrong?
This file specifies how URL paths correspond to request handlers and static files. The app. yaml file also contains information about your app's code, such as the runtime and the latest version identifier. Each service in your app has its own app.
The app. yaml file defines your configuration settings for your Python runtime as well as general app, network, and other resource settings. For more information and an example, see Defining Runtime Settings.
Modify the scripts in package.json
to have GAE use serve
to serve the build
dir instead of the root directory.
Upon deployment, GAE will run npm start
to begin serving your application. By changing what the start
script maps to, you can have the build
directory served as desired. You will have to use npm run local
when doing local development with this setup, as you are changing what npm start
is doing.
This process requires you to run npm run build
before deploying to GAE. This will serve the build
directory for you, but it does not automatically run the build process for you, so that must still be done to serve your latest code in /src
.
Source: https://github.com/facebook/create-react-app/issues/2077
Code:
"scripts": {
"start": "serve -s build",
"prestart": "npm install -g serve",
"local": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
GAE will run npm start
to run your react app. Therefore you need to configure your package.json to tell GAE serve your build folder:
"scripts": {
"start": "serve -s build",
...
},
Also need to configure your .yaml
file accordingly:
handlers:
- url: /
static_files: build/index.html
upload: build/index.html
- url: /(.*)$
static_files: build/\1
upload: build/(.*)
When deploying a GAE app/service the directory containing the app/service's app.yaml
file being deployed is considered the app/service's top level directory and the content of that directory is what's being deployed. Which, in your case, matches what I suspect you're calling the development version.
If you want your build
directory to be your app/service's top dir then you need to:
create an app.yaml
file in the build
dir (manually or instruct your build process to do it)
Note: you need to adjust the paths in that file, since there won't be a build
directory in the app's directory anymore. Or try to create inside it a build -> .
symlink to itself, possibly allowing the use of the existing app.yaml
content as-is, without adjusting the paths (not 100% certain this will work, though).
deploy that build/app.yaml
file, not the one from the top (bsn
) dir.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With