For those who prefer full control, deploy on a Hetzner VPS with Nginx configured to serve your launchpage for ANY domain pointing to your server. Perfect for managing multiple domains from a single server.
First, SSH into your server and install the required software:
# SSH into your server
ssh root@your-server-ip
# Update system packages
apt update && apt upgrade -y
# Install Nginx and Git
apt install nginx git -y
# Install Certbot for SSL certificates
apt install certbot python3-certbot-nginx -y
Deploy Launchpage.xyz to your web directory:
# Create web directory
mkdir -p /var/www/launchpage
# Navigate to the directory
cd /var/www/launchpage
# Clone the repository
git clone https://github.com/simplebytes-com/launchpage.xyz.git .
# Set proper permissions
chown -R www-data:www-data /var/www/launchpage
chmod -R 755 /var/www/launchpage
Create an Nginx configuration that serves the launchpage for ANY domain pointing to your server:
# Create Nginx configuration file
nano /etc/nginx/sites-available/launchpage
Add this configuration:
server {
listen 80 default_server;
listen [::]:80 default_server;
# Catch all server names (ANY domain)
server_name _;
root /var/www/launchpage;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# Serve static files with caching
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$ {
expires 7d;
add_header Cache-Control "public, immutable";
}
}
server_name _; directive is the magic here - it makes Nginx serve your launchpage for ANY domain pointing to this server's IP!
# Remove default Nginx configuration
rm /etc/nginx/sites-enabled/default
# Enable our launchpage configuration
ln -s /etc/nginx/sites-available/launchpage /etc/nginx/sites-enabled/
# Test Nginx configuration for syntax errors
nginx -t
# If test passes, restart Nginx
systemctl restart nginx
# Enable Nginx to start on boot
systemctl enable nginx
For each domain you want to use with your launchpage:
Once DNS propagates, visiting your domain will show the launchpage!
Secure your domains with free Let's Encrypt SSL certificates:
If you have specific domains, add SSL for each:
# For a single domain
certbot --nginx -d example.com -d www.example.com
# Follow the prompts:
# - Enter your email address
# - Agree to Terms of Service
# - Choose whether to redirect HTTP to HTTPS (recommended: yes)
This will automatically update your Nginx configuration with SSL settings.
After running Certbot, your configuration will look like this:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
# Redirect HTTP to HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
# SSL certificates (managed by Certbot)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/launchpage;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# Static file caching
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$ {
expires 7d;
add_header Cache-Control "public, immutable";
}
}
Certbot automatically sets up certificate renewal. Test it with:
# Test renewal process
certbot renew --dry-run
# View renewal timer status
systemctl status certbot.timer
To add more domains to the same server:
certbot --nginx -d newdomain.com -d www.newdomain.com
To update to the latest version of Launchpage.xyz:
# Navigate to launchpage directory
cd /var/www/launchpage
# Pull latest changes from Git
git pull origin main
# Reload Nginx to ensure changes are served
systemctl reload nginx
# Check if Nginx is running
systemctl status nginx
# View Nginx error logs
tail -f /var/log/nginx/error.log
# View access logs
tail -f /var/log/nginx/access.log
If using UFW (Ubuntu Firewall), allow HTTP and HTTPS:
# Allow Nginx through firewall
ufw allow 'Nginx Full'
# Check firewall status
ufw status
To collect email submissions from your launchpage, you'll need to set up a Cloudflare Worker. This allows you to store and access visitor submissions.
Follow our complete guide: Collect Emails/Waitlist →
After setting up the Worker, update the form action in your index.html before deploying to your Hetzner VPS:
<form class="email-form" id="emailForm" method="POST"
action="https://YOUR-WORKER-URL.workers.dev">
dig yourdomain.com or online DNS checkersystemctl status nginxtail /var/log/nginx/error.logcertbot certificatesnginx -tjournalctl -xeAdd to your Nginx configuration:
gzip on;
gzip_vary on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
gzip_min_length 1000;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
Need help? Open an issue on GitHub or check the Hetzner documentation.