[Unit]
Description=Funding Finder API server
After=network.target [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/api.py
Restart=always
RestartSec=5
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/api.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/api.log
Environment=PORT=8083 [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder API server
After=network.target [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/api.py
Restart=always
RestartSec=5
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/api.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/api.log
Environment=PORT=8083 [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder API server
After=network.target [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/api.py
Restart=always
RestartSec=5
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/api.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/api.log
Environment=PORT=8083 [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder data collector (5-min loop)
After=network.target [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/collector.py --exchanges binance,bybit,okx,bitget,mexc,hyperliquid,gateio,dydx --loop 300
Restart=always
RestartSec=10
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/collector.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/collector.log [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder data collector (5-min loop)
After=network.target [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/collector.py --exchanges binance,bybit,okx,bitget,mexc,hyperliquid,gateio,dydx --loop 300
Restart=always
RestartSec=10
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/collector.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/collector.log [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder data collector (5-min loop)
After=network.target [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/collector.py --exchanges binance,bybit,okx,bitget,mexc,hyperliquid,gateio,dydx --loop 300
Restart=always
RestartSec=10
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/collector.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/collector.log [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder healthcheck monitor (Telegram alerts)
After=network.target funding-finder-api.service
Wants=funding-finder-api.service [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/monitor.py --interval 600 --alert-after 2
Restart=always
RestartSec=30
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/monitor.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/monitor.log [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder healthcheck monitor (Telegram alerts)
After=network.target funding-finder-api.service
Wants=funding-finder-api.service [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/monitor.py --interval 600 --alert-after 2
Restart=always
RestartSec=30
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/monitor.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/monitor.log [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder healthcheck monitor (Telegram alerts)
After=network.target funding-finder-api.service
Wants=funding-finder-api.service [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/monitor.py --interval 600 --alert-after 2
Restart=always
RestartSec=30
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/monitor.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/monitor.log [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder alerts worker (Telegram dispatch)
After=network.target funding-finder-api.service
Wants=funding-finder-api.service [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/alerts_worker.py --interval 60
Restart=always
RestartSec=15
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/alerts.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/alerts.log [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder alerts worker (Telegram dispatch)
After=network.target funding-finder-api.service
Wants=funding-finder-api.service [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/alerts_worker.py --interval 60
Restart=always
RestartSec=15
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/alerts.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/alerts.log [Install]
WantedBy=multi-user.target
[Unit]
Description=Funding Finder alerts worker (Telegram dispatch)
After=network.target funding-finder-api.service
Wants=funding-finder-api.service [Service]
Type=simple
WorkingDirectory=/root/project_30d/artifacts/funding_finder
ExecStart=/usr/bin/python3 /root/project_30d/artifacts/funding_finder/alerts_worker.py --interval 60
Restart=always
RestartSec=15
StandardOutput=append:/root/project_30d/artifacts/funding_finder/data/alerts.log
StandardError=append:/root/project_30d/artifacts/funding_finder/data/alerts.log [Install]
WantedBy=multi-user.target
[Unit]
Description=Mission 30j supervision dashboard
After=network.target [Service]
Type=simple
WorkingDirectory=/root/project_30d
ExecStart=/usr/bin/python3 /root/project_30d/dashboard/backend.py
Restart=always
RestartSec=5
StandardOutput=append:/root/project_30d/journal/backend.log
StandardError=append:/root/project_30d/journal/backend.log
Environment=PORT=8082 [Install]
WantedBy=multi-user.target
[Unit]
Description=Mission 30j supervision dashboard
After=network.target [Service]
Type=simple
WorkingDirectory=/root/project_30d
ExecStart=/usr/bin/python3 /root/project_30d/dashboard/backend.py
Restart=always
RestartSec=5
StandardOutput=append:/root/project_30d/journal/backend.log
StandardError=append:/root/project_30d/journal/backend.log
Environment=PORT=8082 [Install]
WantedBy=multi-user.target
[Unit]
Description=Mission 30j supervision dashboard
After=network.target [Service]
Type=simple
WorkingDirectory=/root/project_30d
ExecStart=/usr/bin/python3 /root/project_30d/dashboard/backend.py
Restart=always
RestartSec=5
StandardOutput=append:/root/project_30d/journal/backend.log
StandardError=append:/root/project_30d/journal/backend.log
Environment=PORT=8082 [Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now funding-finder-api
sudo systemctl enable --now funding-finder-collector
sudo systemctl enable --now funding-finder-monitor
sudo systemctl enable --now funding-finder-alerts
sudo systemctl enable --now project30d-dashboard
sudo systemctl daemon-reload
sudo systemctl enable --now funding-finder-api
sudo systemctl enable --now funding-finder-collector
sudo systemctl enable --now funding-finder-monitor
sudo systemctl enable --now funding-finder-alerts
sudo systemctl enable --now project30d-dashboard
sudo systemctl daemon-reload
sudo systemctl enable --now funding-finder-api
sudo systemctl enable --now funding-finder-collector
sudo systemctl enable --now funding-finder-monitor
sudo systemctl enable --now funding-finder-alerts
sudo systemctl enable --now project30d-dashboard
systemctl is-active funding-finder-{api,collector,monitor,alerts} project30d-dashboard
systemctl is-active funding-finder-{api,collector,monitor,alerts} project30d-dashboard
systemctl is-active funding-finder-{api,collector,monitor,alerts} project30d-dashboard
sudo systemctl restart funding-finder-{api,collector,monitor,alerts}
sudo systemctl restart funding-finder-{api,collector,monitor,alerts}
sudo systemctl restart funding-finder-{api,collector,monitor,alerts}
sudo systemctl stop funding-finder-{api,collector,monitor,alerts}
sudo systemctl stop funding-finder-{api,collector,monitor,alerts}
sudo systemctl stop funding-finder-{api,collector,monitor,alerts} - No Dockerfile — your code runs in the host Python, no isolation layer
- No docker-compose.yml — systemd is the orchestrator
- No nginx in front — Flask listens on the public port directly (or use ufw to control which IPs can connect)
- No process manager (supervisor, pm2, etc) — systemd is the process manager
- No log shipper (filebeat, fluentd, etc) — tail is enough at small scale
- No image registry — there are no images
- No CI/CD pipeline — git pull && systemctl restart is your deploy
- No staging environment — fix it in prod, you have an audience of 0 right now
- No "production-grade" web server — Flask dev server handles ~500 req/sec on 1 core, plenty for personal projects - Docker when you need to ship the same app to multiple environments with different OS
- nginx when you need TLS termination, rate limiting, or static file caching at the edge
- gunicorn when you exceed ~500 req/sec sustained
- A real DB when SQLite WAL can't handle the write contention (rarely below 50k writes/sec)
- A staging environment when you have paying customers whose downtime would cost real money
- A CI pipeline when there's more than one developer