Как легко создать и накатить дамп базы данных PostgreSQL
Сегодня разберем простую, но важную тему — работа с дампами PostgreSQL. Это нужно для бэкапов, переноса данных между окружениями или клонирования prod в dev.
⚙️ Установка psql
Linux (Ubuntu/Debian):
macOS:
Windows:
1. Скачайте PostgreSQL с https://www.postgresql.org/download/windows/
2. При установке выберите "Command Line Tools"
3. Добавьте в PATH:
Проверка установки (все ОС):
☝️ Важно: версия
💾 Создание дампа (бэкап)
Linux/macOS:
Windows (CMD):
Windows (PowerShell):
Параметры команды:
-
-
-
-
📥 Заливка дампа (восстановление)
Linux/macOS:
Windows (CMD):
Windows (PowerShell):
🐳 Работа с Docker (универсально для всех ОС)
Если PostgreSQL крутится в Docker, команды одинаковые на всех платформах:
Или через docker-compose:
🔐 Лайфхак: файл для автоматической аутентификации
Linux/macOS:
Windows:
Создайте файл
Теперь команды работают без пароля на всех платформах!
🛠 Полезные опции pg_dump
⚠️ Типичные ошибки
❌ `pg_dump: error: server version mismatch`
→ Обновите postgresql-client до версии вашего сервера
❌ `psql: FATAL: password authentication failed`
→ Проверьте пароль или используйте PGPASSWORD / pgpass файл
❌ `permission denied`
→ Проверьте права на файл дампа
❌ `command not found` (Windows)
→ Добавьте путь к PostgreSQL в PATH
📝 Резюме
✔️ Установили
✔️ Создаем дамп:
✔️ Накатываем дамп:
✔️ Для Docker используем
✔️ Настраиваем
Просто, быстро, надежно — на любой платформе!🚀
Есть вопросы? Пишите в комментариях👇
Сегодня разберем простую, но важную тему — работа с дампами PostgreSQL. Это нужно для бэкапов, переноса данных между окружениями или клонирования prod в dev.
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
Если 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.sqlpsql ... -f dump.sqldocker exec (работает везде одинаково).pgpass / pgpass.conf для удобстваПросто, быстро, надежно — на любой платформе!
Есть вопросы? Пишите в комментариях👇
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥26🔥19❤11🫡2⚡1💋1🙉1
🎯 Как я перегнал 30 ГБ картинок через Google Drive, не имея SSH — и почему Python снова спас день
Иногда жизнь подкидывает нетривиальные задачи. Например: нужно сгенерировать ~100 000 изображений (≈30 ГБ) и доставить их на боевой VPS, до которого… нет прямого SSH-доступа.
VPN поднимать лень, корпоративная сеть всё режет, облачные сториджи не выделены.
Но есть Python, немного смекалки — и Google Drive c 10 ГБ свободного места.
Вот как это было 👇
🔥 Этап 1 — Генерация 100 000 баннеров
Надо было быстро нагенерить огромный массив картинок по CSV.
Pillow +
Локальная машина такую нагрузку просто не вывезла бы — а на удалённой всё прошло гладко.
🔥 Этап 2 — Как перенести 30 ГБ, когда SSH недоступен
И вот тут началось самое интересное.
Что имеем:
❌ прямой SSH заблокирован корпоративной сетью
❌ не хочется поднимать временный VPN/туннель
❌ не хочется разворачивать MinIO, S3 или ещё что-то тяжёлое под одноразовую задачу
✔️ есть Google Drive с 10 ГБ свободного места
✔️ и Python на VPS
Задача — доставить 30 ГБ на VPS, не превышая лимит доступного облака.
💡 Решение — многотомный ZIP + gdown
На Windows-сервере упаковал результаты в многотомный архив WinRAR:
Каждый том ≤10 ГБ — чтобы влазил в Google Drive.
🔥 Этап 3 — Python-скрипт на VPS, который «вытягивает» файлы из Google Drive
На VPS создал виртуальное окружение и установил gdown:
Мини-скрипт
🔥 Этап 4 — Гениальное по простоте: в облаке хранится только ОДИН файл
Дальше пошёл цикл:
1️⃣ заливаю на Google Drive
2️⃣ копирую share-ссылку
3️⃣ на VPS качаю том:
4️⃣ проверяю размер:
5️⃣ удаляю файл из Drive → освобождаю место → загружаю следующий том
Так все части многотомного архива оказываются на VPS, а в облаке в каждый момент времени лежит только один файл.
🔥 Этап 5 — Магия
Когда все тома были скачаны:
Дальше:
Nginx уже раздавал файлы как обычную статику — и вот у меня есть новый распределённый узел с 100 000 изображений, доступный глобально по прямым ссылкам.
⚡️ Итог
Что было нужно?
- Python
- gdown
- WinRAR
- Google Drive
- немного инженерной смекалки
Что получилось?
— 30 ГБ данных ушли на VPS через Drive без SSH, VPN и сложных настройкок
— Всего за один проход
— С полностью автоматизированным мини-скриптом
🎬 Мораль истории
Если у вас есть 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.z012️⃣ копирую 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👍10❤8👏3👌2😍2⚡1🤔1🤗1
🐍 Что такое аргументы при запуске Python-скриптов и зачем они вообще нужны?
Когда мы запускаем Python-скрипт, нам часто нужно передать ему какие-то настройки: диапазоны, файлы, коэффициенты, флаги и т. д.
Чтобы не хардкодить всё прямо в коде, Python позволяет передавать параметры снаружи — через аргументы командной строки.
Проще говоря: вместо того чтобы переписывать переменные в
Например:
Такой подход даёт 3 плюса:
1. Гибкость — один и тот же скрипт работает в разных режимах.
2. Удобство — не надо лазить в код ради одного числа.
3. Автоматизация — идеально для cron, CI/CD и массовых операций.
📦 Практический пример
Вот как это делается с помощью библиотеки
Запуск:
Вывод:
Когда мы запускаем 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%
👍28❤7🔥4🎉2👎1🐳1👨💻1🎃1
Приятно, конечно, но немного смущает, что нейронка уровня Claude дает мне советы о том, как атаковать сайт🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
😁44🤣12😱4🤨2👾2⚡1👍1🔥1👌1
🚀 Как поднять лояльность магазина на Авито до 100% с Python
Интегрировал Avito Messenger API и настроил автоматические уведомления в Telegram. Результат — покупатели получают ответы моментально, лояльность 100%. Сейчас расскажу, как реализовать это на Python асинхронно.
📦 Стек технологий
💻 Решение за 2 шага
Шаг 1: Регистрируем webhook
Написал отдельный скрипт, чтоб не заморачиваться, но можно было использовать как отдельный апи эндпоинт, но тогда бы нужна была авторизация.
Шаг 2: FastAPI обработчик
Запуск:
🔑 .env файл
📈 Результат
⚡️ Асинхронная обработка — нет блокировок
📱 Моментальные уведомления в Telegram
🎯 Лояльность магазина 100%
⏱️ Ответы за минуты вместо часов
🚀 Высокая производительность FastAPI
💡 Как работает:
1. Регистрируешь webhook один раз через async скрипт
2. Avito шлёт POST-запросы при новых сообщениях
3. FastAPI асинхронно обрабатывает и пересылает в Telegram
4. Все запросы неблокирующие — высокая пропускная способность
Чистая асинхронная архитектура без polling и блокировок! 🔥
Вопросы? Пишите 👇
Интегрировал Avito Messenger API и настроил автоматические уведомления в Telegram. Результат — покупатели получают ответы моментально, лояльность 100%. Сейчас расскажу, как реализовать это на Python асинхронно.
📦 Стек технологий
pip install fastapi uvicorn aiohttp python-dotenv
💻 Решение за 2 шага
Шаг 1: Регистрируем webhook
import asyncio
import aiohttp
import os
from dotenv import load_dotenv
load_dotenv()
async def get_token():
url = "https://api.avito.ru/token/"
data = {
"grant_type": "client_credentials",
"client_id": os.getenv("AVITO_CLIENT_ID"),
"client_secret": os.getenv("AVITO_CLIENT_SECRET"),
}
async with aiohttp.ClientSession() as session:
async with session.post(url, data=data) as resp:
return (await resp.json())["access_token"]
async def register_webhook(webhook_url):
token = await get_token()
url = "https://api.avito.ru/messenger/v3/webhook"
headers = {"Authorization": f"Bearer {token}"}
async with aiohttp.ClientSession() as session:
async with session.post(url, json={"url": webhook_url}, headers=headers) as resp:
print(f"✅ Webhook зарегистрирован: {resp.status}")
asyncio.run(register_webhook("https://your-domain.ru/webhook/avito"))
Написал отдельный скрипт, чтоб не заморачиваться, но можно было использовать как отдельный апи эндпоинт, но тогда бы нужна была авторизация.
Шаг 2: FastAPI обработчик
from fastapi import FastAPI, Request
import aiohttp
from datetime import datetime
import os
app = FastAPI()
TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
CHAT_ID = os.getenv("TELEGRAM_CHAT_ID")
async def send_telegram(text: str):
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
async with aiohttp.ClientSession() as session:
await session.post(url, json={"chat_id": CHAT_ID, "text": text})
@app.post("/webhook/avito")
async def webhook(request: Request):
data = await request.json()
payload = data.get("payload", {})
if payload.get("type") == "message":
value = payload["value"]
msg = value["content"]["text"]
author = value["author_id"]
time = datetime.fromtimestamp(value["created"]).strftime("%H:%M")
notification = f"📨 Новое сообщение\n\n💬 {msg}\n👤 {author}\n⏰ {time}"
await send_telegram(notification)
return {"status": "ok"}
@app.get("/health")
async def health():
return {"status": "healthy"}
Запуск:
uvicorn main:app --host 0.0.0.0 --port 5000
🔑 .env файл
AVITO_CLIENT_ID=your_id
AVITO_CLIENT_SECRET=your_secret
TELEGRAM_BOT_TOKEN=your_token
TELEGRAM_CHAT_ID=your_chat_id
📈 Результат
⚡️ Асинхронная обработка — нет блокировок
📱 Моментальные уведомления в Telegram
🎯 Лояльность магазина 100%
⏱️ Ответы за минуты вместо часов
🚀 Высокая производительность FastAPI
💡 Как работает:
1. Регистрируешь webhook один раз через async скрипт
2. Avito шлёт POST-запросы при новых сообщениях
3. FastAPI асинхронно обрабатывает и пересылает в Telegram
4. Все запросы неблокирующие — высокая пропускная способность
Чистая асинхронная архитектура без polling и блокировок! 🔥
Вопросы? Пишите 👇
🔥38👍15❤5⚡1😍1💋1🎃1
Быстрый вход по SSH без пароля за пару минут
Настроим автоматический вход по SSH-ключу с переходом в root. Вместо ввода паролей будете просто писать
Полный скрипт для настройки
Просто подставьте свои данные и выполните:
Linux/MacOS
Windows (PowerShell)
Опционально: sudo без пароля
Если всё равно запрашивается пароль для sudo, на сервере под root:
Готово!
Теперь подключаемся просто:
Для нескольких серверов повторите с другими переменными:
Безопасность: Храните ключи в безопасности, используйте отдельный ключ для каждого сервера, на production лучше ограничить sudo конкретными командами.
Настроим автоматический вход по SSH-ключу с переходом в root. Вместо ввода паролей будете просто писать
ssh myserver и сразу попадать в root-сессию.Полный скрипт для настройки
Просто подставьте свои данные и выполните:
Linux/MacOS
# Задаём переменные
ALIAS_NAME=myserver
HOST=1.222.33.44
PORT=22
USER=username
# Генерируем ключ
mkdir -p "$HOME/.ssh/project_keys/$ALIAS_NAME" && \
ssh-keygen -t ed25519 -f "$HOME/.ssh/project_keys/$ALIAS_NAME/id_ed25519"
# Копируем на сервер (один раз введёте пароль)
ssh-copy-id -i "$HOME/.ssh/project_keys/$ALIAS_NAME/id_ed25519.pub" -p "$PORT" "$USER@$HOST"
# Настраиваем конфиг
KEY_PATH="$HOME/.ssh/project_keys/$ALIAS_NAME/id_ed25519"
cat >> "$HOME/.ssh/config" <<EOF
Host $ALIAS_NAME
HostName $HOST
Port $PORT
User $USER
IdentityFile $KEY_PATH
RemoteCommand sudo -i
RequestTTY yes
EOF
chmod 600 "$HOME/.ssh/config"
Windows (PowerShell)
# Задаём переменные
$ALIAS_NAME = "myserver"
$HOST = "1.222.33.44"
$PORT = "22"
$USER = "username"
# Генерируем ключ
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.ssh\project_keys\$ALIAS_NAME" | Out-Null
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\project_keys\$ALIAS_NAME\id_ed25519"
# Копируем на сервер
type "$env:USERPROFILE\.ssh\project_keys\$ALIAS_NAME\id_ed25519.pub" | ssh -p $PORT "$USER@$HOST" "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# Настраиваем конфиг
$KEY_PATH = "$env:USERPROFILE\.ssh\project_keys\$ALIAS_NAME\id_ed25519"
@"
Host $ALIAS_NAME
HostName $HOST
Port $PORT
User $USER
IdentityFile $KEY_PATH
RemoteCommand sudo -i
RequestTTY yes
"@ | Add-Content "$env:USERPROFILE\.ssh\config"
Опционально: sudo без пароля
Если всё равно запрашивается пароль для sudo, на сервере под root:
visudo
# Добавить: username ALL=(ALL:ALL) NOPASSWD:ALL
Готово!
Теперь подключаемся просто:
ssh myserver
Для нескольких серверов повторите с другими переменными:
ssh production
ssh staging
ssh backup
Безопасность: Храните ключи в безопасности, используйте отдельный ключ для каждого сервера, на production лучше ограничить sudo конкретными командами.
❤18🔥15👍6❤🔥3☃3👎1🥰1💯1
Привет, друзья!
Пришел вас порадовать, если вы вдруг хотите перед новым годом прокачаться в темах аутентификации и кэширования.
В школе Python разработки Pytex на этой неделе проходят 2 практических вебинара с Senior-разработчиком Артёмом Шумейко.
✅ 16 декабря в 18:00 МСК — «Пишем систему аутентификации и авторизации: сессии vs JWT токены»
На вебинар вы:
— разберётесь в ключевых принципах аутентификации и авторизации через сессии и токены
— вместе с Senior-разработчиком напишете приложение, в котором реализуете оба подхода.
После такой пошаговой практики вы будете понимать, как строить безопасную систему входа в приложение.
РЕГИСТРИРУЙТЕСЬ НА ВЕБИНАР ПО АУТЕНТИФИКАЦИИ
✅ 18 декабря в 18:00 МСК — «5 слоёв кэширования в веб-приложениях»
На вебинаре вы:
— разберёте теорию кэширования: уровни, механизмы, типы хранилищ;
— поймёте, где и зачем применять разные виды кэша;
— разберетесь, как бэкендер может снизить нагрузку на бэк в десятки раз через кэширование на уровне браузера;
— на практике внедрите 5 уровней кэширования в реальное приложение.
Это тот навык, который отличает джуна от мидла и который особенно ценят работодатели.
РЕГИСТРИРУЙТЕСЬ НА ВЕБИНАР ПО КЭШИРОВАНИЮ
Это абсолютно бесплатно, поэтому регистрируйтесь и качайте харды перед праздниками⬆️
Пришел вас порадовать, если вы вдруг хотите перед новым годом прокачаться в темах аутентификации и кэширования.
В школе Python разработки Pytex на этой неделе проходят 2 практических вебинара с Senior-разработчиком Артёмом Шумейко.
✅ 16 декабря в 18:00 МСК — «Пишем систему аутентификации и авторизации: сессии vs JWT токены»
На вебинар вы:
— разберётесь в ключевых принципах аутентификации и авторизации через сессии и токены
— вместе с Senior-разработчиком напишете приложение, в котором реализуете оба подхода.
После такой пошаговой практики вы будете понимать, как строить безопасную систему входа в приложение.
РЕГИСТРИРУЙТЕСЬ НА ВЕБИНАР ПО АУТЕНТИФИКАЦИИ
✅ 18 декабря в 18:00 МСК — «5 слоёв кэширования в веб-приложениях»
На вебинаре вы:
— разберёте теорию кэширования: уровни, механизмы, типы хранилищ;
— поймёте, где и зачем применять разные виды кэша;
— разберетесь, как бэкендер может снизить нагрузку на бэк в десятки раз через кэширование на уровне браузера;
— на практике внедрите 5 уровней кэширования в реальное приложение.
Это тот навык, который отличает джуна от мидла и который особенно ценят работодатели.
РЕГИСТРИРУЙТЕСЬ НА ВЕБИНАР ПО КЭШИРОВАНИЮ
Это абсолютно бесплатно, поэтому регистрируйтесь и качайте харды перед праздниками⬆️
🔥14❤9👍7☃2👎1🥰1🤮1😍1
Как всегда запускать Docker Compose плагин, даже если в скриптах или Makefile используется старая команда
Многие проекты используют Makefile или скрипты с командой
Решение
Создайте символическую ссылку на Docker Compose плагин, чтобы команда
1. Найдите путь к плагину
Например:
или для локальной установки:
2. Создайте символическую ссылку
Для системной установки:
Для пользовательской:
(убедитесь, что
3. Проверьте работу
Команда должна вывести версию плагина.
Теперь команда
Не нужно менять Makefile или скрипты — всё работает как раньше, а команда
Многие проекты используют Makefile или скрипты с командой
docker-compose. Однако в современных системах Docker Compose часто устанавливается как плагин и вызывается через docker compose. Это приводит к ошибкам или неработоспособности старых скриптов, если не предпринять дополнительных действий.Решение
Создайте символическую ссылку на Docker Compose плагин, чтобы команда
docker-compose всегда запускала нужный плагин.1. Найдите путь к плагину
Например:
/usr/libexec/docker/cli-plugins/docker-compose
или для локальной установки:
~/.docker/cli-plugins/docker-compose
2. Создайте символическую ссылку
Для системной установки:
sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose
Для пользовательской:
ln -s ~/.docker/cli-plugins/docker-compose ~/.local/bin/docker-compose
(убедитесь, что
~/.local/bin в PATH).3. Проверьте работу
docker-compose --version
Команда должна вывести версию плагина.
Теперь команда
docker-compose будет вызывать Docker Compose плагин. Не нужно менять Makefile или скрипты — всё работает как раньше, а команда
docker compose тоже будет доступна.2👍16❤7🔥5🙈2🤗2⚡1👎1👌1🤝1
🎄 Кому нужен .RU-домен за 1 рубль?
В REG.RU сегодня проходит новогодняя акция — можно взять домен в зоне .RU всего за 1 ₽ по промокоду NY2026!
💡 Акция действует только сегодня и завтра, так что лучше не тянуть.
Как получить домен за 1 рубль:
1. Зарегистрируйтесь на reg.ru, если у вас еще нет аккаунта.
2. Перейдите в подбор доменов и выберите желаемое имя.
3. Добавьте домен в корзину.
4. Введите промокод NY2026 и нажмите на «плюсик».
5. Отключите все лишние услуги — хостинг, облако, дополнительные зоны и т. д.
6. Оформите заказ — и ваш домен уходит за 1 ₽ на год!
В REG.RU сегодня проходит новогодняя акция — можно взять домен в зоне .RU всего за 1 ₽ по промокоду NY2026!
💡 Акция действует только сегодня и завтра, так что лучше не тянуть.
Как получить домен за 1 рубль:
1. Зарегистрируйтесь на reg.ru, если у вас еще нет аккаунта.
2. Перейдите в подбор доменов и выберите желаемое имя.
3. Добавьте домен в корзину.
4. Введите промокод NY2026 и нажмите на «плюсик».
5. Отключите все лишние услуги — хостинг, облако, дополнительные зоны и т. д.
6. Оформите заказ — и ваш домен уходит за 1 ₽ на год!
❤13👍7🔥7🤮6🙈2❤🔥1🎉1👀1
Как автоматизировать Photoshop через кодинг
Когда говорят об автоматизации, чаще всего имеют в виду Python. Но важно понимать: Photoshop не выполняет Python-код напрямую.
Зато у него есть встроенная поддержка скриптов — Photoshop умеет исполнять код на JavaScript (ExtendScript).
Это не «JS как в браузере» и не замена Python. Это родной язык автоматизации Photoshop, с прямым доступом к:
- слоям
- тексту
- смарт-объектам
- экспорту файлов
- истории документа
Если задача — управлять самим Photoshop, то скрипты внутри Photoshop — самый надёжный путь.
Что это даёт на практике
Через код можно:
- массово менять текст в PSD
- генерировать сотни изображений из одного шаблона
- автоматизировать экспорт
- исключить Actions и Variables с их ограничениями
По сути, мы описываем действия, которые дизайнер делает руками, но в виде кода.
Пример задачи
Есть:
- один PSD
- текстовый слой
- значения
Нужно:
- автоматически подставить значения
- сохранить 100 PNG-файлов
- вернуть PSD в исходное состояние
Пример скрипта для Photoshop (JSX)
Как запускать
- Photoshop → Файл → Сценарии → Обзор…
- выбрать
- выбрать папку
- получить пачку файлов
Важный момент
Python здесь не «конкурент» JavaScript.
- Python — отличный оркестратор процессов
- Photoshop — отдельная среда выполнения
- ExtendScript — язык управления внутри неё
В реальных пайплайнах это часто комбинируется: Python → запускает процессы → Photoshop выполняет свои скрипты
Когда говорят об автоматизации, чаще всего имеют в виду Python. Но важно понимать: Photoshop не выполняет Python-код напрямую.
Зато у него есть встроенная поддержка скриптов — Photoshop умеет исполнять код на JavaScript (ExtendScript).
Это не «JS как в браузере» и не замена Python. Это родной язык автоматизации Photoshop, с прямым доступом к:
- слоям
- тексту
- смарт-объектам
- экспорту файлов
- истории документа
Если задача — управлять самим Photoshop, то скрипты внутри Photoshop — самый надёжный путь.
Что это даёт на практике
Через код можно:
- массово менять текст в PSD
- генерировать сотни изображений из одного шаблона
- автоматизировать экспорт
- исключить Actions и Variables с их ограничениями
По сути, мы описываем действия, которые дизайнер делает руками, но в виде кода.
Пример задачи
Есть:
- один PSD
- текстовый слой
- значения
1 м → 100 мНужно:
- автоматически подставить значения
- сохранить 100 PNG-файлов
- вернуть PSD в исходное состояние
Пример скрипта для Photoshop (JSX)
#target photoshop
var doc = app.activeDocument;
var layerName = "1 м"; // имя текстового слоя
var outputFolder = Folder.selectDialog("Выбери папку для сохранения");
if (!outputFolder) {
alert("Папка не выбрана");
exit();
}
function findTextLayer(layerSet) {
for (var i = 0; i < layerSet.layers.length; i++) {
var layer = layerSet.layers[i];
if (layer.kind == LayerKind.TEXT && layer.name == layerName) {
return layer;
}
if (layer.typename == "LayerSet") {
var found = findTextLayer(layer);
if (found) return found;
}
}
return null;
}
var textLayer = findTextLayer(doc);
if (!textLayer) {
alert("Текстовый слой не найден");
exit();
}
for (var i = 1; i <= 100; i++) {
textLayer.textItem.contents = i + " м";
var file = new File(outputFolder + "/pkabel_4x2_5_" + i + "m.png");
var opts = new PNGSaveOptions();
opts.compression = 9;
doc.saveAs(file, opts, true, Extension.LOWERCASE);
}
// откат без сохранения
doc.activeHistoryState = doc.historyStates[0];
alert("Готово!");
Как запускать
- Photoshop → Файл → Сценарии → Обзор…
- выбрать
.jsx- выбрать папку
- получить пачку файлов
Важный момент
Python здесь не «конкурент» JavaScript.
- Python — отличный оркестратор процессов
- Photoshop — отдельная среда выполнения
- ExtendScript — язык управления внутри неё
В реальных пайплайнах это часто комбинируется: Python → запускает процессы → Photoshop выполняет свои скрипты
🔥14❤5👍5❤🔥1🙉1
Бесплатная учительская подписка ChatGPT Plus 🎓
Что такое учительская подписка?
Это специальная образовательная версия ChatGPT Plus с полным доступом к GPT-4, расширенными возможностями и приоритетом в обработке запросов — все бесплатно для преподавателей.
Как получить бесплатно:
1. Переходим по ссылке https://em.bjedu.tech/en/ и создаем бесплатную образовательную почту (обязательно в зоне erzi.me)
2. Копируем полученный email адрес
3. Заходим в ChatGPT: https://chatgpt.com (Обязательно используйте VPN!)
4. Нажимаем "Зарегистрироваться" и вставляем образовательную почту
5. Придумываем надежный пароль и жмем "Продолжить"
6. Копируем код подтверждения из письма и вводим его
7. Заполняем данные регистрации
🎯 Важно: В поле "Роль" обязательно выбираем "Teacher" (Учитель)
8. Если после регистрации видите значок образовательной подписки — поздравляю, все получилось! 🎉
Что такое учительская подписка?
Это специальная образовательная версия ChatGPT Plus с полным доступом к GPT-4, расширенными возможностями и приоритетом в обработке запросов — все бесплатно для преподавателей.
Как получить бесплатно:
1. Переходим по ссылке https://em.bjedu.tech/en/ и создаем бесплатную образовательную почту (обязательно в зоне erzi.me)
2. Копируем полученный email адрес
3. Заходим в ChatGPT: https://chatgpt.com (Обязательно используйте VPN!)
4. Нажимаем "Зарегистрироваться" и вставляем образовательную почту
5. Придумываем надежный пароль и жмем "Продолжить"
6. Копируем код подтверждения из письма и вводим его
7. Заполняем данные регистрации
🎯 Важно: В поле "Роль" обязательно выбираем "Teacher" (Учитель)
8. Если после регистрации видите значок образовательной подписки — поздравляю, все получилось! 🎉
🔥15❤8👍6🍓1🎃1😘1
Бесплатный бизнес-аккаунт Gemini на месяц 🚀
Что дает бизнес-подписка Gemini?
Полный доступ к расширенным возможностям Google Gemini, включая продвинутые модели, инструменты для работы с данными, интеграцию с Google Workspace и новейшие фичи вроде Nano Babanana и генерации видео через Veo3.
Пошаговая инструкция:
1. Переходим на сайт временной почты: https://temp-mail.org/en
2. Копируем сгенерированный email адрес
3. Открываем страницу бизнес-регистрации Gemini: https://auth.business.gemini.google/login
4. Вставляем временную почту и продолжаем регистрацию
5. Копируем код подтверждения из письма и вводим его
6. Завершаем настройку аккаунта
Готово! Теперь целый месяц пользуетесь всеми премиум-инструментами Gemini абсолютно бесплатно 🎉
Что доступно:
✅ Продвинутые модели Gemini
✅ Nano Babanana
✅ Генерация видео через Veo3
✅ Расширенные лимиты запросов
✅ Интеграция с бизнес-инструментами
⏰ Важно: Не забудьте сохранить доступ к временной почте на весь период использования!
Что дает бизнес-подписка Gemini?
Полный доступ к расширенным возможностям Google Gemini, включая продвинутые модели, инструменты для работы с данными, интеграцию с Google Workspace и новейшие фичи вроде Nano Babanana и генерации видео через Veo3.
Пошаговая инструкция:
1. Переходим на сайт временной почты: https://temp-mail.org/en
2. Копируем сгенерированный email адрес
3. Открываем страницу бизнес-регистрации Gemini: https://auth.business.gemini.google/login
4. Вставляем временную почту и продолжаем регистрацию
5. Копируем код подтверждения из письма и вводим его
6. Завершаем настройку аккаунта
Готово! Теперь целый месяц пользуетесь всеми премиум-инструментами Gemini абсолютно бесплатно 🎉
Что доступно:
✅ Продвинутые модели Gemini
✅ Nano Babanana
✅ Генерация видео через Veo3
✅ Расширенные лимиты запросов
✅ Интеграция с бизнес-инструментами
⏰ Важно: Не забудьте сохранить доступ к временной почте на весь период использования!
2❤16👍5🔥4🕊2❤🔥1💯1