How to Set up Sapper With cPanel

author profile
Ignatius Bagussuputra
4 min read Share

Outline & Focus

  • Getting started with cPanel
  • Getting started with Node.js
  • Run and maintain Node application
  • Final steps

I don’t think I’ve seen a single post on how to properly set up a Node.js application in a shared or dedicated hosting with cPanel. Especially with what small community Svelte has, I thought I may as well contribute by sharing my experience on setting up a production-ready application bundle.

It’s today I’m finally successful on setting up my Sapper application in my hosting provider. It took me around 5 days and it was such a weird bug to begin with. Anyways, this shouldn’t be bound to a Sapper app and should work with any Node application that is acting as a server.

This tutorial assumes you already have a working application to begin with. If you don't, you can just use the template provided by Sapper at their website ->

Getting started with cPanel

Let’s get started by first making sure that your hosting provider provides a Node.js development environment and SSH access. You should be able to find it in their pricing and features page they provide. If you can’t find it, either contact the support first or make sure they provide a guaranteed refund so you can buy and test it for yourself first.

Software list provided in cPanel

You should then be able to find this section in your cPanel page, click on the Setup Node.js App and click on Create Application. You’ll see a form like presented below, fill each one according to your needs and preference.

Node app setup configuration

Here’s the explanation for each field,

Getting started with Node.js

After creating your Node application, you’ll be given a command to activate the virtual environment and enter the application root, it will look something like this

source /home/mauss/nodevenv/ && cd /home/mauss/

Copy that command and SSH to your server. Each hosting provider will be slightly different so contact the support if you’re not sure how. The general command is as follow

# some providers use different ports for SSH, but the default is 22 # just change the -p argument to your provided port ssh -p 22

After successfully entering the server, paste in the command from the previous block to enter the virtual environment.

Now, there’s really a lot of ways to do this, you’ll need to find the one you prefer by yourself. I just happen to do this with FTP/SCP. You can easily use the file manager from cPanel and upload your files there.

Using any method you know, move or copy the build result of your application to the application root folder, in my case the folder. Sapper build result is located at __sapper__/build, so all we need to do is copy this folder as well as our static folder that contains all our assets like stylesheets and images.

Finally, we’ll copy our package.json file, focus on our SSH terminal, and run

npm install

This will install all our required server dependencies to run it. While waiting for it to finish, create server.js. This is the file we defined as the application startup file when creating our Node application. It should only contain one line that points it to the server index file.


Now, you should be able to run npm start or node server.js and see your application running on your domain. If your app isn’t showing up and you’ve already tried adding :3000 at the end of it, don’t worry, we’ll cover it in the final steps.

Run and maintain Node application

Now that your application is running, you’ll want to keep it running even when you left the SSH. For this, we’ll use pm2, a Node.js daemon process manager. We can use it via the npm global installation or npx.

# global installation and usage npm i -g pm2 # run once only pm2 start server.js # via npx npx pm2 start server.js

If you want more customizability, you can run pm2 init and it will generate a file called ecosystem.config.js that you can customize for you liking. Below is my configuration file

module.exports = { apps : [{ name: 'web', script: '__sapper__/build/index.js', watch: false }], };

We can then run pm2 start ecosystem.config.js once, and each time we need to manage it, we’ll only need to call 3 commands. Each of them are self-explanatory with their commands.

pm2 stop web pm2 start web pm2 restart web

Final steps

Now here comes the crucial part, because most hosting providers won’t allow you to connect to a specific port, or I’ll assume all of you want your users to go to your website without adding :3000 to the end of the domain, we’ll need to route the traffic using the built-in Apache proxy server with an .htaccess file located in our public_html folder. You should be able to just copy the configuration below and paste it in yours.

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ http://%{HTTP_HOST}:3000/$1 [P,L]

This configuration will solve all the tedious stuff you don’t want to be messing around with, stuff like having https as the default protocol and proxying the traffic to our Node app port. If you’re setting up other application and does not use port 3000, you can just change that number in the last line to whatever port your application resides in.

And with that, you’re all set up and done! You should now be able to visit your website running your Sapper or Node app.

Find an issue with this post? Have something to add, update, or clarify? All my posts here are editable.

Just create a new Issue or PR on GitHub, any fix or addition is much appreciated! Edit