Фикс деплоя на NAS: статика, медиа, автоматическое создание системного покупателя

This commit is contained in:
2025-12-12 19:21:45 +03:00
parent 4cbc5c07b9
commit f320eafc55
6 changed files with 48 additions and 1 deletions

View File

@@ -17,10 +17,17 @@ def ensure_public_tenant():
domain_name = os.environ.get('DOMAIN_NAME', 'localhost')
print(f"Checking public tenant for domain: {domain_name}")
email = os.environ.get('TENANT_ADMIN_EMAIL', 'admin@example.com')
name = os.environ.get('TENANT_ADMIN_NAME', 'System Administrator')
# 1. Ensure Client exists
client, created = Client.objects.get_or_create(
schema_name='public',
defaults={'name': 'Main Tenant'}
defaults={
'name': 'System Tenant',
'owner_email': email,
'owner_name': name
}
)
if created:
print("Created public tenant client.")
@@ -41,5 +48,13 @@ def ensure_public_tenant():
if domain.tenant != client:
print(f"WARNING: Domain {domain_name} is assigned to another tenant!")
# 3. Init system data (System Customer, etc.)
print("Initializing system data for public tenant...")
from django.core.management import call_command
try:
call_command('init_tenant_data', schema='public')
except Exception as e:
print(f"Error initializing system data: {e}")
if __name__ == '__main__':
ensure_public_tenant()

View File

@@ -8,6 +8,8 @@ from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from django.urls import re_path
from django.views.static import serve
from . import views
urlpatterns = [
@@ -25,7 +27,15 @@ urlpatterns = [
path('pos/', include('pos.urls')), # POS Terminal
]
# Serve media files during development
# Serve media files during development
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
else:
# Force serve media files in production (for NAS setup)
urlpatterns += [
re_path(r'^media/(?P<path>.*)$', serve, {
'document_root': settings.MEDIA_ROOT,
}),
]

View File

@@ -10,6 +10,8 @@ from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from django.urls import re_path
from django.views.static import serve
urlpatterns = [
path('admin/', admin.site.urls),
@@ -21,3 +23,10 @@ urlpatterns = [
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
else:
# Force serve media files in production (for NAS setup)
urlpatterns += [
re_path(r'^media/(?P<path>.*)$', serve, {
'document_root': settings.MEDIA_ROOT,
}),
]

View File

@@ -115,6 +115,12 @@ class Command(BaseCommand):
f'истекает: {subscription.expires_at.strftime("%Y-%m-%d")}'
))
# Инициализация системных данных
self.stdout.write('Инициализация системных данных...')
from django.core.management import call_command
call_command('init_tenant_data', schema=client.schema_name)
self.stdout.write(self.style.SUCCESS('✓ Системные данные созданы'))
# Обновляем заявку
registration.status = TenantRegistration.STATUS_APPROVED
registration.processed_at = timezone.now()

View File

@@ -65,6 +65,12 @@ class Command(BaseCommand):
)
self.stdout.write(self.style.SUCCESS(f'✓ Домен создан: {domain}'))
# Инициализация системных данных
self.stdout.write('Инициализация системных данных...')
from django.core.management import call_command
call_command('init_tenant_data', schema=schema_name)
self.stdout.write(self.style.SUCCESS('✓ Системные данные созданы'))
self.stdout.write('\n' + '='*60)
self.stdout.write(self.style.SUCCESS('✓ Магазин успешно создан!'))
self.stdout.write('='*60 + '\n')

View File

@@ -33,3 +33,4 @@ Unidecode==1.4.0
vine==5.1.0
wcwidth==0.2.14
gunicorn==21.2.0
whitenoise==6.6.0