Moving from Replit’s hosted environment to your own Virtual Private Server (VPS) gives you greater control, better performance, and more deployment flexibility. In this comprehensive guide, we’ll walk through deploying a Replit application to a Ramnode VPS running Ubuntu 24 or higher.
Prerequisites
Before we begin, ensure you have:
- A Ramnode VPS with Ubuntu 24.04 LTS or higher
- SSH access to your VPS (root or sudo privileges)
- A Replit application ready for deployment
- Basic familiarity with Linux command line
- Your application’s dependencies documented
Preparing Your Ramnode VPS
Initial Server Setup
First, connect to your Ramnode VPS via SSH:
ssh root@your-server-ip
Update your system packages:
apt update && apt upgrade -y
Install essential packages:
apt install -y curl wget git unzip software-properties-common apt-transport-https ca-certificates gnupg lsb-release
Create a Non-Root User
For security purposes, create a dedicated user for your application:
adduser appuser
usermod -aG sudo appuser
su - appuser
Installing Required Runtime Environment
The installation steps depend on your application’s technology stack. Here are the most common setups:
For Node.js Applications
Install Node.js using NodeSource repository:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
Verify installation:
node --version
npm --version
For Python Applications
Ubuntu 24 comes with Python 3.12 by default, but install pip and venv:
sudo apt install -y python3-pip python3-venv python3-dev
For Other Languages
- Go:
sudo apt install golang-go
- Java:
sudo apt install openjdk-17-jdk
- PHP:
sudo apt install php php-cli php-fpm
Transferring Your Replit Code
Method 1: Using Git (Recommended)
If your Replit project is connected to GitHub:
cd /home/appuser
git clone https://github.com/yourusername/your-repo.git
cd your-repo
Method 2: Direct Download from Replit
In your Replit project, download the entire project as a ZIP file, then upload it to your VPS:
# On your local machine
scp your-project.zip appuser@your-server-ip:/home/appuser/
# On your VPS
cd /home/appuser
unzip your-project.zip
cd your-project-folder
Method 3: Using Replit’s Git Integration
If your Replit has Git initialized:
# In your Replit shell
git remote add origin https://github.com/yourusername/your-repo.git
git add .
git commit -m "Prepare for VPS deployment"
git push -u origin main
Then clone on your VPS as shown in Method 1.
Installing Application Dependencies
Navigate to your application directory and install dependencies:
For Node.js:
npm install
For Python:
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
For other package managers:
- pip:
pip install -r requirements.txt
- composer:
composer install
- go mod:
go mod download
Configuring Environment Variables
Create a .env
file for your environment variables:
nano .env
Add your environment variables:
NODE_ENV=production
PORT=3000
DATABASE_URL=your-database-url
API_KEY=your-api-key
For security, set appropriate permissions:
chmod 600 .env
Setting Up a Reverse Proxy with Nginx
Install Nginx:
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
Create a server block configuration:
sudo nano /etc/nginx/sites-available/your-app
Add the following configuration:
server {
listen 80;
server_name your-domain.com www.your-domain.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
Enable the site:
sudo ln -s /etc/nginx/sites-available/your-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Creating a System Service
Create a systemd service file for your application:
sudo nano /etc/systemd/system/your-app.service
For a Node.js application:
[Unit]
Description=Your App
Documentation=https://your-app.com
After=network.target
[Service]
Environment=NODE_ENV=production
Type=simple
User=appuser
WorkingDirectory=/home/appuser/your-project
ExecStart=/usr/bin/node server.js
Restart=on-failure
[Install]
WantedBy=multi-user.target
For a Python application:
[Unit]
Description=Your Python App
After=network.target
[Service]
User=appuser
WorkingDirectory=/home/appuser/your-project
Environment=PATH=/home/appuser/your-project/venv/bin
ExecStart=/home/appuser/your-project/venv/bin/python app.py
Restart=always
[Install]
WantedBy=multi-user.target
Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable your-app
sudo systemctl start your-app
sudo systemctl status your-app
Setting Up SSL with Let’s Encrypt
Install Certbot:
sudo apt install certbot python3-certbot-nginx -y
Obtain SSL certificate:
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
Set up automatic renewal:
sudo crontab -e
Add this line:
0 12 * * * /usr/bin/certbot renew --quiet
Setting Up a Firewall
Configure UFW (Uncomplicated Firewall):
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable
Database Setup (If Required)
For PostgreSQL:
sudo apt install postgresql postgresql-contrib -y
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo -u postgres psql
CREATE DATABASE your_app_db;
CREATE USER your_app_user WITH ENCRYPTED PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE your_app_db TO your_app_user;
\q
For MySQL:
sudo apt install mysql-server -y
sudo mysql_secure_installation
Monitoring and Logging
Set up log rotation:
sudo nano /etc/logrotate.d/your-app
/home/appuser/your-project/logs/*.log {
daily
missingok
rotate 52
compress
notifempty
copytruncate
}
Monitor your application:
# Check service status
sudo systemctl status your-app
# View logs
journalctl -u your-app -f
# Check Nginx logs
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
Performance Optimization
Enable Gzip compression in Nginx:
sudo nano /etc/nginx/nginx.conf
Uncomment or add:
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/javascript;
For Node.js applications, consider using PM2:
npm install -g pm2
pm2 start server.js --name "your-app"
pm2 startup
pm2 save
Troubleshooting Common Issues
Application Won’t Start
Check the service logs:
journalctl -u your-app -n 50
Port Already in Use
Find and kill the process:
sudo lsof -i :3000
sudo kill -9 <process-id>
Permission Errors
Ensure correct ownership:
sudo chown -R appuser:appuser /home/appuser/your-project
Nginx Configuration Errors
Test configuration:
sudo nginx -t
Continuous Deployment
To automate future deployments, consider setting up a simple deployment script:
#!/bin/bash
# deploy.sh
cd /home/appuser/your-project
git pull origin main
npm install # or pip install -r requirements.txt
sudo systemctl restart your-app
sudo systemctl reload nginx
echo "Deployment completed!"
Make it executable:
chmod +x deploy.sh
Conclusion
You now have your Replit application successfully deployed on a Ramnode VPS with Ubuntu 24. This setup provides you with:
- Full control over your hosting environment
- Better performance and reliability
- SSL encryption
- Proper process management
- Monitoring and logging capabilities
- Scalability options
Remember to regularly update your system, monitor your application’s performance, and maintain backups of your data. Your application is now ready for production use with professional-grade hosting infrastructure.
For advanced setups, consider implementing container orchestration with Docker, setting up CI/CD pipelines, or using load balancers for high-availability deployments.