diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..e71f18f6 --- /dev/null +++ b/.env.example @@ -0,0 +1,29 @@ +# Django +ALLOWED_HOSTS=0.0.0.0 127.0.0.1 localhost # Список разрешённых хостов. Используется для деплоя на сервер. Можно не менять. +CSRF_TRUSTED_ORIGINS=http://0.0.0.0 http://localhost http://127.0.0.1 # Список разрешенных источников CSRF. Используется для деплоя на сервер. Можно не менять. +SECRET_KEY=my_secret_key # SECRET_KEY для настроек Django. Можно передать любую строку. +DJANGO_SUPERUSER_USERNAME=admin # Дефолтные данные для входа в админку +DJANGO_SUPERUSER_PASSWORD=admin123 +DJANGO_SUPERUSER_EMAIL=admin@admin.ru +DJANGO_CONFIGURATION=Prod +## + +# Bot +BASE_WEBHOOK_URL=https://myurl.ngrok-free.app # Сюда нужно поставить Ваш URL, на котором запустился NGROK. +BOT_TOKEN=123414:1lsafls # Токен Вашего ТГ-бота. +WEB_SERVER_HOST=0.0.0.0 # Адрес, на котором запускается бот внутри контейнера. Можно не менять. +WEB_SERVER_PORT=8080 # Порт, на котором запускается бот внутри контейнера. Можно не менять. +CURATOR_CHAT_ID=none # Номер чата с куратором. Можно не ставить. +WEBHOOK_SECRET=none # Секретный ключ для WebHook-мода телеграм-бота. Можно не ставить. +GPT_TOKEN=none # Token YandexGPT. Можно не ставить. +FOLDER_ID=none # Folder_ID для YandexGPT. Можно не ставить. + +# DB +POSTGRES_USER=postgres # Имя пользователя для БД. Можно не менять. +POSTGRES_PASSWORD=postgres # Пароль для БД. Можно не менять. +POSTGRES_DB=postgres # Название БД. Можно не менять. +POSTGRES_PORT=5432 # Порт БД. Можно не менять. + +# NGROK +NGROK_URL=myurl.ngrok-free.app # Прочтите в ReadMe как зарегистрировать постоянный URL в NGROK и вставьте его сюда. +NGROK_AUTHTOKEN=123456 # Ваш Token для NGROK. diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f006b6d5..f1eba3af 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,130 +1,130 @@ -#name: Main workflow -# -#on: -# push: -# branches: -# - main -# -#jobs: -# tests: -# runs-on: ubuntu-latest -# services: -# rabbitmq: -# image: rabbitmq:3.12 -# env: -# RABBITMQ_DEFAULT_USER: guest -# RABBITMQ_DEFAULT_PASS: guest -# ports: [ "5672:5672" ] -# steps: -# - name: Checkout -# uses: actions/checkout@v4.1.1 -# - name: Set up Python -# uses: actions/setup-python@v4 -# with: -# python-version: 3.11 -# - name: Install dependencies -# run: | -# python -m pip install --upgrade pip -# pip install -r requirements.txt -# - name: Run migrations -# run: | -# python admin_panel/manage.py makemigrations -# python admin_panel/manage.py migrate --run-syncdb -# env: -# DJANGO_SETTINGS_MODULE: admin_panel.settings -# DJANGO_CONFIGURATION: Test -# - name: Lint -# run: | -# ruff check . -# - name: tests -# run: | -# pytest admin_panel -# -# build_and_push: -# name: Build Docker images and push them to DockerHub -# runs-on: ubuntu-latest -# needs: tests -# strategy: -# matrix: -# include: -# - image_name: xaer981/admin_panel -# dockerfile: admin_panel/Dockerfile -# - image_name: xaer981/bot -# dockerfile: bots/telegram/Dockerfile -# steps: -# - name: Set up Docker Buildx -# uses: docker/setup-buildx-action@v3.0.0 -# -# - name: Login to Docker Hub -# uses: docker/login-action@v3.0.0 -# with: -# username: ${{ secrets.DOCKERHUB_USERNAME }} -# password: ${{ secrets.DOCKERHUB_PASSWORD }} -# -# - name: Extract metadata (tags, labels) for Docker -# id: meta -# uses: docker/metadata-action@v5 -# with: -# images: ${{ matrix.image_name }} -# -# - name: Build and push -# uses: docker/build-push-action@v5 -# with: -# file: ${{ matrix.dockerfile }} -# push: true -# tags: ${{ steps.meta.outputs.tags }} -# labels: ${{ steps.meta.outputs.labels }} -# -# deploy: -# name: Deploy to server -# runs-on: ubuntu-latest -# needs: build_and_push -# steps: -# - name: Checkout code -# uses: actions/checkout@v4.1.1 -# - name: Copy infra files to server -# uses: appleboy/scp-action@master -# with: -# host: ${{ secrets.HOST }} -# username: ${{ secrets.TEST_SERVER_USERNAME }} -# key: ${{ secrets.TEST_SERVER_SSH_KEY }} -# passphrase: ${{ secrets.TEST_SERVER_SSH_PASSPHRASE }} -# source: "infra/docker-compose.yml,infra/swag_nginx.conf" -# target: ${{ secrets.DEPLOY_PATH }} -# overwrite: true -# strip_components: 1 -# -# - name: Executing remote ssh commands to deploy -# uses: appleboy/ssh-action@master -# with: -# host: ${{ secrets.HOST }} -# username: ${{ secrets.TEST_SERVER_USERNAME }} -# key: ${{ secrets.TEST_SERVER_SSH_KEY }} -# passphrase: ${{ secrets.TEST_SERVER_SSH_PASSPHRASE }} -# script: | -# cd ${{ secrets.DEPLOY_PATH }} -# echo "SECRET_KEY=${{ secrets.SECRET_KEY }}" > .env -# echo DJANGO_SUPERUSER_USERNAME=${{ secrets.DJANGO_SUPERUSER_USERNAME }} >> .env -# echo DJANGO_SUPERUSER_PASSWORD=${{ secrets.DJANGO_SUPERUSER_PASSWORD }} >> .env -# echo DJANGO_SUPERUSER_EMAIL=${{ secrets.DJANGO_SUPERUSER_EMAIL }} >> .env -# echo DJANGO_CONFIGURATION=${{ secrets.DJANGO_CONFIGURATION }} >> .env -# echo GPT_TOKEN=${{ secrets.GPT_TOKEN }} >> .env -# echo FOLDER_ID=${{ secrets.FOLDER_ID }} >> .env -# echo POSTGRES_USER=${{ secrets.POSTGRES_USER }} >> .env -# echo POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} >> .env -# echo POSTGRES_DB=${{ secrets.POSTGRES_DB }} >> .env -# echo POSTGRES_PORT=${{ secrets.POSTGRES_PORT }} >> .env -# echo BOT_TOKEN=${{ secrets.BOT_TOKEN }} >> .env -# echo CURATOR_CHAT_ID=${{ secrets.CURATOR_CHAT_ID }} >> .env -# echo BASE_WEBHOOK_URL=${{ secrets.BASE_WEBHOOK_URL }} >> .env -# echo WEB_SERVER_HOST=${{ secrets.WEB_SERVER_HOST }} >> .env -# echo WEB_SERVER_PORT=${{ secrets.WEB_SERVER_PORT }} >> .env -# sudo docker compose stop django -# sudo docker compose stop bot -# sudo docker compose stop celery -# sudo docker pull --quiet ${{ secrets.DOCKERHUB_USERNAME }}/admin_panel:main -# sudo docker pull --quiet ${{ secrets.DOCKERHUB_USERNAME }}/bot:main -# sudo docker compose up -d -# sudo docker system prune -af -# sudo docker compose exec django python manage.py collectstatic --no-input -# \ No newline at end of file +name: Main workflow + +on: + push: + branches: + - main + +jobs: + tests: + runs-on: ubuntu-latest + services: + rabbitmq: + image: rabbitmq:3.12 + env: + RABBITMQ_DEFAULT_USER: guest + RABBITMQ_DEFAULT_PASS: guest + ports: [ "5672:5672" ] + steps: + - name: Checkout + uses: actions/checkout@v4.1.1 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: 3.11 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Run migrations + run: | + python admin_panel/manage.py makemigrations + python admin_panel/manage.py migrate --run-syncdb + env: + DJANGO_SETTINGS_MODULE: admin_panel.settings + DJANGO_CONFIGURATION: Test + - name: Lint + run: | + ruff check . + - name: tests + run: | + pytest admin_panel + + build_and_push: + name: Build Docker images and push them to DockerHub + runs-on: ubuntu-latest + needs: tests + strategy: + matrix: + include: + - image_name: valeevilja/admin_panel + dockerfile: admin_panel/Dockerfile + - image_name: valeevilja/edubot + dockerfile: bots/telegram/Dockerfile + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3.0.0 + + - name: Login to Docker Hub + uses: docker/login-action@v3.0.0 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ matrix.image_name }} + + - name: Build and push + uses: docker/build-push-action@v5 + with: + file: ${{ matrix.dockerfile }} + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + deploy: + name: Deploy to server + runs-on: ubuntu-latest + needs: build_and_push + steps: + - name: Checkout code + uses: actions/checkout@v4.1.1 + - name: Copy infra files to server + uses: appleboy/scp-action@master + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.TEST_SERVER_USERNAME }} + key: ${{ secrets.TEST_SERVER_SSH_KEY }} + passphrase: ${{ secrets.TEST_SERVER_SSH_PASSPHRASE }} + source: "infra/docker-compose.yml,infra/swag_nginx.conf" + target: ${{ secrets.DEPLOY_PATH }} + overwrite: true + strip_components: 1 + + - name: Executing remote ssh commands to deploy + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.TEST_SERVER_USERNAME }} + key: ${{ secrets.TEST_SERVER_SSH_KEY }} + passphrase: ${{ secrets.TEST_SERVER_SSH_PASSPHRASE }} + script: | + cd ${{ secrets.DEPLOY_PATH }} + echo "SECRET_KEY=${{ secrets.SECRET_KEY }}" > .env + echo DJANGO_SUPERUSER_USERNAME=${{ secrets.DJANGO_SUPERUSER_USERNAME }} >> .env + echo DJANGO_SUPERUSER_PASSWORD=${{ secrets.DJANGO_SUPERUSER_PASSWORD }} >> .env + echo DJANGO_SUPERUSER_EMAIL=${{ secrets.DJANGO_SUPERUSER_EMAIL }} >> .env + echo DJANGO_CONFIGURATION=${{ secrets.DJANGO_CONFIGURATION }} >> .env + echo GPT_TOKEN=${{ secrets.GPT_TOKEN }} >> .env + echo FOLDER_ID=${{ secrets.FOLDER_ID }} >> .env + echo POSTGRES_USER=${{ secrets.POSTGRES_USER }} >> .env + echo POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} >> .env + echo POSTGRES_DB=${{ secrets.POSTGRES_DB }} >> .env + echo POSTGRES_PORT=${{ secrets.POSTGRES_PORT }} >> .env + echo BOT_TOKEN=${{ secrets.BOT_TOKEN }} >> .env + echo CURATOR_CHAT_ID=${{ secrets.CURATOR_CHAT_ID }} >> .env + echo BASE_WEBHOOK_URL=${{ secrets.BASE_WEBHOOK_URL }} >> .env + echo WEB_SERVER_HOST=${{ secrets.WEB_SERVER_HOST }} >> .env + echo WEB_SERVER_PORT=${{ secrets.WEB_SERVER_PORT }} >> .env + echo WEB_SERVER_URL=${{ secrets.WEB_SERVER_URL }} >> .env + sudo docker compose stop django + sudo docker compose stop bot + sudo docker compose stop celery + sudo docker pull --quiet ${{ secrets.DOCKERHUB_USERNAME }}/admin_panel:main + sudo docker pull --quiet ${{ secrets.DOCKERHUB_USERNAME }}/bot:main + sudo docker compose up -d + sudo docker system prune -af + sudo docker compose exec django python manage.py collectstatic --no-input diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ad1ffadc --- /dev/null +++ b/.gitignore @@ -0,0 +1,147 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# папки со статикой и медиа +media/ +static/ + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +.ruff_cache/ +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# .idea +.idea + + + +/.ruff_cache/ + +**/migrations/** +!**/migrations +!**/migrations/__init__.py +/infra/ +/data/ diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 94ea33e4..498d65d3 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,8 +1,33 @@ + + - + + + + + + + + + + + + + + + + + + + + + + + - { + "keyToString": { + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true" } -}]]> +} diff --git a/infra/data/db/base/13468/16428 b/infra/data/db/base/13468/16428 index 41c4d25d..6f9a53f7 100644 Binary files a/infra/data/db/base/13468/16428 and b/infra/data/db/base/13468/16428 differ diff --git a/infra/data/db/base/13468/16722 b/infra/data/db/base/13468/16722 index 895550af..6d63f6fc 100644 Binary files a/infra/data/db/base/13468/16722 and b/infra/data/db/base/13468/16722 differ diff --git a/infra/data/db/base/13468/16736 b/infra/data/db/base/13468/16736 index 14537b23..e42122a6 100644 Binary files a/infra/data/db/base/13468/16736 and b/infra/data/db/base/13468/16736 differ diff --git a/infra/data/db/base/13468/16747 b/infra/data/db/base/13468/16747 index 955fce3f..e8897036 100644 Binary files a/infra/data/db/base/13468/16747 and b/infra/data/db/base/13468/16747 differ diff --git a/infra/data/db/base/13468/16853 b/infra/data/db/base/13468/16853 index 8a9142f5..26411eaf 100644 Binary files a/infra/data/db/base/13468/16853 and b/infra/data/db/base/13468/16853 differ diff --git a/infra/data/db/base/13468/16859 b/infra/data/db/base/13468/16859 index 86e71fa7..8e786718 100644 Binary files a/infra/data/db/base/13468/16859 and b/infra/data/db/base/13468/16859 differ diff --git a/infra/data/db/base/13468/16861 b/infra/data/db/base/13468/16861 index ed8a17b1..636fb930 100644 Binary files a/infra/data/db/base/13468/16861 and b/infra/data/db/base/13468/16861 differ diff --git a/infra/data/db/base/13468/16862 b/infra/data/db/base/13468/16862 index d4a2f596..9682af0a 100644 Binary files a/infra/data/db/base/13468/16862 and b/infra/data/db/base/13468/16862 differ diff --git a/infra/data/db/base/13468/pg_internal.init b/infra/data/db/base/13468/pg_internal.init index 32a36787..aca3472c 100644 Binary files a/infra/data/db/base/13468/pg_internal.init and b/infra/data/db/base/13468/pg_internal.init differ diff --git a/infra/data/db/global/pg_control b/infra/data/db/global/pg_control index 680d6794..a6a56e2c 100644 Binary files a/infra/data/db/global/pg_control and b/infra/data/db/global/pg_control differ diff --git a/infra/data/db/global/pg_internal.init b/infra/data/db/global/pg_internal.init index dd3d11e5..aa2dc995 100644 Binary files a/infra/data/db/global/pg_internal.init and b/infra/data/db/global/pg_internal.init differ diff --git a/infra/data/db/pg_multixact/members/0000 b/infra/data/db/pg_multixact/members/0000 index 3c9ff69a..fa129296 100644 Binary files a/infra/data/db/pg_multixact/members/0000 and b/infra/data/db/pg_multixact/members/0000 differ diff --git a/infra/data/db/pg_multixact/offsets/0000 b/infra/data/db/pg_multixact/offsets/0000 index 87fc3c7d..c5b5d355 100644 Binary files a/infra/data/db/pg_multixact/offsets/0000 and b/infra/data/db/pg_multixact/offsets/0000 differ diff --git a/infra/data/db/pg_stat_tmp/db_0.stat b/infra/data/db/pg_stat_tmp/db_0.stat deleted file mode 100644 index 31c5611e..00000000 Binary files a/infra/data/db/pg_stat_tmp/db_0.stat and /dev/null differ diff --git a/infra/data/db/pg_stat_tmp/db_13468.stat b/infra/data/db/pg_stat_tmp/db_13468.stat deleted file mode 100644 index 849b4b24..00000000 Binary files a/infra/data/db/pg_stat_tmp/db_13468.stat and /dev/null differ diff --git a/infra/data/db/pg_stat_tmp/global.stat b/infra/data/db/pg_stat_tmp/global.stat deleted file mode 100644 index 67c2d7b0..00000000 Binary files a/infra/data/db/pg_stat_tmp/global.stat and /dev/null differ diff --git a/infra/data/db/pg_subtrans/0000 b/infra/data/db/pg_subtrans/0000 index 071b10d3..20199c96 100644 Binary files a/infra/data/db/pg_subtrans/0000 and b/infra/data/db/pg_subtrans/0000 differ diff --git a/infra/data/db/pg_wal/000000010000000000000001 b/infra/data/db/pg_wal/000000010000000000000001 index 29f0bc17..7a4b5d46 100644 Binary files a/infra/data/db/pg_wal/000000010000000000000001 and b/infra/data/db/pg_wal/000000010000000000000001 differ diff --git a/infra/data/db/pg_xact/0000 b/infra/data/db/pg_xact/0000 index 96367662..63ddaccc 100644 Binary files a/infra/data/db/pg_xact/0000 and b/infra/data/db/pg_xact/0000 differ diff --git a/infra/data/db/postmaster.pid b/infra/data/db/postmaster.pid deleted file mode 100644 index 62297338..00000000 --- a/infra/data/db/postmaster.pid +++ /dev/null @@ -1,8 +0,0 @@ -1 -/var/lib/postgresql/data -1718967805 -5432 -/var/run/postgresql -* - 2684 5 -ready diff --git a/infra/docker-compose.yml b/infra/docker-compose.yml index 5b527278..4baf69f9 100644 --- a/infra/docker-compose.yml +++ b/infra/docker-compose.yml @@ -10,7 +10,7 @@ services: environment: - PUID=1000 - PGID=1000 - - URL=chatbothighed.sytes.net + - URL=${WEB_SERVER_URL} env_file: - ./.env volumes: @@ -28,16 +28,6 @@ services: depends_on: - bot - flower: - image: mher/flower - container_name: flower - ports: - - 5555:5555 - environment: - - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672/ - networks: - - services - rabbitmq: image: rabbitmq:management container_name: rabbitmq @@ -77,7 +67,7 @@ services: - services django: - image: xaer981/admin_panel:main + image: valeevilja/admin_panel container_name: admin_panel env_file: - ./.env @@ -96,7 +86,7 @@ services: - services bot: - image: xaer981/bot:main + image: valeevilja/edubot container_name: bot restart: always env_file: @@ -111,7 +101,7 @@ services: - services celery: - image: xaer981/bot:main + image: valeevilja/edubot container_name: celery_bot restart: always env_file: @@ -125,7 +115,7 @@ services: - services django-celery-beat: - image: xaer981/admin_panel:main + image: valeevilja/admin_panel container_name: django_celery_bot_beat restart: always env_file: