Хабраэффект или как вести себя с умом- что бы деньги появились сами по себе
В прошлом посте я рассказывал про абсолютно, совершенно бесплатный VPN который мы создали для всех. Многие спрашивали как мы сможем прожить и кто за это платит. Вышло так что оплата одного VPS выходит в среднем 250 рублей в месяц, хватает это на 75 человек, и такую сумму мы принимаем в качестве пожертвований. И после прошлого поста на наш канал подписалось более 1000 человек — а пожертвований было более 8 тысяч рублей за сутки.
Итог — нас сейчас около 3 тысяч человек — расходы в 10 тысяч рублей — за последние 30 дней мы собрали 16 тысяч рублей что покрыло с горкой расходы на месяц — май — и даже часть июня!
В этом посте я расскажу управлять таким сервисом — и автоматизировать некоторые моменты.
Содержание:
-
Считаем клиентов
-
Считаем среднее количество клиентов и оповещаем админа
-
Создаем клон VDS
TimeWeb API или как автоматизировать большинство систем
Для автоматизации процесса нам нужно что бы при достижении высково среднего онлайн в течении 3–4 часов, система самостоятельно арендовала новый VDS делая из предыдущего клон.
Для начала нам нужно подсчитать сколько человек сейчас в сети.
Импортируем модуль subprocess, который позволяет выполнять команды в терминале из Python‑скрипта.
2. Выполняем команду wg show с помощью subprocess.run(), захватывая вывод команды с помощью параметра capture_output=True и конвертируя его в строку с помощью параметра text=True.
3. Проверяем код возврата команды. Если он равен нулю, то команда была успешно выполнена, и мы можем обработать вывод. Если код возврата не равен нулю, то возникла ошибка, и мы выводим сообщение об ошибке.
4. Разбиваем вывод на строки с помощью метода split('\n').
5. Считаем количество строк в выводе (количество клиентов), вычитая 1 для заголовочной строки.
6. Выводим результат в виде строки с помощью функции print().
import subprocess result = subprocess.run(['wg', 'show'], capture_output=True, text=True) if result.returncode == 0: output = result.stdout.strip().split('\n') clients = len(output) - 1 # subtract 1 for the header line print(f"Number of connected clients: {clients}") else: print("Error:", result.stderr)
Далее нам нужно отследить что бы понять среднее количетсов клиентов за 12 часов и после этого принять решение — арендовать клон vds или нет.
1. Мы определяем переменные avg_clients, count и max_count. avg_clients будет использоваться для хранения среднего количества клиентов, count — для хранения количества проверок, а max_count — максимальное количество проверок, которые мы хотим выполнить.
2. Мы запускаем бесконечный цикл while count < max_count, в котором мы будем проверять количество подключенных клиентов и увеличивать count.
3. Мы выполняем команду wg show, как и в предыдущем скрипте, и обрабатываем вывод.
4. Мы добавляем количество клиентов к avg_clients и увеличиваем count на 1.
5. Мы выводим количество подключенных клиентов и ждем 10 минут с помощью функции time.sleep(600).
6. После выполнения всех проверок мы вычисляем среднее количество клиентов, разделив avg_clients на count.
7. Если среднее количество клиентов больше или равно 75, мы выводим «Server is overloaded», иначе мы выводим «Server is running fine».
Код скрипта, который выводит количество подключенных клиентов Wireguard и проверяет его в течение 12 часов:
import subprocess import time avg_clients = 0 count = 0 max_count = 72 # 12 hours with a check every 10 minutes while count < max_count: result = subprocess.run(['wg', 'show'], capture_output=True, text=True) if result.returncode == 0: output = result.stdout.strip().split('\n') clients = len(output) - 1 # subtract 1 for the header line avg_clients += clients count += 1 print(f"Number of connected clients: {clients}") time.sleep(600) # wait for 10 minutes else: print("Error:", result.stderr) avg_clients //= count if avg_clients >= 75: print("Server is overloaded") else: print("Server is running fine")
Код скрипта, который выводит количество подключенных клиентов Wireguard в течение 12 часов и проверяет, превышает ли среднее значение 75:
python import subprocess import time clients = [] for i in range(0, 144): # 12 hours * 12 updates per hour = 144 updates result = subprocess.run(['wg', 'show'], capture_output=True, text=True) if result.returncode == 0: output = result.stdout.strip().split('\n') clients.append(len(output) - 1) # subtract 1 for the header line else: print("Error:", result.stderr) clients.append(0) # add 0 to the list to maintain the length time.sleep(300) # wait 5 minutes between updates average_clients = sum(clients) / len(clients) if average_clients > 75: print("Server is overloaded") else: print(f"Number of connected clients: {clients[-1]}") ```
1. Создаем пустой список clients, в который будем добавлять количество подключенных клиентов на каждом проходе цикла.
2. Используем цикл for для выполнения 144 обновлений (12 часов * 12 обновлений в час).
3. Выполняем команду wg show и обрабатываем вывод аналогично предыдущему скрипту.
4. Добавляем количество подключенных клиентов в список clients.
5. Если возникает ошибка, добавляем 0 в список clients, чтобы сохранить длину списка.
6. Используем функцию time.sleep() для ожидания 5 минут между обновлениями.
7. Вычисляем среднее значение количества клиентов в списке clients.
8. Если среднее значение больше 75, выводим сообщение «Server is overloaded».
9. Иначе выводим последнее значение списка clients в виде строки с помощью функции print().
Все таки я немного соврал, не все автоматизировано, приходит оповещение, мне удобнее в Телеграм, что сервер переполнен, и уже Администратор решает, хватит ли нам денег на новый сервер или временно закрыть раздачу ключей к WG.
Для отправки оповещения в телеграм мы будем использовать библиотеку python-telegram-bot. Прежде чем начать работу с этой библиотекой, необходимо создать бота и получить токен. Для этого нужно обратиться к BotFather в Telegram и следовать инструкциям.
После получения токена, можно написать скрипт отправки сообщения в телеграм:
import telegram bot_token = 'YOUR_BOT_TOKEN_HERE' chat_id = 'YOUR_CHAT_ID_HERE' bot = telegram.Bot(token=bot_token) message = "Server is overloaded" bot.send_message(chat_id=chat_id, text=message)
Теперь можно объединить этот код с кодом предыдущего скрипта, чтобы отправлять сообщения в телеграм, если сервер перегружен:
import subprocess import time import telegram bot_token = 'YOUR_BOT_TOKEN_HERE' chat_id = 'YOUR_CHAT_ID_HERE' clients = [] for i in range(0, 144): # 12 hours * 12 updates per hour = 144 updates result = subprocess.run(['wg', 'show'], capture_output=True, text=True) if result.returncode == 0: output = result.stdout.strip().split('\n') clients.append(len(output) - 1) # subtract 1 for the header line else: print("Error:", result.stderr) clients.append(0) # add 0 to the list to maintain the length time.sleep(300) # wait 5 minutes between updates average_clients = sum(clients) / len(clients) if average_clients > 75: message = "Server is overloaded" bot = telegram.Bot(token=bot_token) bot.send_message(chat_id=chat_id, text=message) else: print(f"Number of connected clients: {clients[-1]}")
Код отправки сообщения в телеграм добавлен в блок условия, который проверяет, превышает ли среднее значение 75. Если это так, то сообщение «Server is overloaded» отправляется в телеграм. Если нет, то выводится количество подключенных клиентов, как и ранее.
«Server is overloaded» — нам нужно клонировать VPS и поднять его.
Подключаемся к timeweb api (api key в личном кабинете)
Клонирование VPS в Timeweb включает в себя несколько шагов:
1. Получить список доступных VPS.
2. Выбрать VPS, который нужно клонировать.
3. Создать копию VPS.
4. Дождаться, пока копия будет создана.
5. Получить данные копии VPS.
6. Сохранить данные в файл конфигурации Wireguard.
Ниже я написал Python‑код, который выполняет эти шаги:
import requests import json # Задайте свой ключ API api_key = "YOUR_API_KEY_HERE" # 1. Получите список доступных VPS. url = "https://api.timeweb.com/v1/vps" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {api_key}" } response = requests.get(url, headers=headers) vps_list = response.json()["data"] print("Available VPS:", vps_list) # 2. Выберите VPS, которую нужно клонировать. vps_to_clone = None for v in vps_list: if v["hostname"] == "VPS_TO_CLONE": vps_to_clone = v break if vps_to_clone is None: print("VPS to clone not found.") exit(1) print("VPS to clone:", vps_to_clone) # 3. Создайте копию VPS. url = "https://api.timeweb.com/v1/vps/clone" data = { "vps_id": vps_to_clone["id"] } response = requests.post(url, headers=headers, data=json.dumps(data)) clone_id = response.json()["data"]["id"] print("Clone created:", clone_id) # 4. Дождитесь, пока копия будет создана. url = f"https://api.timeweb.com/v1/vps/clone/{clone_id}" while True: response = requests.get(url, headers=headers) status = response.json()["data"]["status"] if status == "completed": print("Clone processed.") break elif status == "failed": print("Clone failed.") exit(1) print("Clone status:", status) time.sleep(10) # 5. Получите данные копии VPS. url = f"https://api.timeweb.com/v1/vps/{clone_id}" response = requests.get(url, headers=headers) clone_vps = response.json()["data"] print("Clone details:", clone_vps) # 6. Сохраните данные в файл конфигурации Wireguard. with open("wg0.conf", "a") as f: f.write(f"[Peer]\n") f.write(f"PublicKey = {clone_vps['wireguard_public_key']}\n") f.write(f"AllowedIPs = {clone_vps['wireguard_allowed_ips']}\n") f.write(f"Endpoint = {clone_vps['wireguard_endpoint']}\n")
Что у нас получилось
Скрипт получает данные о количестве клиентов на сервере, понимает что среднее количество превышает лимит, оповещает администратора, администратор отправляет запрос на клонирование сервера, создается клон сервера, осталось только настроить бота который выдает ключи — выдачу на новый сервер.
Так же нужно понимать что некоторые сервера могут опустеть, в течении года такое уже было, мы замечали что люди зачем то берут новые ключи, клиенты удаляют wireguard или просто не польются впн, в таком случае нужно до заполнить такие сервера, но пока серверов не так много мы просто перенастраиваем бота на выдачу ключей на определенный сервер для до заполнения.
Итог: это очень кустарный метод администрирования, мы не получаем прибыли с этой услуги, но в будущем планируем создать мини панель администратора где можно отследить параметры нагрузки на цпу, сеть.
Это статья не реклама, мы просто сделали проект добра и готовы поделится тем что у нас получилось, вы можете использовать наш опыт для организации своей услуги впн. Работайте для души!
Мы всегда рады, протестировать наш проект можно в телеграм канале https://t.me/blacktemple_space
ссылка на оригинал статьи https://habr.com/ru/articles/735334/
Добавить комментарий