Everything you need
to deploy.
Guides, references, and answers for hosting Discord bots, websites, and more on NeedTo.Host — European infrastructure, low latency, free tier included.
Introduction
NeedTo.Host is a cloud hosting platform designed for developers and creators — with a strong focus on Discord bot hosting and web hosting at unbeatable latency from Europe.
What can you host?
- Discord Bots — Any language (Node.js, Python, etc.) running inside isolated Docker containers
- Static Sites — HTML/CSS/JS, Nginx-powered, instant deploy
- Node.js Apps — Express, Next.js, Fastify…
- PHP — Apache + PHP 8.2
- Python — Flask, Django, FastAPI
- Ghost CMS — Modern blog platform, pre-installed
- WordPress — Full stack: Nginx, PHP-FPM, MySQL 8, Redis
Infrastructure
All services run on Hetzner FSN1 (Frankfurt, Germany) — one of the closest datacenters to Discord's European infrastructure (~10–20ms WebSocket latency). Your containers are fully isolated with Docker.
Why Frankfurt? Discord's closest backend endpoint from Western Europe is in Frankfurt. A bot hosted here experiences ~10ms WebSocket latency vs ~120ms from a US server.
Quick start
From zero to deployed in under 2 minutes.
Create an account
Go to needto.host/register and sign up with your email. You'll receive a verification email — click the link to activate your account.
Choose a plan
Visit Dashboard → Plans. Pick a free or paid plan. For bots, the free 256MB plan is a great start.
Configure your service
Name your service. For websites, choose a subdomain (e.g. mybot.needto.host). Select your node — Frankfurt is recommended.
Upload your files
Use the Files tab to upload your project. Or use the Startup tab to clone a Git repository on first boot.
Set your startup command & start
In the Startup tab, set your launch command (e.g. node index.js). Then click Start in the Console. Your service is live.
Account setup
Manage your profile, security, and authentication settings.
Email verification
Your email must be verified before you can create or purchase any service. Check your inbox after registration — if the email doesn't arrive within 2 minutes, check spam or use the "Resend" button on the verification page.
Two-factor authentication (2FA)
Enable 2FA in Security settings using any TOTP authenticator (Google Authenticator, Authy, 1Password…). You'll also receive recovery codes — store them safely.
Important: Recovery codes are single-use and shown only once. If you lose access to your authenticator and your recovery codes, account recovery will require manual identity verification.
Password reset
Use Forgot password to receive a reset link by email. Links expire after 1 hour.
Discord Bots
Host any Discord bot — Node.js, Python, Java, Rust. Any language that runs in Docker. See our Discord bot hosting overview →
Supported runtimes
Your bot container includes a full Linux environment (Debian-based). You can run anything that works in a Docker container: Node.js, Python 3, Java, Go, Rust, etc.
Deploying a Node.js bot
Upload your files
Go to Files tab and upload your project. Make sure package.json is at the root.
Set environment variables
Go to Startup → Environment Variables and add your bot token: DISCORD_TOKEN=your_token_here
Set startup command
In Startup → Startup command, set: npm install && node index.js
Start
Click Start in the Console. The output will appear live.
Deploying a Python bot
# Startup command example
pip install -r requirements.txt && python bot.py
Make sure your requirements.txt is at the root and includes discord.py or nextcord.
Auto-restart
Paid bot plans support auto-restart — if your container crashes, Docker will automatically restart it. Enable it in Startup → Auto-restart. Free tier bots do not support auto-restart.
Latency tip: Our Frankfurt server is ~10–20ms from Discord's EU gateway. That's 5–10× faster than US-based hosting.
Websites
Deploy any type of website under your free *.needto.host subdomain or your own custom domain.
Available install types
| Type | Stack | Best for |
|---|---|---|
| Static | Nginx | HTML/CSS/JS portfolios, landing pages |
| Node.js | Node + Nginx | Express, Next.js, Fastify APIs |
| PHP | Apache + PHP 8.2 | Custom PHP apps, Laravel, Symfony |
| Python | Python 3 + Gunicorn | Flask, Django, FastAPI |
| Ghost CMS | Ghost + Nginx | Blogs, newsletters |
| WordPress | Nginx + FPM + MySQL + Redis | CMS, e-commerce |
Subdomains
Every site gets a free subdomain at yourname.needto.host. Subdomains must be 3–63 characters, lowercase letters, numbers, and hyphens only.
Ports
For Node.js, Python, or PHP apps, your app must listen on the port specified in the Network tab of your service dashboard. Use the environment variable PORT in your code:
// Node.js
const PORT = process.env.PORT || 3000
app.listen(PORT)
# Python (Flask)
import os
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 5000)))
WordPress
WordPress is fully automated — Nginx, PHP 8.2-FPM, MySQL 8, and Redis object cache are pre-configured. See our WordPress hosting overview →
Admin access
After provisioning (takes ~2–3 minutes), access your WordPress admin at:
https://yoursite.needto.host/wp-admin
Credentials are shown in the WordPress sub-tab of your service page immediately after creation. Store them — they won't be shown again.
Redis object cache
Redis is pre-configured as an object cache drop-in. It significantly improves page load times by caching database queries. No configuration needed.
PHP configuration
PHP 8.2-FPM is configured with OPcache (192MB) for fast performance. JIT is disabled by default for compatibility.
File uploads
Upload media and theme files via the WordPress admin interface or via the Files tab in the service dashboard (both methods work).
Performance tip: Install a caching plugin like WP Super Cache or W3 Total Cache on top of Redis for maximum performance.
VPS
Full virtual private servers are coming soon. Coming soon
VPS plans will give you full root access to a dedicated Linux environment. Join our Discord server to be notified when VPS plans launch.
Custom domains
Point your own domain to your site. HTTPS is provisioned automatically via Let's Encrypt.
Custom domains are available for paid website plans only. Free tier sites cannot use custom domains without the Custom Domain add-on.
Step 1 — Add your domain
In your service dashboard, go to the Domain sub-tab. Enter your custom domain (e.g. www.example.com or example.com).
Step 2 — Configure DNS
Add one of the following DNS records with your domain registrar:
| Type | Name | Value |
|---|---|---|
| A | @ or www | 116.202.158.97 |
| CNAME | www | yoursite.needto.host |
DNS propagation typically takes a few minutes, but can take up to 24–48 hours in rare cases.
Step 3 — Verify & get HTTPS
Click Verify in the Domain tab. We'll check your DNS records and automatically request an SSL certificate from Let's Encrypt. HTTPS will be active within ~30 seconds of verification.
Only one custom domain per service. You can update or remove it at any time from the Domain tab.
File manager
Browse, upload, edit, and delete files directly in your container.
Uploading files
In the Files tab of your service, click Upload to drag-and-drop or browse files. You can upload individual files or entire ZIP archives (automatically extracted).
Navigating directories
Click any folder to enter it. Use the breadcrumb navigation at the top to go back. Your working directory is shown at all times.
Editing files inline
Click any text file (e.g. .js, .py, .json, .html) to open the inline editor. Save with the button or Ctrl+S.
Permissions
All files in your container are accessible. System directories are not exposed. Your working directory is /home/container.
Console & logs
Real-time container output, start/stop controls, and log history.
Live console
The Console tab shows your container's stdout/stderr in real time via WebSocket. There is no delay — you see output as it happens.
Start / Stop / Restart
Use the buttons at the top of the Console tab to control your container. The status indicator (green/orange/red) reflects the current state.
Sending input
Click the console input at the bottom to type a command and press Enter. This sends stdin to your running process — useful for interactive REPL programs.
Log retention
Logs are streamed live and not stored server-side beyond the active session. If you need persistent logs, write them to a file from your application.
Environment variables
Securely inject secrets and configuration into your container.
Setting variables
Go to the Startup tab of your service, then the Environment section. Add key/value pairs. Changes apply on the next container restart.
Accessing variables in code
// Node.js
const token = process.env.DISCORD_TOKEN
# Python
import os
token = os.environ.get('DISCORD_TOKEN')
Security
Environment variables are stored encrypted and are never exposed in logs or the console output. Never hardcode secrets in your source files — use env vars instead.
Never commit secrets to Git. Use a .env file locally and set the same variables in the dashboard for production.
Startup command
The command executed when your container starts.
How it works
The startup command runs as a shell command inside your container when you click Start. It's executed with /bin/sh -c, so you can chain commands with &&.
Common examples
# Node.js bot / app
npm install && node index.js
# Python bot
pip install -r requirements.txt && python bot.py
# Python with venv
python3 -m venv venv && source venv/bin/activate && pip install -r requirements.txt && python bot.py
# Run a script
bash start.sh
Git clone on first boot
You can clone a public Git repository and start your app in one command:
git clone https://github.com/youruser/yourbot.git . && npm install && node index.js
Tip: Use npm install --production instead of npm install to skip dev dependencies and save memory.
Free Tier
Host for free with the free Discord Bot or Website plan. Here's what you need to know.
What's included
Time system
Free services run on a time budget. Each service starts with 15 minutes of runtime. Every minute your service is active consumes 1 minute of budget.
When your time reaches 0, the service is suspended (stopped, not deleted). You have 72 hours to refill time before deletion.
Limits compared to paid plans
| Feature | Free | Paid |
|---|---|---|
| RAM | 256 MB | Up to 8 GB |
| Storage | 1 GB | Up to 50 GB |
| Custom domain | Add-on only | Included |
| Auto-restart (bots) | ✗ | ✓ |
| Sleep mode | Active | Never sleeps |
| Runtime budget | 15 min + claimable | Unlimited |
| Uptime | Sleep after 15min idle | Always on |
Sleep mode
Free tier sites and bots automatically sleep after inactivity to conserve resources.
How sleep works
If your free service receives no HTTP traffic for 15 minutes, it is put to sleep. The container is paused and time stops counting.
Wake on visit
When a visitor loads your site, they'll see a wake screen for a few seconds while your container starts. The wake is automatic — no action required from you or your visitors.
The wake screen automatically retries the request once the container is ready. Most services wake in 2–5 seconds.
Bots and sleep
Discord bots on free plans also sleep after 15 minutes of inactivity. Unlike websites, bots don't "wake on visit" — they need a manual start or a scheduled claim to keep running.
Want always-on? Upgrade to a paid plan — paid services never sleep and have unlimited runtime.
Claiming free time
Extend your free tier runtime by completing a short sponsored link.
How to claim
Open your service
Go to your free service in the dashboard. In the sidebar, find the Free Tier block.
Click "Claim +12h"
This opens a sponsored link. Complete the short page (usually 10–15 seconds).
Return and confirm
After completing, return to the dashboard. Your 12 hours of runtime will be added automatically.
Limits
- Maximum 5 claims per 24 hours per user (= 60h runtime per day)
- Claims expire if not confirmed within 30 minutes
- Anti-bypass protection is active — VPNs or link skippers won't work
Plans & pricing
Monthly subscriptions billed via Stripe. Cancel anytime.
Plan types
- Discord Bot plans — Optimized for always-on bots, auto-restart, low latency
- Website plans — Nginx proxied, custom domain support, multiple install types
- Free plans — Time-based, with sleep mode. No credit card required.
Payment
All paid plans are billed monthly via Stripe. We accept all major credit cards and many local payment methods (Bancontact, iDEAL, SEPA, etc.). We never store your card details.
VAT / Tax
Prices are shown excluding VAT. VAT is applied based on your country of residence (EU OSS rules). The exact amount is shown during checkout before you pay.
Upgrading / downgrading
Currently, to change your plan, cancel the existing service and create a new one with the new plan. Prorated billing on the old service is handled automatically.
Invoices
Download and manage your billing history.
Every payment generates an invoice in your Dashboard → Invoices. Invoices include:
- Invoice number (format:
INV-YYYY-NNNN) - Service name, plan, period
- Subtotal, VAT amount, total
- Your country and applicable tax rate
Click Download PDF to get a printable invoice for your accounting.
Cancel a service
Cancel anytime — no minimum commitment.
How to cancel
Open your service in the dashboard. Scroll to the bottom of the sidebar and click Delete server. This will:
- Stop and remove your container
- Cancel the associated Stripe subscription
- Create a prorated invoice for the remaining days of the current period
- Free up the subdomain for reuse
Deletion is permanent. All files inside your container are deleted and cannot be recovered. Back up your data before deleting.
Billing on cancellation
When you delete a paid service mid-period, a prorated invoice is automatically created for the days used. You are not charged for unused days.
Limits & fair use
Technical limits to ensure fair resource usage for all users.
| Resource | Free plan | Paid plan |
|---|---|---|
| Services per account | 1 bot + 1 site | Unlimited |
| RAM | 256 MB | Plan-defined (up to 8 GB) |
| Storage | 1 GB | Plan-defined (up to 50 GB) |
| CPU | 10% | Plan-defined (up to 400%) |
| Custom domains | Add-on required | 1 per service |
| Bandwidth | Fair use | Fair use |
| Email sending | Not included | Not included |
Excessive bandwidth usage or abuse (DDoS, crypto mining, spam) will result in immediate service suspension.
FAQ
Common questions answered.
Can I run a database?
You can use SQLite (file-based, no extra config) for small projects. For MySQL or PostgreSQL, use an external managed database service (PlanetScale, Railway, Supabase free tier). WordPress on NeedTo.Host already includes MySQL automatically.
Can I use a .env file?
Yes — upload a .env file via the file manager, or use the Environment Variables section in the Startup tab. Both approaches work. For security, we recommend using the dashboard env vars over committed files.
Why is my bot not connecting to Discord?
Check these common causes:
- Your
DISCORD_TOKENenv var is missing or incorrect - The startup command isn't running (check the console for errors)
- Missing intents — make sure you've enabled the required Gateway Intents in the Discord Developer Portal
- The container hasn't started — check that the status dot is green
My site shows a 502 error
Your app is not listening on the correct port, or it crashed on startup. Check the Console for errors. Make sure your app listens on the port shown in the Network tab and on host 0.0.0.0 (not localhost).
Can I use a custom Docker image?
Not directly — services run inside a standard Debian-based container. You can install packages at startup using apt-get in your startup command, but full custom images are not supported on the current plans.
Is there an API?
A public API is on the roadmap. Currently, all management is done through the dashboard. If you need programmatic access, contact support.
Can I transfer a service to another account?
Not currently supported. Contact support for manual transfers in special cases.
What happens when my paid subscription expires?
If a payment fails, you'll receive an email and your service will be suspended (not deleted immediately). You have a grace period to update your payment method. After 7 days without resolution, the service is cancelled.
Contact & support
We're here to help.
Support tickets
The fastest way to get help: open a ticket in Dashboard → Support. Our team responds within 24 hours (usually faster).
For billing or account issues: contact@needto.host
Fastest support: Always include your service ID (found in the URL of your service page) when opening a ticket. This helps us diagnose issues immediately.