Deploying applications has become increasingly accessible, with a range of free and paid hosting options like Render, AWS, and DigitalOcean. However, for developers who want to learn, experiment, and deploy applications without recurring hosting fees, a Raspberry Pi offers an excellent alternative. This compact yet powerful device allows you to create your own Linux-based server for hosting web applications.
In this blog, we’ll explore how to deploy a TypeScript Node.js application using MySQL (MariaDB on Raspberry Pi) and Prisma ORM on a Raspberry Pi. Additionally, we’ll configure NGINX for reverse proxying and use Ngrok to expose the application to the internet. Let’s dive in!
Tools Overview
Raspberry Pi
A low-cost, single-board computer that runs a Linux-based operating system. It’s ideal for creating your own server for IoT or web applications.
Node.js & TypeScript
Node.js is a runtime environment for executing JavaScript on the server, and TypeScript adds static typing to JavaScript, making the codebase more maintainable.
MySQL (MariaDB on Raspberry Pi)
A popular relational database system, MariaDB is a compatible replacement for MySQL and is lightweight enough for a Raspberry Pi.
Prisma ORM
An Object-Relational Mapping (ORM) tool that simplifies database interactions with a type-safe query language and schema migrations.
NGINX
A high-performance HTTP server and reverse proxy server. It helps route traffic to your Node.js application.
Ngrok
A tunneling tool that exposes your locally hosted applications to the internet securely without complex network configurations.
Prerequisites
- A working Raspberry Pi - Ensure that SSH is enabled on the Raspberry Pi and you can access it remotely.
- Github Repository - Your Node.js TypeScript application should be hosted in a GitHub repository for easy deployment.
- Ngrok Account - Create a free account on Ngrok to obtain an auth token for exposing your Raspberry Pi app to the internet.
Setting Up Raspberry Pi
-
Install the OS
Setup your Raspberry Pi with an OS like Raspberry Pi OS. Use the Raspberry Pi Imager to find other OS compatible to your Raspberry Pi.
-
Find the IP Address
Use a tool like Angry IP Scanner to discover your Raspberry Pi’s IP address. Ensure the Raspberry Pi is connected to the same network as your local machine.
-
Check Raspberry Pi Status
ping <ip_address_of_rpi> </ip_address_of_rpi>
-
SSH Into the Raspberry Pi
ssh <username>@<ip_address_of_rpi> </ip_address_of_rpi></username>
Replace
with your Raspberry Pi’s username and with the IP address and then enter the password. -
Update the System
sudo apt update && sudo apt upgrade
-
Install Git
Check if git is installed. If not, run the below command to install git
sudo apt install git
Installing Node.js
To install node js, we will be using nvm (Node Version Manager). It allows you to quickly install and use different version of node via command line.
-
Install NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
-
Verify Installation
nvm --version
-
Install the Latest LTS Version of Node.js
nvm install --lts
-
Verify Node.js and npm Installation
node --version # v22.12.0 npm --version # 10.9.0
Setting Up MySQL (MariaDB)
For Raspberry Pi OS, we will be installing MariaDB.
-
Install the MariaDB SQL Server
sudo apt install mariadb-server
-
Secure MariaDB Installation
sudo mysql_secure_installation
Follow the prompts to secure your database.
- Enter the current root password: - Press Enter when asked to enter the current password for the root user (since it hasn’t been set yet).
- Set the root password: - Type n when prompted to set the root password (we’ll set it later).
- Remove anonymous users: - Type Y to remove anonymous users and improve security. (For testing purposes, you can type n to keep anonymous users.)
- Disallow root login remotely: - Type n to allow root login remotely (optional but less secure).
- Remove the test database: - Type y to remove the test database and access to it. (Type n if you want to keep it.)
-
Login to MariaDB Client
sudo mysql
-
Setup a Root password for MariaDB
First, we need to tell the database server to reload the grant tables.
MariaDB [(none)]> FLUSH PRIVILEGES;
Change the root password with below query.
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY '<new_password>'; </new_password>
Replace
with your own password. Use the exit command to exit from MariaDB CLI.
MariaDB [(none)]> exit; Bye
-
Login to MariaDB Client With Root User
ping <ip_address_of_rpi> </ip_address_of_rpi>
Enter the password for the root user.
Setting up Database and User
Let's create a new database and a user. We will be granting all privileges to the new user for the new database we have created.
-
Create a Database
ssh <username>@<ip_address_of_rpi> </ip_address_of_rpi></username>
-
Create a New User With Password
sudo apt update && sudo apt upgrade
-
Grant Privilege To New User Created
sudo apt install git
-
Flush The Privileges Table
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
Exit from mysql client using exit command.
-
Login With New User
nvm --version
Enter the password you used while creating the user.
-
Verify User Can List The Database
nvm install --lts
That’s it! We will use this database and user in our application.
Setup your Node.js Application
-
Clone Your Github Repository
node --version # v22.12.0 npm --version # 10.9.0
-
Navigate To Your Project Repository
sudo apt install mariadb-server
-
Install Project Dependencies
sudo mysql_secure_installation
-
Compile TypeScript Code
sudo mysql
Make sure you have configured the outDir property in your tsconfig.json file. This specifies the directory where the compiled JavaScript code will be generated. By default, it’s commonly set to dist, but you can customize it based on your project structure.
Setting up environment variables (Optional)
If your project uses environment variables, you need to set them on your Raspberry Pi. You can create a .env file in the root directory of your project to store all the environment variables.
-
Create .env File
MariaDB [(none)]> FLUSH PRIVILEGES;
-
Update .env File
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY '<new_password>'; </new_password>
-
Enter your Environment Variables
MariaDB [(none)]> exit; Bye
Replace the
, and with the one you created in the previous steps. Save the file by pressing Ctrl O, then press Enter, and exit the editor using Ctrl X.
Migrate Prisma Schema
If you are using Prisma, all the schema files will be located inside the prisma/schema directory. We will now deploy these schemas to the database.
Run the below command
sudo mysql -u root -p
This command will use the DATABASE_URL provided in the .env file to deploy the schemas to the database. You can verify the deployment by logging into the MySQL client and using the command SHOW TABLES; to list all the tables.
Setting Up PM2
PM2 is a production process manager for Node.js applications which helps in managing and keeping the application online. Install PM2 to manage your Node.js application.
ping <ip_address_of_rpi> </ip_address_of_rpi>
Configuring NGINX
-
Install NGINX
ssh <username>@<ip_address_of_rpi> </ip_address_of_rpi></username>
-
Create a Site Configuration
sudo apt update && sudo apt upgrade
-
Add the Below Code
sudo apt install git
Here’s a breakdown of each part:
listen 80; This directive tells NGINX to listen on port 80, which is the default port for HTTP traffic.
server_name
; This specifies the domain name or IP address of your Raspberry Pi. Replace with the actual IP address of your Raspberry Pi. NGINX will respond to requests sent to this address.location / { ... } This block defines how NGINX should handle requests to the root URL (/). Essentially, this tells NGINX that whenever a request is made to the root, it should be forwarded to the backend (your Node.js application) running on the specified port.
proxy_pass http://localhost:YOUR_NODE_JS_PORT; This is the key line that forwards incoming requests to your Node.js application. Replace YOUR_NODE_JS_PORT with the actual port where your Node.js app is running (for example, 5000). The requests will be sent to the Node.js application running on the same machine (localhost).
proxy_http_version 1.1; This sets the HTTP version to 1.1 for the proxy connection, which ensures better handling of certain features like WebSockets.
proxy_set_header Upgrade $http_upgrade; This header allows WebSocket connections to be upgraded, which is important for real-time applications.
proxy_set_header Connection 'upgrade'; This header is used alongside the Upgrade header to manage WebSocket connections, ensuring that the connection is properly upgraded from HTTP to WebSocket.
proxy_set_header Host $host; This passes the original Host header from the client request to the backend server. This is useful for applications that rely on the original Host header (e.g., for routing or virtual hosting).
proxy_cache_bypass $http_upgrade; This ensures that WebSocket connections bypass any caching mechanisms, allowing real-time communication to work without interference from caching.
Save the file by pressing Ctrl O, then press Enter, and exit the editor using Ctrl X.
-
Enable the Site Configuration
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
-
Test NGINX Configuration
nvm --version
If the test is successfull, you will see something like below:
ping <ip_address_of_rpi> </ip_address_of_rpi>
-
Restart NGINX Server To Apply the Changes
ssh <username>@<ip_address_of_rpi> </ip_address_of_rpi></username>
-
Check NGINX Server Status
sudo apt update && sudo apt upgrade
Running the Application
Navigate to your project
-
Start Your Application Using PM2
If you have setup a script in package.json, use the below command:
sudo apt install git
Or, you can directly run you application using index.js file in your dist directory:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
You can also check the logs using below command:
nvm --version
Now, check your app by entering the IP address of your Raspberry Pi in the browser on your local machine. It should work. Make sure both your local machine and Raspberry Pi are connected to the same network; otherwise, it will not work.
Exposing Your App To The World Using Ngrok
Now that you have deployed your app to the Raspberry Pi, you can only access the app from the same network in which the Raspberry Pi is running. To expose it to the internet, we need to use port forwarding.
You can set up port forwarding using your router settings, but in this case, I will be using ngrok. Ngrok is useful for development, allowing us to run our apps for testing purposes for free.
Make sure to create an account by visiting https://dashboard.ngrok.com/login. You will need the auth token to configure ngrok on the Raspberry Pi.
-
Install Ngrok
nvm install --lts
-
Add your auth token to ngrok configuration file
node --version # v22.12.0 npm --version # 10.9.0
-
Disable default nginx config file
sudo apt install mariadb-server
-
Test NGINX configuration
sudo mysql_secure_installation
-
Restart NGINX server to apply the changes
sudo mysql
-
Deploy your app online
MariaDB [(none)]> FLUSH PRIVILEGES;
This should provide a URL like https://xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx.ngrok-free.app/ that forwards traffic to your Node.js app. You can navigate to this URL from any other network and access your application.
Summary
In this guide, we successfully deployed a TypeScript Node.js application with MySQL and Prisma on a Raspberry Pi. We configured NGINX as a reverse proxy and used Ngrok to make the application accessible over the internet. With this setup, you have your own cost-effective, self-hosted development server.
This approach is perfect for learning and experimenting with full-stack application deployment, all while gaining valuable experience in server management.
Let me know if you deploy your application using this guide—I’d love to hear about your experience! ?
The above is the detailed content of Deploy a Node.js Application Using MySQL and Prisma on a Raspberry Pi. For more information, please follow other related articles on the PHP Chinese website!

InnoDBBufferPool reduces disk I/O by caching data and indexing pages, improving database performance. Its working principle includes: 1. Data reading: Read data from BufferPool; 2. Data writing: After modifying the data, write to BufferPool and refresh it to disk regularly; 3. Cache management: Use the LRU algorithm to manage cache pages; 4. Reading mechanism: Load adjacent data pages in advance. By sizing the BufferPool and using multiple instances, database performance can be optimized.

Compared with other programming languages, MySQL is mainly used to store and manage data, while other languages such as Python, Java, and C are used for logical processing and application development. MySQL is known for its high performance, scalability and cross-platform support, suitable for data management needs, while other languages have advantages in their respective fields such as data analytics, enterprise applications, and system programming.

MySQL is worth learning because it is a powerful open source database management system suitable for data storage, management and analysis. 1) MySQL is a relational database that uses SQL to operate data and is suitable for structured data management. 2) The SQL language is the key to interacting with MySQL and supports CRUD operations. 3) The working principle of MySQL includes client/server architecture, storage engine and query optimizer. 4) Basic usage includes creating databases and tables, and advanced usage involves joining tables using JOIN. 5) Common errors include syntax errors and permission issues, and debugging skills include checking syntax and using EXPLAIN commands. 6) Performance optimization involves the use of indexes, optimization of SQL statements and regular maintenance of databases.

MySQL is suitable for beginners to learn database skills. 1. Install MySQL server and client tools. 2. Understand basic SQL queries, such as SELECT. 3. Master data operations: create tables, insert, update, and delete data. 4. Learn advanced skills: subquery and window functions. 5. Debugging and optimization: Check syntax, use indexes, avoid SELECT*, and use LIMIT.

MySQL efficiently manages structured data through table structure and SQL query, and implements inter-table relationships through foreign keys. 1. Define the data format and type when creating a table. 2. Use foreign keys to establish relationships between tables. 3. Improve performance through indexing and query optimization. 4. Regularly backup and monitor databases to ensure data security and performance optimization.

MySQL is an open source relational database management system that is widely used in Web development. Its key features include: 1. Supports multiple storage engines, such as InnoDB and MyISAM, suitable for different scenarios; 2. Provides master-slave replication functions to facilitate load balancing and data backup; 3. Improve query efficiency through query optimization and index use.

SQL is used to interact with MySQL database to realize data addition, deletion, modification, inspection and database design. 1) SQL performs data operations through SELECT, INSERT, UPDATE, DELETE statements; 2) Use CREATE, ALTER, DROP statements for database design and management; 3) Complex queries and data analysis are implemented through SQL to improve business decision-making efficiency.

The basic operations of MySQL include creating databases, tables, and using SQL to perform CRUD operations on data. 1. Create a database: CREATEDATABASEmy_first_db; 2. Create a table: CREATETABLEbooks(idINTAUTO_INCREMENTPRIMARYKEY, titleVARCHAR(100)NOTNULL, authorVARCHAR(100)NOTNULL, published_yearINT); 3. Insert data: INSERTINTObooks(title, author, published_year)VA


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

Notepad++7.3.1
Easy-to-use and free code editor

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

EditPlus Chinese cracked version
Small size, syntax highlighting, does not support code prompt function

Dreamweaver CS6
Visual web development tools