{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Hetzner VPS Setup Guide - Complete Instructions\n", "\n", "## Session 6: Live Trading & Deployment\n", "\n", "**Today's Objectives:**\n", "- Secure API key management & best practices\n", "- Choose the right deployment platform\n", "- Set up automated execution on Hetzner Cloud" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 1: Create Account & Choose Server\n", "\n", "### 1.1 Create Hetzner Account\n", "1. Go to [hetzner.com](https://www.hetzner.com/)\n", "2. Click \"Sign Up\" and create your account\n", "3. Verify your email address\n", "4. Add payment method (credit card or PayPal)\n", "\n", "### 1.2 Create Your Server\n", "1. Log into Hetzner Cloud Console\n", "2. Click \"New Project\" → Name it \"crypto-trading-bot\"\n", "3. Click \"Add Server\"\n", "4. **Choose Location**: Nuremberg or Helsinki (closest to major EU exchanges)\n", "5. **Choose Image**: Ubuntu 22.04\n", "6. **Choose Type**: CX11 (1 vCPU, 2GB RAM, 20GB storage) - €3.29/month\n", "7. **SSH Key Setup**:\n", " - If you have SSH key: Upload your public key\n", " - If you don't: Select \"Password\" (we'll create SSH key later)\n", "8. **Server Name**: \"trading-bot-server\"\n", "9. Click \"Create & Buy Now\"\n", "\n", "**Your server will be ready in 30-60 seconds!**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 2: Ubuntu Setup & SSH Access\n", "\n", "### 2.1 For Linux/Mac Users\n", "\n", "Replace `YOUR_SERVER_IP` with your actual server IP from Hetzner console:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Connect to your server (run in terminal, not Jupyter)\n", "# If you used SSH key during setup:\n", "ssh root@YOUR_SERVER_IP\n", "\n", "# If you used password:\n", "ssh root@YOUR_SERVER_IP\n", "# Enter the password from Hetzner console" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Create SSH Key (if you didn't have one)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# On your local machine (run in terminal, not Jupyter):\n", "ssh-keygen -t rsa -b 4096 -C \"your-email@example.com\"\n", "# Press Enter for default location\n", "# Press Enter for no passphrase (or set one if you prefer)\n", "\n", "# Copy your public key to server:\n", "ssh-copy-id root@YOUR_SERVER_IP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 For Windows Users\n", "\n", "#### Option A: Use Windows Terminal (Recommended)\n", "1. Install Windows Terminal from Microsoft Store\n", "2. Open Terminal and use same commands as Linux/Mac above\n", "\n", "#### Option B: Use PuTTY\n", "1. Download PuTTY from [putty.org](https://www.putty.org/)\n", "2. Open PuTTY\n", "3. **Host Name**: YOUR_SERVER_IP\n", "4. **Port**: 22\n", "5. **Connection Type**: SSH\n", "6. Click \"Open\"\n", "7. Username: `root`\n", "8. Password: (from Hetzner console)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Create SSH Key for Windows (run in Windows Terminal or PowerShell):\n", "ssh-keygen -t rsa -b 4096 -C \"your-email@example.com\"\n", "# Keys will be saved in C:\\Users\\YourName\\.ssh\\" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 3: Install Python & Dependencies\n", "\n", "**⚠️ Important: The following commands should be run on your Hetzner server (via SSH), not in this Jupyter notebook!**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1 Update System" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Update package list and upgrade system\n", "sudo apt update && sudo apt upgrade -y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 Install Python and Pip" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Install Python 3 and pip\n", "sudo apt install python3 python3-pip python3-venv -y\n", "\n", "# Check installation\n", "python3 --version\n", "pip3 --version" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3 Install Required Python Libraries" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Install common trading libraries\n", "pip3 install pandas numpy ccxt python-dotenv requests\n", "\n", "# For backtesting (if using backtesting.py)\n", "pip3 install backtesting\n", "\n", "# For notifications\n", "pip3 install python-telegram-bot\n", "\n", "# Install any other libraries your bot uses" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.4 Install Screen (for running bot persistently)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "sudo apt install screen -y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 4: Upload Your Bot Code\n", "\n", "### 4.1 Method 1: Using SCP (Secure Copy) - Linux/Mac" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# From your local machine, copy your bot files (run in local terminal):\n", "scp -r /path/to/your/bot/folder root@YOUR_SERVER_IP:/root/trading-bot/\n", "\n", "# Example:\n", "scp -r ~/Desktop/my-crypto-bot root@YOUR_SERVER_IP:/root/trading-bot/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2 Method 1: Using SCP - Windows" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# In Windows Terminal or PowerShell (run locally):\n", "scp -r C:\\path\\to\\your\\bot\\folder root@YOUR_SERVER_IP:/root/trading-bot/\n", "\n", "# Example:\n", "scp -r C:\\Users\\YourName\\Desktop\\my-crypto-bot root@YOUR_SERVER_IP:/root/trading-bot/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3 Method 2: Using Git (Recommended)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# On your server:\n", "cd /root/\n", "git clone https://github.com/yourusername/your-trading-bot.git\n", "cd your-trading-bot\n", "\n", "# Or if you don't have git repo, create directory and use nano:\n", "mkdir trading-bot\n", "cd trading-bot\n", "nano main.py\n", "# Paste your code, save with Ctrl+X, Y, Enter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 Method 3: Using File Transfer (Windows PuTTY users)\n", "1. Download WinSCP from [winscp.net](https://winscp.net/)\n", "2. Connect using same credentials as PuTTY\n", "3. Drag and drop your bot files to `/root/trading-bot/`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 5: Configure Environment Variables\n", "\n", "### What are .env files?\n", "\n", "**Environment Variables & .env Files Explained**\n", "\n", "**What is a .env file?**\n", "- A simple text file that stores configuration data\n", "- Contains key-value pairs (API_KEY=your_secret_key)\n", "- Kept separate from your main code\n", "\n", "**Why use .env files?**\n", "- **Security**: Keeps secrets out of your code\n", "- **Flexibility**: Easy to change settings without editing code\n", "- **Version Control**: Never accidentally commit API keys to GitHub\n", "- **Environment-specific**: Different keys for testing vs production" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 Create .env File" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "cd /root/trading-bot\n", "nano .env" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.2 Add Your API Keys\n", "\n", "In the nano editor, add your keys:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Example .env file content:\n", "BINANCE_API_KEY=your_actual_api_key_here\n", "BINANCE_SECRET=your_actual_secret_key_here\n", "\n", "# Save: Ctrl+X, then Y, then Enter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.3 Using .env in Your Python Code" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import os\n", "from dotenv import load_dotenv\n", "\n", "# Load environment variables\n", "load_dotenv()\n", "\n", "# Access your API keys\n", "api_key = os.getenv('BINANCE_API_KEY')\n", "secret_key = os.getenv('BINANCE_SECRET')\n", "\n", "print(f\"API Key loaded: {api_key[:10]}...\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.4 Secure Your .env File" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Make file readable only by owner\n", "chmod 600 .env\n", "\n", "# Verify permissions\n", "ls -la .env\n", "# Should show: -rw------- 1 root root" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 6: Test Your Bot\n", "\n", "### 6.1 Run a Test" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "cd /root/trading-bot\n", "python3 main.py" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.2 Run in Background with Screen" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Create a new screen session\n", "screen -S trading-bot\n", "\n", "# Run your bot\n", "python3 main.py\n", "\n", "# Detach from screen: Ctrl+A, then D\n", "# Reattach later: screen -r trading-bot\n", "# List screens: screen -ls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 7: Set Up Automatic Restart (Optional)\n", "\n", "### 7.1 Create a Systemd Service" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "sudo nano /etc/systemd/system/trading-bot.service" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.2 Add Service Configuration\n", "\n", "Add this content to the service file:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "[Unit]\n", "Description=Crypto Trading Bot\n", "After=network.target\n", "\n", "[Service]\n", "Type=simple\n", "User=root\n", "WorkingDirectory=/root/trading-bot\n", "ExecStart=/usr/bin/python3 /root/trading-bot/main.py\n", "Restart=always\n", "RestartSec=10\n", "\n", "[Install]\n", "WantedBy=multi-user.target" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.3 Enable and Start Service" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Reload systemd\n", "sudo systemctl daemon-reload\n", "\n", "# Enable service (start on boot)\n", "sudo systemctl enable trading-bot\n", "\n", "# Start service now\n", "sudo systemctl start trading-bot\n", "\n", "# Check status\n", "sudo systemctl status trading-bot\n", "\n", "# View logs\n", "sudo journalctl -u trading-bot -f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Common Commands Reference\n", "\n", "### Server Management" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Check running processes\n", "ps aux | grep python\n", "\n", "# Kill a process\n", "kill PID_NUMBER\n", "\n", "# Check system resources\n", "htop\n", "# (install with: sudo apt install htop)\n", "\n", "# Check disk space\n", "df -h\n", "\n", "# Check memory usage\n", "free -h" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Screen Commands" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Create new screen\n", "screen -S session_name\n", "\n", "# List screens\n", "screen -ls\n", "\n", "# Reattach to screen\n", "screen -r session_name\n", "\n", "# Detach from screen\n", "# Ctrl+A, then D\n", "\n", "# Kill screen session\n", "screen -X -S session_name quit" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### File Operations" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# View file contents\n", "cat filename.py\n", "\n", "# Edit file\n", "nano filename.py\n", "\n", "# Copy file\n", "cp source.py backup.py\n", "\n", "# Move/rename file\n", "mv oldname.py newname.py\n", "\n", "# Delete file\n", "rm filename.py" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Troubleshooting\n", "\n", "### Connection Issues\n", "- **Can't connect via SSH**: Check if server is running in Hetzner console\n", "- **Permission denied**: Make sure you're using correct username (root) and IP\n", "- **SSH key issues**: Try password authentication first\n", "\n", "### Python Issues\n", "- **ModuleNotFoundError**: Install missing packages with `pip3 install package_name`\n", "- **Permission errors**: Make sure you're in the correct directory\n", "- **Python version issues**: Use `python3` instead of `python`\n", "\n", "### Bot Issues\n", "- **API errors**: Double-check your .env file and API key permissions\n", "- **Network errors**: Check internet connection with `ping google.com`\n", "- **Log errors**: Check bot output for specific error messages" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Getting Help" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "bat" } }, "outputs": [], "source": [ "# Check system logs\n", "sudo journalctl -xe\n", "\n", "# Check your bot logs if using systemd\n", "sudo journalctl -u trading-bot -f\n", "\n", "# Monitor system resources\n", "htop" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 🎉 Congratulations!\n", "\n", "**Your trading bot is now running on Hetzner Cloud!**\n", "\n", "**Next Steps:**\n", "- Monitor your bot's performance\n", "- Set up alerts/notifications\n", "- Consider adding more sophisticated error handling\n", "- Scale up server resources if needed\n", "\n", "**Remember:**\n", "- Start with small position sizes\n", "- Test thoroughly before going live\n", "- Always have kill switches ready\n", "- Monitor your bot regularly" ] } ], "metadata": { "kernelspec": { "display_name": "venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.3" } }, "nbformat": 4, "nbformat_minor": 4 }