The open-source stack is the same code we run. There is no license key, no feature gate, and no phone-home. This gets a full local stack running, then covers what changes for production.
Bring the stack up
git clone https://github.com/moneyline/moneyline
cd moneyline
cp .env.example .env
docker compose up -d
# API on :8080, dashboard on :3000, worker and Postgres behind them.
curl http://localhost:8080/healthConfigure it
Everything is environment variables. The three that matter before anything else:
# Postgres. Use a managed instance in production.
DATABASE_URL=postgres://moneyline:moneyline@db:5432/moneyline
# Signs sessions and encrypts stored credentials.
# Generate with: openssl rand -hex 32
SECRET_KEY=
# Object storage for uploaded documents. Any S3-compatible
# endpoint works, including MinIO inside your own network.
STORAGE_ENDPOINT=http://minio:9000
STORAGE_BUCKET=moneyline-documentsCreate the first organization
docker compose exec api moneyline admin create-org \
--name "Example Capital" \
--owner-email you@example.com
# Prints a one-time invite link. Registration is closed
# by default, so nobody else can create an account.Production differences
- Postgres outside Compose. The bundled database has no backups and no failover. Point
DATABASE_URLat a managed instance. - Scale the worker, not the API. Parsing is the expensive half. Run several worker replicas against one API.
- Terminate TLS in front. The API speaks plain HTTP and expects a proxy or ingress ahead of it.
- Persist object storage. Documents live in the bucket, not the database. Losing it loses the originals.
Kubernetes
A Helm chart is included for anything beyond a single host. It carries the same defaults, plus a horizontal pod autoscaler for the worker keyed on queue depth rather than CPU, since parsing is IO-bound often enough that CPU is a poor signal.
helm repo add moneyline https://charts.moneyline.co
helm install moneyline moneyline/moneyline \
--set postgres.url="$DATABASE_URL" \
--set secretKey="$SECRET_KEY"Upgrading
Migrations run on boot and are forward-only. Parser schemas are pinned per release, so upgrading changes behaviour only where the release notes say it does. Read the changelog for breaking changes before a major.