Free Python hosting with a MySQL database
requirements.txt at startup.
CPU is capped at 30% of a core, which is what rules out data-science workloads rather
than the memory limit.Step by step
Create the server
From the Servers tab of dash.waifly.com, click Create, choose the Python Egg, name the server and pick a Paris location. The free plan's limits apply automatically: 300 MB RAM, 1 GB disk, 30% CPU.
Upload your code and requirements.txt
Use the panel file manager or SFTP. requirements.txt is what drives dependency installation at startup — pin your versions there rather than relying on whatever is latest.
Create the MySQL database
In the panel's Databases tab, create the database. The host, name, user and password are shown there; put them in a .env file rather than in your source, since .env files are excluded from the automated security scan.
Set the startup command
python main.py for a script or a bot. For a Flask or FastAPI app, bind to the port given in the environment variable rather than a hard-coded one, and run through gunicorn or uvicorn.
Start and check the console
pip install output and your own logs both land in the live console. Enable auto-restart so a crash does not leave the server idle — 3 days offline means automatic suspension.
What runs well inside 300 MB
- Discord bots (discord.py) — typically 60–90 MB at idle.
- Flask and FastAPI APIs behind gunicorn or uvicorn, with one or two workers.
- Telegram bots, webhook receivers, scheduled scrapers.
- Small Django projects, provided you keep the worker count low.
What does not: pandas, numpy or scikit-learn on any real dataset, Selenium and Playwright, and anything training a model. These are CPU-bound as much as memory-bound, and the 30% cap is the binding constraint. Nano at €4/month gives 4 GB and 2 full vCPU.
Using the MySQL database
The free plan includes one MySQL database, created from the panel. Read its credentials from environment variables rather than committing them:
import os
import mysql.connector
conn = mysql.connector.connect(
host=os.environ["DB_HOST"],
user=os.environ["DB_USER"],
password=os.environ["DB_PASSWORD"],
database=os.environ["DB_NAME"],
)
Paid plans raise the count: 1 database on Nano, 3 on Mega, 10 on Giga.
Keeping a free Python server alive
The free plan has no sleep mode and no hour quota — the process runs continuously. What ends a free server is the anti-abuse policy: 3 consecutive days offline triggers automatic suspension, and an automated inspection runs every 30 minutes. VPNs, proxies, tunnels and obfuscated code are forbidden.
A suspended server created less than 7 days earlier is deleted after 3 days; an older one is retained 15 days and recoverable from backups.waifly.com. If it is not blacklisted, you can reactivate it yourself at unsuspend.waifly.com.