Deployment
Let's deploy the todo app to railway.app.
Prepare for Production
In this tutorial, we'll deploy both the Angular app and the API server as one server-side app, and redirect all non-API requests to return the Angular app.
In addition, to follow a few basic production best practices, we'll use compression middleware to improve performance and helmet middleware for security
- Add the highlighted code lines to
src/server/index.ts
, and modify theapp.listen
function'sport
argument to prefer a port number provided by the production host'sPORT
environment variable.
// src/server/index.ts
import express from "express"
import { api } from "./api.js"
import session from "cookie-session"
import { auth } from "./auth.js"
const app = express()
app.use(
session({
secret: process.env["SESSION_SECRET"] || "my secret"
})
)
app.use(auth)
app.use(api)
const frontendFiles = process.cwd() + "/dist/remult-angular-todo/browser";
app.use(express.static(frontendFiles));
app.get("/*", (_, res) => {
res.sendFile(frontendFiles + "/index.html");
});
app.listen(process.env["PORT"] || 3002, () => console.log("Server started"));
Angular versions <17
If you're using angular version 16 or less, the result path is: '/dist/remult-angular-todo/browser
Modify the highlighted code in the api server module to prefer a
connectionString
provided by the production host'sDATABASE_URL
environment variable.ts// src/server/api.ts //... const DATABASE_URL = process.env["DATABASE_URL"]; export const api = remultExpress({ dataProvider: DATABASE_URL ? createPostgresDataProvider({ connectionString: DATABASE_URL }) : undefined, //... })
Note
In order to connect to a local PostgresDB, add DATABASE_URL
to an .env file, or simply replace process.env["DATABASE_URL"]
with your connectionString
.
If no DATABASE_URL
has found, it'll fallback to our local JSON files.
- In the root folder, create a TypeScript configuration file
tsconfig.server.json
for the build of the server project using TypeScript.
// tsconfig.server.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"esModuleInterop": true,
"noEmit": false,
"outDir": "dist",
"skipLibCheck": true,
"rootDir": "src"
},
"include": ["src/server/index.ts"]
}
- Modify the project's
build
npm script to additionally transpile the API server's TypeScript code to JavaScript (usingtsc
).
// package.json
"build": "ng build && tsc -p tsconfig.server.json"
- Modify the project's
start
npm script to start the production Node.js server.
// package.json
"start": "node dist/server/"
The todo app is now ready for deployment to production.
Test Locally
To test the application locally run
npm run build
npm run start
Now navigate to http://localhost:3002 and test the application locally
Deploy to Railway
In order to deploy the todo app to railway you'll need a railway
account. You'll also need Railway CLI installed, and you'll need to login to railway from the cli, using railway login
.
Click enter multiple times to answer all its questions with the default answer
Create a Railway
project
.From the terminal in your project folder run:
shrailway init
Set a project name.
Once that's done run the following command to open the project on railway.dev:
shrailway open
Once that's done run the following command to upload the project to railway:
shrailway up
Add Postgres Database:
- In the project on
railway.dev
, click+ Create
- Select
Database
- Select
Add PostgresSQL
- In the project on
Configure the environment variables
- Click on the project card (not the Postgres one)
- Switch to the
variables
tab - Click on
+ New Variable
, and in theVARIABLE_NAME
clickAdd Reference
and selectDATABASE_URL
- Add another variable called
SESSION_SECRET
and set it to a random string, you can use an online UUID generator - Switch to the
settings
tab - Under
Environment
click onGenerate Domain
- Click on the
Deploy
button on the top left.
Once the deployment is complete -
Click on the newly generated url to open the app in the browser and you'll see the app live in production. (it may take a few minutes to go live)
Note
If you run into trouble deploying the app to Railway, try using Railway's documentation.
That's it - our application is deployed to production, play with it and enjoy.
Love Remult? Give our repo a star.⭐