вау!
вау!

Хабраэффект или как вести себя с умом- что бы деньги появились сами по себе

В прошлом посте я рассказывал про абсолютно, совершенно бесплатный VPN который мы создали для всех. Многие спрашивали как мы сможем прожить и кто за это платит. Вышло так что оплата одного VPS выходит в среднем 250 рублей в месяц, хватает это на 75 человек, и такую сумму мы принимаем в качестве пожертвований. И после прошлого поста на наш канал подписалось более 1000 человек - а пожертвований было более 8 тысяч рублей за сутки.

Итог - нас сейчас около 3 тысяч человек - расходы в 10 тысяч рублей - за последние 30 дней мы собрали 16 тысяч рублей что покрыло с горкой расходы на месяц - май - и даже часть июня!

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

Содержание:

  1. Считаем клиентов

  2. Считаем среднее количество клиентов и оповещаем админа

  3. Создаем клон 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

Комментарии (3)


  1. npupoga
    16.05.2023 11:03
    -1

    продайте lifetime и закрывайтесь


    1. Geraclz Автор
      16.05.2023 11:03

      Зачем? Это интересный опыт и игра


      1. npupoga
        16.05.2023 11:03

        coin-vpn именно так работает

        mysterium это игра