feat: Add Docker infrastructure for multi-tenant Django application with services for database, caching, and task processing.

This commit is contained in:
2026-01-17 18:27:57 +03:00
parent 10ab804396
commit 9b4b1277ee
5 changed files with 9 additions and 9 deletions

View File

@@ -0,0 +1,135 @@
#!/bin/bash
set -e
# Ожидание готовности PostgreSQL
wait_for_postgres() {
echo "Waiting for PostgreSQL..."
while ! python -c "
import psycopg2
import os
try:
conn = psycopg2.connect(
dbname=os.environ.get('DB_NAME', 'inventory_db'),
user=os.environ.get('DB_USER', 'postgres'),
password=os.environ.get('DB_PASSWORD', 'postgres'),
host=os.environ.get('DB_HOST', 'db'),
port=os.environ.get('DB_PORT', '5432')
)
conn.close()
exit(0)
except:
exit(1)
" 2>/dev/null; do
echo "PostgreSQL is unavailable - sleeping"
sleep 2
done
echo "PostgreSQL is up!"
}
# Ожидание готовности Redis
wait_for_redis() {
echo "Waiting for Redis..."
while ! python -c "
import redis
import os
try:
r = redis.Redis(
host=os.environ.get('REDIS_HOST', 'redis'),
port=int(os.environ.get('REDIS_PORT', '6379')),
db=int(os.environ.get('REDIS_DB', '0'))
)
r.ping()
exit(0)
except:
exit(1)
" 2>/dev/null; do
echo "Redis is unavailable - sleeping"
sleep 2
done
echo "Redis is up!"
}
# Применение миграций и создание суперпользователя
run_migrations() {
echo "Running migrations for shared apps..."
python manage.py migrate_schemas --shared
echo "Running migrations for tenant schemas..."
python manage.py migrate_schemas --tenant
echo "Collecting static files..."
python manage.py collectstatic --noinput
}
# Создание суперпользователя если не существует
create_superuser() {
echo "Creating superuser if not exists..."
python manage.py shell << EOF
from django.contrib.auth import get_user_model
from django.db import connection
from django_tenants.utils import schema_context
import os
User = get_user_model()
# Создаём суперпользователя в public схеме из переменных окружения
with schema_context('public'):
email = os.environ.get('TENANT_ADMIN_EMAIL', 'admin@example.com')
password = os.environ.get('TENANT_ADMIN_PASSWORD', 'changeme')
first_name = os.environ.get('TENANT_ADMIN_NAME', 'Admin')
if not User.objects.filter(email=email).exists():
user = User.objects.create_superuser(
email=email,
password=password,
first_name=first_name
)
print(f'Superuser {email} created successfully!')
else:
print(f'Superuser {email} already exists.')
EOF
}
case "$1" in
web)
wait_for_postgres
wait_for_redis
run_migrations
create_superuser
echo "Starting Gunicorn..."
exec gunicorn myproject.wsgi:application \
--bind 0.0.0.0:8000 \
--workers 3 \
--threads 2 \
--timeout 120 \
--access-logfile - \
--error-logfile - \
--capture-output
;;
celery-worker)
wait_for_postgres
wait_for_redis
echo "Starting Celery Worker..."
exec celery -A myproject worker \
-l info \
-Q celery,photo_processing \
--concurrency=2
;;
celery-beat)
wait_for_postgres
wait_for_redis
echo "Starting Celery Beat..."
exec celery -A myproject beat -l info
;;
migrate)
wait_for_postgres
run_migrations
create_superuser
;;
shell)
exec python manage.py shell
;;
*)
exec "$@"
;;
esac