Играцентр
В первом посте хочу рассказать о своем проекте. Если говорить в двух словах, то мы в техдепе разрабатывали систему для проведения мероприятия Играцентр
Так вот, расскажу я не про разработку, а про то как мы с Артемом разворачивали эту систему
Изначально у нас были frontend, backend, server, домен и не малейшего понимания, как правильно это разворачивать. С чего было решено было начать, так это все упаковать в докер. Прошло это довольно успешно.
Вот dockerfile которые у меня получились
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/*
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: https://github.com/kill-your-soul/gamecenter
- Frontend: https://github.com/Super-Cereal/igra_center
Если интересно, то могу больше рассказать, про backend, так как там использованы костыли и я думаю будет интересно рассмотреть этот проект поближе, с опытом, что я получил спустя время.
Также хочется у вас попросить прокомментить как вам первый пост, может что-то убрать, или наоборот что-то добавить.