This guide is for platform operators and administrators who manage The Inventory deployment.
The Inventory is a multi-tenant SaaS platform. As an operator, you manage:
/admin/ (for platform staff)/django-admin/ (low-level access)/api/v1/ (programmatic access)Via Wagtail Admin:
/admin/Via API:
curl -X POST http://localhost:8000/api/v1/tenants/ \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Corp",
"slug": "acme-corp",
"is_active": true
}'
Via Wagtail Admin:
/admin/Via API:
curl http://localhost:8000/api/v1/tenants/ \
-H "Authorization: Bearer <token>"
Via Wagtail Admin:
/admin/ → Tenants → TenantsVia API:
curl -X PATCH http://localhost:8000/api/v1/tenants/{id}/ \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"name": "New Name"}'
To temporarily disable a tenant:
curl -X PATCH http://localhost:8000/api/v1/tenants/{id}/ \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"is_active": false}'
Via Wagtail Admin:
/admin/Via Django Admin:
python manage.py createsuperuser
Via Wagtail Admin:
/admin/Via API:
curl -X POST http://localhost:8000/api/v1/tenants/memberships/ \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"user": 1,
"tenant": 1,
"role": "manager"
}'
| Role | Permissions |
|---|---|
| Owner | Full access, manage members, billing |
| Coordinator | Manage inventory, orders, reports |
| Manager | View and manage inventory |
| Viewer | Read-only access |
Via Wagtail Admin:
/admin/ → Users → UsersVia Django Admin:
python manage.py changepassword username
Via Wagtail Admin:
/admin/ → Users → UsersCheck system status:
# Django health check
curl http://localhost:8000/api/v1/
# Database connection
python manage.py dbshell
# Cache connection
python manage.py shell
>>> from django.core.cache import cache
>>> cache.set('test', 'value')
>>> cache.get('test')
Check active connections:
psql postgresql://user:pass@host/inventory
SELECT * FROM pg_stat_activity;
Check slow queries:
SELECT query, calls, mean_time FROM pg_stat_statements
ORDER BY mean_time DESC LIMIT 10;
Check table sizes:
SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename))
FROM pg_tables
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
View logs:
# Render
# Via Render dashboard → Logs tab
# Docker
docker logs container_name
# Kubernetes
kubectl logs -f deployment/inventory-api
Configure alerts for:
Manual backup:
pg_dump postgresql://user:pass@host/inventory > backup.sql
gzip backup.sql
Automated backup (cron):
# Daily backup at 2 AM
0 2 * * * pg_dump postgresql://user:pass@host/inventory | gzip > /backups/inventory_$(date +\%Y\%m\%d).sql.gz
gunzip backup.sql.gz
psql postgresql://user:pass@host/inventory < backup.sql
Vacuum (cleanup):
psql postgresql://user:pass@host/inventory -c "VACUUM ANALYZE;"
Reindex (optimize):
psql postgresql://user:pass@host/inventory -c "REINDEX DATABASE inventory;"
# Check for updates
pip list --outdated
# Update specific package
pip install --upgrade package_name
# Update all
pip install --upgrade -r requirements.txt
python manage.py shell
>>> from django.core.cache import cache
>>> cache.clear()
python manage.py collectstatic --noinput
Symptoms: Slow queries, high CPU usage
Solutions:
SELECT * FROM pg_stat_statements ORDER BY mean_time DESCselect_related() and prefetch_related()Symptoms: Application crashes, “MemoryError”
Solutions:
free -hSymptoms: API endpoints taking >1 second
Solutions:
Symptoms: Backup job fails or doesn’t complete
Solutions:
df -hSymptoms: “Invalid credentials” or “No tenant membership”
Solutions:
Symptoms: “Internal Server Error”
Solutions:
# management/commands/import_users.py
from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
import csv
User = get_user_model()
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('csv_file', type=str)
def handle(self, *args, **options):
with open(options['csv_file']) as f:
reader = csv.DictReader(f)
for row in reader:
User.objects.create_user(
username=row['username'],
email=row['email'],
password=row['password']
)
Run with:
python manage.py import_users users.csv
python manage.py shell
>>> from rest_framework.authtoken.models import Token
>>> from django.contrib.auth import get_user_model
>>> User = get_user_model()
>>> user = User.objects.get(username='username')
>>> token = Token.objects.create(user=user)
>>> print(token.key)
# Export products
python manage.py dumpdata inventory.product --indent 2 > products.json
# Export all data
python manage.py dumpdata > full_backup.json