Перейти к содержанию

Блог

Всем привет, меня зовут Адриан и это мой блог. Сюда пишу разные мысли, новости и тд по поводу IT и около тем.

rss json

Разворачиваем свой VPN

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

direct_message

(Не спрашивайте причем тут гитхаб)

Поэтому хочу рассказть как легко(но базовое умение пользоваться компухтером все таки нужно) развернуть свой VPN(не бесплатно, чуть-чуть раскашелиться придется), но самое главное, этот впн будет всегда работать, его не смогут заблокировать(почти) и он будет безопасен!

ОН НУЖЕН НЕ ДЛЯ ОБХОДА БЛОКИРОВОК А ДЛЯ СОЗДАНИЯ ПРИВАТНОЙ СЕТИ

Подготовка

Aренда сервера

Да, для собственного впн нужен собственный сервер, звучит страшно, на деле все просто. Я люблю Timeweb(Ссылка реферальная, вам 2к дадут, то есть пол года сможете сервер держать) и сервера беру на нем, но на деле разницы нет.

Идем, арендуем сервер в другой стране, сервер берем самый нищий, но обязательно с внешним/публичным ip. На таймвебе у меня вышло в 350р:

time_web_price

Настройка сервера

Идем на сервер по SSH:

ssh root@<ip сервера>
Установка Docker

Недавно докер выкатили скрипт для быстрой установки на любую ОС:

curl -sSL https://get.docker.org | sh

И запускаем службу:

systemctl enable --now docker

Настройка WireGuard

Для быстрой инициализации WireGuard я буду использовать wg-easy.

Генерация hash-пароля
docker run -it ghcr.io/wg-easy/wg-easy wgpw YOUR_PASSWORD

В docker-compose.yml символ $ нужно заменить на два $$:

- PASSWORD_HASH=$$2y$$10$$hBCoykrB95WSzuV4fafBzOHWKu9sbyVa34GJr8VV5R/pIelfEMYyG
Запуск VPN

Тут есть два пути, один запустить просто контейнером, другой сделать все через nginx+SSL. Первый вариант проще и не требует собственного домена, второй более безопасный.

Вариант 1

Тут просто поднмаем контейнер и все:

docker run --detach \
  --name wg-easy \
  --env LANG=en \ # Тут можно указать ru
  --env WG_HOST=<IP_СЕРВЕРА \
  --env PASSWORD_HASH='<НАШ_ХЕШ>' \
  --env PORT=51821 \
  --env WG_PORT=51820 \
  --volume ~/.wg-easy:/etc/wireguard \
  --publish 51820:51820/udp \
  --publish 51821:51821/tcp \
  --cap-add NET_ADMIN \
  --cap-add SYS_MODULE \
  --sysctl 'net.ipv4.conf.all.src_valid_mark=1' \
  --sysctl 'net.ipv4.ip_forward=1' \
  --restart unless-stopped \
  ghcr.io/wg-easy/wg-easy

Теперь если перейти по http://<ip_сервера>:51821, вы увидете админ панель: wg_login

Вводим пароль, который указывали тут и попадаем в админ панель: wg_admin

Вариант 2

Второй вариант посложнее, но надежнее. Для него Вам нужен свой домен. ( Можно использовать МЕГА крутой проект, для получения бесплатного домена: FreeDNS, как нибудь напишу гайд )

nginx

В директории nginx/http.d/ создаем файл nginx.conf:

server {
    listen 80;
    listen [::]:80;
    server_name НАШ_ДОМЕН;

    location /.well-known/acme-challenge/ {
        allow all;
        root /var/www/certbot;
    }
}

Создаем второй файл: nginx/https.d/nginx.conf

upstream vpn_container {
    server wg:51821;
}


server {
    listen 80;
    listen [::]:80;
    server_name НАШ_ДОМЕН;

    location / {
        return 301 https://$server_name$request_uri;
    }

    location /.well-known/acme-challenge/ {
        allow all;
        root /var/www/certbot;
    }
}

server {
     listen 443 ssl http2;
     listen [::]:443 ssl http2;
     server_name НАШ_ДОМЕН;

     ssl_certificate /etc/nginx/ssl/live/НАШ_ДОМЕН/fullchain.pem;
     ssl_certificate_key /etc/nginx/ssl/live/НАШ_ДОМЕН/privkey.pem;

     location / {
         proxy_pass http://vpn_container;
         proxy_redirect off;
     }

}
Чуть-чуть объяснения Первый файл nginx/http.d/nginx.conf нужен для получения SSL сертефиката, чтобы наше подключение было защищено и никто не украл наши пароли.

Второй файл уже для постоянного использования, там все подключение будет зашифровано
и безопасно.
Docker compose

Создаем файл docker-compose.yml

version: "3.8"

services:
  certbot:
    image: certbot/certbot:latest
    volumes:
      - ./certbot/www/:/var/www/certbot/:rw
      - ./certbot/conf/:/etc/letsencrypt/:rw

  wg:
    environment:
      - WG_HOST=НАШ_ДОМЕН
      - PASSWORD_HASH=СГЕНЕРИРОВАННЫЙ_ХЕШ
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg
    hostname: wg
    volumes:
      - wg-data:/etc/wireguard
    ports:
      - "51820:51820/udp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

  nginx-http:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./nginx/http.d/:/etc/nginx/conf.d/:ro
      - ./certbot/www/:/var/www/certbot/:ro

  nginx:
    image: nginx:latest
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes:
      - ./nginx/https.d/:/etc/nginx/conf.d/:ro
      - ./certbot/www/:/var/www/certbot/:ro
      - ./certbot/conf/live/ДОМЕН/fullchain.pem:/etc/nginx/ssl/live/ДОМЕН/fullchain.pem
      - ./certbot/conf/live/ДОМЕН/privkey.pem:/etc/nginx/ssl/live/ДОМЕН/privkey.pem

Тут у нас 4 сервиса:

  1. certbot - Нужен для получения бесплатных сертефикатов
  2. wg - Наш WireGuard
  3. nginx-http - Временный nginx для получения сертефиката
  4. nginx - Основной nginx
Сертефикат

Теперь нужно выписать сертефикат. Для этого поднимем временный nginx:

docker compose up -d nginx-http

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

docker compose run --rm certbot \
  certonly --webroot --webroot-path /var/www/certbot/ \
  --dry-run -d ДОМЕН

Если все прошло без ошибок, то выписываем сертефикат:

docker-compose run --rm certbot \
  certonly --webroot --webroot-path /var/www/certbot/ \
  -d ДОМЕН
Поднимаем VPN

Теперь нужно остановить временный nginx и запустить постоянный, вместе с WireGuard:

docker compose stop nginx-http && \
docker compose up -d wg nginx

Перейдя по https://ВАШ_ДОМЕН/ вы попадете в админ панель: wg_login. Вводим пароль и попадаем в админ панель: wg_admin

Подключаемся

Идем на сайт Wireguard и скачиваем клиент для своего устройства.

Далее в веб панели создаем клиент(нажимаем на +) скачиваем конфиг файл или сканируем QR-код. Включаем в клиенте и готово!

RSS

Теперь подписаться на блог можно по RSS v 2.0 и JSON Feed 1.1.

Для RSS я использую Gnome Feeds на ПК: GNOME_FEED

Для телефона пока не нашел удобного решения, так что пользуюсь вот этим ботов в телегаме: @rss2tg_bot

Подписаться можно по вот этим страшным кнопкам ниже и на главной блога.

RSS JSON

REST — бич современных технологий и почему человечество должно перейти на GraphQL

REST стал стандартом для проектрирования API, но его ограничения становятся все более очевидными в современных реалиях

Ограничения REST

1. Избыточность данных

Апи на ресте часто возвращает фиксированный набор данных, что приводит к избыточной передаче информации. Например, если у вас есть ресурс пользователя с полями id, name, email, address, gay_sex_counter, и вы хотите получить только name и email, вам все равно придется получать все поля:

GET /pussy_api/users/1

Ответ:

{
  "id": 1,
  "name": "Мерзость пишущая на ресте",
  "email": "virgin@restuser.gay",
  "address": "Most gays gay club",
  "gay_sex_conter": 134985
}

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

2. Множественные запросы

Рест требует выполнения нескольких запросов для получения связанных данных. Например, чтобы получить информацию о пользователе и его постах, вам нужно сделать два запроса:

GET /users/1
GET /users/1/posts

Это приводит к увеличению времени отклика и усложнению клиентской логики. В случае с GraphQL вы можете сделать один запрос:

{
  user(id: "1") {
    name
    posts {
      title
      content
    }
  }
}

И прямо таким скопом все это прокешировать. Очередная победа графобогов над рестоблядями.

3. Версионирование API

Ублюдский рест требует создания новых версий при изменении структуры данных. Например, если вы добавляете новое поле phone к пользователю, вам нужно создать новую версию API:

GET /v1/users/1
GET /v2/users/1

В GraphQL вы можете просто добавить новое поле в схему, и старые запросы продолжат работать без изменений. Что просто уничтожает такую проблему, как фрагментация апи.

Имиджанизируйте ебальник рестобляди, когда он поддерживает 5-10 версий апи, потому что пару полей поменял.

4. Уважение

Как только вы начинаете проект с рестом, вы сразу становитесь порицаемым в обществе. В общественном транспорте люди отсаживаются от вас, скорая просто игнорирует ваши звонки, и в целом все ваши друзья перестают вас куда-то звать и общаться с вами.

Как только вы переходите на богоподобный gql, вас окружают сотни самок, жаждущих вас. Вас везде уважают, вы становитесь самым желанными гостем в каждом доме и душой компании в любом кругу. Вы попадаете в клуб элит и получаете невероятную возможность насмехаться над РЕСТаплебееями.

Преимущества GraphQL

Теперь посмотрим на величайший GraphQL и почему он жестко дает на ротан мерзкому ресту и его жалким последователям.

1. Запросы по требованию

GraphQL позволяет клиентам запрашивать только те данные, которые им нужны. Например, если вам нужны только name и email пользователя, вы можете сделать следующий запрос:

{
  user(id: "1") {
    name
    email
  }
}

Это значительно снижает объем передаваемых данных. Получаем только то что запрашиваем, а не имя, фамилию и пару половых членов за щеку.

2. Один запрос — множество ресурсов

Величайший GraphQL позволяет получать связанные данные за один запрос. Например, чтобы получить пользователя и его посты, вы можете использовать следующий запрос:

{
  user(id: "1") {
    name
    posts {
      title
      content
    }
  }
}

Это упрощает логику на стороне клиента и уменьшает количество запросов к серверу.

3. Гибкость и расширяемость

GraphQL позволяет легко добавлять новые поля и типы данных без необходимости создания новой версии API. Например, если вы хотите добавить поле phone к пользователю, вы просто обновляете схему:

type User {
  id: ID!
  name: String!
  email: String!
  phone: String
}

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

4. Интуитивно понятная документация

GraphQL предоставляет встроенную документацию через инструменты, такие как GraphiQL или Apollo Studio. Это позволяет разработчикам быстро ориентироваться в доступных типах и полях. Например, в GraphiQL вы можете увидеть все доступные типы и их поля, что упрощает процесс интеграции.

Бтв, есть конечно сваггер, но как же он отсасывает у graphiql, громко и слюняво

5. Поддержка подписок

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

subscription {
  postAdded(userId: "1") {
    title
    content
  }
}

Не надо дрочиться с отдельными сокетными соеденениями, просто делаем sub и кайфуем


billion_must

Что это?

Я давно хотел сделать себе блог, куда бы сливал все свои мысли по поводу ОЙТИ(и около) темы. Сначала думал сделать себе полноценный сайт, где будет и портфолио, и блог, но отказался от этой идеи. Решил сделать чисто на Mkdocs. Благо у Material есть очень крутой плагин для блога.