From 97c187ac97e2095a312e809282b63e859d370006 Mon Sep 17 00:00:00 2001 From: ackFromRedmi Date: Sat, 14 Feb 2026 23:20:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B7=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85.=20?= =?UTF-8?q?=D0=9D=D1=83=20=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B0=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B8=D1=82=D1=8C=20=D0=B4=D0=B5=D0=BF=D0=BB?= =?UTF-8?q?=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 10 ++++++ .gitea/workflows/deploy.yaml | 15 +++++++++ .gitignore | 2 +- Dockerfile | 23 +++++++++++++ bom_manager/models.py | 6 ++-- core/settings.py | 63 +++++++++++++++++++++++++++++------ docker-compose.yml | 53 +++++++++++++++++++++++++++++ entrypoint.sh | 13 ++++++++ requirements.txt | Bin 332 -> 382 bytes 9 files changed, 172 insertions(+), 13 deletions(-) create mode 100644 .env create mode 100644 .gitea/workflows/deploy.yaml create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 entrypoint.sh diff --git a/.env b/.env new file mode 100644 index 0000000..930707e --- /dev/null +++ b/.env @@ -0,0 +1,10 @@ +# Настройки базы данных +DB_NAME=prodman_db +DB_USER=prodman_user +DB_PASS=prodman_password_zwE45t! + +# Настройки Django +ENV_TYPE=server +DB_HOST=db +# todo потом установить домен для продакшена +ALLOWED_HOSTS=yourdomain.com,123.123.123.123,web \ No newline at end of file diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml new file mode 100644 index 0000000..049533e --- /dev/null +++ b/.gitea/workflows/deploy.yaml @@ -0,0 +1,15 @@ +name: Auto-Deploy-prodman +on: + push: + branches: [ main ] + workflow_dispatch: + +jobs: + deploy: + runs-on: host-shell # Твоя новая метка! + steps: + - name: Shell Deploy + run: | + cd /home/ack/projects/prodman + git pull origin main + docker compose up -d --build \ No newline at end of file diff --git a/.gitignore b/.gitignore index 82f6523..eeab391 100644 --- a/.gitignore +++ b/.gitignore @@ -30,7 +30,7 @@ staticfiles/ # Собранные статические файлы (collects *.pot # Environments -.env +# .env .venv env/ venv/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2da3f32 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM python:3.11-slim + +WORKDIR /app + +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 + +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc libpq-dev && rm -rf /var/lib/apt/lists/* + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +# Копируем скрипт входа +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] + +# Команда по умолчанию +CMD ["gunicorn", "core.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "3"] \ No newline at end of file diff --git a/bom_manager/models.py b/bom_manager/models.py index ba10eac..13c0045 100644 --- a/bom_manager/models.py +++ b/bom_manager/models.py @@ -13,8 +13,8 @@ class BaseOperation(PolymorphicModel): class Meta: ordering = ['order'] - verbose_name = "Операция" - verbose_name_plural = "Операции" + verbose_name = "Технологическая операция" + verbose_name_plural = "Технологический маршрут" def __str__(self): return f"{self.order}. {self._meta.verbose_name}" @@ -35,6 +35,8 @@ class LaserCutSheet(BaseOperation): pierces = models.IntegerField("Количество проколов", default=1) dxf_file = models.FileField("DXF файл", upload_to='dxf_files/%Y/%m', null=True, blank=True) +#todo: добавить использование азота + def clean(self): if self.cut_length < 1: raise ValidationError("Длина реза должна быть больше 0!") diff --git a/core/settings.py b/core/settings.py index 2609491..abb55cb 100644 --- a/core/settings.py +++ b/core/settings.py @@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/6.0/ref/settings/ """ from pathlib import Path +import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -22,10 +23,19 @@ BASE_DIR = Path(__file__).resolve().parent.parent # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-5(p6^by%ax10=(ev#ltdb8#f4@mq4&9gqnjvr9dboc=7t_&sbf' -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +# читаем переменную окружения +ENV_TYPE = os.getenv('ENV_TYPE', 'local') -ALLOWED_HOSTS = [] +# Настройки безопасности +# DEBUG будет True везде, кроме сервера +DEBUG = ENV_TYPE != 'server' + +if not DEBUG: + # На сервере список хостов должен быть ограничен + ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', 'localhost').split(',') +else: + # Для разработки разрешаем всё + ALLOWED_HOSTS = ['*'] # Application definition @@ -57,7 +67,9 @@ ROOT_URLCONF = 'core.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [BASE_DIR / 'templates'], + 'DIRS': [ + os.path.join(BASE_DIR, 'templates'), + ], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -71,16 +83,42 @@ TEMPLATES = [ WSGI_APPLICATION = 'core.wsgi.application' - +print(f"DEBUG: Current ENV_TYPE is {ENV_TYPE}") # Database # https://docs.djangoproject.com/en/6.0/ref/settings/#databases -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', +if ENV_TYPE == 'server': + # Для Docker на удаленном сервере (максимальная защита через .env) + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': os.getenv('DB_NAME'), + 'USER': os.getenv('DB_USER'), + 'PASSWORD': os.getenv('DB_PASS'), + 'HOST': os.getenv('DB_HOST', 'db'), + 'PORT': '5432', + } + } +elif ENV_TYPE == 'dev': + # Настройки для локальной разработки с внешней БД + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'prodman_dev_db', + 'USER': 'dev_user', + 'PASSWORD': 'dev_password', + 'HOST': '192.168.1.90', # локальный сервер БД + 'PORT': '5432', + } + } +else: + # Режим "на коленке" + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } } -} # Password validation @@ -117,4 +155,9 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/6.0/howto/static-files/ +# --- Статика и Медиа --- STATIC_URL = 'static/' +STATIC_ROOT = BASE_DIR / 'staticfiles' + +MEDIA_URL = 'media/' +MEDIA_ROOT = BASE_DIR / 'media' diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e52463e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,53 @@ +name: prodman +services: + db: + image: postgres:15-alpine + restart: always + environment: + - POSTGRES_DB=${DB_NAME} + - POSTGRES_USER=${DB_USER} + - POSTGRES_PASSWORD=${DB_PASS} + volumes: + - postgres_data:/var/lib/postgresql/data + + + web: + build: . + # Загружаем переменные окружения в settings.py + env_file: + - .env + + # Пока не убираем, вопрос возникает о дбхосте + + # environment: + # - ENV_TYPE={ENV_TYPE} + # - DB_NAME={DB_NAME} + # - DB_USER={DB_USER} + # - DB_PASS={DB_PASS} + # - DB_HOST=db + volumes: + - staticfiles:/app/staticfiles # Сюда статику + - mediafiles:/app/media # Сюда медиа + # - .:/app + expose: + - "8000" + depends_on: + - db + + + nginx: + image: nginx:1.25-alpine + volumes: + # Подключаем конфиг и статику с медиа в режиме только для чтения (т.к. nginx смотрит в интернет и может быть подвергнута атаке) + - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro + - staticfiles:/app/staticfiles:ro + - mediafiles:/app/media:ro + ports: + - "8081:80" + depends_on: + - web + +volumes: + postgres_data: + staticfiles: + mediafiles: diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..ae18aca --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +# Собираем статику +echo "Collecting static files..." +python manage.py collectstatic --noinput + +# Применяем миграции базы данных +echo "Applying database migrations..." +python manage.py migrate --noinput + +# Запускаем основную команду (Gunicorn) +echo "Starting Gunicorn..." +exec "$@" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 66431ac7b2fc29d24e9ea4907ff993e2d16b31ff..2bd8ea2ee53f18730d53921441fdcf3d9abb872b 100644 GIT binary patch delta 55 zcmX@Z^p9!672N`cVunhFWQKf(0)})3BL-cDB!*0eJcdMuBA~b}5E?P)F<1hzA%o$> G^R)nwfegt2 delta 10 RcmeyzbcSidmC0<36#yF21VsP<