Легкий путь в Python
5.78K subscribers
142 photos
23 videos
3 files
180 links
Я Алексей Яковенко, senior-разработчик Python. Здесь вы найдете статьи, заметки, посты и видео для прокачки навыков программирования. Интересно и новичку, и профи 💡

По вопросам: https://t.me/yakvenalexx
Download Telegram
Процесс подготовки к выходу новой статьи идет полным ходом. Публикация, ориентировочно, выйдет в пятницу (19-го сентября). Будет много информации😉
240🔥27🎉10🤣4🥰1🤔1💘1
🤖 Вторая часть курса по LangGraph готова!

Статья уже написана и оформлена как черновик на Хабре, сейчас проходит финальную вычитку. В рамках статьи мы превратим безжизненные графы в настоящих AI-агентов с интеллектом и памятью! Что будет в статье?

Теоретическая база (без занудства):

- Типы сообщений (AIMessage, HumanMessage и зачем это нужно)
- Контекстная память агентов
- Шаблонизаторы и парсеры
- Архитектура мультимодельных систем

Практические кейсы:

- Агенты с долговременной памятью (100+ сообщений)
- Гарантированное получение валидного JSON от нейросетей
- Интеграция нескольких LLM в одном графе
- Интеллектуальная маршрутизация сообщений

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

Пока ждете выхода:

📝 Первая часть: Архитектура: графы, узлы и состояния

💻 Исходный код второй части: GitHub

📅 Публикация: 20 сентября (суббота)

Ждете продолжение? 👀
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥6529🎉7❤‍🔥3👀2🙉2😘1
🎉 Вторая часть курса по LangGraph уже доступна!

Статья "Создание умных AI-агентов: полный курс по LangGraph от А до Я. Часть 2. Диалоговые агенты: память, сообщения и контекст" опубликована и готова к изучению!
В этой части мы превратили безжизненные графы в настоящих AI-агентов с интеллектом и памятью!

Что вы найдете в статье:

🧠 Теоретическая база (без занудства):

- Типы сообщений (AIMessage, HumanMessage и зачем это нужно)
- Контекстная память агентов
- Шаблонизаторы и парсеры
-Архитектура мультимодельных систем

⚡️ Практические кейсы:

- Агенты с долговременной памятью (100+ сообщений)
- Гарантированное получение валидного JSON от нейросетей
- Интеграция нескольких LLM в одном графе
- Интеллектуальная маршрутизация сообщений

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

🔗 Читать статью: ЧИТАТЬ

📚 Полезные материалы:

📝 Первая часть: Архитектура: графы, узлы и состояния

💻 Исходный код: GitHub

🚀 А что дальше?

Уже собираю материал для третьей части! Там речь пойдет про Инструменты, действия, MCP - создадим агентов, которые умеют ДЕЛАТЬ, а не только говорить!

Понравилась статья? Делитесь впечатлениями! 👇
3🔥6616👍13🎉2🎄1💘1
🚀 Начал активную подготовку 3-й части курса по LangGraph!

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

Тема: "Реактивные агенты: инструменты, действия, MCP"

🎯 От слов к делам:

Во второй части мы создали умных болтунов с памятью и JSON-ответами. Но они всё ещё не могут НИЧЕГО ДЕЛАТЬ в реальном мире.

В третьей части исправляем это критическое ограничение!

⚡️ Что будет в статье:

🔧 Model Context Protocol (MCP) — стандарт для подключения любых инструментов
📁 Файловые операции — агент читает CSV, создаёт отчёты
🗄 Работа с БД — SQL-запросы через естественный язык
🚀 DevOps-автоматизация — от git-мониторинга до автодеплоя
🛡 Безопасность — как дать агентам силу, но сохранить контроль

Представьте диалог:
"Проанализируй продажи за месяц"
🔍 Подключаюсь к БД...
📊 Анализирую данные...
📈 Создаю отчёт в Excel...
"Готово! Отчёт сохранён в sales_report.xlsx"


Пока кажется фантастикой? К концу статьи сами научитесь такое создавать!

📅 Планы по срокам:

Активно работаю над материалом, код уже тестирую. Третья часть выйдет в на следующей неделе (надеюсь), а не через месяц как в прошлый раз 😅

🔥 Будете ждать продолжение?
4🔥89👍22183🎉2🤩2👏1🤝1🙊1
⚡️ Как быстро превратить CSV в JSON на Python

Часто данные прилетают в формате CSV, а работать удобнее в JSON. Решается в пару строк кода:

import csv
import json

def csv_to_json(filename_in, filename_out):
with open(filename_in, "r", encoding="cp1251") as csvfile:
reader = csv.DictReader(csvfile, delimiter=";")
rows = list(reader)
with open(filename_out, "w", encoding="utf-8") as jsonfile:
json.dump(rows, jsonfile, ensure_ascii=False, indent=2)

# Пример:
csv_to_json("price.csv", "output.json")


🔑 На что стоит обратить внимание:

* Кодировка: в России CSV-файлы часто в cp1251, а JSON лучше сохранять в utf-8.
* Разделитель: Excel любит ; вместо привычной запятой ,. Если структура другая — не забудьте поменять delimiter.

В итоге получаем аккуратный output.json с красивыми отступами и без кракозябр. 🚀
27👍12🔥8🕊1👻1🤝1🤪1💘1
🚀 Третья часть курса по LangGraph практически готова!

После умных болтунов с памятью и JSON-ответами настало время дать агентам «руки» — инструменты для реальных действий.

Черновик статьи уже на Хабре, финальная вычитка идёт, код написан и проверен 😉

Что будет в статье?

📚 Теоретическая база (коротко и по делу):

- Что такое инструменты (Tools) и зачем они нужны
- Model Context Protocol (MCP) — стандарт для подключения любых действий
- Архитектура «реактивных» агентов

🛠 Практика и кейсы:

* Агент, который умеет читать файлы, анализировать CSV и сохранять отчёты
* SQL-запросы к базе прямо из естественного языка
* Мультиагентные системы: несколько агентов-экспертов в одном графе
* Безопасность: как дать агентам силу, но сохранить контроль

Пример диалога из статьи:

👩 Пользователь: «Проанализируй продажи за месяц»
🤖 Агент: «Подключаюсь к БД → Анализирую → Создаю отчёт…»
📊 «Готово! Отчёт сохранён в sales\_report.xlsx»

Уже не болтун, а настоящий цифровой ассистент!

📅 Публикация: 27 сентября (суббота)
💻 Исходный код третьей части: GitHub

🔗 Связь с предыдущими частями:

1️⃣Часть. Архитектура: графы, узлы и состояния

2️⃣Часть. Диалоговые агенты: память, сообщения и контекст

🔥 Название статьи:

Создание умных AI-агентов: полный курс по LangGraph от А до Я. Часть 3. Даём ИИ руки: работа с инструментами и MCP

Ждёте публикацию? 👀
Please open Telegram to view this post
VIEW IN TELEGRAM
843🔥33👍15🤩4🎉3👀3👌1💯1
🚀 Всё по плану!

Только что закончил финальную вычитку текста третьей части курса по LangGraph.

Уже завтра статья выйдет на Хабре 🙌

Будем давать ИИ «руки» — подключать инструменты и MCP, а агенты перестанут быть просто болтунами и начнут реально действовать

А дальше будет ещё интереснее 👉 Часть 4 задумывается как полноценный проект на LangGraph.

Но пока я не определился, какой именно — хочу услышать ваши идеи.

Что было бы круче разобрать:

— ассистента для работы с документами?
— мультиагентный проект с несколькими экспертами?
— или что-то под DevOps/кодинг?

Пишите в комментах 👇 именно ваши хотелки могут попасть в четвёртую часть 🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥4613👏3🎉21🙏1👀1
🎉 Третья часть курса по LangGraph уже опубликована!

Статья «Создание умных AI-агентов: полный курс по LangGraph от А до Я. Часть 3. Даём ИИ руки: работа с инструментами и MCP» 👉 читать на Хабре

В этой части агенты перестают быть болтунами — они получают инструменты и MCP, учатся читать файлы, работать с БД, анализировать CSV, строить отчёты и даже объединяться в мультиагентные системы 💪

📚 Полезные ссылки:

1️⃣ Часть 1. Архитектура

2️⃣ Часть 2. Диалоговые агенты

3️⃣ Исходники третьей части (GitHub)

🔥 А что дальше?

Часть 4 задумывается как полноценный проект на LangGraph.

Я пока не определился с темой проекта — поэтому всё ещё жду ваши идеи:

— Ассистент для работы с документами (поиск, аннотации, резюме)?
— Мультиагентная система, где каждый агент — эксперт в своей области?
— DevOps-помощник: CI/CD, сборки, деплой прямо из графа?
— Data-аналитик: сбор данных из разных источников, отчёты и дашборды?
— Агент для работы с кодом: рефакторинг, тесты, генерация pull-request?
— Личный productivity-ассистент: планирование задач, интеграции с календарём и почтой?
— Или что-то совершенно необычное, о чём я даже не подумал?

💡 Делитесь в комментариях 👇 именно ваши хотелки могут попасть в четвёртую часть!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥58👍1613🎉3❤‍🔥2🎄1😘1
This media is not supported in your browser
VIEW IN TELEGRAM
Помню те времена, когда ещё не было нейронок и именно Stack Overflow был нашей единственной надеждой.

Найдёшь то самое ключевое слово — и будто свет в конце туннеля. Покойся с миром, старый друг 😔
1😁38😢23💯129🙏4👎2🏆1👻1🦄1
Карьерный буст, робот в подарок и призовой фонд 7 500 000 рублей 🤖
Успей зарегистрироваться до 20 октября.


Все это ждет участников трека «Программирование роботов» на всероссийском ИТ-чемпионате МТС True Tech Champ 2025. Присоединяйся, если пишешь на С++, Go, Python, JS, Java, C# или другом языке.

Соревнования пройдут в командах от 2 до 4 человек в несколько этапов:

Квалификация. Тебе предстоит запрограммировать робота на прохождение виртуального лабиринта.
Полуфинал. Ты будешь дистанционно управлять роботом на офлайн-полигоне и наблюдать за его перемещениями в трансляции.
Финал. За две недели до финала организаторы отправят тебе настоящего робота для кастомизации. Ты сможешь модифицировать его, чтобы он оказался быстрее других в многоуровневом офлайн-лабиринте и смог выбить соперников с платформы в шоу-битве.

Команды финалистов получат по одному роботу Waveshare Cobra Flex в подарок и сразятся за крупные денежные призы: 4 000 000 ₽ за первое место, 2 500 000 ₽ за второе и 1 000 000 ₽ за третье.

Еще ты сможешь:

— Получить практический опыт работы с инструментами, с помощью которых создают домашних и промышленных роботов.
— Прокачать компетенции, которые помогут развиваться в ИТ.
— Заявить о себе на всю Россию и ускорить свой профессиональный рост.

📍 Финал состоится 21 ноября в МТС Live Холл в Москве.
👉🏻 Регистрируйся на сайте до 20 октября.
👍96🔥4🤡3🫡3👎1🥰1🤮1👌1💯1
Мой боевой набор MCP-серверов для работы с AI

Делюсь инструментами, которые реально меняют подход к разработке с нейросетями. Использую их и в личных проектах, и в связке с агентами вроде Claude Code или Cursor.

Что такое MCP и почему это важно

Model Context Protocol — это протокол, который даёт AI-ассистенту прямой доступ к вашим инструментам: файловой системе, базам данных, git-репозиториям и API. Вместо бесконечного копипаста нейросеть сама читает код, выполняет запросы к БД и коммитит изменения.

Пять серверов, которые я настраиваю в каждом проекте

1. Filesystem — фундамент работы

"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/путь/к/вашему/проекту"
]
}


Зачем нужен: AI получает доступ к файлам проекта — может читать код, анализировать структуру, вносить изменения. Это базовый инструмент, без которого остальное не имеет смысла. Особенно актуальный инструмент в работе с собственными ии-проектами.

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

2. Git — версионирование на автопилоте

"git": {
"type": "stdio",
"command": "uvx",
"args": [
"mcp-server-git",
"--repository",
"/путь/к/вашему/проекту"
]
}


Зачем нужен: AI может изучать историю коммитов, создавать ветки, делать коммиты. Особенно полезно для code review и анализа того, как менялся код со временем.

Требования: нужен Python и установленный uvx.

3. Postgres — работа с БД без головной боли

"postgres": {
"command": "uv",
"args": ["run", "postgres-mcp", "--access-mode=unrestricted"],
"env": {
"DATABASE_URI": "postgresql://user:password@localhost:5432/dbname"
}
}


Зачем нужен: AI может выполнять SQL-запросы, анализировать схему базы данных, помогать с миграциями. Экономит массу времени на отладке запросов и оптимизации.

Важно:
- Флаг --access-mode=unrestricted используйте только в dev-окружении
- Никогда не коммитьте реальные пароли в конфиг — используйте переменные окружения

4. cURL — свобода работы с API

"curl": {
"command": "npx",
"args": ["-y", "@mcp-get-community/server-curl"]
}


Зачем нужен: AI может делать HTTP-запросы к любым API. Тестирование эндпоинтов, интеграция с внешними сервисами — всё через простое текстовое описание задачи.

5. Context7 — актуальная документация библиотек

"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp"],
"env": {
"CONTEXT7_API_KEY": "ваш_api_ключ"
}
}


Зачем нужен: даёт AI доступ к актуальной документации популярных библиотек и фреймворков. Вместо того чтобы полагаться на устаревшие знания из обучающей выборки, нейросеть получает свежую информацию об API, best practices и изменениях в новых версиях. Особенно критично для быстро развивающихся экосистем вроде React, Next.js или FastAPI.

API-ключ: получить можно на Сontext7

Как это работает в реальной жизни

Мой типичный workflow выглядит так:

1. Filesystem + Git — AI читает код, вносит изменения, коммитит их с осмысленными сообщениями
2. Postgres — проверяю и оптимизирую SQL-запросы, анализирую данные
3. cURL — тестирую API endpoints прямо в диалоге с AI
4. Context7 — AI работает с актуальной документацией библиотек, не галлюцинирует устаревшие методы

Безопасность превыше всего

Несколько правил, которых я строго придерживаюсь:

- Никогда не давайте AI доступ к продакшн-базам данных
- Создавайте отдельного пользователя БД с минимально необходимыми правами
- Храните секреты и пароли в переменных окружения, а не в конфигах
- Всегда ревьюте действия AI, особенно git-коммиты и изменения в БД

Эти пять MCP-серверов покрывают около 90% моих задач при работе с AI в проектах. Настраиваются один раз, работают везде. AI получает все необходимые инструменты для реальной работы — не просто генерации кода, а полноценного участия в разработке.

Какие MCP-серверы используете вы? Поделитесь опытом в комментариях! 👇
2👍5518🔥10🎉2🙏1🐳1🏆1😘1
А что, GitHub тоже отказался работать?
5😱3🤯2🤗2🤩1😭1
Привет, друзья!

Хочу признаться: последние пару месяцев я немного выпал из привычного ритма. Сначала — работа над крупным государственным проектом, потом отпуск, а затем и небольшая болезнь. В итоге образовалась пауза, и я упустил момент, когда многие из вас активно росли и развивались внутри сообщества.

Но теперь я снова в строю! Уже в эти выходные выйду с новым материалом — и дальше постараюсь не исчезать надолго.

Спасибо, что остаётесь рядом и продолжаете двигаться вперёд ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
277🔥30👍17👏4👌2🤡2😎2🥰1
Лайфхак: обходим CORS через прокси-бэкенд на Python 🐍

Недавно у меня был забавный случай. Работал с фронтендером над одним проектом, и он столкнулся с классической проблемой CORS. Вместо того чтобы разбираться с настройками, он просто поднял свой прокси-сервер на Node.js, который пробрасывает запросы к моему Python API. Проблема решена за 15 минут.

Я подумал — а почему бы не показать, как сделать то же самое на Python? Получится еще быстрее и элегантнее.

Что такое CORS и почему он мешает?

CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузера. Он блокирует запросы с одного домена на другой.

Пример: Ваш фронтенд крутится на localhost:3000, а API находится на api.example.com. Браузер видит разные origins и блокирует запрос. В консоли вы видите знакомую ошибку:

Access to fetch at 'https://api.example.com' from origin 'http://localhost:3000' 
has been blocked by CORS policy


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

Решение: прокси-бэкенд

Идея простая: поднимаем свой легкий сервер, который:

1. Принимает запросы от фронта (один и тот же origin — никаких CORS)
2. Пробрасывает их на целевой API
3. Возвращает ответ обратно фронту

Для браузера это обычный запрос на свой сервер. Для API — запрос с бэкенда (где CORS не существует).

Реализация на FastAPI

from fastapi import FastAPI, Request, Response
from fastapi.middleware.cors import CORSMiddleware
import httpx

app = FastAPI()

# Разрешаем CORS для фронта
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_methods=["*"],
allow_headers=["*"],
)

TARGET_API = "https://api.example.com"

@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH"])
async def proxy(path: str, request: Request):
# Формируем URL целевого API
url = f"{TARGET_API}/{path}"

# Получаем тело запроса
body = await request.body()

# Пробрасываем запрос
async with httpx.AsyncClient() as client:
response = await client.request(
method=request.method,
url=url,
headers=dict(request.headers),
content=body,
params=request.query_params
)

# Возвращаем ответ фронту
return Response(
content=response.content,
status_code=response.status_code,
headers=dict(response.headers)
)


Запуск:
pip install fastapi httpx uvicorn
uvicorn main:app --reload --port 8000


Теперь ваш фронт делает запросы на localhost:8000, а прокси пробрасывает их куда нужно.

Вариант на Flask (для минималистов)

from flask import Flask, request, Response
from flask_cors import CORS
import requests

app = Flask(__name__)
CORS(app)

TARGET_API = "https://api.example.com"

@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])
def proxy(path):
url = f"{TARGET_API}/{path}"

response = requests.request(
method=request.method,
url=url,
headers={k: v for k, v in request.headers if k != 'Host'},
data=request.get_data(),
params=request.args
)

return Response(
response.content,
status=response.status_code,
headers=dict(response.headers)
)

if __name__ == '__main__':
app.run(port=8000, debug=True)


Когда это полезно?

В разработке — когда нет доступа к настройкам целевого API
Сторонние API — многие публичные API не поддерживают CORS
Дополнительная логика — можно добавить кэширование, логирование, rate limiting
Скрытие API ключей — не светите токены на фронте
Когда хочется прикрутить стороннее API напрямую к своему фронту, а API не позволяет (например API Ozon Seller с недавнего времени)

Вот так простая проблема с CORS решается за 10 минут с помощью Python. А фронтендеры могут спокойно работать дальше, не копаясь в настройках😉

Кстати, если у вас есть интересные кейсы из практики — пишите в комментарии, разберем вместе!
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥36👍15103🕊1🫡1
Возвращаюсь к практике с LangGraph! 🎯

Многие из вас ждали продолжения серии статей про LangChain и LangGraph — я не забыл о ней, просто последние пару месяцев совсем не было времени на публикации.

Сейчас возвращаюсь, и осталась последняя, самая практическая часть. Долго думал над форматом — хотелось найти что-то реально интересное, не просто очередной RAG-чатбот или скрипт для парсинга новостей.

И вот что решил сделать:

Телеграм-бот с детективной игрой, где вы — следователь, расследующий преступление. Агент на LangGraph генерирует уникальное дело: подозреваемые, улики, алиби, мотивы. Вы осматриваете локации, допрашиваете свидетелей, собираете доказательства. Все это в свободной форме — никаких готовых вариантов ответов, только живое общение с ИИ.

Что интересного покажу:
- ReAct агент в деле — как он логически рассуждает от лица разных персонажей
- Граф состояний — обработка разных типов действий игрока
- Сложный State менеджмент — агент помнит всю картину преступления, показания, улики
- Условную логику — персонажи меняют поведение в зависимости от ваших вопросов и улик
- Интеграцию с Telegram Bot API

Это будет полноценное приложение, которое можно запустить и поиграть. Весь код, естественно, будет в статье.

Готовлю материал, выйдет на следующей неделе. Кто ждал практики — она будет 🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥100👍22❤‍🔥9🤩32💯2🙉1
Многие начинающие разработчики, которые уже пишут свои программы, рано или поздно приходят к понятию деплоя. К сожалению, часто в проектах, в которых нам приходится участвовать, нет DevOps-специалиста, поэтому ответственность за деплой ложится на нас.

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

Нужно понимать одну важную вещь: в абсолютном большинстве случаев вы будете работать с готовой операционной системой. Обычно это какой-то дистрибутив Linux (часто Ubuntu) или Windows Server, но с одним критическим отличием — там не будет графической оболочки. Мышкой некуда будет нажать.

В остальном же у вас не вызывает трепет взаимодействие с операционной системой, на которой вы работаете, верно? Вот и сервер — это та же самая операционная система, только без GUI. Файлы, процессы, сеть — все это работает точно так же.

Единственное, что меняется — способ взаимодействия. Вместо мышки у вас будет SSH и командная строка. Вместо двойного клика — команды типа python app.py или systemctl start myapp. Это не магия, это просто другой интерфейс для той же самой системы.

Так что не бойтесь серверов. Просто держите крышку открытой 😄

P.S. Рассказать в следующих постах про основные способы запуска Python приложений на VPS-сервере?
👍11116❤‍🔥5🔥5😁4🐳1💯1💋1🙈1
🧩 Одно ядро авторизации и куча микросервисов на FastAPI

Простая и надёжная схема, которую можно масштабировать хоть до бесконечности

Сегодня расскажу, как вокруг одного ядра авторизации можно выстраивать десятки микросервисов — лёгких, быстрых и независимых. Вся магия держится на правильной работе с access и refresh токенами. На самом деле всё гораздо проще, чем кажется.

🔐 Как работает мини-бэкенд (микросервис)

Каждый микросервис получает в запросах заголовок:

Authorization: Bearer <access_token>


И делает всего одну вещь — локально проверяет access_token через PyJWT:

- подпись валидна ✔️
- exp не истёк ✔️
- формат корректный ✔️

Если всё ок → выполняет свою бизнес-логику.
Если токен умер → просто отдаёт 401 Unauthorized.

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

👉 На этом его роль заканчивается. Микросервис никогда не работает с refresh токенами, не хранит их и не обновляет.

🖥 Что делает фронтенд при ошибке 401

Вот здесь происходит самая приятная магия:

1. Фронт получает 401 → понимает “access токен умер”.
2. Достаёт у себя в хранилище refresh_token.
3. Идёт в Auth Service: POST /auth/refresh.
4. Получает свежую пару access + refresh.
5. Сохраняет.
6. Повторяет оригинальный запрос уже с новым access токеном.
7. Микросервис снова проверяет токен → всё работает.

Микросервисы остаются лёгкими, а ядро авторизации — централизованным и контролирующим.

👤 Как выглядит флоу регистрации / авторизации

1. Пользователь вводит почту.
2. Бэк проверяет:
– если пользователя нет → запускается сценарий регистрации (отправляется временный пароль);
– если есть → открывается форма ввода пароля.
3. При успешном входе бэк отдаёт фронту два токена:

- access (живёт ~15 минут)
- refresh (живёт, например, 3 дня)

В бою именно фронтенд хранит оба токена. Это важно.

🤝 Взаимодействие микросервисов с ядром

Микросервис:

- видит только access_token
- проверяет его валидность
- при успехе получает из токена базовые данные пользователя
- при провале отдаёт 401

Если приходит новый пользователь — делается хук: микросервис принимает токен + почту и фиксирует у себя пользователя под своим айди. Из токена через валидатор извлекается айди пользователя и происходит фиксация пользователя в своей системе. Ключевая связка тут - свой айди + основной айдишник пользователя.

Частые вопросы

Нужно ли хранить refresh_token в микросервисе?
Нет. Только фронт.

Что делать, если access токен истёк?
Вернуть 401. Фронт сам всё обновит.

Можно ли доверять данным из JWT?
Да, если подпись валидна — данные не были изменены.

🚀 Масштабируемость и лучшие практики

- Такая схема одинаково отлично работает и для веба, и для мобильных приложений.
- Можно добавлять авторизацию через Google / GitHub — механика почти та же: там тоже возвращаются access + refresh токены.
- При желании refresh токен можно убирать в защищённую cookie — это уже уровень “best practices 2.0”.

🔮 Немного про магию QR-кодов

То, что кажется “инопланетной технологией”, например авторизация через QR (как в VK), на самом деле очень просто:

QR-код содержит ссылку с параметрами (токены, коды, состояния).
Фронт её парсит → бэк это фиксирует → выдаются токены.

Никаких чудес — просто длинная URL-строка с зашитыми данными 😄

🧠 Итог

Вся система строится вокруг простого, но мощного принципа:

> Ядро авторизации выдаёт токены.
> Микросервисы проверяют access и ничего больше не знают.
> Фронтенд управляет жизненным циклом токенов.


Именно такая архитектура позволяет легко строить вокруг ядра десятки сервисов, не городя сложные и тяжёлые схемы.

P.S. Рассказать в одном из следующих постов почему refresh token нужно хранить в защищенной кукки сессии и как вообще это работает?
1👍6912❤‍🔥5🔥5🎉2😇1🤝1👾1
Как легко создать и накатить дамп базы данных PostgreSQL

Сегодня разберем простую, но важную тему — работа с дампами PostgreSQL. Это нужно для бэкапов, переноса данных между окружениями или клонирования prod в dev.

⚙️Установка psql

Linux (Ubuntu/Debian):
sudo apt update
sudo apt install postgresql-client


macOS:
brew install postgresql


Windows:

1. Скачайте PostgreSQL с https://www.postgresql.org/download/windows/
2. При установке выберите "Command Line Tools"
3. Добавьте в PATH: C:\Program Files\PostgreSQL\16\bin

Проверка установки (все ОС):
psql --version


☝️ Важно: версия psql должна совпадать или быть новее версии вашего PostgreSQL сервера.

💾 Создание дампа (бэкап)

Linux/macOS:
# Базовая команда
pg_dump -h localhost -p 5432 -U postgres -d mydb > dump.sql

# Без запроса пароля
PGPASSWORD=your_password pg_dump -h localhost -p 5432 -U postgres -d mydb > dump.sql

# С сжатием (для больших баз)
pg_dump -h localhost -p 5432 -U postgres -d mydb | gzip > dump.sql.gz


Windows (CMD):
REM Базовая команда
pg_dump -h localhost -p 5432 -U postgres -d mydb > dump.sql

REM Без запроса пароля
set PGPASSWORD=your_password
pg_dump -h localhost -p 5432 -U postgres -d mydb > dump.sql


Windows (PowerShell):
# Без запроса пароля
$env:PGPASSWORD="your_password"
pg_dump -h localhost -p 5432 -U postgres -d mydb > dump.sql


Параметры команды:
- -h — хост (localhost или IP сервера)
- -p — порт (по умолчанию 5432)
- -U — пользователь
- -d — название базы данных

📥 Заливка дампа (восстановление)

Linux/macOS:
# Из обычного дампа
psql -h localhost -p 5432 -U postgres -d mydb -f dump.sql

# Без запроса пароля
PGPASSWORD=your_password psql -h localhost -p 5432 -U postgres -d mydb -f dump.sql

# Из сжатого дампа
gunzip < dump.sql.gz | psql -h localhost -p 5432 -U postgres -d mydb


Windows (CMD):
REM Из обычного дампа
set PGPASSWORD=your_password
psql -h localhost -p 5432 -U postgres -d mydb -f dump.sql


Windows (PowerShell):
$env:PGPASSWORD="your_password"
psql -h localhost -p 5432 -U postgres -d mydb -f dump.sql


🐳Работа с Docker (универсально для всех ОС)

Если PostgreSQL крутится в Docker, команды одинаковые на всех платформах:

# Создание дампа
docker exec -t postgres_container pg_dump -U postgres -d mydb > dump.sql

# Заливка дампа
docker exec -i postgres_container psql -U postgres -d mydb < dump.sql


Или через docker-compose:

# Создание
docker-compose exec -T db pg_dump -U postgres -d mydb > dump.sql

# Заливка
docker-compose exec -T db psql -U postgres -d mydb < dump.sql


🔐 Лайфхак: файл для автоматической аутентификации

Linux/macOS:
# Создаем файл
nano ~/.pgpass

# Добавляем строку (формат: host:port:database:username:password)
localhost:5432:*:postgres:your_password

# Ставим права
chmod 600 ~/.pgpass


Windows:

Создайте файл %APPDATA%\postgresql\pgpass.conf со строкой:
localhost:5432:*:postgres:your_password


Теперь команды работают без пароля на всех платформах!

🛠 Полезные опции pg_dump

# Только структура (без данных)
pg_dump -s -h localhost -U postgres -d mydb > schema.sql

# Только данные (без структуры)
pg_dump -a -h localhost -U postgres -d mydb > data.sql

# Конкретная таблица
pg_dump -t users -h localhost -U postgres -d mydb > users.sql

# Исключить таблицу
pg_dump --exclude-table=logs -h localhost -U postgres -d mydb > dump.sql

# Verbose режим (показывает процесс)
pg_dump -v -h localhost -U postgres -d mydb > dump.sql


⚠️ Типичные ошибки

`pg_dump: error: server version mismatch`
→ Обновите postgresql-client до версии вашего сервера

`psql: FATAL: password authentication failed`
→ Проверьте пароль или используйте PGPASSWORD / pgpass файл

`permission denied`
→ Проверьте права на файл дампа

`command not found` (Windows)
→ Добавьте путь к PostgreSQL в PATH

📝 Резюме

✔️Установили postgresql-client (Linux/Mac) или PostgreSQL Tools (Windows)
✔️Создаем дамп: pg_dump ... > dump.sql
✔️Накатываем дамп: psql ... -f dump.sql
✔️Для Docker используем docker exec (работает везде одинаково)
✔️Настраиваем .pgpass / pgpass.conf для удобства

Просто, быстро, надежно — на любой платформе! 🚀

Есть вопросы? Пишите в комментариях👇
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥26🔥1912🫡21💋1🙉1
🎯 Как я перегнал 30 ГБ картинок через Google Drive, не имея SSH — и почему Python снова спас день

Иногда жизнь подкидывает нетривиальные задачи. Например: нужно сгенерировать ~100 000 изображений (≈30 ГБ) и доставить их на боевой VPS, до которого… нет прямого SSH-доступа.
VPN поднимать лень, корпоративная сеть всё режет, облачные сториджи не выделены.
Но есть Python, немного смекалки — и Google Drive c 10 ГБ свободного места.

Вот как это было 👇

🔥 Этап 1 — Генерация 100 000 баннеров

Надо было быстро нагенерить огромный массив картинок по CSV.
Pillow + ThreadPoolExecutor → и мощный арендованный сервер выдаёт за ~20 минут набор изображений общим весом около 30 ГБ.

Локальная машина такую нагрузку просто не вывезла бы — а на удалённой всё прошло гладко.

🔥 Этап 2 — Как перенести 30 ГБ, когда SSH недоступен

И вот тут началось самое интересное.

Что имеем:

прямой SSH заблокирован корпоративной сетью
не хочется поднимать временный VPN/туннель
не хочется разворачивать MinIO, S3 или ещё что-то тяжёлое под одноразовую задачу
✔️ есть Google Drive с 10 ГБ свободного места
✔️ и Python на VPS

Задача — доставить 30 ГБ на VPS, не превышая лимит доступного облака.

💡 Решение — многотомный ZIP + gdown

На Windows-сервере упаковал результаты в многотомный архив WinRAR:

all_images.z01  
all_images.z02
all_images.z03
...
all_images.zip


Каждый том ≤10 ГБ — чтобы влазил в Google Drive.

🔥 Этап 3 — Python-скрипт на VPS, который «вытягивает» файлы из Google Drive

На VPS создал виртуальное окружение и установил gdown:

python -m venv .venv
source .venv/bin/activate
pip install gdown


Мини-скрипт gdrive_download.py:

import sys
import gdown

def main():
if len(sys.argv) != 3:
print("Usage: python gdrive_download.py <share_url> <output_name>")
sys.exit(1)

url = sys.argv[1]
output = sys.argv[2]

gdown.download(url=url, output=output, fuzzy=True)

if __name__ == "__main__":
main()


fuzzy=True позволяет передавать обычную share-ссылку формата:

https://drive.google.com/file/d/<ID>/view?usp=sharing


🔥 Этап 4 — Гениальное по простоте: в облаке хранится только ОДИН файл

Дальше пошёл цикл:

1️⃣ заливаю на Google Drive all_images.z01
2️⃣ копирую share-ссылку
3️⃣ на VPS качаю том:

python gdrive_download.py "https://drive.google.com/file/d/FILE_ID/view?usp=sharing" all_images.z01


4️⃣ проверяю размер:

ls -lh all_images.z01


5️⃣ удаляю файл из Drive → освобождаю место → загружаю следующий том

Так все части многотомного архива оказываются на VPS, а в облаке в каждый момент времени лежит только один файл.

🔥 Этап 5 — Магия unzip: один ZIP — вся директория

Когда все тома были скачаны:

unzip all_images.zip


unzip автоматически подтянул все .z0N части и развернул структуру.

Дальше:

find extracted_folder -type f -name "*.jpg" -exec mv {} /var/www/photos/ \;


Nginx уже раздавал файлы как обычную статику — и вот у меня есть новый распределённый узел с 100 000 изображений, доступный глобально по прямым ссылкам.

⚡️ Итог

Что было нужно?

- Python
- gdown
- WinRAR
- Google Drive
- немного инженерной смекалки

Что получилось?

30 ГБ данных ушли на VPS через Drive без SSH, VPN и сложных настройкок
— Всего за один проход
— С полностью автоматизированным мини-скриптом

🎬 Мораль истории

Если у вас есть Python — значит, у вас есть способ решить почти любую инженерную задачу. Даже если корпоративная сеть пытается вам помешать 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32👍108👏3👌2😍21🤔1🤗1
🐍 Что такое аргументы при запуске Python-скриптов и зачем они вообще нужны?

Когда мы запускаем Python-скрипт, нам часто нужно передать ему какие-то настройки: диапазоны, файлы, коэффициенты, флаги и т. д.
Чтобы не хардкодить всё прямо в коде, Python позволяет передавать параметры снаружи — через аргументы командной строки.

Проще говоря: вместо того чтобы переписывать переменные в .py файле, мы даём скрипту команды прямо при запуске.

Например:

python script.py --name "Ozon" --delay 5 --enable-log


Такой подход даёт 3 плюса:

1. Гибкость — один и тот же скрипт работает в разных режимах.
2. Удобство — не надо лазить в код ради одного числа.
3. Автоматизация — идеально для cron, CI/CD и массовых операций.

📦 Практический пример

Вот как это делается с помощью библиотеки argparse:

import argparse


def parse_arguments():
parser = argparse.ArgumentParser(
description="Пример использования аргументов"
)

parser.add_argument(
"--start",
type=int,
required=True,
help="Начальный индекс"
)

parser.add_argument(
"--end",
type=int,
required=True,
help="Конечный индекс"
)

parser.add_argument(
"--markup",
type=float,
default=10.0,
help="Процент наценки"
)

return parser.parse_args()


if __name__ == "__main__":
args = parse_arguments()
print(f"Обрабатываю товары от {args.start} до {args.end} с наценкой {args.markup}%")


Запуск:

python update_prices.py --start 0 --end 17 --markup 15


Вывод:

Обрабатываю товары от 0 до 17 с наценкой 15%
👍287🔥4🎉2👎1🐳1👨‍💻1🎃1