[{"data":1,"prerenderedAt":1178},["ShallowReactive",2],{"guide-detail-hetzner-vps-setup":3},{"id":4,"title":5,"body":6,"category":1162,"description":1163,"difficulty":1164,"extension":1165,"meta":1166,"navigation":404,"path":1167,"published":1168,"readTime":1169,"seo":1170,"slug":1171,"stem":1172,"tags":1173,"updated":1168,"__hash__":1177},"guides\u002Fen\u002Fguides\u002Fhetzner-vps-setup.md","Hetzner VPS Setup for AI Workloads",{"type":7,"value":8,"toc":1146},"minimark",[9,14,18,24,43,46,50,79,81,85,165,170,181,188,190,194,197,226,233,236,264,271,273,277,309,312,358,360,364,367,430,433,464,466,470,477,492,495,503,506,524,526,530,674,677,679,683,686,800,802,806,849,852,871,874,889,891,895,898,909,959,962,1025,1027,1031,1034,1040,1043,1064,1066,1070,1119,1122,1124,1128,1142],[10,11,13],"h2",{"id":12},"overview","Overview",[15,16,17],"p",{},"Hetzner Cloud offers the best price-per-core ratio in Europe for AI inference workloads. This guide gets you from zero to a hardened, Docker-ready server in under 30 minutes.",[15,19,20],{},[21,22,23],"strong",{},"What you will have at the end:",[25,26,27,31,34,37,40],"ul",{},[28,29,30],"li",{},"Non-root user with sudo",[28,32,33],{},"UFW firewall (only ports 22, 80, 443 open)",[28,35,36],{},"fail2ban blocking brute-force SSH",[28,38,39],{},"Docker + Docker Compose installed",[28,41,42],{},"Automated snapshot schedule",[44,45],"hr",{},[10,47,49],{"id":48},"_1-create-a-project","1. Create a Project",[51,52,53,64,76],"ol",{},[28,54,55,56,63],{},"Sign up at ",[57,58,62],"a",{"href":59,"rel":60},"https:\u002F\u002Fconsole.hetzner.cloud",[61],"nofollow","console.hetzner.cloud",".",[28,65,66,67,70,71,75],{},"Click ",[21,68,69],{},"New Project"," → name it (e.g., ",[72,73,74],"code",{},"ai-infra",").",[28,77,78],{},"Stay in the project — all resources below are created inside it.",[44,80],{},[10,82,84],{"id":83},"_2-choose-a-server-type","2. Choose a Server Type",[86,87,88,110],"table",{},[89,90,91],"thead",{},[92,93,94,98,101,104,107],"tr",{},[95,96,97],"th",{},"Type",[95,99,100],{},"vCPU",[95,102,103],{},"RAM",[95,105,106],{},"Disk",[95,108,109],{},"Price\u002Fmo",[111,112,113,131,148],"tbody",{},[92,114,115,119,122,125,128],{},[116,117,118],"td",{},"CX22",[116,120,121],{},"2",[116,123,124],{},"4 GB",[116,126,127],{},"40 GB NVMe",[116,129,130],{},"€4.51",[92,132,133,136,139,142,145],{},[116,134,135],{},"CPX31",[116,137,138],{},"4",[116,140,141],{},"8 GB",[116,143,144],{},"160 GB NVMe",[116,146,147],{},"€13.49",[92,149,150,153,156,159,162],{},[116,151,152],{},"CPX41",[116,154,155],{},"8",[116,157,158],{},"16 GB",[116,160,161],{},"240 GB NVMe",[116,163,164],{},"€26.49",[15,166,167],{},[21,168,169],{},"Rule of thumb:",[25,171,172,175,178],{},[28,173,174],{},"CX22 → API proxy, lightweight agents, small Ollama models (≤3B).",[28,176,177],{},"CPX31 → Ollama with 7–8B models, self-hosted inference gateway.",[28,179,180],{},"CPX41 → Multiple models, vector DB, full agent stack.",[15,182,183,184,187],{},"Select ",[21,185,186],{},"Ubuntu 24.04"," as the OS image.",[44,189],{},[10,191,193],{"id":192},"_3-upload-your-ssh-key","3. Upload Your SSH Key",[15,195,196],{},"Before creating the server, add your public key:",[198,199,204],"pre",{"className":200,"code":201,"language":202,"meta":203,"style":203},"language-bash shiki shiki-themes github-light github-dark","# on your local machine\ncat ~\u002F.ssh\u002Fid_ed25519.pub\n","bash","",[72,205,206,215],{"__ignoreMap":203},[207,208,211],"span",{"class":209,"line":210},"line",1,[207,212,214],{"class":213},"sJ8bj","# on your local machine\n",[207,216,218,222],{"class":209,"line":217},2,[207,219,221],{"class":220},"sScJk","cat",[207,223,225],{"class":224},"sZZnC"," ~\u002F.ssh\u002Fid_ed25519.pub\n",[15,227,228,229,232],{},"Copy the output. In Hetzner console: ",[21,230,231],{},"SSH Keys → Add SSH Key"," → paste → save.",[15,234,235],{},"If you do not have a key yet:",[198,237,239],{"className":200,"code":238,"language":202,"meta":203,"style":203},"ssh-keygen -t ed25519 -C \"hetzner-ai\"\n# press Enter twice for no passphrase (or set one)\n",[72,240,241,259],{"__ignoreMap":203},[207,242,243,246,250,253,256],{"class":209,"line":210},[207,244,245],{"class":220},"ssh-keygen",[207,247,249],{"class":248},"sj4cs"," -t",[207,251,252],{"class":224}," ed25519",[207,254,255],{"class":248}," -C",[207,257,258],{"class":224}," \"hetzner-ai\"\n",[207,260,261],{"class":209,"line":217},[207,262,263],{"class":213},"# press Enter twice for no passphrase (or set one)\n",[15,265,266,267,270],{},"Select your key during server creation. Hetzner injects it into ",[72,268,269],{},"\u002Froot\u002F.ssh\u002Fauthorized_keys"," automatically.",[44,272],{},[10,274,276],{"id":275},"_4-first-login","4. First Login",[198,278,280],{"className":200,"code":279,"language":202,"meta":203,"style":203},"ssh root@\u003CSERVER_IP>\n# confirm the fingerprint on first connect\n",[72,281,282,304],{"__ignoreMap":203},[207,283,284,287,290,294,297,301],{"class":209,"line":210},[207,285,286],{"class":220},"ssh",[207,288,289],{"class":224}," root@",[207,291,293],{"class":292},"szBVR","\u003C",[207,295,296],{"class":224},"SERVER_I",[207,298,300],{"class":299},"sVt8B","P",[207,302,303],{"class":292},">\n",[207,305,306],{"class":209,"line":217},[207,307,308],{"class":213},"# confirm the fingerprint on first connect\n",[15,310,311],{},"Update packages immediately:",[198,313,315],{"className":200,"code":314,"language":202,"meta":203,"style":203},"apt update && apt upgrade -y\napt install -y curl wget git unzip\n",[72,316,317,336],{"__ignoreMap":203},[207,318,319,322,325,328,330,333],{"class":209,"line":210},[207,320,321],{"class":220},"apt",[207,323,324],{"class":224}," update",[207,326,327],{"class":299}," && ",[207,329,321],{"class":220},[207,331,332],{"class":224}," upgrade",[207,334,335],{"class":248}," -y\n",[207,337,338,340,343,346,349,352,355],{"class":209,"line":217},[207,339,321],{"class":220},[207,341,342],{"class":224}," install",[207,344,345],{"class":248}," -y",[207,347,348],{"class":224}," curl",[207,350,351],{"class":224}," wget",[207,353,354],{"class":224}," git",[207,356,357],{"class":224}," unzip\n",[44,359],{},[10,361,363],{"id":362},"_5-create-a-non-root-user","5. Create a Non-Root User",[15,365,366],{},"Never run production workloads as root.",[198,368,370],{"className":200,"code":369,"language":202,"meta":203,"style":203},"adduser deploy\n# enter a password, skip the other prompts\nusermod -aG sudo deploy\n\n# copy SSH key to the new user\nrsync --archive --chown=deploy:deploy ~\u002F.ssh \u002Fhome\u002Fdeploy\n",[72,371,372,380,385,399,406,412],{"__ignoreMap":203},[207,373,374,377],{"class":209,"line":210},[207,375,376],{"class":220},"adduser",[207,378,379],{"class":224}," deploy\n",[207,381,382],{"class":209,"line":217},[207,383,384],{"class":213},"# enter a password, skip the other prompts\n",[207,386,388,391,394,397],{"class":209,"line":387},3,[207,389,390],{"class":220},"usermod",[207,392,393],{"class":248}," -aG",[207,395,396],{"class":224}," sudo",[207,398,379],{"class":224},[207,400,402],{"class":209,"line":401},4,[207,403,405],{"emptyLinePlaceholder":404},true,"\n",[207,407,409],{"class":209,"line":408},5,[207,410,411],{"class":213},"# copy SSH key to the new user\n",[207,413,415,418,421,424,427],{"class":209,"line":414},6,[207,416,417],{"class":220},"rsync",[207,419,420],{"class":248}," --archive",[207,422,423],{"class":248}," --chown=deploy:deploy",[207,425,426],{"class":224}," ~\u002F.ssh",[207,428,429],{"class":224}," \u002Fhome\u002Fdeploy\n",[15,431,432],{},"Test the new user in a second terminal before closing root session:",[198,434,436],{"className":200,"code":435,"language":202,"meta":203,"style":203},"ssh deploy@\u003CSERVER_IP>\nsudo whoami   # should return: root\n",[72,437,438,453],{"__ignoreMap":203},[207,439,440,442,445,447,449,451],{"class":209,"line":210},[207,441,286],{"class":220},[207,443,444],{"class":224}," deploy@",[207,446,293],{"class":292},[207,448,296],{"class":224},[207,450,300],{"class":299},[207,452,303],{"class":292},[207,454,455,458,461],{"class":209,"line":217},[207,456,457],{"class":220},"sudo",[207,459,460],{"class":224}," whoami",[207,462,463],{"class":213},"   # should return: root\n",[44,465],{},[10,467,469],{"id":468},"_6-harden-ssh","6. Harden SSH",[15,471,472,473,476],{},"Edit ",[72,474,475],{},"\u002Fetc\u002Fssh\u002Fsshd_config",":",[198,478,480],{"className":200,"code":479,"language":202,"meta":203,"style":203},"sudo nano \u002Fetc\u002Fssh\u002Fsshd_config\n",[72,481,482],{"__ignoreMap":203},[207,483,484,486,489],{"class":209,"line":210},[207,485,457],{"class":220},[207,487,488],{"class":224}," nano",[207,490,491],{"class":224}," \u002Fetc\u002Fssh\u002Fsshd_config\n",[15,493,494],{},"Set these values (add or uncomment):",[198,496,501],{"className":497,"code":499,"language":500},[498],"language-text","PermitRootLogin no\nPasswordAuthentication no\nPubkeyAuthentication yes\nPort 22\n","text",[72,502,499],{"__ignoreMap":203},[15,504,505],{},"Reload:",[198,507,509],{"className":200,"code":508,"language":202,"meta":203,"style":203},"sudo systemctl reload ssh\n",[72,510,511],{"__ignoreMap":203},[207,512,513,515,518,521],{"class":209,"line":210},[207,514,457],{"class":220},[207,516,517],{"class":224}," systemctl",[207,519,520],{"class":224}," reload",[207,522,523],{"class":224}," ssh\n",[44,525],{},[10,527,529],{"id":528},"_7-configure-ufw-firewall","7. Configure UFW Firewall",[198,531,533],{"className":200,"code":532,"language":202,"meta":203,"style":203},"sudo apt install -y ufw\n\n# default: deny incoming, allow outgoing\nsudo ufw default deny incoming\nsudo ufw default allow outgoing\n\n# allow your access\nsudo ufw allow 22\u002Ftcp   # SSH\nsudo ufw allow 80\u002Ftcp   # HTTP\nsudo ufw allow 443\u002Ftcp  # HTTPS\n\nsudo ufw --force enable\nsudo ufw status verbose\n",[72,534,535,549,553,558,574,588,592,598,613,628,643,648,661],{"__ignoreMap":203},[207,536,537,539,542,544,546],{"class":209,"line":210},[207,538,457],{"class":220},[207,540,541],{"class":224}," apt",[207,543,342],{"class":224},[207,545,345],{"class":248},[207,547,548],{"class":224}," ufw\n",[207,550,551],{"class":209,"line":217},[207,552,405],{"emptyLinePlaceholder":404},[207,554,555],{"class":209,"line":387},[207,556,557],{"class":213},"# default: deny incoming, allow outgoing\n",[207,559,560,562,565,568,571],{"class":209,"line":401},[207,561,457],{"class":220},[207,563,564],{"class":224}," ufw",[207,566,567],{"class":224}," default",[207,569,570],{"class":224}," deny",[207,572,573],{"class":224}," incoming\n",[207,575,576,578,580,582,585],{"class":209,"line":408},[207,577,457],{"class":220},[207,579,564],{"class":224},[207,581,567],{"class":224},[207,583,584],{"class":224}," allow",[207,586,587],{"class":224}," outgoing\n",[207,589,590],{"class":209,"line":414},[207,591,405],{"emptyLinePlaceholder":404},[207,593,595],{"class":209,"line":594},7,[207,596,597],{"class":213},"# allow your access\n",[207,599,601,603,605,607,610],{"class":209,"line":600},8,[207,602,457],{"class":220},[207,604,564],{"class":224},[207,606,584],{"class":224},[207,608,609],{"class":224}," 22\u002Ftcp",[207,611,612],{"class":213},"   # SSH\n",[207,614,616,618,620,622,625],{"class":209,"line":615},9,[207,617,457],{"class":220},[207,619,564],{"class":224},[207,621,584],{"class":224},[207,623,624],{"class":224}," 80\u002Ftcp",[207,626,627],{"class":213},"   # HTTP\n",[207,629,631,633,635,637,640],{"class":209,"line":630},10,[207,632,457],{"class":220},[207,634,564],{"class":224},[207,636,584],{"class":224},[207,638,639],{"class":224}," 443\u002Ftcp",[207,641,642],{"class":213},"  # HTTPS\n",[207,644,646],{"class":209,"line":645},11,[207,647,405],{"emptyLinePlaceholder":404},[207,649,651,653,655,658],{"class":209,"line":650},12,[207,652,457],{"class":220},[207,654,564],{"class":224},[207,656,657],{"class":248}," --force",[207,659,660],{"class":224}," enable\n",[207,662,664,666,668,671],{"class":209,"line":663},13,[207,665,457],{"class":220},[207,667,564],{"class":224},[207,669,670],{"class":224}," status",[207,672,673],{"class":224}," verbose\n",[15,675,676],{},"Output should show three ALLOW rules and status: active.",[44,678],{},[10,680,682],{"id":681},"_8-install-fail2ban","8. Install fail2ban",[15,684,685],{},"fail2ban bans IPs after repeated failed SSH attempts.",[198,687,689],{"className":200,"code":688,"language":202,"meta":203,"style":203},"sudo apt install -y fail2ban\n\nsudo tee \u002Fetc\u002Ffail2ban\u002Fjail.local \u003C\u003C'EOF'\n[DEFAULT]\nbantime  = 10m\nfindtime = 10m\nmaxretry = 5\n\n[sshd]\nenabled = true\nport    = 22\nEOF\n\nsudo systemctl enable --now fail2ban\nsudo fail2ban-client status sshd\n",[72,690,691,704,708,724,729,734,739,744,748,753,758,763,768,772,787],{"__ignoreMap":203},[207,692,693,695,697,699,701],{"class":209,"line":210},[207,694,457],{"class":220},[207,696,541],{"class":224},[207,698,342],{"class":224},[207,700,345],{"class":248},[207,702,703],{"class":224}," fail2ban\n",[207,705,706],{"class":209,"line":217},[207,707,405],{"emptyLinePlaceholder":404},[207,709,710,712,715,718,721],{"class":209,"line":387},[207,711,457],{"class":220},[207,713,714],{"class":224}," tee",[207,716,717],{"class":224}," \u002Fetc\u002Ffail2ban\u002Fjail.local",[207,719,720],{"class":292}," \u003C\u003C",[207,722,723],{"class":224},"'EOF'\n",[207,725,726],{"class":209,"line":401},[207,727,728],{"class":224},"[DEFAULT]\n",[207,730,731],{"class":209,"line":408},[207,732,733],{"class":224},"bantime  = 10m\n",[207,735,736],{"class":209,"line":414},[207,737,738],{"class":224},"findtime = 10m\n",[207,740,741],{"class":209,"line":594},[207,742,743],{"class":224},"maxretry = 5\n",[207,745,746],{"class":209,"line":600},[207,747,405],{"emptyLinePlaceholder":404},[207,749,750],{"class":209,"line":615},[207,751,752],{"class":224},"[sshd]\n",[207,754,755],{"class":209,"line":630},[207,756,757],{"class":224},"enabled = true\n",[207,759,760],{"class":209,"line":645},[207,761,762],{"class":224},"port    = 22\n",[207,764,765],{"class":209,"line":650},[207,766,767],{"class":224},"EOF\n",[207,769,770],{"class":209,"line":663},[207,771,405],{"emptyLinePlaceholder":404},[207,773,775,777,779,782,785],{"class":209,"line":774},14,[207,776,457],{"class":220},[207,778,517],{"class":224},[207,780,781],{"class":224}," enable",[207,783,784],{"class":248}," --now",[207,786,703],{"class":224},[207,788,790,792,795,797],{"class":209,"line":789},15,[207,791,457],{"class":220},[207,793,794],{"class":224}," fail2ban-client",[207,796,670],{"class":224},[207,798,799],{"class":224}," sshd\n",[44,801],{},[10,803,805],{"id":804},"_9-install-docker","9. Install Docker",[198,807,809],{"className":200,"code":808,"language":202,"meta":203,"style":203},"curl -fsSL https:\u002F\u002Fget.docker.com | sudo sh\nsudo usermod -aG docker deploy\n# log out and back in for group to take effect\n",[72,810,811,830,844],{"__ignoreMap":203},[207,812,813,816,819,822,825,827],{"class":209,"line":210},[207,814,815],{"class":220},"curl",[207,817,818],{"class":248}," -fsSL",[207,820,821],{"class":224}," https:\u002F\u002Fget.docker.com",[207,823,824],{"class":292}," |",[207,826,396],{"class":220},[207,828,829],{"class":224}," sh\n",[207,831,832,834,837,839,842],{"class":209,"line":217},[207,833,457],{"class":220},[207,835,836],{"class":224}," usermod",[207,838,393],{"class":248},[207,840,841],{"class":224}," docker",[207,843,379],{"class":224},[207,845,846],{"class":209,"line":387},[207,847,848],{"class":213},"# log out and back in for group to take effect\n",[15,850,851],{},"Verify:",[198,853,855],{"className":200,"code":854,"language":202,"meta":203,"style":203},"docker run --rm hello-world\n",[72,856,857],{"__ignoreMap":203},[207,858,859,862,865,868],{"class":209,"line":210},[207,860,861],{"class":220},"docker",[207,863,864],{"class":224}," run",[207,866,867],{"class":248}," --rm",[207,869,870],{"class":224}," hello-world\n",[15,872,873],{},"Install Docker Compose plugin (included since Docker 24, but confirm):",[198,875,877],{"className":200,"code":876,"language":202,"meta":203,"style":203},"docker compose version\n",[72,878,879],{"__ignoreMap":203},[207,880,881,883,886],{"class":209,"line":210},[207,882,861],{"class":220},[207,884,885],{"class":224}," compose",[207,887,888],{"class":224}," version\n",[44,890],{},[10,892,894],{"id":893},"_10-set-up-automated-snapshots","10. Set Up Automated Snapshots",[15,896,897],{},"Hetzner charges €0.0119\u002FGB\u002Fmonth for snapshots. For a CX22 (40 GB, typically 5–10 GB compressed), that is ~€0.06–0.12\u002Fmo.",[15,899,900,901,904,905,908],{},"In Hetzner console: ",[21,902,903],{},"Server → Backups"," → enable (adds 20% to server cost) ",[21,906,907],{},"or"," use snapshots manually before upgrades:",[198,910,912],{"className":200,"code":911,"language":202,"meta":203,"style":203},"# via hcloud CLI (optional)\nhcloud server create-image \u003CSERVER_ID> --type snapshot --description \"pre-upgrade-$(date +%Y%m%d)\"\n",[72,913,914,919],{"__ignoreMap":203},[207,915,916],{"class":209,"line":210},[207,917,918],{"class":213},"# via hcloud CLI (optional)\n",[207,920,921,924,927,930,933,935,938,941,944,947,950,953,956],{"class":209,"line":217},[207,922,923],{"class":220},"hcloud",[207,925,926],{"class":224}," server",[207,928,929],{"class":224}," create-image",[207,931,932],{"class":292}," \u003C",[207,934,296],{"class":224},[207,936,937],{"class":299},"D",[207,939,940],{"class":292},">",[207,942,943],{"class":248}," --type",[207,945,946],{"class":224}," snapshot",[207,948,949],{"class":248}," --description",[207,951,952],{"class":224}," \"pre-upgrade-$(",[207,954,955],{"class":220},"date",[207,957,958],{"class":224}," +%Y%m%d)\"\n",[15,960,961],{},"For CLI access:",[198,963,965],{"className":200,"code":964,"language":202,"meta":203,"style":203},"# install hcloud on your local machine\ncurl -Lo hcloud.tar.gz https:\u002F\u002Fgithub.com\u002Fhetznercloud\u002Fcli\u002Freleases\u002Flatest\u002Fdownload\u002Fhcloud-linux-amd64.tar.gz\ntar -xzf hcloud.tar.gz\nsudo mv hcloud \u002Fusr\u002Flocal\u002Fbin\u002F\nhcloud context create ai-infra   # paste API token from console\n",[72,966,967,972,985,996,1009],{"__ignoreMap":203},[207,968,969],{"class":209,"line":210},[207,970,971],{"class":213},"# install hcloud on your local machine\n",[207,973,974,976,979,982],{"class":209,"line":217},[207,975,815],{"class":220},[207,977,978],{"class":248}," -Lo",[207,980,981],{"class":224}," hcloud.tar.gz",[207,983,984],{"class":224}," https:\u002F\u002Fgithub.com\u002Fhetznercloud\u002Fcli\u002Freleases\u002Flatest\u002Fdownload\u002Fhcloud-linux-amd64.tar.gz\n",[207,986,987,990,993],{"class":209,"line":387},[207,988,989],{"class":220},"tar",[207,991,992],{"class":248}," -xzf",[207,994,995],{"class":224}," hcloud.tar.gz\n",[207,997,998,1000,1003,1006],{"class":209,"line":401},[207,999,457],{"class":220},[207,1001,1002],{"class":224}," mv",[207,1004,1005],{"class":224}," hcloud",[207,1007,1008],{"class":224}," \u002Fusr\u002Flocal\u002Fbin\u002F\n",[207,1010,1011,1013,1016,1019,1022],{"class":209,"line":408},[207,1012,923],{"class":220},[207,1014,1015],{"class":224}," context",[207,1017,1018],{"class":224}," create",[207,1020,1021],{"class":224}," ai-infra",[207,1023,1024],{"class":213},"   # paste API token from console\n",[44,1026],{},[10,1028,1030],{"id":1029},"_11-point-a-dns-record","11. Point a DNS Record",[15,1032,1033],{},"In your DNS provider, add an A record:",[198,1035,1038],{"className":1036,"code":1037,"language":500},[498],"A   ai.yourdomain.com   \u003CSERVER_IP>   TTL 300\n",[72,1039,1037],{"__ignoreMap":203},[15,1041,1042],{},"Verify propagation:",[198,1044,1046],{"className":200,"code":1045,"language":202,"meta":203,"style":203},"dig +short ai.yourdomain.com\n# should return your server IP within 5 minutes\n",[72,1047,1048,1059],{"__ignoreMap":203},[207,1049,1050,1053,1056],{"class":209,"line":210},[207,1051,1052],{"class":220},"dig",[207,1054,1055],{"class":224}," +short",[207,1057,1058],{"class":224}," ai.yourdomain.com\n",[207,1060,1061],{"class":209,"line":217},[207,1062,1063],{"class":213},"# should return your server IP within 5 minutes\n",[44,1065],{},[10,1067,1069],{"id":1068},"_12-cost-summary","12. Cost Summary",[86,1071,1072,1085],{},[89,1073,1074],{},[92,1075,1076,1079,1082],{},[95,1077,1078],{},"Config",[95,1080,1081],{},"Use Case",[95,1083,1084],{},"Monthly Cost",[111,1086,1087,1097,1108],{},[92,1088,1089,1091,1094],{},[116,1090,118],{},[116,1092,1093],{},"API proxy, small agents",[116,1095,1096],{},"~€4.51",[92,1098,1099,1102,1105],{},[116,1100,1101],{},"CPX31 + snapshots",[116,1103,1104],{},"7B models, agent stack",[116,1106,1107],{},"~€14–16",[92,1109,1110,1113,1116],{},[116,1111,1112],{},"CPX31 + IPv4 + backups",[116,1114,1115],{},"Production inference",[116,1117,1118],{},"~€16–18",[15,1120,1121],{},"IPv4 addresses cost an additional €0.50\u002Fmo. IPv6 is free and works for most setups.",[44,1123],{},[10,1125,1127],{"id":1126},"next-steps","Next Steps",[25,1129,1130,1136,1139],{},[28,1131,1132,1133],{},"Install Ollama on the server: ",[72,1134,1135],{},"curl -fsSL https:\u002F\u002Follama.com\u002Finstall.sh | sh",[28,1137,1138],{},"Set up Nginx as a reverse proxy with Let's Encrypt",[28,1140,1141],{},"Deploy an OpenAI-compatible inference gateway (LiteLLM, llama.cpp server)",[1143,1144,1145],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":203,"searchDepth":217,"depth":387,"links":1147},[1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161],{"id":12,"depth":217,"text":13},{"id":48,"depth":217,"text":49},{"id":83,"depth":217,"text":84},{"id":192,"depth":217,"text":193},{"id":275,"depth":217,"text":276},{"id":362,"depth":217,"text":363},{"id":468,"depth":217,"text":469},{"id":528,"depth":217,"text":529},{"id":681,"depth":217,"text":682},{"id":804,"depth":217,"text":805},{"id":893,"depth":217,"text":894},{"id":1029,"depth":217,"text":1030},{"id":1068,"depth":217,"text":1069},{"id":1126,"depth":217,"text":1127},"vps","Rent and harden a Hetzner Cloud VPS for running local LLMs, agents, or a private inference gateway.","beginner","md",{},"\u002Fen\u002Fguides\u002Fhetzner-vps-setup","2026-05-30",25,{"title":5,"description":1163},"hetzner-vps-setup","en\u002Fguides\u002Fhetzner-vps-setup",[1174,1162,1175,286,1176],"hetzner","devops","ufw","wtVDW9ODhnfcAfvRElGAmFdkdznRukpDNw5bp3AbzU0",1781557609815]