Как мне отладить удаленное веб-приложение Gunicorn Python с помощью Jetbrains Gateway?

Фон

Я работаю программистом в компании, у которой сложная настройка репозиториев, поэтому они установили экземпляр EC2 со всеми необходимыми репозиториями и конфигурациями, и я подключаюсь к нему по ssh, чтобы работать над их Python ( Flask) серверный код. В качестве IDE я использую Jetbrains Gateway (он запускает экземпляр IDE на удаленном сервере, а затем вы подключаетесь к нему через локальный клиентский интерфейс, поэтому он выглядит так же, как PyCharm, но фактический код и функции IDE выполняются на удаленный сервер)

Проблема

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

То, что я пробовал до сих пор

Я просмотрел представление «Редактировать конфигурации» и увидел, что есть функция под названием «Сервер отладки Python», которая требует, чтобы я указал IP-адрес моего локального компьютера и порт, который он прослушивает, что затем сделает удаленный экземпляр EC2. TCP-соединение с. У меня нет статического IP-адреса, и я не уверен, что мой интернет-провайдер разрешает подобные входящие соединения, поэтому я поискал в Интернете службу, которая могла бы мне в этом помочь, и увидел, что ngrok упоминается в нескольких местах. .

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
146
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В конце концов у меня это заработало, и я решил написать, как я это сделал, для всех, у кого в будущем возникнет такая проблема:

Решение

  1. Настройте TCP-туннель ngrok.
    1. Подпишитесь на личный план ngrok (10 долларов США в месяц).
      • Как: перейдите на https://ngrok.com/pricing, нажмите «ngrok для разработки», а затем «Начать» в разделе «Личный» план.
      • Почему: интерфейс сервера отладки Python Jetbrains Gateway, по-видимому, требует, чтобы вы установили один порт, который (кажется) будет одновременно портом, к которому будет обращаться удаленная IDE (работающая на экземпляре EC2) (пытаясь подключиться к вашему ноутбуку). ), а также порт, который будет прослушивать ваш локальный клиентский экземпляр Jetbrains Gateway. Но поскольку уровень бесплатного пользования ngrok 1) требует, чтобы вы установили порт на вашем компьютере, к которому должен обратиться ngrok, прежде чем он назначит порт, который ngrok будет прослушивать, а также 2) случайным образом назначает порт, который он будет прослушивать внешне кажется, что вы не можете гарантировать, что эти два порта, используемые ngrok, будут одинаковыми, если вы не заплатите.
        • Если кто-нибудь сможет заставить TCP-туннель работать на бесплатном уровне ngrok, оставьте комментарий, и я обновлю этот ответ (или просто обновлю этот ответ самостоятельно).
    2. На веб-панели ngrok нажмите «TCP-адреса», а затем «Добавить адрес». Запишите веб-адрес и порт, которые он вам назначил.
    3. На своем ноутбуке установите ngrok CLI.
    4. На своем ноутбуке запустите туннель ngrok, используя адрес и порт с панели управления.
      • Пример: ngrok tcp --region=us --remote-addr=1.tcp.ngrok.io:12345 12345
  2. Настройте сервер приложений на удаленном сервере, чтобы иметь возможность запускать модуль сервера отладки Python.
    1. На своем ноутбуке перейдите в диалоговое окно Edit Configurations в Jetbrains Gateway.
    2. Создайте новую запись «Сервер отладки Python».
      • Заполните поля «Имя хоста IDE» и «Порт» значениями, полученными из веб-интерфейса ngrok.
    3. На удаленном сервере установите модуль pydevd в среду Python, которую вы обычно используете для запуска сервера (будь то venv или базовый интерпретатор).
      • Пример: pip install pydevd-pycharm~=241.14494.200
    4. На удаленном сервере добавьте код import pydevd_pycharm; pydevd_pycharm.settrace(...) где-нибудь в коде сервера приложений, где он будет запускаться (либо при запуске сервера приложений, либо при посещении маршрута, который вы хотите отладить).
  3. Настройте конфигурацию «Отладка/Выполнение» на своем ноутбуке.
    1. На удаленном сервере соберите следующую информацию:
      • Путь к исполняемому файлу Python, который вы обычно используете для запуска сервера приложений.
      • Путь к исполняемому файлу Gunicorn, который вы обычно используете для запуска сервера приложений, а также любые дополнительные параметры командной строки, обычно используемые при его запуске.
      • Рабочий каталог сервера приложений.
      • Пути к любым файлам .env, которые вы обычно используете для запуска сервера приложений.
      • Примечание. Если вы обычно запускаете сервер приложений с помощью команды типа sudo systemctl start myappserver, вы можете найти приведенные ниже значения в файле в вашем каталоге /etc/systemd/system/. Итак, вы можете запустить что-то вроде cat /etc/systemd/system/myappserver.service.
    2. Создайте новую конфигурацию запуска/отладки Python.
    3. Скопируйте значения, которые вы собрали ранее.
      • Возможно, вам придется добавить интерпретатор Python, перейдя на File-->Settings-->Project: app_name-->Python Interpreter, прежде чем он появится в качестве опции в этом диалоговом окне.
  4. Запустите сервер приложений через отладчик.
    1. Если у вас уже есть сервер приложений, работающий нормально, остановите его. Возможно, вам придется запустить команду типа sudo systemctl stop myappserver.
    2. Нажмите зеленую кнопку отладки в Jetbrains, чтобы запустить сервер приложений с активным отладчиком.
  5. Теперь приложение должно запуститься и приостановиться в том месте, где вы включили команду settrace(). Любые точки останова, которые вы добавляете в код, теперь должны работать (выполнение должно остановиться на точке останова).

Дополнительные ресурсы/помощь по устранению неполадок

  • Это был лучший ресурс, который мне попадался: Jetbrains — удаленная отладка с помощью PyCharm.
  • Если у вас возникли проблемы с выполнением описанных выше шагов, я рекомендую следующее (что я тоже сделал):
    1. Попробуйте запустить файл Python типа «Hello world» на удаленном сервере в режиме отладки, используя метод отладки удаленного интерпретатора, описанный здесь.
      • Это позволяет избежать сложностей, связанных с необходимостью заставить работать TCP-туннель.
    2. Попробуйте запустить файл Python типа «Hello world» на удаленном сервере, используя метод «Сервер отладки Python», описанный выше.
      • Это позволяет избежать дополнительных сложностей, связанных с необходимостью запуска кода через Gunicorn и правильной конфигурации веб-приложения.

Другие вопросы по теме