Фикс деплоя на 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') domain_name = os.environ.get('DOMAIN_NAME', 'localhost')
print(f"Checking public tenant for domain: {domain_name}") 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 # 1. Ensure Client exists
client, created = Client.objects.get_or_create( client, created = Client.objects.get_or_create(
schema_name='public', schema_name='public',
defaults={'name': 'Main Tenant'} defaults={
'name': 'System Tenant',
'owner_email': email,
'owner_name': name
}
) )
if created: if created:
print("Created public tenant client.") print("Created public tenant client.")
@@ -41,5 +48,13 @@ def ensure_public_tenant():
if domain.tenant != client: if domain.tenant != client:
print(f"WARNING: Domain {domain_name} is assigned to another tenant!") 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__': if __name__ == '__main__':
ensure_public_tenant() ensure_public_tenant()

View File

@@ -8,6 +8,8 @@ from django.contrib import admin
from django.urls import path, include from django.urls import path, include
from django.conf import settings from django.conf import settings
from django.conf.urls.static import static from django.conf.urls.static import static
from django.urls import re_path
from django.views.static import serve
from . import views from . import views
urlpatterns = [ urlpatterns = [
@@ -25,7 +27,15 @@ urlpatterns = [
path('pos/', include('pos.urls')), # POS Terminal path('pos/', include('pos.urls')), # POS Terminal
] ]
# Serve media files during development
# Serve media files during development # Serve media files during development
if settings.DEBUG: if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_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.urls import path, include
from django.conf import settings from django.conf import settings
from django.conf.urls.static import static from django.conf.urls.static import static
from django.urls import re_path
from django.views.static import serve
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
@@ -21,3 +23,10 @@ urlpatterns = [
if settings.DEBUG: if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_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")}' 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.status = TenantRegistration.STATUS_APPROVED
registration.processed_at = timezone.now() 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(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('\n' + '='*60)
self.stdout.write(self.style.SUCCESS('✓ Магазин успешно создан!')) self.stdout.write(self.style.SUCCESS('✓ Магазин успешно создан!'))
self.stdout.write('='*60 + '\n') self.stdout.write('='*60 + '\n')

View File

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