Хабраэффект или как вести себя с умом- что бы деньги появились сами по себе
В прошлом посте я рассказывал про абсолютно, совершенно бесплатный 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
npupoga
продайте lifetime и закрывайтесь
Geraclz Автор
Зачем? Это интересный опыт и игра
npupoga
coin-vpn именно так работает
mysterium это игра