Pycharm remote debugging + Ngrok + Heroku

Среда, 11 Янв. 2017 by Kirill Shershen


Есть задача удаленной отладки веб приложения из Pycharm. На heroku у меня крутится telegram bot, вот его и надо отладить. Зачем тут ngrok? А затем что для отладки нужно указать адрес машины и порт, а у меня нет белого айпи. Так что нужно создать httptunnel.

Теория

Сама удалённая отладка выглядит следующим образом:

1. в исходник вставляется кусок кода который с указанным адресом отладочного сервера

2. на локальном исходнике в pycharm настраивается и запускается отладочный сервер, ставится брейкпоинт в любом месте после пункта 1

3. программа запускается на удаленной машине

4. отладочный сервер pycharm останавливает выполнение кода на брейкпоинте

Соответственно локальный исходник на котором запускается pycharm и исходник на удаленной машине должны быть равны.

Проблема в связке Heroku и ngrok. На Heroku залить исходники можно только через систему контроля версий или встройнный git или через github. ngrok(бесплатная версия) в свою очередь создает соединение при запуске с новыми параметрами. Поэтому параметры придется передавать в код через системные переменные.

heroku_debug = os.environ.get('heroku_debug') == 'True'
server_debug = os.environ.get('server_debug')
try:
    port_debug = int(os.environ.get('port_debug') or 0)
except ValueError:
    port_debug = 0

heroku_debug нужен нам для того чтобы не всегда уходить в отладку кода

Схема будет выглядеть так.

  • Запускаем ngrok
  • копируем параметры в системные переменные heroku
  • запускаем отладочный сервер
  • если надо перезапускаем приложение

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

Практика

Настройка конфигурации отладочного сервера

Настраивается там же где и все конфигурации запуска и отладки, в меню Run - Edit Configurations

из списка выбирается пункт Python Remote Debug

Вот моя кофигурация:

Здесь нам надо указать:

  • Имя конфигурации, например heroku
  • адрес сервера, тут должен быть имя или IP моей машины, но т.к. его пока нет оставил 127.0.0.1
  • порт, любой не занятый порт(80 не подойдет), в моём случае 4141
  • Привязку исходников, тоесть расположение каталога локальных исходников и каталога исходников на удаленный машине. 

Выше кстати написана небольшая инструкция. Дальше по ней.

pycharn-debug.egg

Этот файл нужен чтобы python на heroku смог импортировать модуль pydevd. У себя нашел его по адресу c:\Program Files (x86)\JetBrains\PyCharm 145.597.11\debug-eggs\pycharm-debug.egg. Т.к. файл просто так нельзя скопировать на heroku пришлось добавить его в корень своего git проекта.

Далее необходимо сказать питону что нужно загружать этот файл

для этого в исходниках перед строкой import pydevd надо добавить его в системные пути

Отладочный код

В итоге кусок отладочного кода выглядет так

import sys
if settings.heroku_debug:
     logger.debug('remote debug')
     sys.path.append('/app/pycharm-debug.egg')
     import pydevd
     pydevd.settrace(settings.server_debug, port=settings.port_debug, stdoutToServer=True, stderrToServer=True)

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

Заливка иходников на heroku

Добавляем pycharm-debug.egg в git, коммитим исходники.

Выполняем git push all master

Исходники отправляются на github, оттуда автоматом деплоятся на heroku

ngrok

Далее скачиваем утилиту ngrok c официального сайта. ОБЯЗАТЕЛЬНО регистрируемся и получаем authtoken.

Связь с отладочным сервером происходит по tcp, а его ngrok позвляет запускать только с регистрацией. 

команда запуска будет выглядет так

ngrok tcp 4141 --authtoken 2у1аqZdKiVmUXpjvQg4d2а_3saD2jNZPуtMsiKEkXtrw

Порт указываем тот что указали в конфигурации.

В результате получим такое окошко с нужными нам параметрами.

Настойка heroku

Выделенные выше параметры мы указываем в настройках переменных среды нашего проекта на сайте heroku.

После установки параметром можно проверить что они обновились через консоль heroku. Надо запустить команду heroku config, она выведет все указанные переменные.

Запуск отладочного сервера

Далее ставим в коде брейкпоинт(после куска кода отладки) и запускаем сервер кнопкой Debug 'Heroku' или shift-F9.

В консоли pycharm должно выдать чтото типа

Starting debug server at port 4141
Use the following code to connect to the debugger:
import pydevd
pydevd.settrace('127.0.0.1', port=4141, stdoutToServer=True, stderrToServer=True)
Waiting for process connection...
Connected to pydev debugger (build 145.597.11)

Выполнение кода остановится на брейкпоинте и это значит что всё получилось.

Теги: python


blog comments powered by Disqus