https://food.jackpilot.co
Automated bash deployment pipeline with SSH connectivity. Easily configure your VPS, synchronize all 140 Asian dishes & PHP logic, configure Nginx, and activate free Let's Encrypt SSL.
⚡ Interactive VPS Command Generator
Enter your VPS connection details below to generate ready-to-run terminal commands.
bash deploy.sh food.jackpilot.co root 22
Uses rsync over SSH (with streaming tar fallback) to sync all code directly into /var/www/food.jackpilot.co, updates permissions, and reloads PHP-FPM.
ssh -p 22 root@food.jackpilot.co "bash -s" < setup-subdomain-vps.sh
Installs Nginx, PHP 8.2-FPM, UFW firewall, writes the VirtualHost, and requests Let's Encrypt SSL certificate for food.jackpilot.co.
sudo mkdir -p /var/www/food.jackpilot.co && curl -sSL "http://food.jackpilot.co/api.php?action=download_bundle" | sudo tar -xzf - -C /var/www/food.jackpilot.co && sudo chown -R www-data:www-data /var/www/food.jackpilot.co
Run this single line on your VPS terminal to pull and extract the entire production project bundle in one second.
📋 Complete Step-by-Step Live Deployment Guide
Log in to your DNS manager (Cloudflare, Namecheap, GoDaddy, DigitalOcean) for jackpilot.co and add an A Record:
Connect to your VPS and run the provisioning script. It prepares the web root, creates Nginx server block, and configures PHP-FPM:
Includes automatic Let's Encrypt Certbot SSL for HTTPS!
Deploy all application files directly from your workspace using the automated deploy script:
Automatically syncs index.php, admin.php, api.php, products.json, and data_storage/.
Your live store is now accessible worldwide with HTTPS and HTTP/2:
SSL certificates auto-renew every 60 days via certbot systemd timer.
⚙️ Nginx Configuration: /etc/nginx/sites-available/food.jackpilot.co
Pre-configured with gzip compression, security headers, clean admin & API routing, and PHP-FPM fastcgi proxying.
# /etc/nginx/sites-available/food.jackpilot.co
# Nginx VirtualHost & Reverse Proxy Configuration for https://food.jackpilot.co
# Upstream PHP Service on Port 3200 (Managed by PM2)
upstream food_backend {
server 127.0.0.1:3200;
keepalive 32;
}
# HTTP Server Block
server {
listen 80;
listen [::]:80;
server_name food.jackpilot.co;
client_max_body_size 64M;
charset utf-8;
# Gzip Compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
# Security Headers
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header X-Frame-Options "SAMEORIGIN" always;
# Let's Encrypt ACME Challenge
location /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files $uri =404;
}
# Deny access to hidden dotfiles (.env, .git, etc.)
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# Protect internal data storage files
location ^~ /data_storage/ {
deny all;
return 403;
}
location / {
proxy_pass http://food_backend;
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_connect_timeout 60s;
proxy_send_timeout 180s;
proxy_read_timeout 180s;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
}
# HTTPS Server Block (SSL)
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name food.jackpilot.co;
client_max_body_size 64M;
charset utf-8;
# SSL Certificates (Auto-managed by Certbot or fallback certificate)
ssl_certificate /etc/ssl/food.jackpilot.co/fullchain.pem;
ssl_certificate_key /etc/ssl/food.jackpilot.co/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# Gzip Compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
# Security Headers
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header X-Frame-Options "SAMEORIGIN" always;
# Deny access to hidden dotfiles
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# Protect internal data storage files
location ^~ /data_storage/ {
deny all;
return 403;
}
location / {
proxy_pass http://food_backend;
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_connect_timeout 60s;
proxy_send_timeout 180s;
proxy_read_timeout 180s;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
access_log /var/log/nginx/food.jackpilot.co_access.log;
error_log /var/log/nginx/food.jackpilot.co_error.log;
}