Exploring business banking with F#.
- Akka.NET: actor model, event sourcing, cluster sharded entities
- PostgreSQL
- React via F# Feliz
- RabbitMQ: Queued communication with external services
- SignalR: Provides feedback from actors running on the server to components in the React SPA
- Quartz.NET: Future/recurring actor message scheduling with PostgreSQL persistence
- Pulumi: IaC via TypeScript for managing Kubernetes resources locally or deployed to Azure Kubernetes Service
- Automatic Balance Management
- Maintain a zero balance after each transaction
- Maintain a daily target balance by allowing a partner account to absorb excess cash or replenish cash to the target account
- Distribute balance among multiple accounts within an org on a per-transaction, daily, or twice-monthly schedule
- Lithic card issuer makes requests to our platform to authorize employee debit card purchases & communicate progression of the purchase lifecycle
- Approval Rules
- Require admin approval for inviting employees, unlocking cards, fulfilling payments, etc.
- Restrict submission of actions by type, daily accrued transaction amount, and transaction amount with upper and lower bounds (ex: amounts less than $1500 require 1 approvers; amounts between $1500 and $10,000 require 2 approvers)
- Assign multiple approvers per rule (ex: Den Vau, Pop Pongkool, & Any Admin = 3 approvals required to submit an action associated with this rule)
- Payment requests between organizations on the platform or external entities
- Optional recurring schedule (ex: due date every 3 months on the last Monday of the month until 4 payments made)
- Optional invoice line-item breakdown
- Transfer money immediately or on a future date to other organizations on the platform or domestically (ex: ACH)
- Partner Bank
- Create a legal entity for the business during onboarding
- Process domestic transfers (ex: ACH)
- Currently set up as a separate server processing TCP requests from the platform, mocking interactions between platform and partner bank
- TODO: Integrate with an actual partner bank (column)
- Recurring maintenance fee for each billing cycle unless a qualified deposit found or a daily account balance threshold met.
- Manage daily/monthly employee purchase limits per employee card
- Monitor employee purchases and other activities on the platform
- Billing statements issued for each billing cycle
- Emails sent for payment requests, employee invites, purchase declined, etc.
- Dependencies: .NET 9, minikube, pulumi, Node.js 18
sh build.sh -t RunK8sApp- Browser opens automatically after all K8s resources start up
- Enable postgres port forwarding if you want to inspect postgres in a local client:
sh postgres-port-forward-k8s.sh(Server=postgres;Database=akkabank;Uid=testuser;Pwd=testpass) - View Akka cluster and actor info via Petabridge.Cmd:
> minikube kubectl -- exec --stdin --tty account-cluster-0 -- /bin/bash > dotnet tool run pbm > cluster show > actor hierarchy
- Dependencies: .NET 9, Node.js 18
sh build.sh -t RunDockerApp- Navigate to localhost:3000
- If you want to inspect postgres in a dashboard you can visit localhost:5008 (Server=postgres;Database=akkabank;Uid=postgres;Pwd=password)
- Dependencies: .NET 9, Node.js 18, PostgreSQL & psql
- Create a database (Server=localhost;Database=akkabank;Uid=postgres;Pwd=password)
- Seed the database:
psql -h 127.0.0.1 -p 5432 -U postgres akkabank < Database/Init/Bank.sql cdinto ./Web, ./Account/Service, ./Scheduler/Service, & ./MockPartnerBank.Service &dotnet runin eachcdinto ./UI andnpm run buildornpm start
- Dependencies: .NET 9, Azure CLI, Pulumi, Node.js 18
sh build.sh -t DeployAllStaging(You will be prompted to sign in to Pulumi & Azure CLI)- One pulumi stack of Azure AKS resources and another Pulumi stack for K8s resources will be created. A Pulumi ESC staging environment will be created and app environment configuration will be set. Your local kubeconfig file will be modified to include details needed to connect to the AKS cluster. See
kubectl get all --namespace akkabank&kubectl get all --namespace app-routing-system. App images are currently being pulled from my public docker hub repos. An IP will be exported to the console when Pulumi finishes creating resources.
sh build.sh -t Test





