Эта 404 ошибка возникает из-за бага встроенного OAuth-скрипта в старых версиях IDE. Решается за минуту через ручной выпуск классического токена.
Как исправить:
1. На GitHub зайдите в Settings -> Developer settings -> Personal access tokens (classic) -> Generate new token (classic).
2. Дайте ему имя, обязательно отметьте галочками права repo, gist и read:org, после чего нажмите Generate и скопируйте сам токен.
3. В PhpStorm перейдите в Settings -> Version Control -> GitHub, удалите старую зависшую учетку (через минус), нажмите «Плюс» -> Log In with Token и вставьте скопированный ключ.
Связь сразу поднимется в обход забагованной браузерной авторизации.
Принцип Дженги — это классика стартапов.
На самом деле, такая схема часто оправдана как временный MVP для проверки гипотез отдела маркетинга. Затащить тысячи позиций по API в готовый шаблон можно за пару дней, чтобы быстро откатать спрос.
Но если бизнес оставляет эту конструкцию на постоянку в проде и пытается поверх нее строить сложную сквозную аналитику — тогда да, вся эта башня гарантированно рухнет от любого чиха.
Скорее всего, дело в блокировке стандартных UDP-портов вашим провайдером или неверном размере пакета (MTU), из-за чего соединение зависает прямо перед авторизацией.
Попробуйте решить это следующими шагами:
1. Перейдите в раздел Access на сайте Академии, переключите протокол с UDP на TCP и выберите порт 443 (трафик пойдет под видом обычного HTTPS). Скачайте новый файл.
2. Откройте скачанный .ovpn файл в любом текстовом редакторе и добавьте в самый конец две строчки для принудительного ограничения размера пакетов:
mssfix 1300
tun-mtu 1300
3. В терминале полностью убейте зависшие процессы openvpn перед новым запуском:
sudo killall openvpn
И запустите заново: sudo openvpn [имя_файла].ovpn
4. Проверьте интерфейс. Иногда строка "Initialization Sequence Completed" просто не успевает отрисоваться, хотя туннель уже поднялся. Не закрывая терминал с VPN, откройте соседнюю вкладку и введите: ip a show tun0. Если там появился IP-адрес 10.10.x.x — вы в сети, можно работать.
Личный опыт:
Я столкнулась с похожей жесткой блокировкой от провайдера, когда даже TCP 443 не помогал. Решила проблему кардинально — развернула собственный зарубежный VPS на хостинге под эти задачи и настроила подключение через свой VPN (Психанула).Свой чистый туннель провайдеры не трогают, и через него виртуальные лабораторные машины Академии коннектятся без единого разрыва и без шаманства с MTU.
Если локальная сеть совсем не пускает туннели, просто перейдите в нужный модуль курса и нажмите кнопку "Start Pwnbox" — откроется готовая виртуальная машина прямо в соседней вкладке браузера, запускать OpenVPN на своей системе не потребуется.
Переносить интерфейсы во внешние слои к их реализациям — это грубая архитектурная ошибка. Это полностью разрушает главное правило Чистой Архитектуры — направление зависимостей.
Согласно луковой структуре, все зависимости должны быть направлены строго внутрь (к ядру). Внутренние слои (Domain / Core) понятия не имеют, какая инфраструктура находится снаружи (база данных, файлы, UI). Если вы перенесете интерфейсы в папки к реализациям, то ваше ядро будет вынуждено импортировать их из внешних слоев. Это породит запрещенную обратную зависимость «Ядро ➡️ Инфраструктура».
Интерфейс всегда принадлежит вызывающему коду (тому, кто его использует), а не вызываемому (реализации). Разносить интерфейсы нужно не к реализациям, а по функциональным зонам самого ядра, чтобы не нарушать принцип разделения интерфейса (ISP из SOLID).
Где правильно расположить ваши интерфейсы:
Интерфейс репозитория (работа с файлом/БД): Оставляем в Core (Application/Domain). Бизнес-логике приложения нужно знать, какие действия можно совершать с данными (сохранить, получить), но ей плевать на физический носитель. Реализация уходит в слой инфраструктуры и импортирует этот интерфейс из ядра.
Класс для генерации нового ID: Это чистое доменное правило, определяющее логику сущности. Абстракция должна лежать в самом центре — в Domain Model.
Класс для конвертации объекта в словарь (Serializer): Зависит от того, для чего он нужен. Если для отдачи данных в UI/API — интерфейс лежит на границе Application Services / Presenters. Если для сохранения в файл — в инфраструктурном шлюзе.
Примечание для Python:
для обычного перевода объекта в dict абстрактные классы часто избыточны, лучше использовать методы самой сущности или библиотеки вроде Pydantic.Идеальная структура директорий:Не нужно плодить «подслои core» внутри инфраструктуры.
Разнесите код в ядре по смыслу:
my_project/
│
├── core/ (Слой Domain / Core — не зависит от внешнего мира)
│ ├── domain/
│ │ ├── models.py # Сущности бизнес-логики
│ │ └── id_generator.py # ABC для генератора ID (Доменное правило)
│ │
│ └── application/
│ ├── interfaces.py # ABC для Репозиториев и внешних сервисов
│ └── use_cases.py # Логика приложения, использующая эти ABC
│
└── infrastructure/ (Внешний слой — импортирует и реализует интерфейсы ядра)
├── file_repository.py # Реализация репозитория (работа с файлом)
├── db_id_generator.py # Реализация генератора ID
└── serializers.py # Конкретные мапперы
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Как исправить:
1. На GitHub зайдите в Settings -> Developer settings -> Personal access tokens (classic) -> Generate new token (classic).
2. Дайте ему имя, обязательно отметьте галочками права repo, gist и read:org, после чего нажмите Generate и скопируйте сам токен.
3. В PhpStorm перейдите в Settings -> Version Control -> GitHub, удалите старую зависшую учетку (через минус), нажмите «Плюс» -> Log In with Token и вставьте скопированный ключ.
Связь сразу поднимется в обход забагованной браузерной авторизации.