| .. | ||
| app | ||
| .env-example | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
| requirements.txt | ||
FleetLedger
FleetLedger is a small self-hosted web app to keep track of your rented servers:
- VPS, dedicated servers, storage boxes, managed services
- Provider, location, IPs, hardware
- Monthly / yearly pricing and contract dates
- Simple access info (management URLs, SSH user + key hint)
- Multi-user support with per-user data separation
- Admin user management (activate / deactivate users)
- Dark-mode-first UI with PWA support (installable as an app)
- Per-user map view for server locations
- Admin global dashboard for fleet-wide stats
Security note: FleetLedger is not a full password manager. It is intentionally designed to store only management password(s) optionally and only SSH key names (no private keys).
Features
-
Authentication & Users
- User registration + login (session cookie based)
- First registered user becomes admin
- Admin can view all users and activate/deactivate them
- Deactivated users cannot log in and will be logged out automatically
-
Server Management
- Each user has their own list of servers (no cross-visibility)
- Create / edit / archive (soft-delete) servers
- Fields include:
- General: name, hostname, type (VPS, dedicated, storage, managed, other), provider, location, tags
- Network: IPv4, IPv6
- Billing: price, currency, billing period (monthly/yearly/other), contract start/end
- Hardware: CPU model, core count, RAM, storage size & type
- Access: management URL, management user, management password (optional), SSH user, SSH key hint
- Free-form notes
- Contract badges:
- "abgelaufen" (expired): contract end in the past
- "läuft bald aus" (expiring soon): contract end within the next 30 days
- Detail view also shows how many days until / since contract end
-
Per-user Dashboard & Map
- On
/: small dashboard row showing:- number of active servers
- estimated total monthly cost
- how many contracts are expiring soon / already expired
- On
/map: Leaflet-based map showing all non-archived servers of the logged-in user- Marker position is derived from the
locationstring (city/datacenter name) - Multiple servers per city are slightly offset so all markers remain clickable
- Click on a marker → opens the server details page
- Marker position is derived from the
- On
-
Admin Global Dashboard
- On
/admin/dashboard(admin only):- Global counts: users, servers, monthly cost, expiring soon, expired
- Breakdown by provider (server count, monthly total, expiring soon, expired)
- List of contracts expiring soon and already expired
- On
-
Security
- Passwords hashed with bcrypt (
passlib[bcrypt]) - Optional encryption for management passwords using Fernet (
cryptography) - No private SSH keys are stored, only name/hint strings
- Jinja2 auto-escaping enabled; no untrusted HTML is rendered with
|safe - Management URLs are restricted to
http://orhttps://(nojavascript:links, etc.)
- Passwords hashed with bcrypt (
-
UI / UX
- TailwindCSS via CDN for quick styling
- Dark mode is enabled by default
- Theme preference stored in
localStorageand toggleable via a small button - Responsive layout, works well on mobile
- PWA manifest and service worker for a simple offline-friendly experience
Quick Start (Docker)
0. Environment
Kopiere .env-example nach .env und setze mindestens ein starkes SESSION_SECRET. Für lokale HTTP-Tests kannst du SESSION_COOKIE_SECURE=0 setzen, in Produktion sollte es 1 bleiben. Optional kannst du einen ENCRYPTION_KEY (Fernet) hinterlegen, um Management-Passwörter zu speichern.
1. Clone / copy the repository
git clone https://example.com/your/fleetledger.git
cd fleetledger