本篇教學的目的, 主要是學習 多租戶 tenant 的概念,
這邊使用 django-tenants 這個套件來說明.
拿作者的範例來介紹架構 (強烈建議要觀看原作者的說明).
首先, 多租戶技術 (Multi-Tenancy Technology), 他是一種軟體架構,
主要的目的就是實現多個客戶之間的隔離性, 安全性, 獨立性,以及同時降低管理和維護成本.
實作多租戶的方式有很多,
這套件主要是透過 PostgreSQL 中的 schemas 來實現多租戶,
只有一個 db(共享資料庫), 然後一個 schema(獨立 schema) 代表一個租戶 tenant.
安裝套件
pip install django-tenants
pip install psycopg2-binary # 使用 PostgreSQL
接著把 db 執行起來, docker compose up -d
然後可以執行 django,
python manage.py migrate
依照範例總共會有3個網址, 分別為
trendy-sass.com
共用
tenant1.trendy-sass.com
租戶1
tenant2.trendy-sass
租戶2
因為要在本機測試, 所以要設定 host
sudo vim /etc/hosts
127.0.0.1 trendy-sass.com
127.0.0.1 tenant1.trendy-sass.com
127.0.0.1 tenant2.trendy-sass.com
先建立一個主要的 tenant
❯ python manage.py create_tenant
schema name: public
name: Trendy SaSS
description: Public Tenant
domain: trendy-sass.com
is primary (leave blank to use 'True'): True
建立 tenant 1
❯ python manage.py create_tenant
schema name: tenant1
name: Tenant1
description: A one tenant
domain: tenant1.trendy-sass.com
is primary (leave blank to use 'True'): False
建立 tenant 2
❯ python manage.py create_tenant
schema name: tenant2
name: Tenant2 - Even Awesome-r
description: A second tenant, even more awesome!
domain: tenant2.trendy-sass.com
is primary (leave blank to use 'True'): False
執行 server
python3 manage.py runserver 8088
trendy-sass.com
畫面
tenant1.trendy-sass.com
租戶1 畫面
tenant2.trendy-sass
租戶2 畫面
資料庫也切成了3個 schema 彼此不互相影響, 除了共用的 public,
然後 tenant1 和 tenant2 裡面的 table 都是一樣的.
連 user 權限彼此都是完全切開的,
可以嘗試進去 sample-random/
這個 url, 因為他會幫你建立一些 user.
然後你可以嘗試再進去 admin/
登入看看.
如果你想要在 public 中建立 super user, 可執行
python manage.py createsuperuser
建立 tenant 中的 super user
python manage.py create_tenant_superuser --username=admin --schema=tenant1
官方文件可參考 tenant_command
指定進入特定的 tenant
python3 manage.py tenant_command shell --schema=tenant1
進入全部的 tenant (當你退出後會自動進入下一個 shell)
python3 manage.py all_tenants_command shell
範例如下, tenant1, tenant2, public
❯ python3 manage.py all_tenants_command shell
['manage.py', 'shell']
Applying command to: tenant1
Python 3.9.16 (main, Dec 7 2022, 01:11:58)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
now exiting InteractiveConsole...
Applying command to: tenant2
Python 3.9.16 (main, Dec 7 2022, 01:11:58)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
now exiting InteractiveConsole...
Applying command to: public
Python 3.9.16 (main, Dec 7 2022, 01:11:58)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
now exiting InteractiveConsole...
作者總共提供三種範例
這篇介紹的是 tenant_tutorial,
還有 tenant_subfolder_tutorial 是類似下的概念
http://trendy-sass.com:8088/
http://trendy-sass.com:8088/clients/tenant2.trendy-sass.com/
至於最後的 tenant_multi_types 我沒有測試出來.
文章都是我自己研究內化後原創,如果有幫助到您,也想鼓勵我的話,歡迎請我喝一杯咖啡:laughing:
綠界科技ECPAY ( 不需註冊會員 )
歐付寶 ( 需註冊會員 )
MIT license