Рубрики
Без рубрики

Развертывание в Pythonanywhere через GitHub

Каждый может сделать это: местный → GitHub С SSH Access (оплаченный) вы можете сделать это: Local → Pythonanywher … Tagged Flask, Rucioter, Github, Python.

Каждый может сделать это:

Местный → Github

С SSH Access (оплаченный) вы можете сделать это:

Местный → Pythonanywhere

Я здесь делаю (бесплатно):

Местный → GitHub → Pythonanywhere

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

Почему?

Pythonanywhere потрясающий. Это бесплатные, хорошие ресурсы, даже база данных, и у вас может быть динамичный веб -сайт, работающий за считанные минуты. Это очень хороший ресурс, если вы начинаете и просто хотите поиграть или даже если вы хотите разместить API или что -то собственное.

Но у него есть недостатки, что, если вы хотите открыть источник, над чем вы работаете? Вы поддерживаете два отдельных местах и продолжаете совершать дважды? Оказавшись до производства в Pythonanywhere и еще раз в GitHub, чтобы люди могли проверить ваш код. Что если вы объедините запрос на тягу или хотите интегрировать CI? Делать то же самое снова и снова отстой.

GitHub отлично подходит для сотрудничества и даже просмотра кода, у них есть гораздо лучший пользовательский интерфейс, чем Pythonanywhere, и я имею в виду, что редактирование кода непосредственно в Pythonanywhere не является хорошим опытом. Что если есть способ связать все это?

Вы настаиваете на GitHub, и это обновляет ваше работает веб -приложение в Pythonanywhere и также перезагружает его. Вы можете объединить PR, использовать проблемы, просматривать свой код из любого места, даже не входите и не открывая файл в редакторе, и хорошо все, что может предложить GitHub.

Я слышу тебя: «Хорошо, Аади, все это звучит хорошо и хорошо, но как?»

Больше ни слова.

Как?

Мы используем GitHub Webhooks, чтобы сообщить нашему приложению, что оно было обновлено, так что оно делает тягу, а затем перезагружается.

Я возьму пример моего приложения Swaglyrics, чей бэкэнд размещен в Pythonanywhere. Я использую колбу, так что вы можете скорректировать соответствующим образом, если нет. Это мое репо Таким образом, вы можете использовать его в качестве ссылки:

Swaglyrics/Swaglyrics-Issue-Maker

Во -первых, убедитесь, что ваш репозиторий на Github и Pythonanywhere находится в синхронизации, GitHub должен быть происхождением, и если вы еще не сделали репо на Pythonanywhere, вы можете инициализировать один или клонировать в Pythonanywhere от Github.

Что-то вроде

git init

git remote add origin https://github.com/yourusername/yourreponame.git

Теперь перейдите в свой репозиторий на GitHub → Settings → Webhooks → Добавьте веб -крюк.

Это то, что вы видите:

В URL -адресу полезной нагрузки добавить https://your_domain/route_to_update _ Обновить

Например. В моем репо, WebHook отправлен в https://aadibajpai.pythonanywhere.com/update_server

Затем измените тип контента из Application/xwww-form-urlencode на Application/json (я скажу вам, почему чуть позже).

Мы также приедем в секретную часть чуть позже.

Убедитесь, что это событие Push запускает веб -крючок и нажмите «Добавить веб -крюк».

Теперь откройте приложение Flask, и мы настроим маршрут, который получает информацию от GitHub всякий раз, когда есть событие Push. Этот маршрут будет таким же, как и тот, который мы использовали в URL -адресу полезной нагрузки. Мы явно не проверяем мастер, так как я предполагаю, что это единственная филиал здесь.

Простая настройка голой кости будет выглядеть примерно так:

from flask import Flask, request
import git

app = Flask(__name__)

@app.route('/update_server', methods=['POST'])
 def webhook():
  if request.method == 'POST':
    repo = git.Repo('path/to/git_repo')
    origin = repo.remotes.origin

   origin.pull()

   return 'Updated PythonAnywhere successfully', 200
  else:
   return 'Wrong event type', 400

Это очень элементарная версия, и есть более полная версия ниже.

Теперь всякий раз, когда есть событие Push, этот маршрут получит информацию и обновите себя, выполнив тягу.

Надеюсь, это то, на что это выглядит, когда вы совершаете коммит

скрещенные пальцы

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

Автозагружая веб-приложение

Мы собираемся использовать крючки GIT, чтобы сделать это. Это команды оболочки, выполненные после того, как произошло событие GIT. Там нет крючка после удара, но…

Мы используем тот факт, что git prough – это не что иное, как слияние git → git, и есть Post-Merge крюк. Он выполняется, если притяжение завершено успешно.

В вашем GIT Repo в Pythonanywher

Там будет множество ранее существовавших, но сделайте новый файл под названием Post-Merge.

Поместите там следующий код:

#!/bin/sh
touch /path/to/username_pythonanywhere_com_wsgi.py

Используйте путь к своему файлу wsgi, который при прикосновении перезагружает ваш веб -приложение.

Теперь, чтобы сделать этот исполняемый файл, откройте там консоль и запустите

chmod +x post-merge

Вот и все, теперь вы можете проверить, что это работает, сделав образец коммита.

Самое главное, что теперь мы переходим к защиту вашего веб -крючка.

Обеспечивая ваш веб -крючок

Это необходимо, чтобы кто -то другой не мог спамить ваш сервер с помощью запросов для его обновления.

Мы следим за этим руководством для этого https://developer.github.com/webhooks/securing/

Во -первых, экспортируйте этот секретный токен и добавьте его в Pythonanywhere в качестве переменной среды, а также в секретном поле в ваших настройках GitHub Webhook. Это может быть полезно https://help.pythonanywhere.com/pages/environment-variables-for-web-apps

Теперь GitHub перечисляет свой метод в Ruby, но мы используем Python, поэтому, хотя метод одинаков, вот функция сравнения:

Теперь измените свой маршрут update_server, чтобы проверить, действительна ли подпись, добавив эти строки перед обновлением части вашего маршрута:

x_hub_signature = request.headers.get('X-Hub-Signature')

if not is_valid_signature(x_hub_signature, request.data, w_secret):

Предполагается, что W_SECRET будет ваш секрет веб -крючков, который вы установили в качестве переменной среды.

Теперь не имеет большого смысла не иметь никаких журналов, а также никаких других проверок безопасности, чтобы убедиться, что WebHook на самом деле из GitHub или что событие Pull действительно содержало данные, поэтому вы можете пойти и скопировать вставьте Маршрут на моем репо Это содержит все это в собственном и изменяйте его для себя, где это необходимо, вы уже знаете важные части 😃

Я надеюсь, что это было полезно, я знаю, что это немного подробно Но я хотел, чтобы вы знали, что происходит. Если вы нашли это слишком долго, вы можете сойти с рук с копией, вставленной многое после настройки веб -крючка в GitHub и создания крючка Git.

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

Вот ссылки, чтобы вы могли знать и делать с ними больше.

  1. https://stackoverflow.com/a/54268132/9044659 (Основная настройка)
  2. https://developer.github.com/webhooks/ (Документация GitHub Webhooks)
  3. https://github.com/ccextractor/sample-platform/blob/master/mod_deploy/controllers.py (Подробная реализация с лучшими проверками, если вы хотите пойти все)
  4. https://github.com/swaglyrics/swaglyrics-issue-maker/blob/35d23d0ba416e742e381da931d592ce6f58fc13f/issue_maker.py#l268 ( Мой собственный путь к обновлению Pythonanywhere)
  5. https://github.com/swaglyrics/swaglyrics-for-potify (Вот где я его использую, бесстыдный заглушка репо, чтобы получить звезды ❤)

Пожалуйста, дайте мне знать, если есть какая -либо часть, которая может быть улучшена или упрощена для понимания.

Большое спасибо за чтение!

П. С. Я оставался на месте, делая это, то, что мы делаем для науки вздох

Оригинал: “https://dev.to/aadibajpai/deploying-to-pythonanywhere-via-github-1j7b”