8.8 KiB
🚀 LemonLink Deployment Guide
Deploy your stunning landing page using Docker in Portainer or Proxmox!
📋 Prerequisites
- Docker VM running in Proxmox
- Portainer (CE or EE) installed and accessible
- (Optional) Reverse proxy (Traefik/Nginx Proxy Manager) for HTTPS
🎯 Option 1: Portainer Stack (Recommended - Easiest)
Step 1: Upload Files to Your VM
SSH into your Docker VM and create the project directory:
ssh root@your-docker-vm-ip
mkdir -p /opt/lemonlink
cd /opt/lemonlink
Upload these 5 files to /opt/lemonlink/:
index.htmlstyles.cssscript.jsdocker-compose.ymlnginx.conf
You can use SCP, SFTP, or Portainer's file browser (if available).
Step 2: Deploy via Portainer
- Open Portainer in your browser (
http://your-vm-ip:9000) - Click Stacks in the left sidebar
- Click + Add Stack
- Configure:
- Name:
lemonlink - Build method: Select "Web editor"
- Paste the contents of
docker-compose.yml:
- Name:
version: '3.8'
services:
lemonlink:
image: nginx:alpine
container_name: lemonlink-landing
restart: unless-stopped
volumes:
- /opt/lemonlink/index.html:/usr/share/nginx/html/index.html:ro
- /opt/lemonlink/styles.css:/usr/share/nginx/html/styles.css:ro
- /opt/lemonlink/script.js:/usr/share/nginx/html/script.js:ro
- /opt/lemonlink/nginx.conf:/etc/nginx/conf.d/default.conf:ro
networks:
- lemonlink-network
ports:
- "8080:80"
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
labels:
- "com.lemonlink.description=LemonLink Landing Page"
networks:
lemonlink-network:
driver: bridge
- Click Deploy the stack
- Wait for deployment (green indicator)
Step 3: Access Your Site
Visit: http://your-docker-vm-ip:8080
🐳 Option 2: Direct Docker (No Portainer)
If you prefer command line:
# SSH to your Docker VM
ssh root@your-docker-vm-ip
# Create directory
mkdir -p /opt/lemonlink
cd /opt/lemonlink
# Upload files (from your local machine)
scp index.html styles.css script.js docker-compose.yml nginx.conf root@your-docker-vm-ip:/opt/lemonlink/
# Run the container
docker-compose up -d
# Check status
docker-compose ps
docker-compose logs -f
🔒 Option 3: With HTTPS (Traefik Reverse Proxy)
If you have Traefik running in Portainer:
Step 1: Create Network
In Portainer:
- Go to Networks
- Click + Add Network
- Name:
traefik-public - Driver:
bridge - Click Create the network
Step 2: Deploy with Traefik Labels
Update the docker-compose.yml in Portainer:
version: '3.8'
services:
lemonlink:
image: nginx:alpine
container_name: lemonlink-landing
restart: unless-stopped
volumes:
- /opt/lemonlink/index.html:/usr/share/nginx/html/index.html:ro
- /opt/lemonlink/styles.css:/usr/share/nginx/html/styles.css:ro
- /opt/lemonlink/script.js:/usr/share/nginx/html/script.js:ro
- /opt/lemonlink/nginx.conf:/etc/nginx/conf.d/default.conf:ro
networks:
- traefik-public # Connect to Traefik network
# NO PORTS EXPOSED - Traefik handles routing
labels:
# Enable Traefik
- "traefik.enable=true"
# Router configuration
- "traefik.http.routers.lemonlink.rule=Host(`lemonlink.eu`)"
- "traefik.http.routers.lemonlink.entrypoints=websecure"
- "traefik.http.routers.lemonlink.tls.certresolver=letsencrypt"
# Service configuration
- "traefik.http.services.lemonlink.loadbalancer.server.port=80"
# Middleware (optional - for security headers)
- "traefik.http.routers.lemonlink.middlewares=security-headers"
networks:
traefik-public:
external: true
Step 3: Update DNS
Point your domain lemonlink.eu to your Docker VM's public IP.
Step 4: Access
Visit: https://lemonlink.eu 🎉
🔄 Option 4: Using Nginx Proxy Manager
If you use Nginx Proxy Manager:
Deploy without exposed ports:
version: '3.8'
services:
lemonlink:
image: nginx:alpine
container_name: lemonlink-landing
restart: unless-stopped
volumes:
- /opt/lemonlink/index.html:/usr/share/nginx/html/index.html:ro
- /opt/lemonlink/styles.css:/usr/share/nginx/html/styles.css:ro
- /opt/lemonlink/script.js:/usr/share/nginx/html/script.js:ro
- /opt/lemonlink/nginx.conf:/etc/nginx/conf.d/default.conf:ro
networks:
- npm-network # Your NPM network
# NO PORTS - NPM will route to it
networks:
npm-network:
external: true
In Nginx Proxy Manager:
- Go to Proxy Hosts
- Click Add Proxy Host
- Configure:
- Domain Names:
lemonlink.eu - Scheme:
http - Forward Hostname/IP:
lemonlink-landing - Forward Port:
80
- Domain Names:
- Enable Block Common Exploits
- Go to SSL tab:
- Request a new SSL certificate
- Enable Force SSL
- Enable HTTP/2 Support
- Click Save
🖥️ Option 5: Proxmox LXC Container (Alternative)
If you prefer an LXC container instead of Docker:
Step 1: Create LXC Container
In Proxmox:
- Click Create CT
- Template:
debian-12-standard - Resources: 1 CPU, 512MB RAM, 8GB Disk (minimum)
- Network: DHCP or static IP
- Start container after creation
Step 2: Install Nginx
# Enter the container (or SSH into it)
pct exec <ctid> -- bash
# Update and install nginx
apt update && apt install -y nginx
# Remove default site
rm /var/www/html/index.nginx-debian.html
Step 3: Upload Files
From your computer:
scp index.html styles.css script.js root@lxc-container-ip:/var/www/html/
Step 4: Configure Nginx
# Edit nginx config
cat > /etc/nginx/sites-available/default << 'EOF'
server {
listen 80;
listen [::]:80;
root /var/www/html;
index index.html;
server_name lemonlink.eu;
location / {
try_files $uri $uri/ =404;
}
# Gzip
gzip on;
gzip_types text/css application/javascript;
}
EOF
# Test and reload
nginx -t
systemctl reload nginx
📁 File Structure on Server
After deployment, your server should have:
/opt/lemonlink/
├── index.html # Main website
├── styles.css # Styling
├── script.js # JavaScript
├── docker-compose.yml # Docker configuration
├── nginx.conf # Nginx configuration
├── DEPLOY.md # This guide
└── README.md # Website documentation
🔄 Updating Your Website
Method 1: Direct File Edit
Edit files directly on the server:
ssh root@your-docker-vm-ip
nano /opt/lemonlink/index.html
# Edit, save, and changes reflect immediately!
Method 2: Re-upload Files
scp index.html styles.css script.js root@your-docker-vm-ip:/opt/lemonlink/
No restart needed - changes are live instantly!
Method 3: Using Portainer
- Go to Containers
- Find
lemonlink-landing - Click Console → /bin/sh
- Edit files in
/usr/share/nginx/html/
🛠️ Troubleshooting
Container won't start
# Check logs
docker logs lemonlink-landing
# Verify files exist
ls -la /opt/lemonlink/
# Restart container
docker restart lemonlink-landing
Permission denied
# Fix permissions
chmod 644 /opt/lemonlink/*.{html,css,js,conf}
Can't access the site
# Check if container is running
docker ps | grep lemonlink
# Check ports
docker port lemonlink-landing
# Test from VM
curl http://localhost:8080
# Check firewall
ufw status
iptables -L
SSL/HTTPS issues
Make sure:
- DNS A record points to your server IP
- Port 443 is open in firewall
- Traefik/NPM is properly configured
🌐 Domain & DNS Setup
For External Access:
-
Get your public IP:
curl ifconfig.me -
Create A Record at your DNS provider:
- Type:
A - Name:
@(orwww) - Value:
YOUR_PUBLIC_IP - TTL:
3600
- Type:
-
Port Forward on your router:
- External 80 → Internal
your-vm-ip:8080 - External 443 → Internal
your-vm-ip:443(if using HTTPS)
- External 80 → Internal
For Internal Only:
Add to your local DNS (Pi-hole, AdGuard, or /etc/hosts):
your-docker-vm-ip lemonlink.eu
🎉 Success!
Your jaw-dropping landing page should now be live! 🍋
- Without HTTPS:
http://your-vm-ip:8080 - With HTTPS:
https://lemonlink.eu
💡 Pro Tips
- Auto-updates: Set up a Git repository for version control
- Backups: Use Proxmox backup for the entire VM
- Monitoring: Add the site to Uptime Kuma or your monitoring stack
- Analytics: Add Plausible or Umami for privacy-focused analytics
Need help? Check the logs or ask! 🚀