How to Run MoneyPrinterTurbo as a Service: Docker and Systemd Deployment Guide
Run MoneyPrinterTurbo as a persistent background service using either Docker Compose for containerized deployments or systemd for native Linux process management, exposing the API on port 8080 and the Web UI on port 8501.
MoneyPrinterTurbo is an open-source AI video generation platform that ships with two distinct runtime components. Deploying it as a service requires orchestrating both the FastAPI backend and the Streamlit frontend to run continuously and restart automatically on failure. This guide covers production-ready deployment strategies using the official source files from the harry0703/MoneyPrinterTurbo repository.
Architecture Overview
MoneyPrinterTurbo operates as two independent processes that share the same codebase but serve different traffic patterns.
The Two-Process Architecture
| Component | Entry Point | Default Port | Protocol |
|---|---|---|---|
| API Service | main.py |
8080 | HTTP REST (Uvicorn/FastAPI) |
| Web UI | webui/Main.py |
8501 | Streamlit interactive interface |
The API service defined in main.py launches a Uvicorn ASGI server that mounts the FastAPI application from app/asgi:app. It exposes REST endpoints under app/controllers/v1/*.py for programmatic video generation. The Web UI defined in webui/Main.py renders a browser-based interface that imports services directly from app.services.llm and app.services.voice, though it can optionally be configured to call the external API.
Key Source Files
Understanding the entry points is critical for service configuration:
main.py– Executesuvicorn.run()with the ASGI app, reading configuration fromapp/config/config.pywhich loadsconfig.toml.webui/Main.py– The Streamlit entry point that renders the graphical interface.docker-compose.yml– Orchestrates both services with shared volumes for configuration persistence.webui.sh– Convenience shell script that wraps thestreamlit runcommand with default flags.
Method 1: Docker Compose Deployment
Docker Compose is the recommended approach for production deployments, as the Dockerfile pre-installs system dependencies including ffmpeg and ImageMagick, ensuring consistent runtime environments.
Prerequisites and Setup
Clone the repository and prepare the configuration:
git clone https://github.com/harry0703/MoneyPrinterTurbo.git
cd MoneyPrinterTurbo
# Create runtime configuration from template
cp config.example.toml config.toml
Edit config.toml to configure your LLM provider API keys and storage paths according to the settings defined in app/config/config.py.
Building and Starting Services
Build the image and launch both services in detached mode:
docker compose build
docker compose up -d
The docker-compose.yml defines two services:
api– Runspython main.pyexposing port 8080webui– Runsstreamlit run webui/Main.pyexposing port 8501
Both services mount the host's config.toml and storage/ directory as volumes, ensuring that video outputs and configuration changes persist across container restarts.
Verification
Confirm both containers are healthy:
docker ps
curl http://localhost:8080/docs # Access Swagger UI
open http://localhost:8501 # Access Streamlit interface
To stop the services:
docker compose down
Method 2: Systemd Service Deployment
For bare-metal Linux servers, systemd provides native process supervision with automatic restart capabilities and log aggregation via journalctl.
Installation Steps
Install the code and dependencies to a dedicated directory:
sudo mkdir -p /opt/moneyprinterturbo
sudo chown $(whoami):$(whoami) /opt/moneyprinterturbo
git clone https://github.com/harry0703/MoneyPrinterTurbo.git /opt/moneyprinterturbo
# Create unprivileged service user
sudo useradd -r -s /usr/sbin/nologin moneyprinter
# Install system dependencies
sudo apt-get update && sudo apt-get install -y ffmpeg imagemagick
# Install Python dependencies in virtual environment
cd /opt/moneyprinterturbo
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# Copy and edit configuration
cp config.example.toml config.toml
# Edit config.toml with your API keys
API Service Unit
Create /etc/systemd/system/moneyprinterturbo-api.service:
[Unit]
Description=MoneyPrinterTurbo API Service
After=network.target
[Service]
WorkingDirectory=/opt/moneyprinterturbo
ExecStart=/opt/moneyprinterturbo/venv/bin/python /opt/moneyprinterturbo/main.py
Environment="PYTHONPATH=/opt/moneyprinterturbo"
Restart=on-failure
User=moneyprinter
Group=moneyprinter
[Install]
WantedBy=multi-user.target
Web UI Service Unit
Create /etc/systemd/system/moneyprinterturbo-webui.service:
[Unit]
Description=MoneyPrinterTurbo Web UI (Streamlit)
After=network.target
[Service]
WorkingDirectory=/opt/moneyprinterturbo
ExecStart=/opt/moneyprinterturbo/venv/bin/streamlit run ./webui/Main.py \
--browser.serverAddress=0.0.0.0 \
--server.enableCORS=True \
--browser.gatherUsageStats=False
Environment="PYTHONPATH=/opt/moneyprinterturbo"
Restart=on-failure
User=moneyprinter
Group=moneyprinter
[Install]
WantedBy=multi-user.target
Managing Systemd Services
Enable and start both services:
sudo cp moneyprinterturbo-api.service /etc/systemd/system/
sudo cp moneyprinterturbo-webui.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now moneyprinterturbo-api.service
sudo systemctl enable --now moneyprinterturbo-webui.service
Monitor status and logs:
sudo systemctl status moneyprinterturbo-api.service
journalctl -u moneyprinterturbo-webui.service -f
Essential Commands Reference
| Task | Docker Compose | Systemd |
|---|---|---|
| Start services | docker compose up -d |
sudo systemctl start moneyprinterturbo-api.service |
| View logs | docker compose logs -f |
journalctl -u moneyprinterturbo-api.service -f |
| Restart | docker compose restart |
sudo systemctl restart moneyprinterturbo-api.service |
| Stop | docker compose down |
sudo systemctl stop moneyprinterturbo-api.service |
Summary
- MoneyPrinterTurbo consists of two distinct services: a FastAPI backend (
main.py) on port 8080 and a Streamlit frontend (webui/Main.py) on port 8501. - Docker Compose provides the simplest deployment path, handling dependency installation via the
Dockerfileand ensuring consistent environments across hosts. - Systemd offers tighter integration with Linux host systems, providing automatic startup on boot and centralized logging through
journalctl. - Both methods require the
config.tomlfile for LLM API keys and ffmpeg paths, loaded at runtime byapp/config/config.py.
Frequently Asked Questions
What ports does MoneyPrinterTurbo use by default?
The API service binds to port 8080 and serves the REST API with Swagger documentation available at /docs. The Web UI service binds to port 8501 and provides the Streamlit graphical interface. These ports are hardcoded in the default startup commands but can be modified via environment variables or command-line arguments in your service definitions.
Can I run only the API without the Web UI?
Yes. The components are decoupled by design. To run only the API service, start main.py directly without launching webui/Main.py. This is useful for headless deployments where you intend to interact with MoneyPrinterTurbo programmatically via the REST API rather than through the browser interface.
How do I persist data when using Docker Compose?
The docker-compose.yml mounts the ./storage directory from the host into the container. All generated videos, audio files, and temporary assets are written to this directory by the service layer (app/services). Ensure this directory has appropriate permissions for the container user or bind-mount to a specific host path in your compose override file.
Where are the logs stored when running as a systemd service?
Systemd captures stdout and stderr from both the API and Web UI processes in the system journal. Access logs using journalctl -u moneyprinterturbo-api.service for the backend and journalctl -u moneyprinterturbo-webui.service for the frontend. Add the -f flag to follow logs in real-time, similar to tail -f.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →