Deploy Polly Discord Bot to Hetzner Cloud in minutes!
- Hetzner Cloud Server (Ubuntu 22.04 LTS recommended)
- Domain name pointed to your server IP
- Discord Bot configured with tokens
- GitHub repository with your Polly code
# SSH into your Hetzner server
ssh root@your-server-ip
# Run the deployment script
curl -sSL https://raw.githubusercontent.com/pacnpal/polly/main/deploy.sh | bash# Update system
sudo apt update && sudo apt upgrade -y
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# Install Git
sudo apt install -y git
# Clone repository
git clone https://github.com/pacnpal/polly.git
cd polly
# Configure environment
cp .env.example .env
nano .env # Edit with your Discord credentials
# Deploy with Docker
docker compose up -dEdit .env file with your Discord bot credentials:
DISCORD_TOKEN=your_discord_bot_token_here
DISCORD_CLIENT_ID=your_discord_client_id_here
DISCORD_CLIENT_SECRET=your_discord_client_secret_here
DISCORD_REDIRECT_URI=https://your-domain.com/auth/callback
SECRET_KEY=your-random-secret-key-here# Install Certbot
sudo apt install -y certbot
# Get SSL certificate
sudo certbot certonly --standalone -d your-domain.com
# Update nginx config
sed -i 's/your-domain.com/your-actual-domain.com/g' nginx.conf
# Restart services
docker compose restart-
Create Discord Application
- Go to https://discord.com/developers/applications
- Create new application named "Polly"
-
Create Bot
- Go to "Bot" section
- Create bot and copy token to
.env
-
Configure OAuth2
- Go to "OAuth2" section
- Add redirect URI:
https://your-domain.com/auth/callback - Copy Client ID and Secret to
.env
-
Invite Bot
- Go to "OAuth2" > "URL Generator"
- Select scopes:
bot,applications.commands - Select permissions:
Send Messages,Add Reactions,Use Slash Commands - Use generated URL to invite bot to servers
# Check status
docker compose ps
docker compose logs -f polly
# Restart services
docker compose restart
# Update deployment
git pull
docker compose build
docker compose up -d
# View logs
docker compose logs -f polly
docker compose logs -f nginx
# Stop services
docker compose down# Check if services are running
curl -f http://localhost:8000/
curl -f https://your-domain.com/
# Check Docker containers
docker compose ps# View real-time logs
docker compose logs -f
# View specific service logs
docker compose logs polly
docker compose logs nginx# Manual renewal
sudo certbot renew
# Auto-renewal is set up via cron job
sudo crontab -l# Backup SQLite database
cp data/polly.db data/polly.db.backup.$(date +%Y%m%d)
# Backup uploaded images
tar -czf uploads-backup-$(date +%Y%m%d).tar.gz static/uploads/-
Bot not responding
docker compose logs polly # Check Discord token in .env -
Web interface not accessible
docker compose logs nginx # Check domain DNS settings # Verify SSL certificate
-
Database errors
# Recreate database docker compose down rm -f data/polly.db docker compose up -d -
Permission denied errors
# Fix file permissions sudo chown -R $USER:$USER . chmod +x deploy.sh
-
Enable Docker logging limits
# Add to docker-compose.yml logging: driver: "json-file" options: max-size: "10m" max-file: "3"
-
Monitor resource usage
docker stats htop df -h
-
Firewall Setup
sudo ufw allow 22 # SSH sudo ufw allow 80 # HTTP sudo ufw allow 443 # HTTPS sudo ufw enable
-
Regular Updates
# Update system packages sudo apt update && sudo apt upgrade -y # Update Docker images docker compose pull docker compose up -d
-
Secure Environment Variables
- Never commit
.envfile to Git - Use strong, random SECRET_KEY
- Rotate Discord tokens periodically
- Never commit
For high-traffic deployments:
- Load Balancer - Use Hetzner Load Balancer
- Database - Migrate to PostgreSQL
- File Storage - Use object storage for uploads
- Monitoring - Add Prometheus + Grafana
- Backup - Automated database backups
- Documentation: Check README.md
- Issues: GitHub Issues
- Logs:
docker compose logs -f polly
🎉 Your Polly Discord Bot is now deployed and ready to use!
Visit https://your-domain.com to access the web interface and start creating polls!