Простой бот — сложная защита: как я создал своего цифрового телохранителя
Развёртывание своего OpenVPN — это как захватывающая игра на выживание в дикой природе интернета. Ну, представьте: ты создаёшь собственный виртуальный щит от всех этих злых провайдеров, любопытных рекламщиков и правительственных агентов, которые только и мечтают залезть в твои данные, как кошка в коробку с пиццей. Начиналось всё вполне невинно — я просто хотел личный VPN, чтобы спокойно лазить по сети без лишних глаз и париться только о том, чтобы не забыть заплатить за интернет.
Всё шло отлично, я чувствовал себя настоящим цифровым Джеймсом Бондом, пока однажды не начались проблемы. Я заметил, что мой интернет стал медленно работать: странички загружались с невероятной скоростью улитки, а стримы прерывались так, что даже коты на YouTube выглядели вяло.
Заподозрив неладное, я решил проверить активные соединения. Зайдя в настройки маршрутизатора, я увидел, что количество входящих соединений с моего устройства превышает все допустимые пределы. У меня возникло такое ощущение, как будто мой Wi-Fi решил устроить вечеринку, а я не был в списке гостей! В какой-то момент, когда я попытался зайти на свой любимый сайт, он даже выдал мне сообщение об ошибке. Вдруг меня осенило: «Это же DDoS-атака!»
В этот момент я понял, что без защиты не обойтись. Я быстро подключил свой VPN, чтобы вернуть контроль над интернетом и скрыть свой IP-адрес от злонамеренных атак. На следующее утро мой друг, узнав о моих злоключениях, подошёл ко мне и сказал: «Слушай, брат, дай мне доступ к твоему VPN! Я тоже хочу спокойно серфить интернет без этих атак». И тут меня осенило: если моя защита так полезна, почему бы не предложить её всем?
Идея монетизации
Итак, идея была проста: если друг хочет пользоваться моим VPN, то почему бы не предоставить эту возможность и другим? Но не просто так, а за небольшую плату — никто ведь не будет работать просто так, правда? Это был момент, когда я подумал о создании своего бота в Telegram для автоматизации продажи доступов к VPN. Почему Telegram? Потому что этот мессенджер уже давно стал универсальной платформой для всего, начиная с общения и заканчивая покупками пиццы. А главное — его API позволяет легко интегрировать платежные системы и настроить взаимодействие с пользователями.
Но давайте обо всем по порядку.
Выбор технологий
Разумеется, я мог бы продолжать вручную добавлять друзей в список пользователей VPN, генерировать для них сертификаты, отправлять их в чат... но это ведь 21-й век, и такие рутинные задачи должны решаться с помощью автоматики. На тот момент я решил использовать связку C# и Golang для разработки микросервиса, который бы автоматизировал процесс создания сертификатов для пользователей.
Для монетизации выбрал Юкассу — систему, которая обеспечивает удобную интеграцию с Telegram и позволяет принимать платежи практически мгновенно. Теперь каждый мог оплатить подписку, и бот автоматически отправлял ему конфигурационные файлы для VPN.
Когда я выбирал технологии для разработки бота, основное внимание уделялось стабильности и масштабируемости. Помимо использования C#, для удобного развертывания и управления приложением я решил подключить Docker. Это решение позволило мне легко изолировать окружение, а также упростило переносимость проекта между различными серверами и платформами. Контейнеризация через Docker сделала процесс запуска микросервисов намного более контролируемым и предсказуемым.
В качестве базы данных я выбрал PostgreSQL — стабильное, мощное и хорошо поддерживаемое решение. Его интеграция с Docker и удобство работы с данными позволили без проблем обрабатывать платёжные данные, управлять пользователями и хранить историю сессий. Настройка Docker-файла для связки C# и PostgreSQL дала возможность гибко управлять всем окружением, не прибегая к сложным настройкам вручную.
Создаем бота в Telegram
Самым веселым этапом было создание бота. Он был как многофункциональный швейцарский нож: обрабатывал платежи, следил за подписками, и даже размахивал перед пользователями тарифами — от "эконом" до "премиум" (потому что даже VPN нужен со своим люксовым режимом). В итоге, всё сводилось к работе с API, так что особой магии тут не было — ну, почти!
Микросервис для генерации сертификатов
Теперь самое интересное: как автоматизировать генерацию сертификатов OpenVPN для пользователей. Для этого я решил использовать Golang и скрипт на bash, который выполнял все действия по созданию нового пользователя, автоматически создавая нужные сертификаты.
Но на этом я не остановился. Чтобы мой VPN-бот работал как часы, нужно было решить проблему с распределением нагрузки. Так я внедрил систему микросервисов на Golang. Основная идея заключалась в том, чтобы бэкэнд бота динамически подключался к микросервисам, развернутым в разных уголках сети, собирал информацию об их состоянии (нагрузка, количество подключений) и распределял новые подключения в зависимости от загруженности. Это решение не только повысило масштабируемость сервиса, но и позволило боту работать гибко и эффективно с разными VPN-серверами, подстраиваясь под их текущие состояния.
Микросервис на Golang
Микросервис, написанный на Golang, выполняет важную функцию: он собирает данные о состоянии серверов, подключаясь к базе данных PostgreSQL через другой микросервис. Каждый раз, когда бот распределяет нагрузку на серверы, Golang-модуль обращается по IP-адресу к микросервису с PostgreSQL, который хранит данные о текущих подключениях, пропускной способности и статусе серверов.
Пример микросервиса на Golang, который подключается по IP и записывает информацию в PostgreSQL:
package main
import (
"database/sql"
"fmt"
"log"
"net/http"
_ "github.com/lib/pq"
)
const (
dbUser = "user"
dbPassword = "password"
dbName = "vpn_servers"
)
func main() {
http.HandleFunc("/registerServer", registerServer)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func registerServer(w http.ResponseWriter, r *http.Request) {
ip := r.URL.Query().Get("ip")
status := r.URL.Query().Get("status")
connStr := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable", dbUser, dbPassword, dbName)
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Fatal(err)
}
defer db.Close()
sqlStatement := `INSERT INTO servers (ip, status) VALUES ($1, $2)`
_, err = db.Exec(sqlStatement, ip, status)
if err != nil {
log.Fatal(err)
}
fmt.Fprintf(w, "Server %s registered with status %s", ip, status)
}
Этот простой микросервис регистрирует сервер, передавая его IP-адрес и статус через HTTP-запрос. Он подключается к базе данных PostgreSQL и сохраняет информацию о сервере, которую затем использует бот для распределения нагрузки.
Распределение нагрузки через бота
Бот, используя эту систему, как настоящий страж порядка, сначала проверяет статус серверов через микросервисы, собирая информацию о текущих подключениях, а затем, подобно опытному диспетчеру, решает, куда направить новых пользователей. Но это еще не всё! Как любой бюрократ, он ищет всё через таблицы SQL. Каждое подключение фиксируется, и за каждым клиентом записано, на каком сервере его сертификат действителен. Так что если какой-то сервер начинает «пухнуть» от перегрузки, бот сразу скажет: "Извините, здесь всё забито, идите в другой конец таблицы!"
Интеграция с Юкассой
Конечно, с интеграцией платежей всегда есть нюансы. На первый взгляд, всё просто: после оплаты бот проверяет транзакцию, создаёт сертификаты и раздаёт их клиентам. Но не тут-то было! Оказалось, что для корректной работы Юкассы нужно не только принимать платежи, но и заморачиваться с отправкой чеков через email. И вот тут начинается веселье — для этого нужно писать в техподдержку и настраивать. Но вы, главное, имейте в виду: не забудьте заполнить providerData, иначе чеков клиенту не видать. А ещё важен корректный формат для предмета оплаты — вроде доступа к подписке.
Вот пример кода для создания чека:
var receipt = new
{
receipt = new
{
items = new[]
{
new
{
description = @$"Доступ к подписке до {DateTime.Now.AddMonths(6):dd.MM.yyyy}",
quantity = "1.00",
amount = new
{
value = "10.00",
currency = "RUB"
},
vat_code = 1
}
}
}
};
// Преобразуем объект в JSON-строку
string providerData = JsonConvert.SerializeObject(receipt);
Так что, если нужно настроить автоматическую отправку чеков — запаситесь терпением и пишите в техподдержку. Ну, а дальше всё как по маслу: проверили платёж, выдали чек — клиенты довольны!
Проблемы и их решения
Первый запуск, как и всегда, принес не только восторг от работающего бота, но и вызовы, которые я, как типичный бэкендер, даже не сразу понял, как решать. С одной стороны, с технической стороны всё было отлажено: бот стабильно обрабатывал запросы, система сгенерированных сертификатов работала как часы, интеграция с Юкассой прошла без нареканий. Казалось, теперь остается только ждать потока пользователей. Но тут и начались сложности — продвижение.
Для бэкендера, привыкшего писать код и разворачивать сервисы, задачи по маркетингу — это совершенно другая вселенная. "Просто создать бота" — оказалось лишь первой маленькой частью на пути к успеху. Реальная проблема заключалась в том, что без аудитории никакая даже самая гениальная разработка не принесет пользы. Я быстро понял, что мой бот теряется среди тысячи других предложений, и обычные попытки привлечь внимание через посты или рекламу приносили крайне мало пользы.
Другие сервисы VPN
На первых этапах я, как, возможно, настоящий джун, решил попробовать несколько крутых решений, которые выглядели ну очень перспективно. Outline, разработанный Google, обещал лёгкость развертывания VPN, и я подумал: "Вот оно, будущее!". Но, к сожалению, провайдеры вырубали его так часто, что я начал думать, что не понимаю, как VPN должен работать. С Amnezia Xray история повторилась: там и поддержка кучи протоколов, и удобный API — мечта любого автоматизатора! Но и он сдался под натиском блокировок. В итоге, решив, что пора возвращаться к классике, я остановился на OpenVPN — надёжный, кастомизируемый и, что важно, живёт дольше остальных в мире блокировок!
Итоги
В итоге, что мы имеем? Я начал с личного проекта для собственного пользования, и в результате создал сервис, который помогает другим людям защищать свои данные. Это отличное чувство — знать, что ты не только смог решить свою задачу, но и помог другим.
Так что, если у вас есть интересная идея и желание разобраться в технологиях, не бойтесь экспериментировать. Мир технологий — это отличное место для реализации своих задумок, и иногда даже небольшие проекты могут вырасти во что-то большее, чем вы ожидали.
Конечно, просто создать бота — это полдела. Нужно ещё и как-то раскручивать его, ведь никто сам не узнает о твоём чудо-VPN. И тут началась борьба с «ветряными мельницами». Попробовал своими силами запустить группу по информационной безопасности в Telegram — WelcomeOpenVPN. Но вот беда: раскрутка стоит как крыло самолёта — цены на рекламу кусаются. Решил попробовать обойтись без больших вложений, двигаясь по принципу "сарафанное радио". Но что поделать, ИТ-проекты сами себя не рекламируют!
Так что, если хотите поддержать меня в этом нелёгком деле, заглядывайте в группу и присоединяйтесь к @welcomeVPN_bot. У вас есть 10 дней, чтобы насладиться безопасным серфингом абсолютно бесплатно. А чтобы добавить немного мотивации, вот фраза на удачу: «Поддержи, и да прибудет с тобой вечный SSL!»
Если у вас остались вопросы или вы хотите узнать больше о моём опыте — пишите в комментариях или в Telegram, буду рад поделиться!