---
# System prepended metadata

title: AFJ Multitenancy

---

# AFJ Multitenancy


## What is Multitenancy? 

Most deployments of ACA-Py use a single wallet for all operations. This means all connections, credentials, keys, and everything else is stored in the same wallet and shared between all controllers of the agent. Multi-tenancy in ACA-Py allows multiple tenants to use the same ACA-Py instance with a different context. All tenants get their own encrypted wallet that only holds their own data.

General description of Multitenancy in software applications can be found [here](https://www.salesforce.com/nl/blog/2016/06/wat-is-multitenancy--en-waarom-is-het-essentieel-voor-uw-succes-.html).

## Why is it needed?

For the ORCA project we don't want to setup an AFJ Rest Api server for every customer. It would be nice if we can use 1 rest api for all of our customers. We can add a token to every request to fetch the correct wallet for the action.

## What steps do we need to take?

**Are there anymore AFJ issues we need to tackle first?**
- [Postgres wallet support](https://github.com/hyperledger/aries-framework-javascript/issues/553): this is already supported by Indy. We just need to install a plugin.


**Where can we start with development?**

We have multiple options we can explore in AFJ.

- Option 1: Multiple instances of the same agent. 

This will probably be very resource heavy and not really scalable, but if this saves months of development time it might be something to look at.

- Option 2: Base wallet

At this time, when initializing a wallet, everything is a setup for the wallet. This makes running multiple agents very resource heavy. We could introduce a context so we can call a function with a context and return an agent. This agent will then be initialized and can be used. If agent is not used for x amount of time, the agent is shutdown again. Something to think about is how we introduce this context. You would want every implementation to stay the same.


- Option 3: Base agent as mediator

This structure requires a base agent that acts like a mediator. For every tenant a new agent is created. Every subagent uses the same inboudtransporter, but the base agent redirects the request to the correct wallet. Again, you want to introduce some sort of context so that you don't have to change every implemenatation to use an API key or something.

*2 and 3 are bassically the same?*

**Develop Proof of Concept** 

The goal: how can we handle multiple wallets?


1. PoC 1: Dependency injection to context
Could it be possible to change AFJ to use context instead of using dependency injection with singletons? How much does AFJ depent on these injected services right now and could we change this easily to use a context? 


2. PoC 2: Base Agent as mediator
Create a new agent for every sub agent. Use the same inboundtransporter for every agent but add a base agent in between that acts like a mediator. This can be called with a reference to the tenant wallet. 


**Design document**
These Options/PoC's could lead to a design document for the actual implementation in AFJ.


## Questions

- **Are tenants kind of subscribers of an Agent?**
Tenants all belong to the same agent, but have their own wallet. Requests will be handled by a base agent and redirected to the correct wallet based on some context.

- **Can we use ACAPy as an example or is it going to be implemented differently in AFJ?**
ACAPy is somewhat different from AFJ, so we can't use the same structure. Also, some features (like managed and un-managed wallets) are not needed in AFJ.

- **Hoe vertalen we de Multi-tenant Admin API naar AFJ?**
Kan wel encapsuleren in rest api.

- **De functionaliteit is voledig optional, en zou dus geen breaking changes veroorzaken?**
mag wel, maar het idee is wel dat de API hetzelfde blijft.

- **Are there any designs/discussions related to the implementation in ACA-Py?**
See links.

- **Is er een ACAPy instance draaiend waarbij we kunnen testen met de functionaliteit?**
We could do this, might be handy for aries-cli too. 

## Links
- https://github.com/hyperledger/aries-cloudagent-python/blob/main/Multitenancy.md
- https://hackmd.io/Rpx9CahTRJKtPAJxxqqYRQ
- https://hackmd.io/gTBBdYCYRRKNV8-Bo9yHWA
- https://docs.google.com/document/d/1qAtpEKtACshg_mhdf14fXNGPcNGkPo3xxp8xMFuRaBM/edit#heading=h.mek5yn6ipfxo


## Next steps

- Create an issue in AFJ
- Discuss what PoC we're going to work on next sprint
- Bring up the Multitenancy subject to see if some people have already thought about how this could be implemented.
- Postgres support in AFJ

