Add tenant management container and update management script for improved tenant operations
This commit is contained in:
@@ -196,3 +196,15 @@ networks:
|
|||||||
# - Medium (5-10 tenants): 4GB RAM, 2-4 CPU cores
|
# - Medium (5-10 tenants): 4GB RAM, 2-4 CPU cores
|
||||||
# - Large (10-20 tenants): 8GB RAM, 4-8 CPU cores
|
# - Large (10-20 tenants): 8GB RAM, 4-8 CPU cores
|
||||||
# - Jumbo (20+ tenants): 16GB+ RAM, 8+ CPU cores with clustering
|
# - Jumbo (20+ tenants): 16GB+ RAM, 8+ CPU cores with clustering
|
||||||
|
|
||||||
|
# Management Container for multi-tenant scripts
|
||||||
|
tenant-manager:
|
||||||
|
image: bash
|
||||||
|
container_name: tenant-manager
|
||||||
|
restart: "no"
|
||||||
|
profiles:
|
||||||
|
- tools
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- .:/workspace
|
||||||
|
entrypoint: ["bash", "-c", "cd /workspace && ./manage-tenant.sh \"$$@\"", "--"]
|
||||||
|
|||||||
+5
-5
@@ -45,7 +45,7 @@ case "$COMMAND" in
|
|||||||
|
|
||||||
# Initialize tenant database via Python inside container
|
# Initialize tenant database via Python inside container
|
||||||
echo "Initializing database for $TENANT_ID..."
|
echo "Initializing database for $TENANT_ID..."
|
||||||
APP_CONTAINER=$(docker-compose -f docker-compose-multitenant.yml ps -q app | head -n 1)
|
APP_CONTAINER=$(docker ps -qf "name=app" | head -n 1)
|
||||||
if [ -n "$APP_CONTAINER" ]; then
|
if [ -n "$APP_CONTAINER" ]; then
|
||||||
docker exec $APP_CONTAINER python3 -c "
|
docker exec $APP_CONTAINER python3 -c "
|
||||||
import sys; sys.path.insert(0, '/app/Web'); import tenant, settings
|
import sys; sys.path.insert(0, '/app/Web'); import tenant, settings
|
||||||
@@ -70,7 +70,7 @@ print(f'Tenant {sys.argv[1]} database initialized.')
|
|||||||
read confirm
|
read confirm
|
||||||
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
|
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
|
||||||
echo "Removing tenant '$TENANT_ID'..."
|
echo "Removing tenant '$TENANT_ID'..."
|
||||||
APP_CONTAINER=$(docker-compose -f docker-compose-multitenant.yml ps -q app | head -n 1)
|
APP_CONTAINER=$(docker ps -qf "name=app" | head -n 1)
|
||||||
if [ -n "$APP_CONTAINER" ]; then
|
if [ -n "$APP_CONTAINER" ]; then
|
||||||
docker exec $APP_CONTAINER python3 -c "
|
docker exec $APP_CONTAINER python3 -c "
|
||||||
import sys; sys.path.insert(0, '/app/Web'); import tenant, settings
|
import sys; sys.path.insert(0, '/app/Web'); import tenant, settings
|
||||||
@@ -95,7 +95,7 @@ print(f'Database for tenant {sys.argv[1]} dropped.')
|
|||||||
echo "Restarting tenant '$TENANT_ID' (clearing session/cache)..."
|
echo "Restarting tenant '$TENANT_ID' (clearing session/cache)..."
|
||||||
# To restart a single tenant without restarting the global python processes,
|
# To restart a single tenant without restarting the global python processes,
|
||||||
# we can invalidate their cache or drop their sessions collection to sign everyone out
|
# we can invalidate their cache or drop their sessions collection to sign everyone out
|
||||||
APP_CONTAINER=$(docker-compose -f docker-compose-multitenant.yml ps -q app | head -n 1)
|
APP_CONTAINER=$(docker ps -qf "name=app" | head -n 1)
|
||||||
if [ -n "$APP_CONTAINER" ]; then
|
if [ -n "$APP_CONTAINER" ]; then
|
||||||
docker exec $APP_CONTAINER python3 -c "
|
docker exec $APP_CONTAINER python3 -c "
|
||||||
import sys; sys.path.insert(0, '/app/Web'); import tenant, settings
|
import sys; sys.path.insert(0, '/app/Web'); import tenant, settings
|
||||||
@@ -112,13 +112,13 @@ print(f'Tenant {sys.argv[1]} session cache cleared. Tenant restarted.')
|
|||||||
|
|
||||||
restart-all)
|
restart-all)
|
||||||
echo "Restarting all application instances with zero-downtime rolling restart..."
|
echo "Restarting all application instances with zero-downtime rolling restart..."
|
||||||
docker-compose -f docker-compose-multitenant.yml restart app
|
docker restart $(docker ps -qf "name=app")
|
||||||
echo "Global restart complete."
|
echo "Global restart complete."
|
||||||
;;
|
;;
|
||||||
|
|
||||||
list)
|
list)
|
||||||
echo "Listing active tenants (Databases):"
|
echo "Listing active tenants (Databases):"
|
||||||
APP_CONTAINER=$(docker-compose -f docker-compose-multitenant.yml ps -q app | head -n 1)
|
APP_CONTAINER=$(docker ps -qf "name=app" | head -n 1)
|
||||||
if [ -n "$APP_CONTAINER" ]; then
|
if [ -n "$APP_CONTAINER" ]; then
|
||||||
docker exec $APP_CONTAINER python3 -c "
|
docker exec $APP_CONTAINER python3 -c "
|
||||||
import sys; sys.path.insert(0, '/app/Web'); import tenant, settings
|
import sys; sys.path.insert(0, '/app/Web'); import tenant, settings
|
||||||
|
|||||||
Executable
+3
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Wrapper to run tenant management fully containerized via docker-compose
|
||||||
|
docker-compose -f docker-compose-multitenant.yml --profile tools run --rm tenant-manager "$@"
|
||||||
Reference in New Issue
Block a user