January 12, 2024

Играцентр

В первом посте хочу рассказать о своем проекте. Если говорить в двух словах, то мы в техдепе разрабатывали систему для проведения мероприятия Играцентр

Так вот, расскажу я не про разработку, а про то как мы с Артемом разворачивали эту систему
Изначально у нас были frontend, backend, server, домен и не малейшего понимания, как правильно это разворачивать. С чего было решено было начать, так это все упаковать в докер. Прошло это довольно успешно.
Вот dockerfile которые у меня получились

  • backend:
FROM python:3.10 as builder
WORKDIR /app
RUN apt-get update && \
    apt-get install -y --no-install-recommends gcc libpq-dev
    
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /app/wheels -r requirements.txt

FROM python:3.10-slim-buster
WORKDIR /app
RUN apt-get update && \
    apt-get install -y libpq-dev
USER root
COPY ./backend .
COPY --from=builder /app/wheels /app/wheels
COPY --from=builder /app/requirements.txt .
RUN pip install --upgrade pip 
RUN pip install --no-cache /app/wheels/*
  • frontend:
FROM node:18 as builder

WORKDIR /builder
# COPY package*.json ./
COPY . .
RUN npm install
RUN npm run build

Однако связать это было достаточно трудно(как я думал, сейчас я понимаю, что сложности возникали из-за недостатка знаний). Как веб-сервер был выбран nginx.
Однако ни я, ни Артем никогда его не настраивал. Как итог мы на говне и палках написали такой конфиг(он рабочий, но кривой, не советую использовать)

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    #default_type application/octet-stream;
    server {
        listen 80;
        server_name localhost;
        root /var/www/html;
	location /admin {
	    proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
	   proxy_set_header X-Forwarded-Host $host;
   	   # proxy_set_header X-Forwarded-Server $host;
           # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # include proxy_params;
	    proxy_pass http://backend:8000;
        }
	#location /static/admin {
	#    try_files $uri http://backend:8000;
	#}
	location /static/admin {
            alias /home/www/site/backend/static/admin;
	}
	location /static {
        alias /home/www/site/frontend/build/static;
	}
	location /images {
		alias /home/www/site/backend/images;
	}
	location /task {
	proxy_pass http://backend:8000/api/task;
	}
	location /station {
		proxy_pass http://backend:8000/api/station;
	}
	location /playerteam {
	proxy_pass http://backend:8000/api/playerteam;
	}
	location /stationorder {
	proxy_pass http://backend:8000/api/stationorder;
	}
	location /user {
	    proxy_pass http://backend:8000/api/user;
	}
	location /curator {
            proxy_pass http://backend:8000/api/curator;
	}
	location /api {
	    proxy_pass http://backend:8000/api/;
	}
	location /token {
	proxy_pass http://backend:8000/api/token;
	}
        location / {
            try_files $uri /index.html;
        }
    }


Там было продолжение с попыткой привязать сертификат, но на тот момент, это у нас так и не получилось. Во время написания этого конфига, было даже сделано 2 бекапа, но в них нет ничего интересного, мы просто пытались разобраться как это работает.

Вот сертификаты которые мы получили на домен

Переходя к самому интересному, то это docker-compose.yml

version: "3"

volumes:
  postgres_data:

services:
  db:
    image: postgres:13
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - "POSTGRES_HOST_AUTH_METHOD=trust"
        #- "PG_USER"
        #- "PG_PASSWORD"
        # - "PG_DATABASE"
    networks:
      - net
  backend:
    build: ./backend
    command: "gunicorn --bind 0.0.0.0:8000 config.wsgi:application --chdir backend --workers=12"
      #command: "python backend/manage.py runserver 0.0.0.0:8000"
    environment:
      - SECRET_KEY=123
      - DEBUG=0
        #- ALLOWED_HOSTS="*"
    volumes:
      - .:/app
    ports:
      - 8000:8000
    depends_on:
      - db
    env_file:
      - ./backend/.env
    networks:
      - net
  nginx:
    image: nginx
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./frontend/build:/var/www/html
      - /home/www/site/:/home/www/site
    depends_on:
      - backend
    networks:
      - net

networks:
  net:
   driver: bridge

Как видно из этого конфига, то тут много говна написано, по типу, переменные окружения передаются как через файл, так и через прямое указание.
Так же не были указаны user и password к базу данных, что потом сказалось на том, что кто-то к ней пытался подключиться(скорее всего у него это получилось, однако работоспособность это не нарушило)
Ну и конечно же secret_key=123 это верх моего мастерства.
Однако не смотря на все эти проблемы, сайт был успешно поднят, однако он работал только по http(хотя как я уже говорил сертификат был)

Если бы я делал это сейчас, то во-первых я бы не откладывал бы все на последний момент.
Во-вторых я бы правильно настроил бы nginx, добавил бы сертификат, указал бы креды для базы данных

Если интересно посмотреть исходники то вот:

Если интересно, то могу больше рассказать, про backend, так как там использованы костыли и я думаю будет интересно рассмотреть этот проект поближе, с опытом, что я получил спустя время.

Также хочется у вас попросить прокомментить как вам первый пост, может что-то убрать, или наоборот что-то добавить.