├── .editorConfig ├── .env ├── .gitignore ├── app ├── amnezia.py ├── backup.php ├── bot.php ├── calc.php ├── checkwebhook.php ├── cron.php ├── debug.php ├── i18n.php ├── index.php ├── init.php ├── iplimit.php ├── qr │ └── .gitkeep ├── service.php ├── timezone.php ├── updatepac.php ├── webapp │ ├── donate.html │ ├── img │ │ └── jsoneditor-icons.svg │ ├── index.html │ ├── jquery-3.7.1.min.js │ ├── jsoneditor.min.css │ ├── jsoneditor.min.js │ └── toncoin.png └── zapretlists │ └── .gitkeep ├── certs └── .gitkeep ├── config ├── .profile ├── AdGuardHome.yaml ├── Caddyfile ├── Makefile ├── clash.json ├── clients.json ├── clients1.json ├── deny ├── include.conf ├── mtprotodomain ├── mtprotosecret ├── nginx.conf ├── nginx_default.conf ├── ocserv.conf ├── ocserv.passwd ├── pac.json ├── php.ini ├── sing.json ├── sshd_config ├── sslocal.json ├── ssserver.json ├── unit.json ├── upstream.conf ├── v2ray.json ├── wg0.conf ├── wg1.conf └── xray.json ├── docker-compose.yml ├── dockerfile ├── adguard.dockerfile ├── naive.dockerfile ├── nginx.dockerfile ├── ocserv.dockerfile ├── php.dockerfile ├── shadowsocks.dockerfile ├── telegram.dockerfile ├── warp.dockerfile ├── wireguard.dockerfile └── xray.dockerfile ├── logs └── .gitkeep ├── makefile ├── mirror ├── docker-compose.yml ├── dockerfile ├── makefile └── start_socat.sh ├── readme.md ├── scripts ├── block_exchange.sh ├── block_torrent.sh ├── check_file.sh ├── init.sh ├── install_as_service.sh ├── reset_wg.sh ├── start_ad.sh ├── start_ng.sh ├── start_np.sh ├── start_oc.sh ├── start_php.sh ├── start_proxy.sh ├── start_service.sh ├── start_ss.sh ├── start_tg.sh ├── start_upstream.sh ├── start_wg.sh ├── start_wp.sh ├── start_xray.sh └── vpnbot.service ├── singbox_windows ├── singbox.zip └── winsw3.xml ├── ssh └── .gitkeep ├── unit.rest ├── update └── update.sh └── version /.editorConfig: -------------------------------------------------------------------------------- 1 | root=true 2 | 3 | [*] 4 | indent_style=space 5 | indent_size=4 6 | end_of_line=lf 7 | charset=utf-8 8 | trim_trailing_whitespace=true 9 | [*.php] 10 | insert_final_newline=true 11 | [makefile] 12 | indent_style=tab 13 | [config/Makefile] 14 | indent_style=tab 15 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | TZ=Europe/Samara 2 | WGADDRESS=10.0.1.1/24 3 | WGPORT=51820 4 | WG1ADDRESS=10.0.3.1/24 5 | WG1PORT=51821 6 | SSPORT=8388 7 | TGPORT=4443 8 | IMAGE=alpine:3.18.2 9 | IP= 10 | VER= 11 | ENV=/root/.ashrc -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /app/config.php 2 | /certs/* 3 | !/certs/.gitkeep 4 | /logs/* 5 | !/logs/.gitkeep 6 | /ssh/* 7 | !/ssh/.gitkeep 8 | /app/zaprelists/* 9 | !/app/zaprelists/.gitkeep 10 | /sftp-config.json 11 | /tg.pyr 12 | /config/wg0.conf 13 | /todo.todo 14 | /app/zapretlists/* 15 | !/app/zapretlists/.gitkeep 16 | .vscode/ 17 | .idea/ 18 | mirror/.env 19 | update/* 20 | !update/update.sh 21 | 22 | override.env 23 | override.html 24 | override.php 25 | docker-compose.override.yml 26 | backup.json 27 | app/webapp/override/ 28 | .rest 29 | -------------------------------------------------------------------------------- /app/amnezia.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from PyQt5.QtCore import * 3 | 4 | 5 | def enc(s): 6 | ba = qCompress(QByteArray(s.encode())) 7 | ba = ba.toBase64(QByteArray.Base64Option.Base64UrlEncoding | QByteArray.Base64Option.OmitTrailingEquals) 8 | print('vpn://' + str(ba, 'utf-8')) 9 | 10 | s = '' 11 | for line in sys.stdin: 12 | s += line 13 | s = s.strip() 14 | enc(s) 15 | -------------------------------------------------------------------------------- /app/backup.php: -------------------------------------------------------------------------------- 1 | export(); 14 | -------------------------------------------------------------------------------- /app/calc.php: -------------------------------------------------------------------------------- 1 | $a[1] + 1) { 8 | $tmp = [$a, $b]; 9 | } elseif ($b[1] <= $a[1]) { 10 | $tmp = [$a]; 11 | } else { 12 | $tmp = [[$a[0], $b[1]]]; 13 | } 14 | return array_filter($tmp); 15 | } 16 | 17 | public function substract(array $a, array $b): array 18 | { 19 | if ($b[0] > $a[1] || $b[1] < $a[0]) { 20 | return [$a]; 21 | } elseif ($b[0] <= $a[0] && $b[1] >= $a[1]) { 22 | return []; 23 | } elseif ($b[0] > $a[0] && $b[1] < $a[1]) { 24 | return [[$a[0], $b[0] - 1], [$b[1] + 1, $a[1]]]; 25 | } elseif ($b[0] <= $a[0]) { 26 | return [$b[1] + 1, $a[1]]; 27 | } else { 28 | return [$a[0], $b[1] - 1]; 29 | } 30 | } 31 | 32 | public function alignment(array $arr): array 33 | { 34 | usort($arr, fn ($a, $b) => $a[0] <=> $b[0]); 35 | $tmp = [[]]; 36 | foreach ($arr as $k => $v) { 37 | $t = array_pop($tmp); 38 | $tmp = array_merge($tmp, $this->merge($t, $v)); 39 | } 40 | return $tmp; 41 | } 42 | 43 | public function prepare(array $include, array $exclude): array 44 | { 45 | $include = $this->alignment($include); 46 | if (!empty($exclude)) { 47 | $tmp = []; 48 | $exclude = $this->alignment($exclude); 49 | foreach ($exclude as $k => $v) { 50 | foreach ($include as $i => $j) { 51 | $tmp = array_merge($tmp, $this->substract($j, $v)); 52 | } 53 | $d = array_filter($tmp); 54 | } 55 | return $tmp; 56 | } 57 | return $include; 58 | } 59 | 60 | public function toCIDR(int $a, int $b) 61 | { 62 | $diff = $b - $a + 1; 63 | if ($diff > 1) { 64 | for ($i = 0; $i <= 32; $i++) { 65 | if ($diff / (1 << $i) < 1) { 66 | break; 67 | } 68 | } 69 | $tmp[] = long2ip($a) . "/" . (32 - $i + 1); 70 | $new = $a + (1 << ($i - 1)); 71 | if ($new <= $b) { 72 | $tmp = array_merge($tmp, $this->toCIDR($new, $b)); 73 | } 74 | } else { 75 | $tmp[] = long2ip($a) . "/32"; 76 | } 77 | return $tmp; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/checkwebhook.php: -------------------------------------------------------------------------------- 1 | "https://api.telegram.org/bot{$c['key']}/getWebhookInfo", 8 | CURLOPT_RETURNTRANSFER => true, 9 | ]); 10 | $res = curl_exec($ch); 11 | die(var_dump($res)); 12 | -------------------------------------------------------------------------------- /app/cron.php: -------------------------------------------------------------------------------- 1 | cron(); 11 | -------------------------------------------------------------------------------- /app/debug.php: -------------------------------------------------------------------------------- 1 | file_get_contents('php://input'), 9 | 'json' => json_decode(file_get_contents('php://input'), true), 10 | 'post' => $_POST, 11 | 'file' => $_FILES, 12 | ]; 13 | register_shutdown_function('exit_log', $debug); 14 | 15 | function exit_log($debug) 16 | { 17 | $output = ob_get_contents(); 18 | $debug['response'] = json_decode($output, true) ?: $output; 19 | file_put_contents('/logs/requests', "\n" . date('Y-m-d H:i:s') . "\n" . var_export($debug, true) . "\n", FILE_APPEND); 20 | } 21 | -------------------------------------------------------------------------------- /app/i18n.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'en' => 'Warp', 6 | 'ru' => 'Warp', 7 | ], 8 | 'wg_title' => [ 9 | 'en' => 'Wireguard', 10 | 'ru' => 'Wireguard', 11 | ], 12 | 'amnezia' => [ 13 | 'en' => 'Amnezia', 14 | 'ru' => 'Amnezia', 15 | ], 16 | 'sh_title' => [ 17 | 'en' => 'Shadowsocks', 18 | 'ru' => 'Shadowsocks', 19 | ], 20 | 'ad_title' => [ 21 | 'en' => 'AdGuard', 22 | 'ru' => 'AdGuard', 23 | ], 24 | 'config' => [ 25 | 'en' => 'Settings', 26 | 'ru' => 'настройки', 27 | ], 28 | 'pac' => [ 29 | 'en' => 'PAC', 30 | 'ru' => 'PAC', 31 | ], 32 | 'chat' => [ 33 | 'en' => 'chat', 34 | 'ru' => 'чат поддержки', 35 | ], 36 | 'back' => [ 37 | 'en' => 'back', 38 | 'ru' => 'назад', 39 | ], 40 | 'import' => [ 41 | 'en' => 'restore', 42 | 'ru' => 'восстановить', 43 | ], 44 | 'export' => [ 45 | 'en' => 'backup', 46 | 'ru' => 'сохранить', 47 | ], 48 | 'delete' => [ 49 | 'en' => 'delete', 50 | 'ru' => 'удалить', 51 | ], 52 | 'add' => [ 53 | 'en' => 'add', 54 | 'ru' => 'добавить', 55 | ], 56 | 'donate' => [ 57 | 'en' => 'donate', 58 | 'ru' => 'донат', 59 | ], 60 | 'admin' => [ 61 | 'en' => 'admin', 62 | 'ru' => 'админа', 63 | ], 64 | 'menu' => [ 65 | 'en' => 'Menu', 66 | 'ru' => 'Меню', 67 | ], 68 | 'update status' => [ 69 | 'en' => 'update status', 70 | 'ru' => 'обновить статус', 71 | ], 72 | 'add peer' => [ 73 | 'en' => 'add peer', 74 | 'ru' => 'добавить клиента', 75 | ], 76 | 'all traffic' => [ 77 | 'en' => 'all traffic', 78 | 'ru' => 'весь трафик', 79 | ], 80 | 'subnet' => [ 81 | 'en' => 'subnet', 82 | 'ru' => 'подсеть', 83 | ], 84 | 'proxy ip' => [ 85 | 'en' => 'proxy ip', 86 | 'ru' => 'айпи прокси', 87 | ], 88 | 'rename' => [ 89 | 'en' => 'rename', 90 | 'ru' => 'переименовать', 91 | ], 92 | 'show QR' => [ 93 | 'en' => 'show QR', 94 | 'ru' => 'показать QR', 95 | ], 96 | 'download config' => [ 97 | 'en' => 'download config', 98 | 'ru' => 'скачать настройки', 99 | ], 100 | 'install domain' => [ 101 | 'en' => 'install domain', 102 | 'ru' => 'установить домен', 103 | ], 104 | 'renew SSL' => [ 105 | 'en' => 'renew SSL', 106 | 'ru' => 'обновить SSL', 107 | ], 108 | 'delete SSL' => [ 109 | 'en' => 'delete SSL', 110 | 'ru' => 'удалить SSL', 111 | ], 112 | 'Letsencrypt SSL' => [ 113 | 'en' => 'Letsencrypt SSL', 114 | 'ru' => 'Letsencrypt SSL', 115 | ], 116 | 'Self SSL' => [ 117 | 'en' => 'Self SSL', 118 | 'ru' => 'Собственный SSL', 119 | ], 120 | 'change password' => [ 121 | 'en' => 'change password', 122 | 'ru' => 'изменить пароль', 123 | ], 124 | 'reset settings' => [ 125 | 'en' => 'reset settings', 126 | 'ru' => 'сбросить настройки', 127 | ], 128 | 'add upstream' => [ 129 | 'en' => 'add upstream', 130 | 'ru' => 'добавить DNS', 131 | ], 132 | 'check DNS' => [ 133 | 'en' => 'check DNS', 134 | 'ru' => 'проверить DNS', 135 | ], 136 | 'update' => [ 137 | 'en' => 'update', 138 | 'ru' => 'обновить', 139 | ], 140 | 'self list' => [ 141 | 'en' => 'self list', 142 | 'ru' => 'собственный список', 143 | ], 144 | 'reverse list' => [ 145 | 'en' => 'reverse list', 146 | 'ru' => 'обратный список', 147 | ], 148 | 'subzones' => [ 149 | 'en' => 'subzones', 150 | 'ru' => 'поддомены', 151 | ], 152 | 'check url' => [ 153 | 'en' => 'check url', 154 | 'ru' => 'проверить домен', 155 | ], 156 | 'blacklist exclude' => [ 157 | 'en' => 'blacklist exclude', 158 | 'ru' => 'исключения из списка ркн', 159 | ], 160 | 'lang' => [ 161 | 'en' => 'language', 162 | 'ru' => 'язык интерфейса', 163 | ], 164 | 'adguard web' => [ 165 | 'en' => 'web interface', 166 | 'ru' => 'вебморда адгварда', 167 | ], 168 | 'domain explain' => [ 169 | 'en' => 'Some clients require a valid certificate when connecting, such as windows 11 DoH or ShadowSocks Android (PAC url), this requires a domain', 170 | 'ru' => 'Некоторым клиентам требуется валидный сертификат при подключении, например Windows 11 DoH или ShadowSocks Android (URL-адрес PAC), для этого требуется домен', 171 | ], 172 | 'self list explain' => [ 173 | 'en' => ' - domains that will work through a proxy, all others directly', 174 | 'ru' => ' - домены, которые будут работать через прокси, все остальные напрямую', 175 | ], 176 | 'reverse list explain' => [ 177 | 'en' => ' - domains that will work directly, all others through a proxy', 178 | 'ru' => ' - домены которые будут работать напрямую, все остальные через прокси', 179 | ], 180 | 'timer' => [ 181 | 'en' => 'set timer', 182 | 'ru' => 'установить время действия', 183 | ], 184 | 'reset nginx' => [ 185 | 'en' => 'reset nginx', 186 | 'ru' => 'сбросить nginx', 187 | ], 188 | 'set internal dns' => [ 189 | 'en' => 'set internal dns', 190 | 'ru' => 'установить внутренний dns', 191 | ], 192 | 'delete internal dns' => [ 193 | 'en' => 'delete internal dns', 194 | 'ru' => 'удалить внутренний dns', 195 | ], 196 | 'on' => [ 197 | 'en' => '🟢', 198 | 'ru' => '🟢', 199 | ], 200 | 'off' => [ 201 | 'en' => '🔴', 202 | 'ru' => '🔴', 203 | ], 204 | 'torrent' => [ 205 | 'en' => 'torrents', 206 | 'ru' => 'торренты', 207 | ], 208 | 'blinkmenuon' => [ 209 | 'en' => 'blinkmenu on', 210 | 'ru' => 'прыгающее меню вкл', 211 | ], 212 | 'blinkmenuoff' => [ 213 | 'en' => 'blinkmenu off', 214 | 'ru' => 'прыгающее меню выкл', 215 | ], 216 | 'listSubnet' => [ 217 | 'en' => 'listSubnet', 218 | 'ru' => 'список подсетей', 219 | ], 220 | 'AllowedIPs' => [ 221 | 'en' => 'AllowedIPs', 222 | 'ru' => 'AllowedIPs', 223 | ], 224 | 'calc' => [ 225 | 'en' => 'calc CIDR', 226 | 'ru' => 'calc CIDR', 227 | ], 228 | 'mtproto' => [ 229 | 'en' => 'MTProto', 230 | 'ru' => 'MTProto', 231 | ], 232 | 'generateSecret' => [ 233 | 'en' => 'generateSecret', 234 | 'ru' => 'сгенерировать ключ', 235 | ], 236 | 'setSecret' => [ 237 | 'en' => 'setSecret', 238 | 'ru' => 'установить свой ключ', 239 | ], 240 | 'defaultDNS' => [ 241 | 'en' => 'defaultDNS', 242 | 'ru' => 'дефолтный днс', 243 | ], 244 | 'defaultMTU' => [ 245 | 'en' => 'defaultMTU', 246 | 'ru' => 'дефолтный MTU', 247 | ], 248 | 'debug' => [ 249 | 'en' => 'debug mode', 250 | 'ru' => 'режим отладки', 251 | ], 252 | 'backup' => [ 253 | 'en' => 'auto backup', 254 | 'ru' => 'автобэкап', 255 | ], 256 | 'logs' => [ 257 | 'en' => 'logs', 258 | 'ru' => 'логи', 259 | ], 260 | 'clear' => [ 261 | 'en' => 'clear', 262 | 'ru' => 'очистить', 263 | ], 264 | 'xray' => [ 265 | 'en' => 'Vless', 266 | 'ru' => 'Vless', 267 | ], 268 | 'clash' => [ 269 | 'en' => 'mihomo', 270 | 'ru' => 'mihomo', 271 | ], 272 | 'geodb' => [ 273 | 'en' => 'GeoIp/GeoSite', 274 | 'ru' => 'GeoIp/GeoSite', 275 | ], 276 | 'changeFakeDomain' => [ 277 | 'en' => 'changeFakeDomain', 278 | 'ru' => 'фейковый домен', 279 | ], 280 | 'selfFakeDomain' => [ 281 | 'en' => 'steal from yourself', 282 | 'ru' => 'steal from yourself', 283 | ], 284 | 'page' => [ 285 | 'en' => 'pagination', 286 | 'ru' => 'пагинация', 287 | ], 288 | 'exchange' => [ 289 | 'en' => 'client isolation', 290 | 'ru' => 'изоляция клиентов', 291 | ], 292 | 'ocserv' => [ 293 | 'en' => 'OpenConnect', 294 | 'ru' => 'OpenConnect', 295 | ], 296 | 'naive' => [ 297 | 'en' => 'NaiveProxy', 298 | 'ru' => 'NaiveProxy', 299 | ], 300 | 'change login' => [ 301 | 'en' => 'change login', 302 | 'ru' => 'изменить логин', 303 | ], 304 | 'change secret' => [ 305 | 'en' => 'change secret', 306 | 'ru' => 'секретное слово', 307 | ], 308 | 'dns' => [ 309 | 'en' => 'dns', 310 | 'ru' => 'днс', 311 | ], 312 | 'mirror' => [ 313 | 'en' => 'mirror', 314 | 'ru' => 'зеркало', 315 | ], 316 | 'download' => [ 317 | 'en' => 'download', 318 | 'ru' => 'скачать', 319 | ], 320 | 'update bot' => [ 321 | 'en' => 'update bot', 322 | 'ru' => 'обновить бота', 323 | ], 324 | 'third party browser' => [ 325 | 'en' => 'third party browser', 326 | 'ru' => 'сторонний браузер', 327 | ], 328 | 'browser_notify_on' => [ 329 | 'en' => 'the web panel can be opened in any browser', 330 | 'ru' => 'веб панель может быть открыта в любом браузере', 331 | ], 332 | 'browser_notify_off' => [ 333 | 'en' => 'web panel is only available from telegram', 334 | 'ru' => 'веб панель доступна только из телеграмма', 335 | ], 336 | 'no updates' => [ 337 | 'en' => 'no updates', 338 | 'ru' => 'нет обновлений', 339 | ], 340 | 'have updates' => [ 341 | 'en' => '🟢 have updates', 342 | 'ru' => '🟢 есть обновления', 343 | ], 344 | 'fake html' => [ 345 | 'en' => 'fake html', 346 | 'ru' => 'фейк заглушка', 347 | ], 348 | 'expose-iroutes' => [ 349 | 'en' => 'expose-iroutes', 350 | 'ru' => 'изоляция клиентов', 351 | ], 352 | 'fill allowed clients' => [ 353 | 'en' => 'fill allowed clients', 354 | 'ru' => 'заполнить белый список клиентов', 355 | ], 356 | 'delete allowed clients' => [ 357 | 'en' => 'delete allowed clients', 358 | 'ru' => 'очистить белый список клиентов', 359 | ], 360 | 'success' => [ 361 | 'en' => 'success', 362 | 'ru' => 'сохранено', 363 | ], 364 | 'error' => [ 365 | 'en' => 'error', 366 | 'ru' => 'ошибка', 367 | ], 368 | 'save' => [ 369 | 'en' => 'save', 370 | 'ru' => 'сохранить', 371 | ], 372 | 'copy' => [ 373 | 'en' => 'copy', 374 | 'ru' => 'копировать', 375 | ], 376 | 'restart' => [ 377 | 'en' => 'restart', 378 | 'ru' => 'перезагрузка', 379 | ], 380 | ]; 381 | -------------------------------------------------------------------------------- /app/index.php: -------------------------------------------------------------------------------- 1 | getHashBot(); 16 | if (!empty($_GET['hash'])) { 17 | $t = $_GET; 18 | unset($t['hash']); 19 | ksort($t); 20 | foreach ($t as $k => $v) { 21 | $s[] = "$k=$v"; 22 | } 23 | $s = implode("\n", $s); 24 | $sk = hash_hmac('sha256', $c['key'], "WebAppData", true); 25 | $webapp = hash_hmac('sha256', $s, $sk) == $_GET['hash']; 26 | } 27 | 28 | switch (true) { 29 | // tlgrm 30 | case 'POST' == $_SERVER['REQUEST_METHOD'] && preg_match('~^/tlgrm~', $_SERVER['REQUEST_URI']) && $_GET['k'] == $c['key']: 31 | $bot->input(); 32 | break; 33 | 34 | // save template 35 | case preg_match('~^' . preg_quote("/webapp$hash/save") . '~', $_SERVER['REQUEST_URI']) && $webapp && !empty($_POST['json']): 36 | echo json_encode($bot->saveTemplate($_POST['name'], $_POST['type'], $_POST['json'])); 37 | break; 38 | 39 | // adguard cookie 40 | case preg_match('~^' . preg_quote("/webapp$hash/check") . '~', $_SERVER['REQUEST_URI']) && $webapp: 41 | setcookie('c', $hash, 0, '/'); 42 | echo "/adguard$hash/"; 43 | break; 44 | 45 | // subs & pac 46 | case preg_match('~^' . preg_quote("/pac$hash") . '~', $_SERVER['REQUEST_URI']): 47 | if (!empty($t = unserialize(base64_decode(explode('/', $_SERVER['REQUEST_URI'])[2])))) { // fix sing-box import 48 | $_GET = array_merge($_GET, $t); 49 | } 50 | $type = $_GET['t'] ?? 'pac'; 51 | $address = $_GET['a'] ?: '127.0.0.1'; 52 | $port = $_GET['p'] ?: '1080'; 53 | switch ($type) { 54 | case 's': 55 | case 'si': 56 | case 'cl': 57 | $bot->subscription(); 58 | exit; 59 | 60 | case 'te': 61 | if (!empty($_GET['te'])) { 62 | $t = $bot->getPacConf()["{$_GET['ty']}templates"][$_GET['te']]; 63 | } else { 64 | $t = json_decode(file_get_contents("/config/{$_GET['ty']}.json"), true); 65 | } 66 | if ($t) { 67 | header('Content-Type: text/html'); 68 | $t = json_encode($t, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); 69 | $name = $_GET['te'] ?: 'origin'; 70 | $type = $_GET['ty']; 71 | echo << 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 |
86 | 87 | 121 | 122 | 123 | HTML; 124 | exit; 125 | } 126 | 127 | default: 128 | if (file_exists($file = __DIR__ . "/zapretlists/$type")) { 129 | $pac = file_get_contents($file); 130 | header('Content-Type: text/plain'); 131 | echo str_replace([ 132 | '~address~', 133 | '~port~', 134 | ], [ 135 | $address, 136 | $port, 137 | ], $pac); 138 | exit; 139 | } 140 | break; 141 | } 142 | break; 143 | 144 | default: 145 | header('500', true, 500); 146 | } 147 | -------------------------------------------------------------------------------- /app/init.php: -------------------------------------------------------------------------------- 1 | cleanQueue(); 14 | $bot->setwebhook(); 15 | $bot->syncPortClients(); 16 | $bot->setcommands(); 17 | -------------------------------------------------------------------------------- /app/iplimit.php: -------------------------------------------------------------------------------- 1 | analyzeXray(); 11 | -------------------------------------------------------------------------------- /app/qr/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/app/qr/.gitkeep -------------------------------------------------------------------------------- /app/service.php: -------------------------------------------------------------------------------- 1 | selfUpdate(); 16 | $bot->ssPswdCheck(); 17 | $bot->restartTG(); 18 | if (!empty($bot->selfupdate)) { 19 | $bot->offWarp(); 20 | } 21 | $bot->dontshowcron = 1; 22 | $bot->sslip(); 23 | $bot->adguardSync(); 24 | $bot->cloakNginx(); 25 | $bot->syncDeny(); 26 | $bot->cleanDocker(); 27 | -------------------------------------------------------------------------------- /app/timezone.php: -------------------------------------------------------------------------------- 1 | $v) { 15 | $curr ++; 16 | $percent = (int) ceil($curr * 100 / $size); 17 | $rotate = $curr != $size ? $load[$j % count($load)] : ''; 18 | $tail = << 0.1) { 22 | update($text . $tail); 23 | $time = microtime(true); 24 | $j++; 25 | } 26 | switch (true) { 27 | case $last == $k: 28 | $r .= strlen($phrase) > 1 ? mb_chr($keys[$phrase]) : $v; 29 | break; 30 | case !empty($keys[$phrase . $str[$k + 1]]): 31 | $phrase .= $str[$k + 1]; 32 | break; 33 | default: 34 | $r .= strlen($phrase) > 1 ? mb_chr($keys[$phrase]) : $v; 35 | $keys[$phrase . $str[$k + 1]] = $code; 36 | $code++; 37 | $phrase = $str[$k + 1]; 38 | } 39 | } 40 | return $r; 41 | } 42 | 43 | function dlzw($text) 44 | { 45 | $text = mb_str_split($text); 46 | $code = 256; 47 | $r = $phrase = ''; 48 | $keys = []; 49 | $last = count($text) - 1; 50 | foreach ($text as $k => $v) { 51 | $cc = mb_ord($v); 52 | $r .= $cc < 256 ? $v : $keys[$cc]; 53 | if ($last == $k) { 54 | break; 55 | } 56 | if (!empty($phrase)) { 57 | $keys[$code] = $phrase . ($cc < 256 ? $v : $keys[$cc][0]); 58 | $code++; 59 | } 60 | $phrase = $cc < 256 ? $v : $keys[$cc]; 61 | } 62 | return $r; 63 | } 64 | 65 | function getSize($url) 66 | { 67 | $ch = curl_init($url); 68 | curl_setopt_array($ch, [ 69 | CURLOPT_HEADER => 1, 70 | CURLOPT_NOBODY => 1, 71 | CURLOPT_RETURNTRANSFER => 1, 72 | CURLOPT_TIMEOUT => 10, 73 | ]); 74 | $r = curl_exec($ch); 75 | curl_close($ch); 76 | preg_match('~content-length.+?(\d+)~ius', $r, $m); 77 | return (int) $m[1]; 78 | } 79 | 80 | function update($text) 81 | { 82 | global $bot; 83 | $bot->update($bot->input['chat'], $bot->input['message_id'], $text); 84 | } 85 | 86 | function start() 87 | { 88 | global $bot, $source, $res, $load, $text; 89 | 90 | $conf = $bot->getPacConf(); 91 | 92 | if (!empty($conf['subzoneslist'])) { 93 | $subzones = array_keys(array_filter($conf['subzoneslist'], fn($x) => $x == true)); 94 | } 95 | 96 | // check && exclude 97 | if (!empty($conf['includelist'])) { 98 | $domains = array_filter($conf['includelist'], fn($x) => $x == true); 99 | } 100 | if (empty($domains)) { 101 | $text = "Empty domains. Delete pac files"; 102 | unlink(__DIR__ . '/zapretlists/mpac'); 103 | unlink(__DIR__ . '/zapretlists/pac'); 104 | } else { 105 | $domains = array_keys($domains); 106 | 107 | $size = count($domains); 108 | $curr = $j = 0; 109 | $time = microtime(true); 110 | $f = fopen(__DIR__ . '/zapretlists/mpac', 'w'); 111 | $t = []; 112 | foreach ($domains as $v) { 113 | $curr ++; 114 | $percent = (int) ceil($curr * 100 / $size); 115 | $rotate = $curr != $size ? $load[$j % count($load)] : ''; 116 | $tail = << 0.1) { 120 | update($text . $tail); 121 | $time = microtime(true); 122 | $j++; 123 | } 124 | if ($exclude && preg_match('~' . implode('|', $exclude) . '~', $v)) { 125 | continue; 126 | } 127 | fwrite($f, preg_quote($v) . "\n"); 128 | 129 | preg_match('~(.+)\.([^.]+)$~', $v, $m); 130 | $t[$m[2]][strlen($m[1])][] = $m[1]; 131 | } 132 | fclose($f); 133 | $text .= $tail ? "$tail\n" : ''; 134 | 135 | // create pac 136 | $domains = json_encode($t); 137 | $pac = << $x == true); 156 | } 157 | if (empty($domains)) { 158 | 159 | // $text .= "Empty reverse domains. Delete reverse pac files"; 160 | unlink(__DIR__ . '/zapretlists/rmpac'); 161 | unlink(__DIR__ . '/zapretlists/rpac'); 162 | } else { 163 | $domains = array_keys($domains); 164 | 165 | // $size = count($domains); 166 | // $curr = $j = 0; 167 | // $time = microtime(true); 168 | // $f = fopen(__DIR__ . '/zapretlists/rmpac', 'w'); 169 | // $t = []; 170 | // foreach ($domains as $v) { 171 | // $curr ++; 172 | // $percent = (int) ceil($curr * 100 / $size); 173 | // $rotate = $curr != $size ? $load[$j % count($load)] : ''; 174 | // $tail = << 0.1) { 178 | // update($text . $tail); 179 | // $time = microtime(true); 180 | // $j++; 181 | // } 182 | // fwrite($f, '!(' . preg_quote($v) . ')' . "\n"); 183 | 184 | // preg_match('~(.+)\.([^.]+)$~', $v, $m); 185 | // $t[$m[2]][strlen($m[1])][] = $m[1]; 186 | // } 187 | // fclose($f); 188 | $text .= $tail ? "$tail\n" : ''; 189 | 190 | $domains = json_encode($t); 191 | $pac = <<menu('pac'); 217 | } 218 | die(); 219 | } 220 | 221 | function download($index) 222 | { 223 | global $source; 224 | file_put_contents($source[$index]['dest'], file_get_contents($source[$index]['source'])); 225 | } 226 | 227 | ini_set('memory_limit', '256M'); 228 | require __DIR__ . '/timezone.php'; 229 | // require __DIR__ . '/debug.php'; 230 | require __DIR__ . '/bot.php'; 231 | require __DIR__ . '/config.php'; 232 | require __DIR__ . '/i18n.php'; 233 | $source = [ 234 | [ 235 | 'source' => 'https://raw.githubusercontent.com/zapret-info/z-i/master/nxdomain.txt', 236 | 'dest' => __DIR__ . '/zapretlists/nxdomain.txt', 237 | ], 238 | [ 239 | 'source' => 'https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv', 240 | 'dest' => __DIR__ . '/zapretlists/dump.csv', 241 | ], 242 | ]; 243 | 244 | $res = __DIR__ . '/zapretlists/result'; 245 | 246 | $text = ''; 247 | $load = [ 248 | '/', 249 | '-', 250 | '\\', 251 | ]; 252 | switch ($_SERVER['argv'][1]) { 253 | case 'start': 254 | $bot = new Bot($c['key'], $i); 255 | $bot->input['chat'] = $_SERVER['argv'][2]; 256 | $bot->input['message_id'] = $_SERVER['argv'][3]; 257 | $bot->input['callback_id'] = $_SERVER['argv'][4]; 258 | start(); 259 | break; 260 | case 'download': 261 | download($_SERVER['argv'][2]); 262 | break; 263 | } 264 | -------------------------------------------------------------------------------- /app/webapp/donate.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 |
16 |
17 | 18 | copy 19 | 20 |
21 | 22 | 23 | Перевести 24 | 25 | 26 |
-------------------------------------------------------------------------------- /app/webapp/img/jsoneditor-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 16 | JSON Editor Icons 18 | 20 | 21 | 23 | image/svg+xml 24 | 26 | JSON Editor Icons 27 | 28 | 29 | 30 | 32 | 56 | 60 | 61 | 62 | 69 | 76 | 83 | 90 | 97 | 100 | 107 | 114 | 115 | 119 | 126 | 133 | 134 | 141 | 148 | 155 | 157 | 164 | 171 | 178 | 179 | 182 | 189 | 196 | 203 | 204 | 211 | 217 | 223 | 230 | 235 | 240 | 247 | 253 | 258 | 265 | 271 | 277 | 284 | 291 | 298 | 305 | 312 | 319 | 326 | 332 | 340 | 346 | 352 | 359 | 367 | 375 | 382 | 389 | 396 | 403 | 410 | 417 | 424 | 431 | 437 | 445 | 451 | 457 | 464 | 472 | 480 | 487 | 494 | 501 | 508 | 515 | 522 | 529 | 536 | 541 | 546 | 551 | 557 | 563 | 568 | 573 | 578 | 583 | 588 | 604 | 621 | 638 | 655 | 661 | 667 | 673 | 679 | 686 | 692 | 695 | 702 | 709 | 716 | 723 | 729 | 730 | 736 | 743 | 749 | 750 | -------------------------------------------------------------------------------- /app/webapp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Document 9 | 10 | 11 | 23 | 24 | -------------------------------------------------------------------------------- /app/webapp/jsoneditor.min.css: -------------------------------------------------------------------------------- 1 | .jsoneditor,.jsoneditor-modal{-webkit-text-size-adjust:none;text-size-adjust:none}.jsoneditor input,.jsoneditor input:not([type]),.jsoneditor input[type=search],.jsoneditor input[type=text],.jsoneditor-modal input,.jsoneditor-modal input:not([type]),.jsoneditor-modal input[type=search],.jsoneditor-modal input[type=text]{height:auto;border:inherit;box-shadow:none;font-size:inherit;box-sizing:inherit;padding:inherit;font-family:inherit;transition:none;line-height:inherit}.jsoneditor input:focus,.jsoneditor input:not([type]):focus,.jsoneditor input[type=search]:focus,.jsoneditor input[type=text]:focus,.jsoneditor-modal input:focus,.jsoneditor-modal input:not([type]):focus,.jsoneditor-modal input[type=search]:focus,.jsoneditor-modal input[type=text]:focus{border:inherit;box-shadow:inherit}.jsoneditor textarea,.jsoneditor-modal textarea{height:inherit}.jsoneditor select,.jsoneditor-modal select{display:inherit;height:inherit}.jsoneditor label,.jsoneditor-modal label{font-size:inherit;font-weight:inherit;color:inherit}.jsoneditor table,.jsoneditor-modal table{border-collapse:collapse;width:auto}.jsoneditor td,.jsoneditor th,.jsoneditor-modal td,.jsoneditor-modal th{padding:0;display:table-cell;text-align:left;vertical-align:inherit;border-radius:inherit}.jsoneditor .autocomplete.dropdown{position:absolute;background:#fff;box-shadow:2px 2px 12px rgba(128,128,128,.3);border:1px solid #d3d3d3;overflow-x:hidden;overflow-y:auto;cursor:default;margin:0;padding:5px;text-align:left;outline:0;font-family:consolas,menlo,monaco,"Ubuntu Mono",source-code-pro,monospace;font-size:14px}.jsoneditor .autocomplete.dropdown .item{color:#1a1a1a}.jsoneditor .autocomplete.dropdown .item.hover{background-color:#ebebeb}.jsoneditor .autocomplete.hint{color:#a1a1a1;top:4px;left:4px}.jsoneditor-contextmenu-root{position:relative;width:0;height:0}.jsoneditor-contextmenu{position:absolute;box-sizing:content-box;z-index:2}.jsoneditor-contextmenu .jsoneditor-menu{position:relative;left:0;top:0;width:128px;height:auto;background:#fff;border:1px solid #d3d3d3;box-shadow:2px 2px 12px rgba(128,128,128,.3);list-style:none;margin:0;padding:0}.jsoneditor-contextmenu .jsoneditor-menu button{position:relative;padding:0 8px 0 0;margin:0;width:128px;height:auto;border:none;cursor:pointer;color:#4d4d4d;background:0 0;font-size:14px;font-family:arial,sans-serif;box-sizing:border-box;text-align:left}.jsoneditor-contextmenu .jsoneditor-menu button::-moz-focus-inner{padding:0;border:0}.jsoneditor-contextmenu .jsoneditor-menu button.jsoneditor-default{width:96px}.jsoneditor-contextmenu .jsoneditor-menu button.jsoneditor-expand{float:right;width:32px;height:24px;border-left:1px solid #e5e5e5}.jsoneditor-contextmenu .jsoneditor-menu li{overflow:hidden}.jsoneditor-contextmenu .jsoneditor-menu li ul{display:none;position:relative;left:-10px;top:0;border:none;box-shadow:inset 0 0 10px rgba(128,128,128,.5);padding:0 10px;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.jsoneditor-contextmenu .jsoneditor-menu li ul .jsoneditor-icon{margin-left:24px}.jsoneditor-contextmenu .jsoneditor-menu li ul li button{padding-left:24px;animation:all ease-in-out 1s}.jsoneditor-contextmenu .jsoneditor-menu li button .jsoneditor-expand{position:absolute;top:0;right:0;width:24px;height:24px;padding:0;margin:0 4px 0 0;background-image:url(./img/jsoneditor-icons.svg);background-position:0 -72px}.jsoneditor-contextmenu .jsoneditor-icon{position:absolute;top:0;left:0;width:24px;height:24px;border:none;padding:0;margin:0;background-image:url(./img/jsoneditor-icons.svg)}.jsoneditor-contextmenu .jsoneditor-text{padding:4px 0 4px 24px;word-wrap:break-word}.jsoneditor-contextmenu .jsoneditor-text.jsoneditor-right-margin{padding-right:24px}.jsoneditor-contextmenu .jsoneditor-separator{height:0;border-top:1px solid #e5e5e5;padding-top:5px;margin-top:5px}.jsoneditor-contextmenu button.jsoneditor-remove .jsoneditor-icon{background-position:-24px 0}.jsoneditor-contextmenu button.jsoneditor-append .jsoneditor-icon{background-position:0 0}.jsoneditor-contextmenu button.jsoneditor-insert .jsoneditor-icon{background-position:0 0}.jsoneditor-contextmenu button.jsoneditor-duplicate .jsoneditor-icon{background-position:-48px 0}.jsoneditor-contextmenu button.jsoneditor-sort-asc .jsoneditor-icon{background-position:-168px 0}.jsoneditor-contextmenu button.jsoneditor-sort-desc .jsoneditor-icon{background-position:-192px 0}.jsoneditor-contextmenu button.jsoneditor-transform .jsoneditor-icon{background-position:-216px 0}.jsoneditor-contextmenu button.jsoneditor-extract .jsoneditor-icon{background-position:0 -24px}.jsoneditor-contextmenu button.jsoneditor-type-string .jsoneditor-icon{background-position:-144px 0}.jsoneditor-contextmenu button.jsoneditor-type-auto .jsoneditor-icon{background-position:-120px 0}.jsoneditor-contextmenu button.jsoneditor-type-object .jsoneditor-icon{background-position:-72px 0}.jsoneditor-contextmenu button.jsoneditor-type-array .jsoneditor-icon{background-position:-96px 0}.jsoneditor-contextmenu button.jsoneditor-type-modes .jsoneditor-icon{background-image:none;width:6px}.jsoneditor-contextmenu li,.jsoneditor-contextmenu ul{box-sizing:content-box;position:relative}.jsoneditor-contextmenu .jsoneditor-menu button:focus,.jsoneditor-contextmenu .jsoneditor-menu button:hover{color:#1a1a1a;background-color:#f5f5f5;outline:0}.jsoneditor-contextmenu .jsoneditor-menu li button.jsoneditor-selected,.jsoneditor-contextmenu .jsoneditor-menu li button.jsoneditor-selected:focus,.jsoneditor-contextmenu .jsoneditor-menu li button.jsoneditor-selected:hover{color:#fff;background-color:#ee422e}.jsoneditor-contextmenu .jsoneditor-menu li ul li button:focus,.jsoneditor-contextmenu .jsoneditor-menu li ul li button:hover{background-color:#f5f5f5}.jsoneditor-modal{max-width:95%;border-radius:2px!important;padding:45px 15px 15px 15px!important;box-shadow:2px 2px 12px rgba(128,128,128,.3);color:#4d4d4d;line-height:1.3em}.jsoneditor-modal.jsoneditor-modal-transform{width:600px!important}.jsoneditor-modal .pico-modal-header{position:absolute;box-sizing:border-box;top:0;left:0;width:100%;padding:0 10px;height:30px;line-height:30px;font-family:arial,sans-serif;font-size:11pt;background:#3883fa;color:#fff}.jsoneditor-modal table{width:100%}.jsoneditor-modal table td{padding:3px 0}.jsoneditor-modal table td.jsoneditor-modal-input{text-align:right;padding-right:0;white-space:nowrap}.jsoneditor-modal table td.jsoneditor-modal-actions{padding-top:15px}.jsoneditor-modal table th{vertical-align:middle}.jsoneditor-modal p:first-child{margin-top:0}.jsoneditor-modal a{color:#3883fa}.jsoneditor-modal .jsoneditor-jmespath-block{margin-bottom:10px}.jsoneditor-modal .pico-close{background:0 0!important;font-size:24px!important;top:7px!important;right:7px!important;color:#fff}.jsoneditor-modal input{padding:4px}.jsoneditor-modal input[type=text]{cursor:inherit}.jsoneditor-modal input[disabled]{background:#d3d3d3;color:grey}.jsoneditor-modal .jsoneditor-select-wrapper{position:relative;display:inline-block}.jsoneditor-modal .jsoneditor-select-wrapper:after{content:"";width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid #666;position:absolute;right:8px;top:14px;pointer-events:none}.jsoneditor-modal select{padding:3px 24px 3px 10px;min-width:180px;max-width:350px;-webkit-appearance:none;-moz-appearance:none;appearance:none;text-indent:0;text-overflow:"";font-size:14px;line-height:1.5em}.jsoneditor-modal select::-ms-expand{display:none}.jsoneditor-modal .jsoneditor-button-group input{padding:4px 10px;margin:0;border-radius:0;border-left-style:none}.jsoneditor-modal .jsoneditor-button-group input.jsoneditor-button-first{border-top-left-radius:3px;border-bottom-left-radius:3px;border-left-style:solid}.jsoneditor-modal .jsoneditor-button-group input.jsoneditor-button-last{border-top-right-radius:3px;border-bottom-right-radius:3px}.jsoneditor-modal .jsoneditor-transform-preview{background:#f5f5f5;height:200px}.jsoneditor-modal .jsoneditor-transform-preview.jsoneditor-error{color:#ee422e}.jsoneditor-modal .jsoneditor-jmespath-wizard{line-height:1.2em;width:100%;padding:0;border-radius:3px}.jsoneditor-modal .jsoneditor-jmespath-label{font-weight:700;color:#1e90ff;margin-top:20px;margin-bottom:5px}.jsoneditor-modal .jsoneditor-jmespath-wizard-table{width:100%;border-collapse:collapse}.jsoneditor-modal .jsoneditor-jmespath-wizard-label{font-style:italic;margin:4px 0 2px 0}.jsoneditor-modal .jsoneditor-inline{position:relative;display:inline-block;width:100%;padding-top:2px;padding-bottom:2px}.jsoneditor-modal .jsoneditor-inline:not(:last-child){padding-right:2px}.jsoneditor-modal .jsoneditor-jmespath-filter{display:flex;flex-wrap:wrap}.jsoneditor-modal .jsoneditor-jmespath-filter-field{width:180px}.jsoneditor-modal .jsoneditor-jmespath-filter-relation{width:100px}.jsoneditor-modal .jsoneditor-jmespath-filter-value{min-width:180px;flex:1}.jsoneditor-modal .jsoneditor-jmespath-sort-field{width:170px}.jsoneditor-modal .jsoneditor-jmespath-sort-order{width:150px}.jsoneditor-modal .jsoneditor-jmespath-select-fields{width:100%}.jsoneditor-modal .selectr-selected{border-color:#d3d3d3;padding:4px 28px 4px 8px}.jsoneditor-modal .selectr-selected .selectr-tag{background-color:#3883fa;border-radius:5px}.jsoneditor-modal table td,.jsoneditor-modal table th{text-align:left;vertical-align:middle;font-weight:400;color:#4d4d4d;border-spacing:0;border-collapse:collapse}.jsoneditor-modal #query,.jsoneditor-modal input,.jsoneditor-modal input[type=text],.jsoneditor-modal input[type=text]:focus,.jsoneditor-modal select,.jsoneditor-modal textarea{background:#fff;border:1px solid #d3d3d3;color:#4d4d4d;border-radius:3px;padding:4px}.jsoneditor-modal #query,.jsoneditor-modal textarea{border-radius:unset}.jsoneditor-modal,.jsoneditor-modal #query,.jsoneditor-modal input,.jsoneditor-modal input[type=text],.jsoneditor-modal option,.jsoneditor-modal select,.jsoneditor-modal table td,.jsoneditor-modal table th,.jsoneditor-modal textarea{font-size:10.5pt;font-family:arial,sans-serif}.jsoneditor-modal #query,.jsoneditor-modal .jsoneditor-transform-preview{font-family:consolas,menlo,monaco,"Ubuntu Mono",source-code-pro,monospace;font-size:14px;width:100%;box-sizing:border-box}.jsoneditor-modal input[type=button],.jsoneditor-modal input[type=submit]{background:#f5f5f5;padding:4px 20px}.jsoneditor-modal input,.jsoneditor-modal select{cursor:pointer}.jsoneditor-modal .jsoneditor-button-group.jsoneditor-button-group-value-asc input.jsoneditor-button-asc,.jsoneditor-modal .jsoneditor-button-group.jsoneditor-button-group-value-desc input.jsoneditor-button-desc{background:#3883fa;border-color:#3883fa;color:#fff}.jsoneditor{color:#1a1a1a;border:thin solid #3883fa;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:100%;position:relative;padding:0;line-height:100%}a.jsoneditor-value,div.jsoneditor-default,div.jsoneditor-field,div.jsoneditor-readonly,div.jsoneditor-value{border:1px solid transparent;min-height:16px;min-width:32px;line-height:16px;padding:2px;margin:1px;word-wrap:break-word;word-break:break-word;overflow-wrap:break-word;float:left}div.jsoneditor-field p,div.jsoneditor-value p{margin:0}div.jsoneditor-value.jsoneditor-empty::after{content:"value"}div.jsoneditor-value.jsoneditor-string{color:#006000}div.jsoneditor-value.jsoneditor-number{color:#ee422e}div.jsoneditor-value.jsoneditor-boolean{color:#ff8c00}div.jsoneditor-value.jsoneditor-null{color:#004ed0}div.jsoneditor-value.jsoneditor-color-value{color:#1a1a1a}div.jsoneditor-value.jsoneditor-invalid{color:#1a1a1a}div.jsoneditor-readonly{min-width:16px;color:grey}div.jsoneditor-empty{border-color:#d3d3d3;border-style:dashed;border-radius:2px}div.jsoneditor-field.jsoneditor-empty::after{content:"field"}div.jsoneditor td{vertical-align:top}div.jsoneditor td.jsoneditor-separator{padding:3px 0;vertical-align:top;color:grey}div.jsoneditor td.jsoneditor-tree{vertical-align:top}div.jsoneditor.busy pre.jsoneditor-preview{background:#f5f5f5;color:grey}div.jsoneditor.busy div.jsoneditor-busy{display:inherit}div.jsoneditor code.jsoneditor-preview{background:0 0}div.jsoneditor.jsoneditor-mode-preview pre.jsoneditor-preview{width:100%;height:100%;box-sizing:border-box;overflow:auto;padding:2px;margin:0;white-space:pre-wrap;word-break:break-all}div.jsoneditor-default{color:grey;padding-left:10px}div.jsoneditor-tree{width:100%;height:100%;position:relative;overflow:auto;background:#fff}div.jsoneditor-tree button.jsoneditor-button{width:24px;height:24px;padding:0;margin:0;border:none;cursor:pointer;background-color:transparent;background-image:url(./img/jsoneditor-icons.svg)}div.jsoneditor-tree button.jsoneditor-button:focus{background-color:#f5f5f5;outline:#e5e5e5 solid 1px}div.jsoneditor-tree button.jsoneditor-collapsed{background-position:0 -48px}div.jsoneditor-tree button.jsoneditor-expanded{background-position:0 -72px}div.jsoneditor-tree button.jsoneditor-contextmenu-button{background-position:-48px -72px}div.jsoneditor-tree button.jsoneditor-invisible{visibility:hidden;background:0 0}div.jsoneditor-tree button.jsoneditor-dragarea{background-image:url(./img/jsoneditor-icons.svg);background-position:-72px -72px;cursor:move}div.jsoneditor-tree :focus{outline:0}div.jsoneditor-tree div.jsoneditor-show-more{display:inline-block;padding:3px 4px;margin:2px 0;background-color:#e5e5e5;border-radius:3px;color:grey;font-family:arial,sans-serif;font-size:14px}div.jsoneditor-tree div.jsoneditor-show-more a{display:inline-block;color:grey}div.jsoneditor-tree div.jsoneditor-color{display:inline-block;width:12px;height:12px;margin:4px;border:1px solid grey;cursor:pointer}div.jsoneditor-tree div.jsoneditor-color.jsoneditor-color-readonly{cursor:inherit}div.jsoneditor-tree div.jsoneditor-date{background:#a1a1a1;color:#fff;font-family:arial,sans-serif;border-radius:3px;display:inline-block;padding:3px;margin:0 3px}div.jsoneditor-tree table.jsoneditor-tree{border-collapse:collapse;border-spacing:0;width:100%}div.jsoneditor-tree .jsoneditor-button{display:block}div.jsoneditor-tree .jsoneditor-button.jsoneditor-schema-error{width:24px;height:24px;padding:0;margin:0 4px 0 0;background-image:url(./img/jsoneditor-icons.svg);background-position:-168px -48px;background-color:transparent}div.jsoneditor-outer{position:static;width:100%;height:100%;margin:0;padding:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}div.jsoneditor-outer.has-nav-bar{margin-top:-26px;padding-top:26px}div.jsoneditor-outer.has-nav-bar.has-main-menu-bar{margin-top:-61px;padding-top:61px}div.jsoneditor-outer.has-status-bar{margin-bottom:-26px;padding-bottom:26px}div.jsoneditor-outer.has-main-menu-bar{margin-top:-35px;padding-top:35px}div.jsoneditor-busy{position:absolute;top:15%;left:0;box-sizing:border-box;width:100%;text-align:center;display:none}div.jsoneditor-busy span{background-color:#ffffab;border:1px solid #fe0;border-radius:3px;padding:5px 15px;box-shadow:0 0 5px rgba(0,0,0,.4)}div.jsoneditor-field.jsoneditor-empty::after,div.jsoneditor-value.jsoneditor-empty::after{pointer-events:none;color:#d3d3d3;font-size:8pt}a.jsoneditor-value.jsoneditor-url,div.jsoneditor-value.jsoneditor-url{color:#006000;text-decoration:underline}a.jsoneditor-value.jsoneditor-url{display:inline-block;padding:2px;margin:2px}a.jsoneditor-value.jsoneditor-url:focus,a.jsoneditor-value.jsoneditor-url:hover{color:#ee422e}div.jsoneditor-field.jsoneditor-highlight,div.jsoneditor-field[contenteditable=true]:focus,div.jsoneditor-field[contenteditable=true]:hover,div.jsoneditor-value.jsoneditor-highlight,div.jsoneditor-value[contenteditable=true]:focus,div.jsoneditor-value[contenteditable=true]:hover{background-color:#ffffab;border:1px solid #fe0;border-radius:2px}div.jsoneditor-field.jsoneditor-highlight-active,div.jsoneditor-field.jsoneditor-highlight-active:focus,div.jsoneditor-field.jsoneditor-highlight-active:hover,div.jsoneditor-value.jsoneditor-highlight-active,div.jsoneditor-value.jsoneditor-highlight-active:focus,div.jsoneditor-value.jsoneditor-highlight-active:hover{background-color:#fe0;border:1px solid #ffc700;border-radius:2px}div.jsoneditor-value.jsoneditor-array,div.jsoneditor-value.jsoneditor-object{min-width:16px}div.jsoneditor-tree button.jsoneditor-contextmenu-button.jsoneditor-selected,div.jsoneditor-tree button.jsoneditor-contextmenu-button:focus,div.jsoneditor-tree button.jsoneditor-contextmenu-button:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu-button{background-position:-48px -48px}div.jsoneditor-tree div.jsoneditor-show-more a:focus,div.jsoneditor-tree div.jsoneditor-show-more a:hover{color:#ee422e}.ace-jsoneditor,textarea.jsoneditor-text{min-height:150px}.ace-jsoneditor.ace_editor,textarea.jsoneditor-text.ace_editor{font-family:consolas,menlo,monaco,"Ubuntu Mono",source-code-pro,monospace}textarea.jsoneditor-text{width:100%;height:100%;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;outline-width:0;border:none;background-color:#fff;resize:none}tr.jsoneditor-highlight,tr.jsoneditor-selected{background-color:#d3d3d3}tr.jsoneditor-selected button.jsoneditor-contextmenu-button,tr.jsoneditor-selected button.jsoneditor-dragarea{visibility:hidden}tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu-button,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{visibility:visible}div.jsoneditor-tree button.jsoneditor-dragarea:focus,div.jsoneditor-tree button.jsoneditor-dragarea:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{background-position:-72px -48px}div.jsoneditor td,div.jsoneditor th,div.jsoneditor tr{padding:0;margin:0}.jsoneditor-popover,.jsoneditor-schema-error,div.jsoneditor td,div.jsoneditor textarea,div.jsoneditor th,div.jsoneditor-field,div.jsoneditor-value,pre.jsoneditor-preview{font-family:consolas,menlo,monaco,"Ubuntu Mono",source-code-pro,monospace;font-size:14px;color:#1a1a1a}.jsoneditor-schema-error{cursor:default;display:inline-block;height:24px;line-height:24px;position:relative;text-align:center;width:24px}.jsoneditor-popover{background-color:#4c4c4c;border-radius:3px;box-shadow:0 0 5px rgba(0,0,0,.4);color:#fff;padding:7px 10px;position:absolute;cursor:auto;width:200px}.jsoneditor-popover.jsoneditor-above{bottom:32px;left:-98px}.jsoneditor-popover.jsoneditor-above:before{border-top:7px solid #4c4c4c;bottom:-7px}.jsoneditor-popover.jsoneditor-below{top:32px;left:-98px}.jsoneditor-popover.jsoneditor-below:before{border-bottom:7px solid #4c4c4c;top:-7px}.jsoneditor-popover.jsoneditor-left{top:-7px;right:32px}.jsoneditor-popover.jsoneditor-left:before{border-left:7px solid #4c4c4c;border-top:7px solid transparent;border-bottom:7px solid transparent;content:"";top:19px;right:-14px;left:inherit;margin-left:inherit;margin-top:-7px;position:absolute}.jsoneditor-popover.jsoneditor-right{top:-7px;left:32px}.jsoneditor-popover.jsoneditor-right:before{border-right:7px solid #4c4c4c;border-top:7px solid transparent;border-bottom:7px solid transparent;content:"";top:19px;left:-14px;margin-left:inherit;margin-top:-7px;position:absolute}.jsoneditor-popover:before{border-right:7px solid transparent;border-left:7px solid transparent;content:"";display:block;left:50%;margin-left:-7px;position:absolute}.jsoneditor-text-errors tr.jump-to-line:hover{text-decoration:underline;cursor:pointer}.jsoneditor-schema-error:focus .jsoneditor-popover,.jsoneditor-schema-error:hover .jsoneditor-popover{display:block;animation:fade-in .3s linear 1,move-up .3s linear 1}@keyframes fade-in{from{opacity:0}to{opacity:1}}.jsoneditor .jsoneditor-validation-errors-container{max-height:130px;overflow-y:auto}.jsoneditor .jsoneditor-validation-errors{width:100%;overflow:hidden}.jsoneditor .jsoneditor-additional-errors{position:absolute;margin:auto;bottom:31px;left:calc(50% - 92px);color:grey;background-color:#ebebeb;padding:7px 15px;border-radius:8px}.jsoneditor .jsoneditor-additional-errors.visible{visibility:visible;opacity:1;transition:opacity 2s linear}.jsoneditor .jsoneditor-additional-errors.hidden{visibility:hidden;opacity:0;transition:visibility 0s 2s,opacity 2s linear}.jsoneditor .jsoneditor-text-errors{width:100%;border-collapse:collapse;border-top:1px solid #ffc700}.jsoneditor .jsoneditor-text-errors td{padding:3px 6px;vertical-align:middle}.jsoneditor .jsoneditor-text-errors td pre{margin:0;white-space:pre-wrap}.jsoneditor .jsoneditor-text-errors tr{background-color:#ffffab}.jsoneditor .jsoneditor-text-errors tr.parse-error{background-color:rgba(238,46,46,.4392156863)}.jsoneditor-text-errors .jsoneditor-schema-error{border:none;width:24px;height:24px;padding:0;margin:0 4px 0 0;cursor:pointer}.jsoneditor-text-errors tr .jsoneditor-schema-error{background-image:url(./img/jsoneditor-icons.svg);background-position:-168px -48px;background-color:transparent}.jsoneditor-text-errors tr.parse-error .jsoneditor-schema-error{background-image:url(./img/jsoneditor-icons.svg);background-position:-25px 0;background-color:transparent}.jsoneditor-anchor{cursor:pointer}.jsoneditor-anchor .picker_wrapper.popup.popup_bottom{top:28px;left:-10px}.fadein{-webkit-animation:fadein .3s;animation:fadein .3s;-moz-animation:fadein .3s;-o-animation:fadein .3s}@keyframes fadein{0%{opacity:0}100%{opacity:1}}.jsoneditor-modal input[type=search].selectr-input{border:1px solid #d3d3d3;width:calc(100% - 4px);margin:2px;padding:4px;box-sizing:border-box}.jsoneditor-modal button.selectr-input-clear{right:8px}.jsoneditor-menu{width:100%;height:35px;padding:2px;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;background-color:#3883fa;border-bottom:1px solid #3883fa}.jsoneditor-menu>.jsoneditor-modes>button,.jsoneditor-menu>button{width:26px;height:26px;margin:2px;padding:0;border-radius:2px;border:1px solid transparent;background-color:transparent;background-image:url(./img/jsoneditor-icons.svg);color:#fff;opacity:.8;font-family:arial,sans-serif;font-size:14px;float:left}.jsoneditor-menu>.jsoneditor-modes>button:hover,.jsoneditor-menu>button:hover{background-color:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.4)}.jsoneditor-menu>.jsoneditor-modes>button:active,.jsoneditor-menu>.jsoneditor-modes>button:focus,.jsoneditor-menu>button:active,.jsoneditor-menu>button:focus{background-color:rgba(255,255,255,.3)}.jsoneditor-menu>.jsoneditor-modes>button:disabled,.jsoneditor-menu>button:disabled{opacity:.5;background-color:transparent;border:none}.jsoneditor-menu>button.jsoneditor-collapse-all{background-position:0 -96px}.jsoneditor-menu>button.jsoneditor-expand-all{background-position:0 -120px}.jsoneditor-menu>button.jsoneditor-sort{background-position:-120px -96px}.jsoneditor-menu>button.jsoneditor-transform{background-position:-144px -96px}.jsoneditor.jsoneditor-mode-form>.jsoneditor-menu>button.jsoneditor-sort,.jsoneditor.jsoneditor-mode-form>.jsoneditor-menu>button.jsoneditor-transform,.jsoneditor.jsoneditor-mode-view>.jsoneditor-menu>button.jsoneditor-sort,.jsoneditor.jsoneditor-mode-view>.jsoneditor-menu>button.jsoneditor-transform{display:none}.jsoneditor-menu>button.jsoneditor-undo{background-position:-24px -96px}.jsoneditor-menu>button.jsoneditor-undo:disabled{background-position:-24px -120px}.jsoneditor-menu>button.jsoneditor-redo{background-position:-48px -96px}.jsoneditor-menu>button.jsoneditor-redo:disabled{background-position:-48px -120px}.jsoneditor-menu>button.jsoneditor-compact{background-position:-72px -96px}.jsoneditor-menu>button.jsoneditor-format{background-position:-72px -120px}.jsoneditor-menu>button.jsoneditor-repair{background-position:-96px -96px}.jsoneditor-menu>.jsoneditor-modes{display:inline-block;float:left}.jsoneditor-menu>.jsoneditor-modes>button{background-image:none;width:auto;padding-left:6px;padding-right:6px}.jsoneditor-menu>.jsoneditor-modes>button.jsoneditor-separator,.jsoneditor-menu>button.jsoneditor-separator{margin-left:10px}.jsoneditor-menu a{font-family:arial,sans-serif;font-size:14px;color:#fff;opacity:.8;vertical-align:middle}.jsoneditor-menu a:hover{opacity:1}.jsoneditor-menu a.jsoneditor-poweredBy{font-size:8pt;position:absolute;right:0;top:0;padding:10px}.jsoneditor-navigation-bar{width:100%;height:26px;line-height:26px;padding:0;margin:0;border-bottom:1px solid #d3d3d3;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:grey;background-color:#ebebeb;overflow:hidden;font-family:arial,sans-serif;font-size:14px}.jsoneditor-search{font-family:arial,sans-serif;position:absolute;right:4px;top:4px;border-collapse:collapse;border-spacing:0;display:flex}.jsoneditor-search input{color:#1a1a1a;width:120px;border:none;outline:0;margin:1px;line-height:20px;font-family:arial,sans-serif}.jsoneditor-search button{width:16px;height:24px;padding:0;margin:0;border:none;background:url(./img/jsoneditor-icons.svg);vertical-align:top}.jsoneditor-search button:hover{background-color:transparent}.jsoneditor-search button.jsoneditor-refresh{width:18px;background-position:-99px -73px}.jsoneditor-search button.jsoneditor-next{cursor:pointer;background-position:-124px -73px}.jsoneditor-search button.jsoneditor-next:hover{background-position:-124px -49px}.jsoneditor-search button.jsoneditor-previous{cursor:pointer;background-position:-148px -73px;margin-right:2px}.jsoneditor-search button.jsoneditor-previous:hover{background-position:-148px -49px}.jsoneditor-results{font-family:arial,sans-serif;color:#fff;padding-right:5px;line-height:26px}.jsoneditor-frame{border:1px solid transparent;background-color:#fff;padding:0 2px;margin:0}.jsoneditor-statusbar{line-height:26px;height:26px;color:grey;background-color:#ebebeb;border-top:1px solid #d3d3d3;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-size:14px}.jsoneditor-statusbar>.jsoneditor-curserinfo-val{margin-right:12px}.jsoneditor-statusbar>.jsoneditor-curserinfo-count{margin-left:4px}.jsoneditor-statusbar>.jsoneditor-validation-error-icon{float:right;width:24px;height:24px;padding:0;margin-top:1px;background-image:url(./img/jsoneditor-icons.svg);background-position:-168px -48px;cursor:pointer}.jsoneditor-statusbar>.jsoneditor-validation-error-count{float:right;margin:0 4px 0 0;cursor:pointer}.jsoneditor-statusbar>.jsoneditor-parse-error-icon{float:right;width:24px;height:24px;padding:0;margin:1px;background-image:url(./img/jsoneditor-icons.svg);background-position:-25px 0}.jsoneditor-statusbar .jsoneditor-array-info a{color:inherit}div.jsoneditor-statusbar>.jsoneditor-curserinfo-label,div.jsoneditor-statusbar>.jsoneditor-size-info{margin:0 4px}.jsoneditor-treepath{padding:0 5px;overflow:hidden;white-space:nowrap;outline:0}.jsoneditor-treepath.show-all{word-wrap:break-word;white-space:normal;position:absolute;background-color:#ebebeb;z-index:1;box-shadow:2px 2px 12px rgba(128,128,128,.3)}.jsoneditor-treepath.show-all span.jsoneditor-treepath-show-all-btn{display:none}.jsoneditor-treepath div.jsoneditor-contextmenu-root{position:absolute;left:0}.jsoneditor-treepath .jsoneditor-treepath-show-all-btn{position:absolute;background-color:#ebebeb;left:0;height:20px;padding:0 3px;cursor:pointer}.jsoneditor-treepath .jsoneditor-treepath-element{margin:1px;font-family:arial,sans-serif;font-size:14px}.jsoneditor-treepath .jsoneditor-treepath-seperator{margin:2px;font-size:9pt;font-family:arial,sans-serif}.jsoneditor-treepath span.jsoneditor-treepath-element:hover,.jsoneditor-treepath span.jsoneditor-treepath-seperator:hover{cursor:pointer;text-decoration:underline}/*! 2 | * Selectr 2.4.13 3 | * http://mobius.ovh/docs/selectr 4 | * 5 | * Released under the MIT license 6 | */.selectr-container{position:relative}.selectr-container li{list-style:none}.selectr-hidden{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px;margin:-1px;padding:0;border:0 none}.selectr-visible{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;z-index:11}.selectr-desktop.multiple .selectr-visible{display:none}.selectr-desktop.multiple.native-open .selectr-visible{top:100%;min-height:200px!important;height:auto;opacity:1;display:block}.selectr-container.multiple.selectr-mobile .selectr-selected{z-index:0}.selectr-selected{position:relative;z-index:1;box-sizing:border-box;width:100%;padding:7px 28px 7px 14px;cursor:pointer;border:1px solid #999;border-radius:3px;background-color:#fff}.selectr-selected::before{position:absolute;top:50%;right:10px;width:0;height:0;content:"";-o-transform:rotate(0) translate3d(0,-50%,0);-ms-transform:rotate(0) translate3d(0,-50%,0);-moz-transform:rotate(0) translate3d(0,-50%,0);-webkit-transform:rotate(0) translate3d(0,-50%,0);transform:rotate(0) translate3d(0,-50%,0);border-width:4px 4px 0 4px;border-style:solid;border-color:#6c7a86 transparent transparent}.selectr-container.native-open .selectr-selected::before,.selectr-container.open .selectr-selected::before{border-width:0 4px 4px 4px;border-style:solid;border-color:transparent transparent #6c7a86}.selectr-label{display:none;overflow:hidden;width:100%;white-space:nowrap;text-overflow:ellipsis}.selectr-placeholder{color:#6c7a86}.selectr-tags{margin:0;padding:0;white-space:normal}.has-selected .selectr-tags{margin:0 0 -2px}.selectr-tag{list-style:none;position:relative;float:left;padding:2px 25px 2px 8px;margin:0 2px 2px 0;cursor:default;color:#fff;border:medium none;border-radius:10px;background:#acb7bf none repeat scroll 0 0}.selectr-container.multiple.has-selected .selectr-selected{padding:5px 28px 5px 5px}.selectr-options-container{position:absolute;z-index:10000;top:calc(100% - 1px);left:0;display:none;box-sizing:border-box;width:100%;border-width:0 1px 1px;border-style:solid;border-color:transparent #999 #999;border-radius:0 0 3px 3px;background-color:#fff}.selectr-container.open .selectr-options-container{display:block}.selectr-input-container{position:relative;display:none}.selectr-clear,.selectr-input-clear,.selectr-tag-remove{position:absolute;top:50%;right:22px;width:20px;height:20px;padding:0;cursor:pointer;-o-transform:translate3d(0,-50%,0);-ms-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0);border:medium none;background-color:transparent;z-index:11}.selectr-clear,.selectr-input-clear{display:none}.selectr-container.has-selected .selectr-clear,.selectr-input-container.active .selectr-input-clear{display:block}.selectr-selected .selectr-tag-remove{right:2px}.selectr-clear::after,.selectr-clear::before,.selectr-input-clear::after,.selectr-input-clear::before,.selectr-tag-remove::after,.selectr-tag-remove::before{position:absolute;top:5px;left:9px;width:2px;height:10px;content:" ";background-color:#6c7a86}.selectr-tag-remove::after,.selectr-tag-remove::before{top:4px;width:3px;height:12px;background-color:#fff}.selectr-clear:before,.selectr-input-clear::before,.selectr-tag-remove::before{-o-transform:rotate(45deg);-ms-transform:rotate(45deg);-moz-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg)}.selectr-clear:after,.selectr-input-clear::after,.selectr-tag-remove::after{-o-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.selectr-input-container.active,.selectr-input-container.active .selectr-clear{display:block}.selectr-input{top:5px;left:5px;box-sizing:border-box;width:calc(100% - 30px);margin:10px 15px;padding:7px 30px 7px 9px;border:1px solid #999;border-radius:3px}.selectr-notice{display:none;box-sizing:border-box;width:100%;padding:8px 16px;border-top:1px solid #999;border-radius:0 0 3px 3px;background-color:#fff}.selectr-container.notice .selectr-notice{display:block}.selectr-container.notice .selectr-selected{border-radius:3px 3px 0 0}.selectr-options{position:relative;top:calc(100% + 2px);display:none;overflow-x:auto;overflow-y:scroll;max-height:200px;margin:0;padding:0}.selectr-container.notice .selectr-options-container,.selectr-container.open .selectr-input-container,.selectr-container.open .selectr-options{display:block}.selectr-option{position:relative;display:block;padding:5px 20px;list-style:outside none none;cursor:pointer;font-weight:400}.selectr-options.optgroups>.selectr-option{padding-left:25px}.selectr-optgroup{font-weight:700;padding:0}.selectr-optgroup--label{font-weight:700;margin-top:10px;padding:5px 15px}.selectr-match{text-decoration:underline}.selectr-option.selected{background-color:#ddd}.selectr-option.active{color:#fff;background-color:#5897fb}.selectr-option.disabled{opacity:.4}.selectr-option.excluded{display:none}.selectr-container.open .selectr-selected{border-color:#999 #999 transparent #999;border-radius:3px 3px 0 0}.selectr-container.open .selectr-selected::after{-o-transform:rotate(180deg) translate3d(0,50%,0);-ms-transform:rotate(180deg) translate3d(0,50%,0);-moz-transform:rotate(180deg) translate3d(0,50%,0);-webkit-transform:rotate(180deg) translate3d(0,50%,0);transform:rotate(180deg) translate3d(0,50%,0)}.selectr-disabled{opacity:.6}.has-selected .selectr-placeholder,.selectr-empty{display:none}.has-selected .selectr-label{display:block}.taggable .selectr-selected{padding:4px 28px 4px 4px}.taggable .selectr-selected::after{display:table;content:" ";clear:both}.taggable .selectr-label{width:auto}.taggable .selectr-tags{float:left;display:block}.taggable .selectr-placeholder{display:none}.input-tag{float:left;min-width:90px;width:auto}.selectr-tag-input{border:medium none;padding:3px 10px;width:100%;font-family:inherit;font-weight:inherit;font-size:inherit}.selectr-input-container.loading::after{position:absolute;top:50%;right:20px;width:20px;height:20px;content:"";-o-transform:translate3d(0,-50%,0);-ms-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0);-o-transform-origin:50% 0 0;-ms-transform-origin:50% 0 0;-moz-transform-origin:50% 0 0;-webkit-transform-origin:50% 0 0;transform-origin:50% 0 0;-moz-animation:.5s linear 0s normal forwards infinite running selectr-spin;-webkit-animation:.5s linear 0s normal forwards infinite running selectr-spin;animation:.5s linear 0s normal forwards infinite running selectr-spin;border-width:3px;border-style:solid;border-color:#aaa #ddd #ddd;border-radius:50%}@-webkit-keyframes selectr-spin{0%{-webkit-transform:rotate(0) translate3d(0,-50%,0);transform:rotate(0) translate3d(0,-50%,0)}100%{-webkit-transform:rotate(360deg) translate3d(0,-50%,0);transform:rotate(360deg) translate3d(0,-50%,0)}}@keyframes selectr-spin{0%{-webkit-transform:rotate(0) translate3d(0,-50%,0);transform:rotate(0) translate3d(0,-50%,0)}100%{-webkit-transform:rotate(360deg) translate3d(0,-50%,0);transform:rotate(360deg) translate3d(0,-50%,0)}}.selectr-container.open.inverted .selectr-selected{border-color:transparent #999 #999;border-radius:0 0 3px 3px}.selectr-container.inverted .selectr-options-container{border-width:1px 1px 0;border-color:#999 #999 transparent;border-radius:3px 3px 0 0;background-color:#fff}.selectr-container.inverted .selectr-options-container{top:auto;bottom:calc(100% - 1px)}.selectr-container ::-webkit-input-placeholder{color:#6c7a86;opacity:1}.selectr-container ::-moz-placeholder{color:#6c7a86;opacity:1}.selectr-container :-ms-input-placeholder{color:#6c7a86;opacity:1}.selectr-container ::placeholder{color:#6c7a86;opacity:1} -------------------------------------------------------------------------------- /app/webapp/toncoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/app/webapp/toncoin.png -------------------------------------------------------------------------------- /app/zapretlists/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/app/zapretlists/.gitkeep -------------------------------------------------------------------------------- /certs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/certs/.gitkeep -------------------------------------------------------------------------------- /config/.profile: -------------------------------------------------------------------------------- 1 | export LANG=ru_RU.utf8 2 | 3 | alias ls='ls $LS_OPTIONS' 4 | alias ll='ls -lah' 5 | 6 | 7 | PS1='[\[\e[0;94m\]\u\[\e[0;37m\]@\[\e[0;31m\]\h\[\e[0;36m\] $PWD\[\e[0;37m\]]\$\[\e[0m\] ' 8 | 9 | export LS_OPTIONS='--color=auto' 10 | 11 | case "$TERM" in 12 | xterm*|rxvt*) 13 | PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" 14 | ;; 15 | *) 16 | ;; 17 | esac 18 | -------------------------------------------------------------------------------- /config/AdGuardHome.yaml: -------------------------------------------------------------------------------- 1 | http: 2 | address: 0.0.0.0:80 3 | users: 4 | - name: admin 5 | password: 6 | dns: 7 | bind_hosts: 8 | - 0.0.0.0 9 | upstream_dns: 10 | - 1.1.1.1 11 | - 8.8.8.8 12 | trusted_proxies: 13 | - 10.10.0.0/24 14 | - 127.0.0.0/8 15 | - ::1/128 16 | tls: 17 | certificate_path: /certs/cert_public 18 | private_key_path: /certs/cert_private 19 | filtering: 20 | safe_search: 21 | enabled: false 22 | log: 23 | file: /logs/adguard 24 | -------------------------------------------------------------------------------- /config/Caddyfile: -------------------------------------------------------------------------------- 1 | { 2 | order forward_proxy before file_server 3 | servers { 4 | listener_wrappers { 5 | proxy_protocol 6 | tls 7 | } 8 | } 9 | } 10 | 11 | :443 { 12 | tls /certs/cert_public /certs/cert_private 13 | forward_proxy { 14 | basic_auth _ __ 15 | hide_ip 16 | hide_via 17 | probe_resistance 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /config/Makefile: -------------------------------------------------------------------------------- 1 | OBJ = objs 2 | DEP = dep 3 | EXE = ${OBJ}/bin 4 | 5 | COMMIT := $(shell git log -1 --pretty=format:"%H") 6 | 7 | ARCH = 8 | ifeq ($m, 32) 9 | ARCH = -m32 10 | endif 11 | ifeq ($m, 64) 12 | ARCH = -m64 13 | endif 14 | 15 | CFLAGS = $(ARCH) -O3 -std=gnu11 -Wall -mpclmul -march=core2 -mfpmath=sse -mssse3 -fno-strict-aliasing -fno-strict-overflow -fwrapv -DAES=1 -DCOMMIT=\"${COMMIT}\" -D_GNU_SOURCE=1 -D_FILE_OFFSET_BITS=64 -fcommon 16 | LDFLAGS = $(ARCH) -ggdb -rdynamic -lm -lrt -lcrypto -lz -lpthread -lcrypto 17 | 18 | LIB = ${OBJ}/lib 19 | CINCLUDE = -iquote common -iquote . 20 | 21 | LIBLIST = ${LIB}/libkdb.a 22 | 23 | PROJECTS = common jobs mtproto net crypto engine 24 | 25 | OBJDIRS := ${OBJ} $(addprefix ${OBJ}/,${PROJECTS}) ${EXE} ${LIB} 26 | DEPDIRS := ${DEP} $(addprefix ${DEP}/,${PROJECTS}) 27 | ALLDIRS := ${DEPDIRS} ${OBJDIRS} 28 | 29 | 30 | .PHONY: all clean 31 | 32 | EXELIST := ${EXE}/mtproto-proxy 33 | 34 | 35 | OBJECTS = \ 36 | ${OBJ}/mtproto/mtproto-proxy.o ${OBJ}/mtproto/mtproto-config.o ${OBJ}/net/net-tcp-rpc-ext-server.o 37 | 38 | DEPENDENCE_CXX := $(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${OBJECTS_CXX})) 39 | DEPENDENCE_STRANGE := $(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${OBJECTS_STRANGE})) 40 | DEPENDENCE_NORM := $(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${OBJECTS})) 41 | 42 | LIB_OBJS_NORMAL := \ 43 | ${OBJ}/common/crc32c.o \ 44 | ${OBJ}/common/pid.o \ 45 | ${OBJ}/common/sha1.o \ 46 | ${OBJ}/common/sha256.o \ 47 | ${OBJ}/common/md5.o \ 48 | ${OBJ}/common/resolver.o \ 49 | ${OBJ}/common/parse-config.o \ 50 | ${OBJ}/crypto/aesni256.o \ 51 | ${OBJ}/jobs/jobs.o ${OBJ}/common/mp-queue.o \ 52 | ${OBJ}/net/net-events.o ${OBJ}/net/net-msg.o ${OBJ}/net/net-msg-buffers.o \ 53 | ${OBJ}/net/net-config.o ${OBJ}/net/net-crypto-aes.o ${OBJ}/net/net-crypto-dh.o ${OBJ}/net/net-timers.o \ 54 | ${OBJ}/net/net-connections.o \ 55 | ${OBJ}/net/net-rpc-targets.o \ 56 | ${OBJ}/net/net-tcp-connections.o ${OBJ}/net/net-tcp-rpc-common.o ${OBJ}/net/net-tcp-rpc-client.o ${OBJ}/net/net-tcp-rpc-server.o \ 57 | ${OBJ}/net/net-http-server.o \ 58 | ${OBJ}/common/tl-parse.o ${OBJ}/common/common-stats.o \ 59 | ${OBJ}/engine/engine.o ${OBJ}/engine/engine-signals.o \ 60 | ${OBJ}/engine/engine-net.o \ 61 | ${OBJ}/engine/engine-rpc.o \ 62 | ${OBJ}/engine/engine-rpc-common.o \ 63 | ${OBJ}/net/net-thread.o ${OBJ}/net/net-stats.o ${OBJ}/common/proc-stat.o \ 64 | ${OBJ}/common/kprintf.o \ 65 | ${OBJ}/common/precise-time.o ${OBJ}/common/cpuid.o \ 66 | ${OBJ}/common/server-functions.o ${OBJ}/common/crc32.o \ 67 | 68 | LIB_OBJS := ${LIB_OBJS_NORMAL} 69 | 70 | DEPENDENCE_LIB := $(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${LIB_OBJS})) 71 | 72 | DEPENDENCE_ALL := ${DEPENDENCE_NORM} ${DEPENDENCE_STRANGE} ${DEPENDENCE_LIB} 73 | 74 | OBJECTS_ALL := ${OBJECTS} ${LIB_OBJS} 75 | 76 | all: ${ALLDIRS} ${EXELIST} 77 | dirs: ${ALLDIRS} 78 | create_dirs_and_headers: ${ALLDIRS} 79 | 80 | ${ALLDIRS}: 81 | @test -d $@ || mkdir -p $@ 82 | 83 | -include ${DEPENDENCE_ALL} 84 | 85 | ${OBJECTS}: ${OBJ}/%.o: %.c | create_dirs_and_headers 86 | ${CC} ${CFLAGS} ${CINCLUDE} -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $< 87 | 88 | ${LIB_OBJS_NORMAL}: ${OBJ}/%.o: %.c | create_dirs_and_headers 89 | ${CC} ${CFLAGS} -fpic ${CINCLUDE} -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $< 90 | 91 | ${EXELIST}: ${LIBLIST} 92 | 93 | ${EXE}/mtproto-proxy: ${OBJ}/mtproto/mtproto-proxy.o ${OBJ}/mtproto/mtproto-config.o ${OBJ}/net/net-tcp-rpc-ext-server.o 94 | ${CC} -o $@ $^ ${LIB}/libkdb.a ${LDFLAGS} 95 | 96 | ${LIB}/libkdb.a: ${LIB_OBJS} 97 | rm -f $@ && ar rcs $@ $^ 98 | 99 | clean: 100 | rm -rf ${OBJ} ${DEP} ${EXE} || true 101 | 102 | force-clean: clean 103 | -------------------------------------------------------------------------------- /config/clash.json: -------------------------------------------------------------------------------- 1 | { 2 | "mixed-port": 2080, 3 | "allow-lan": true, 4 | "tcp-concurrent": true, 5 | "enable-process": true, 6 | "find-process-mode": "strict", 7 | "global-client-fingerprint": "chrome", 8 | "mode": "rule", 9 | "log-level": "info", 10 | "ipv6": false, 11 | "keep-alive-interval": 30, 12 | "unified-delay": false, 13 | "profile": { 14 | "store-selected": true, 15 | "store-fake-ip": true 16 | }, 17 | "sniffer": { 18 | "enable": true, 19 | "sniff": { 20 | "HTTP": { 21 | "ports": [ 22 | 80, 23 | "8080-8880" 24 | ], 25 | "override-destination": true 26 | }, 27 | "TLS": { 28 | "ports": [ 29 | 443, 30 | 8443 31 | ] 32 | }, 33 | "QUIC": { 34 | "ports": [ 35 | 443, 36 | 8443 37 | ] 38 | } 39 | } 40 | }, 41 | "tun": { 42 | "enable": true, 43 | "stack": "mixed", 44 | "dns-hijack": [ 45 | "any:53" 46 | ], 47 | "auto-route": true, 48 | "auto-detect-interface": true, 49 | "strict-route": true 50 | }, 51 | "dns": { 52 | "enable": true, 53 | "listen": ":1053", 54 | "prefer-h3": false, 55 | "ipv6": false, 56 | "enhanced-mode": "fake-ip", 57 | "fake-ip-filter": [ 58 | "~domain~", 59 | "+.lan", 60 | "+.local" 61 | ], 62 | "nameserver": [ 63 | "~dns~" 64 | ] 65 | }, 66 | "proxies": [ 67 | { 68 | "name": "~outbound~", 69 | "type": "vless", 70 | "server": "~domain~", 71 | "port": 443, 72 | "uuid": "~uid~", 73 | "network": "tcp", 74 | "flow": "xtls-rprx-vision", 75 | "udp": true, 76 | "tls": true, 77 | "reality-opts": { 78 | "public-key": "~public_key~", 79 | "short-id": "~short_id~" 80 | }, 81 | "servername": "~server_name~", 82 | "client-fingerprint": "chrome" 83 | } 84 | ], 85 | "proxy-groups": [ 86 | { 87 | "name": "PROXY", 88 | "type": "select", 89 | "proxies": [ 90 | "~outbound~" 91 | ] 92 | } 93 | ], 94 | "add-rule-providers": true, 95 | "rule-providers": {}, 96 | "rules": [ 97 | { 98 | "type": "RULE-SET", 99 | "list": "~block~", 100 | "action": "REJECT", 101 | "interval": 30, 102 | "behavior": "domain", 103 | "name": "block" 104 | }, 105 | { 106 | "type": "RULE-SET", 107 | "list": "~process~", 108 | "action": "PROXY", 109 | "interval": 30, 110 | "behavior": "classical", 111 | "name": "process" 112 | }, 113 | { 114 | "type": "RULE-SET", 115 | "list": "~package~", 116 | "action": "PROXY", 117 | "interval": 30, 118 | "behavior": "classical", 119 | "name": "package" 120 | }, 121 | { 122 | "type": "RULE-SET", 123 | "list": "~warp~", 124 | "action": "PROXY", 125 | "interval": 30, 126 | "behavior": "domain", 127 | "name": "warp" 128 | }, 129 | { 130 | "type": "RULE-SET", 131 | "list": "~pac~", 132 | "action": "PROXY", 133 | "interval": 30, 134 | "behavior": "domain", 135 | "name": "pac" 136 | }, 137 | { 138 | "type": "RULE-SET", 139 | "list": "~subnet~", 140 | "action": "PROXY", 141 | "interval": 30, 142 | "behavior": "ipcidr", 143 | "name": "subnet" 144 | }, 145 | { 146 | "type": "MATCH", 147 | "action": "DIRECT" 148 | } 149 | ] 150 | } -------------------------------------------------------------------------------- /config/clients.json: -------------------------------------------------------------------------------- 1 | [] 2 | -------------------------------------------------------------------------------- /config/clients1.json: -------------------------------------------------------------------------------- 1 | [] 2 | -------------------------------------------------------------------------------- /config/deny: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/config/deny -------------------------------------------------------------------------------- /config/include.conf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/config/include.conf -------------------------------------------------------------------------------- /config/mtprotodomain: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/config/mtprotodomain -------------------------------------------------------------------------------- /config/mtprotosecret: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/config/mtprotosecret -------------------------------------------------------------------------------- /config/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | 4 | error_log /logs/nginx_error; 5 | pid /var/run/nginx.pid; 6 | 7 | events { 8 | worker_connections 1024; 9 | } 10 | 11 | http { 12 | server_names_hash_bucket_size 64; 13 | server_tokens off; 14 | include include.conf; 15 | include /etc/nginx/mime.types; 16 | default_type application/octet-stream; 17 | 18 | # Proxy Cache storage - so we can cache the DoH response from the upstream 19 | proxy_cache_path /var/cache/nginx/doh_cache levels=1:2 keys_zone=doh_cache:10m; 20 | 21 | real_ip_header proxy_protocol; 22 | real_ip_recursive on; 23 | set_real_ip_from 10.10.0.10; 24 | 25 | server { 26 | listen 80 default_server; 27 | 28 | location / { 29 | return 301 https://$host$request_uri; 30 | } 31 | location ~\.well-known { 32 | access_log /logs/nginx_certbot_access; 33 | root /certs/; 34 | try_files $uri =404; 35 | } 36 | } 37 | 38 | server { 39 | listen 10.10.0.2:443 ssl http2 proxy_protocol default_server; 40 | listen 10.10.1.2:443 ssl http2 default_server; 41 | ssl_certificate /certs/self_public; 42 | ssl_certificate_key /certs/self_private; 43 | 44 | access_log /logs/nginx_ip_access; 45 | 46 | location = / { 47 | root /app; 48 | try_files $uri /override.html @auth; 49 | } 50 | 51 | location / { 52 | root /app; 53 | auth_basic "Restricted Content"; 54 | auth_basic_user_file /app/.htpasswd; 55 | try_files $uri =404; 56 | } 57 | location @auth { 58 | root /app; 59 | auth_basic "Restricted Content"; 60 | auth_basic_user_file /app/.htpasswd; 61 | try_files $uri =404; 62 | } 63 | 64 | location /tlgrm { 65 | access_log /logs/nginx_tlgrm_access; 66 | proxy_pass http://php; 67 | } 68 | 69 | location @php { 70 | proxy_pass http://php; 71 | } 72 | 73 | location /adguard/ { 74 | } 75 | 76 | location /webapp { 77 | access_log /logs/nginx_webapp_access; 78 | alias /app; 79 | index index.html; 80 | try_files $uri $uri/ @php; 81 | } 82 | 83 | location /pac { 84 | access_log /logs/nginx_pac_access; 85 | proxy_set_header Host $http_host; 86 | proxy_pass http://php; 87 | } 88 | 89 | location /ws { 90 | proxy_pass http://xr:443; 91 | proxy_redirect off; 92 | proxy_http_version 1.1; 93 | proxy_set_header Upgrade $http_upgrade; 94 | proxy_set_header Connection "upgrade"; 95 | proxy_set_header Host $host; 96 | proxy_set_header X-Real-IP $remote_addr; 97 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 98 | proxy_read_timeout 5d; 99 | } 100 | 101 | location /v2ray { 102 | access_log /logs/nginx_v2ray_access; 103 | proxy_redirect off; 104 | proxy_buffering off; 105 | proxy_http_version 1.1; 106 | proxy_pass http://ss:8388/; 107 | proxy_set_header Host $http_host; 108 | proxy_set_header Upgrade $http_upgrade; 109 | proxy_set_header Connection "upgrade"; 110 | } 111 | 112 | location /dns-query { 113 | access_log /logs/nginx_doh_access; 114 | proxy_http_version 1.1; 115 | proxy_set_header Connection ""; 116 | proxy_set_header Host $host; 117 | proxy_set_header X-Real-IP $remote_addr; 118 | proxy_set_header X-Forwarded-Proto https; 119 | proxy_set_header X-Forwarded-For $remote_addr; 120 | proxy_set_header X-Forwarded-Host $remote_addr; 121 | proxy_cache doh_cache; 122 | proxy_cache_key $scheme$proxy_host$uri$is_args$args$request_body; 123 | proxy_pass https://ad/dns-query; 124 | } 125 | } 126 | 127 | #~ 128 | 129 | #-domain 130 | # server { 131 | # server_name domain; 132 | # listen 10.10.0.2:443 ssl http2 proxy_protocol; 133 | # listen 10.10.1.2:443 ssl http2; 134 | # ssl_certificate /certs/cert_public; 135 | # ssl_certificate_key /certs/cert_private; 136 | 137 | # access_log /logs/nginx_domain_access; 138 | 139 | # location = / { 140 | # root /app; 141 | # try_files $uri /override.html @auth; 142 | # } 143 | 144 | # location / { 145 | # root /app; 146 | # auth_basic "Restricted Content"; 147 | # auth_basic_user_file /app/.htpasswd; 148 | # try_files $uri =404; 149 | # } 150 | # location @auth { 151 | # root /app; 152 | # auth_basic "Restricted Content"; 153 | # auth_basic_user_file /app/.htpasswd; 154 | # try_files $uri =404; 155 | # } 156 | 157 | # location @php { 158 | # proxy_pass http://php; 159 | # } 160 | 161 | # location /adguard/ { 162 | # } 163 | 164 | # location /webapp { 165 | # access_log /logs/nginx_webapp_access; 166 | # alias /app; 167 | # index index.html; 168 | # try_files $uri $uri/ @php; 169 | # } 170 | 171 | # location /pac { 172 | # access_log /logs/nginx_pac_access; 173 | # proxy_set_header Host $http_host; 174 | # proxy_pass http://php; 175 | # } 176 | 177 | # location /v2ray { 178 | # access_log /logs/nginx_v2ray_access; 179 | # proxy_redirect off; 180 | # proxy_buffering off; 181 | # proxy_http_version 1.1; 182 | # proxy_pass http://ss:8388/; 183 | # proxy_set_header Host $http_host; 184 | # proxy_set_header Upgrade $http_upgrade; 185 | # proxy_set_header Connection "upgrade"; 186 | # } 187 | 188 | # location /ws { 189 | # proxy_pass http://xr:443; 190 | # proxy_redirect off; 191 | # proxy_http_version 1.1; 192 | # proxy_set_header Upgrade $http_upgrade; 193 | # proxy_set_header Connection "upgrade"; 194 | # proxy_set_header Host $host; 195 | # proxy_set_header X-Real-IP $remote_addr; 196 | # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 197 | # proxy_read_timeout 5d; 198 | # } 199 | 200 | # location /dns-query { 201 | # access_log /logs/nginx_doh_access; 202 | # proxy_http_version 1.1; 203 | # proxy_set_header Connection ""; 204 | # proxy_set_header Host $host; 205 | # proxy_set_header X-Real-IP $remote_addr; 206 | # proxy_set_header X-Forwarded-Proto https; 207 | # proxy_set_header X-Forwarded-For $remote_addr; 208 | # proxy_set_header X-Forwarded-Host $remote_addr; 209 | # proxy_cache doh_cache; 210 | # proxy_cache_key $scheme$proxy_host$uri$is_args$args$request_body; 211 | # proxy_pass https://ad/dns-query; 212 | # } 213 | # } 214 | #-domain 215 | } 216 | -------------------------------------------------------------------------------- /config/nginx_default.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | 4 | error_log /logs/nginx_error; 5 | pid /var/run/nginx.pid; 6 | 7 | events { 8 | worker_connections 1024; 9 | } 10 | 11 | http { 12 | server_names_hash_bucket_size 64; 13 | server_tokens off; 14 | include include.conf; 15 | include /etc/nginx/mime.types; 16 | default_type application/octet-stream; 17 | 18 | # Proxy Cache storage - so we can cache the DoH response from the upstream 19 | proxy_cache_path /var/cache/nginx/doh_cache levels=1:2 keys_zone=doh_cache:10m; 20 | 21 | real_ip_header proxy_protocol; 22 | real_ip_recursive on; 23 | set_real_ip_from 10.10.0.10; 24 | 25 | server { 26 | listen 80 default_server; 27 | 28 | location / { 29 | return 301 https://$host$request_uri; 30 | } 31 | location ~\.well-known { 32 | access_log /logs/nginx_certbot_access; 33 | root /certs/; 34 | try_files $uri =404; 35 | } 36 | } 37 | 38 | server { 39 | listen 10.10.0.2:443 ssl http2 proxy_protocol default_server; 40 | listen 10.10.1.2:443 ssl http2 default_server; 41 | ssl_certificate /certs/self_public; 42 | ssl_certificate_key /certs/self_private; 43 | 44 | access_log /logs/nginx_ip_access; 45 | 46 | location = / { 47 | root /app; 48 | try_files $uri /override.html @auth; 49 | } 50 | 51 | location / { 52 | root /app; 53 | auth_basic "Restricted Content"; 54 | auth_basic_user_file /app/.htpasswd; 55 | try_files $uri =404; 56 | } 57 | location @auth { 58 | root /app; 59 | auth_basic "Restricted Content"; 60 | auth_basic_user_file /app/.htpasswd; 61 | try_files $uri =404; 62 | } 63 | 64 | location /tlgrm { 65 | access_log /logs/nginx_tlgrm_access; 66 | proxy_pass http://php; 67 | } 68 | 69 | location @php { 70 | proxy_pass http://php; 71 | } 72 | 73 | location /adguard/ { 74 | } 75 | 76 | location /webapp { 77 | access_log /logs/nginx_webapp_access; 78 | alias /app; 79 | index index.html; 80 | try_files $uri $uri/ @php; 81 | } 82 | 83 | location /pac { 84 | access_log /logs/nginx_pac_access; 85 | proxy_set_header Host $http_host; 86 | proxy_pass http://php; 87 | } 88 | 89 | location /ws { 90 | proxy_pass http://xr:443; 91 | proxy_redirect off; 92 | proxy_http_version 1.1; 93 | proxy_set_header Upgrade $http_upgrade; 94 | proxy_set_header Connection "upgrade"; 95 | proxy_set_header Host $host; 96 | proxy_set_header X-Real-IP $remote_addr; 97 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 98 | proxy_read_timeout 5d; 99 | } 100 | 101 | location /v2ray { 102 | access_log /logs/nginx_v2ray_access; 103 | proxy_redirect off; 104 | proxy_buffering off; 105 | proxy_http_version 1.1; 106 | proxy_pass http://ss:8388/; 107 | proxy_set_header Host $http_host; 108 | proxy_set_header Upgrade $http_upgrade; 109 | proxy_set_header Connection "upgrade"; 110 | } 111 | 112 | location /dns-query { 113 | access_log /logs/nginx_doh_access; 114 | proxy_http_version 1.1; 115 | proxy_set_header Connection ""; 116 | proxy_set_header Host $host; 117 | proxy_set_header X-Real-IP $remote_addr; 118 | proxy_set_header X-Forwarded-Proto https; 119 | proxy_set_header X-Forwarded-For $remote_addr; 120 | proxy_set_header X-Forwarded-Host $remote_addr; 121 | proxy_cache doh_cache; 122 | proxy_cache_key $scheme$proxy_host$uri$is_args$args$request_body; 123 | proxy_pass https://ad/dns-query; 124 | } 125 | } 126 | 127 | #~ 128 | 129 | #-domain 130 | # server { 131 | # server_name domain; 132 | # listen 10.10.0.2:443 ssl http2 proxy_protocol; 133 | # listen 10.10.1.2:443 ssl http2; 134 | # ssl_certificate /certs/cert_public; 135 | # ssl_certificate_key /certs/cert_private; 136 | 137 | # access_log /logs/nginx_domain_access; 138 | 139 | # location = / { 140 | # root /app; 141 | # try_files $uri /override.html @auth; 142 | # } 143 | 144 | # location / { 145 | # root /app; 146 | # auth_basic "Restricted Content"; 147 | # auth_basic_user_file /app/.htpasswd; 148 | # try_files $uri =404; 149 | # } 150 | # location @auth { 151 | # root /app; 152 | # auth_basic "Restricted Content"; 153 | # auth_basic_user_file /app/.htpasswd; 154 | # try_files $uri =404; 155 | # } 156 | 157 | # location @php { 158 | # proxy_pass http://php; 159 | # } 160 | 161 | # location /adguard/ { 162 | # } 163 | 164 | # location /webapp { 165 | # access_log /logs/nginx_webapp_access; 166 | # alias /app; 167 | # index index.html; 168 | # try_files $uri $uri/ @php; 169 | # } 170 | 171 | # location /pac { 172 | # access_log /logs/nginx_pac_access; 173 | # proxy_set_header Host $http_host; 174 | # proxy_pass http://php; 175 | # } 176 | 177 | # location /v2ray { 178 | # access_log /logs/nginx_v2ray_access; 179 | # proxy_redirect off; 180 | # proxy_buffering off; 181 | # proxy_http_version 1.1; 182 | # proxy_pass http://ss:8388/; 183 | # proxy_set_header Host $http_host; 184 | # proxy_set_header Upgrade $http_upgrade; 185 | # proxy_set_header Connection "upgrade"; 186 | # } 187 | 188 | # location /ws { 189 | # proxy_pass http://xr:443; 190 | # proxy_redirect off; 191 | # proxy_http_version 1.1; 192 | # proxy_set_header Upgrade $http_upgrade; 193 | # proxy_set_header Connection "upgrade"; 194 | # proxy_set_header Host $host; 195 | # proxy_set_header X-Real-IP $remote_addr; 196 | # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 197 | # proxy_read_timeout 5d; 198 | # } 199 | 200 | # location /dns-query { 201 | # access_log /logs/nginx_doh_access; 202 | # proxy_http_version 1.1; 203 | # proxy_set_header Connection ""; 204 | # proxy_set_header Host $host; 205 | # proxy_set_header X-Real-IP $remote_addr; 206 | # proxy_set_header X-Forwarded-Proto https; 207 | # proxy_set_header X-Forwarded-For $remote_addr; 208 | # proxy_set_header X-Forwarded-Host $remote_addr; 209 | # proxy_cache doh_cache; 210 | # proxy_cache_key $scheme$proxy_host$uri$is_args$args$request_body; 211 | # proxy_pass https://ad/dns-query; 212 | # } 213 | # } 214 | #-domain 215 | } 216 | -------------------------------------------------------------------------------- /config/ocserv.passwd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/config/ocserv.passwd -------------------------------------------------------------------------------- /config/pac.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /config/sing.json: -------------------------------------------------------------------------------- 1 | { 2 | "log": { 3 | "level": "error", 4 | "timestamp": true 5 | }, 6 | "inbounds": [ 7 | { 8 | "type": "tun", 9 | "tag": "tun-in", 10 | "domain_strategy": "prefer_ipv4", 11 | "interface_name": "sing-tun", 12 | "address": [ 13 | "172.19.0.1\/30" 14 | ], 15 | "mtu": 1400, 16 | "auto_route": true, 17 | "strict_route": true, 18 | "endpoint_independent_nat": false, 19 | "stack": "mixed", 20 | "platform": { 21 | "http_proxy": { 22 | "enabled": false, 23 | "server": "127.0.0.1", 24 | "server_port": 2080 25 | } 26 | } 27 | }, 28 | { 29 | "type": "mixed", 30 | "tag": "in", 31 | "listen": "127.0.0.1", 32 | "listen_port": 2080 33 | } 34 | ], 35 | "dns": { 36 | "servers": [ 37 | { 38 | "tag": "dns_direct", 39 | "address": "~dns~", 40 | "address_resolver": "dns-remote", 41 | "strategy": "prefer_ipv4", 42 | "detour": "direct" 43 | }, 44 | { 45 | "tag": "dns-remote", 46 | "address": "tcp:\/\/8.8.8.8", 47 | "address_strategy": "prefer_ipv4", 48 | "strategy": "prefer_ipv4", 49 | "detour": "direct" 50 | } 51 | ], 52 | "rules": [ 53 | { 54 | "outbound": "any", 55 | "server": "dns-direct", 56 | "disable_cache": false 57 | } 58 | ], 59 | "strategy": "ipv4_only", 60 | "independent_cache": true 61 | }, 62 | "outbounds": [ 63 | { 64 | "flow": "xtls-rprx-vision", 65 | "packet_encoding": "", 66 | "server": "~domain~", 67 | "server_port": 443, 68 | "tls": { 69 | "enabled": true, 70 | "insecure": false, 71 | "reality": { 72 | "enabled": true, 73 | "public_key": "~public_key~", 74 | "short_id": "~short_id~" 75 | }, 76 | "server_name": "~server_name~", 77 | "utls": { 78 | "enabled": true, 79 | "fingerprint": "chrome" 80 | } 81 | }, 82 | "uuid": "~uid~", 83 | "type": "vless", 84 | "domain_strategy": "ipv4_only", 85 | "tag": "~outbound~" 86 | }, 87 | { 88 | "type": "direct", 89 | "tag": "direct" 90 | } 91 | ], 92 | "route": { 93 | "auto_detect_interface": true, 94 | "override_android_vpn": true, 95 | "rules": [ 96 | { 97 | "action": "sniff" 98 | }, 99 | { 100 | "protocol": "dns", 101 | "action": "hijack-dns" 102 | }, 103 | { 104 | "inbound": "in", 105 | "action": "resolve", 106 | "strategy": "prefer_ipv4" 107 | }, 108 | { 109 | "inbound": "in", 110 | "action": "sniff", 111 | "timeout": "1s" 112 | }, 113 | { 114 | "addruleset": true, 115 | "outbound": "direct" 116 | }, 117 | { 118 | "addruleset": true, 119 | "createruleset": [ 120 | { 121 | "name": "pac", 122 | "interval": "30s", 123 | "rules": [ 124 | { 125 | "domain_suffix": "~pac~" 126 | } 127 | ] 128 | } 129 | ], 130 | "outbound": "~outbound~" 131 | }, 132 | { 133 | "addruleset": true, 134 | "createruleset": [ 135 | { 136 | "name": "subnet", 137 | "interval": "30s", 138 | "rules": [ 139 | { 140 | "ip_cidr": "~subnet~" 141 | } 142 | ] 143 | } 144 | ], 145 | "outbound": "~outbound~" 146 | }, 147 | { 148 | "addruleset": true, 149 | "createruleset": [ 150 | { 151 | "name": "package", 152 | "interval": "30s", 153 | "rules": [ 154 | { 155 | "package_name": "~package~" 156 | } 157 | ] 158 | } 159 | ], 160 | "outbound": "~outbound~" 161 | }, 162 | { 163 | "addruleset": true, 164 | "createruleset": [ 165 | { 166 | "name": "process", 167 | "interval": "30s", 168 | "rules": [ 169 | { 170 | "process_name": "~process~" 171 | } 172 | ] 173 | } 174 | ], 175 | "outbound": "~outbound~" 176 | }, 177 | { 178 | "addruleset": true, 179 | "createruleset": [ 180 | { 181 | "name": "block", 182 | "interval": "30s", 183 | "rules": [ 184 | { 185 | "domain_suffix": "~block~" 186 | } 187 | ] 188 | } 189 | ], 190 | "action": "reject" 191 | }, 192 | { 193 | "addruleset": true, 194 | "createruleset": [ 195 | { 196 | "name": "warp", 197 | "interval": "30s", 198 | "rules": [ 199 | { 200 | "domain_suffix": "~warp~" 201 | } 202 | ] 203 | } 204 | ], 205 | "outbound": "~outbound~" 206 | } 207 | ], 208 | "final": "direct" 209 | } 210 | } -------------------------------------------------------------------------------- /config/sshd_config: -------------------------------------------------------------------------------- 1 | # $OpenBSD: sshd_config,v 1.104 2021/07/02 05:11:21 dtucker Exp $ 2 | 3 | # This is the sshd server system-wide configuration file. See 4 | # sshd_config(5) for more information. 5 | 6 | # This sshd was compiled with PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 7 | 8 | # The strategy used for options in the default sshd_config shipped with 9 | # OpenSSH is to specify options with their default value where 10 | # possible, but leave them commented. Uncommented options override the 11 | # default value. 12 | 13 | #Port 22 14 | #AddressFamily any 15 | #ListenAddress 0.0.0.0 16 | #ListenAddress :: 17 | 18 | #HostKey /etc/ssh/ssh_host_rsa_key 19 | #HostKey /etc/ssh/ssh_host_ecdsa_key 20 | #HostKey /etc/ssh/ssh_host_ed25519_key 21 | 22 | # Ciphers and keying 23 | #RekeyLimit default none 24 | 25 | # Logging 26 | #SyslogFacility AUTH 27 | #LogLevel INFO 28 | 29 | # Authentication: 30 | 31 | #LoginGraceTime 2m 32 | #PermitRootLogin prohibit-password 33 | #StrictModes yes 34 | #MaxAuthTries 6 35 | #MaxSessions 10 36 | 37 | #PubkeyAuthentication yes 38 | 39 | # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2 40 | # but this is overridden so installations will only check .ssh/authorized_keys 41 | AuthorizedKeysFile .ssh/authorized_keys 42 | 43 | #AuthorizedPrincipalsFile none 44 | 45 | #AuthorizedKeysCommand none 46 | #AuthorizedKeysCommandUser nobody 47 | 48 | # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts 49 | #HostbasedAuthentication no 50 | # Change to yes if you don't trust ~/.ssh/known_hosts for 51 | # HostbasedAuthentication 52 | #IgnoreUserKnownHosts no 53 | # Don't read the user's ~/.rhosts and ~/.shosts files 54 | #IgnoreRhosts yes 55 | 56 | # To disable tunneled clear text passwords, change to no here! 57 | #PasswordAuthentication yes 58 | #PermitEmptyPasswords no 59 | 60 | # Change to no to disable s/key passwords 61 | #KbdInteractiveAuthentication yes 62 | 63 | # Kerberos options 64 | #KerberosAuthentication no 65 | #KerberosOrLocalPasswd yes 66 | #KerberosTicketCleanup yes 67 | #KerberosGetAFSToken no 68 | 69 | # GSSAPI options 70 | #GSSAPIAuthentication no 71 | #GSSAPICleanupCredentials yes 72 | 73 | # Set this to 'yes' to enable PAM authentication, account processing, 74 | # and session processing. If this is enabled, PAM authentication will 75 | # be allowed through the KbdInteractiveAuthentication and 76 | # PasswordAuthentication. Depending on your PAM configuration, 77 | # PAM authentication via KbdInteractiveAuthentication may bypass 78 | # the setting of "PermitRootLogin prohibit-password". 79 | # If you just want the PAM account and session checks to run without 80 | # PAM authentication, then enable this but set PasswordAuthentication 81 | # and KbdInteractiveAuthentication to 'no'. 82 | #UsePAM no 83 | 84 | #AllowAgentForwarding yes 85 | # Feel free to re-enable these if your use case requires them. 86 | AllowTcpForwarding no 87 | GatewayPorts no 88 | X11Forwarding no 89 | #X11DisplayOffset 10 90 | #X11UseLocalhost yes 91 | #PermitTTY yes 92 | #PrintMotd yes 93 | #PrintLastLog yes 94 | #TCPKeepAlive yes 95 | #PermitUserEnvironment no 96 | #Compression delayed 97 | #ClientAliveInterval 0 98 | #ClientAliveCountMax 3 99 | #UseDNS no 100 | #PidFile /run/sshd.pid 101 | #MaxStartups 10:30:100 102 | #PermitTunnel no 103 | #ChrootDirectory none 104 | #VersionAddendum none 105 | 106 | # no default banner path 107 | #Banner none 108 | 109 | # override default of no subsystems 110 | Subsystem sftp internal-sftp 111 | 112 | # Example of overriding settings on a per-user basis 113 | #Match User anoncvs 114 | # X11Forwarding no 115 | # AllowTcpForwarding no 116 | # PermitTTY no 117 | # ForceCommand cvs server 118 | HostKeyAlgorithms +ssh-rsa 119 | PubkeyAcceptedKeyTypes +ssh-rsa 120 | PasswordAuthentication no 121 | -------------------------------------------------------------------------------- /config/sslocal.json: -------------------------------------------------------------------------------- 1 | { 2 | "server": "ss", 3 | "server_port": 8388, 4 | "local_address": "0.0.0.0", 5 | "local_port": 1080, 6 | "password": "", 7 | "timeout": 120, 8 | "method": "chacha20-ietf-poly1305", 9 | "no_delay": true, 10 | "fast_open": true, 11 | "reuse_port": true, 12 | "workers": 1, 13 | "nameserver": "10.10.0.5", 14 | "mode": "tcp_and_udp" 15 | } 16 | -------------------------------------------------------------------------------- /config/ssserver.json: -------------------------------------------------------------------------------- 1 | { 2 | "server": "0.0.0.0", 3 | "server_port": 8388, 4 | "password": "", 5 | "timeout": 120, 6 | "method": "chacha20-ietf-poly1305", 7 | "no_delay": true, 8 | "fast_open": true, 9 | "reuse_port": true, 10 | "workers": 1, 11 | "nameserver": "10.10.0.5", 12 | "mode": "tcp_and_udp" 13 | } 14 | -------------------------------------------------------------------------------- /config/unit.json: -------------------------------------------------------------------------------- 1 | { 2 | "listeners": { 3 | "*:80": { 4 | "pass": "applications/php" 5 | } 6 | }, 7 | "applications": { 8 | "php": { 9 | "type": "php", 10 | "root": "/app", 11 | "script": "index.php", 12 | "user": "root", 13 | "group": "root" 14 | } 15 | }, 16 | "access_log": "/logs/unit_access" 17 | } 18 | -------------------------------------------------------------------------------- /config/upstream.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | 4 | load_module /usr/lib/nginx/modules/ngx_stream_module.so; 5 | 6 | error_log /logs/upstream_error; 7 | pid /var/run/nginx.pid; 8 | 9 | events { 10 | worker_connections 1024; 11 | } 12 | 13 | stream { 14 | include /etc/nginx/deny; 15 | log_format basic '$remote_addr [$time_local] ' 16 | '$protocol $status $bytes_sent $bytes_received'; 17 | access_log /logs/upstream_access basic; 18 | 19 | upstream other { 20 | server ng:443; 21 | } 22 | 23 | upstream reality { 24 | server xr:443; 25 | } 26 | 27 | upstream ocserv { 28 | server oc:443; 29 | } 30 | 31 | upstream naive { 32 | server np:443; 33 | } 34 | 35 | map_hash_bucket_size 128; 36 | map $ssl_preread_server_name $sni_name { 37 | #domain 38 | t reality; 39 | #domain 40 | 41 | #ocserv 42 | #oc.domain ocserv; 43 | #ocserv 44 | 45 | #naive 46 | #np.domain naive; 47 | #naive 48 | default other; 49 | } 50 | 51 | server { 52 | listen 443 reuseport; 53 | proxy_pass $sni_name; 54 | proxy_protocol on; 55 | ssl_preread on; 56 | } 57 | 58 | server { 59 | listen 443 udp; 60 | proxy_pass $sni_name; 61 | proxy_protocol on; 62 | ssl_preread on; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /config/v2ray.json: -------------------------------------------------------------------------------- 1 | { 2 | "log": { 3 | "access": "", 4 | "error": "", 5 | "loglevel": "warning" 6 | }, 7 | "inbounds": [ 8 | { 9 | "tag": "socks", 10 | "port": 10808, 11 | "listen": "127.0.0.1", 12 | "protocol": "socks", 13 | "sniffing": { 14 | "enabled": true, 15 | "destOverride": [ 16 | "http", 17 | "tls" 18 | ], 19 | "routeOnly": false 20 | }, 21 | "settings": { 22 | "auth": "noauth", 23 | "udp": true, 24 | "allowTransparent": false 25 | } 26 | }, 27 | { 28 | "tag": "http", 29 | "port": 10809, 30 | "listen": "127.0.0.1", 31 | "protocol": "http", 32 | "sniffing": { 33 | "enabled": true, 34 | "destOverride": [ 35 | "http", 36 | "tls" 37 | ], 38 | "routeOnly": false 39 | }, 40 | "settings": { 41 | "auth": "noauth", 42 | "udp": true, 43 | "allowTransparent": false 44 | } 45 | } 46 | ], 47 | "outbounds": [ 48 | { 49 | "tag": "direct", 50 | "protocol": "freedom" 51 | }, 52 | { 53 | "tag": "~outbound~", 54 | "protocol": "vless", 55 | "settings": { 56 | "vnext": [ 57 | { 58 | "address": "~domain~", 59 | "port": 443, 60 | "users": [ 61 | { 62 | "id": "~uid~", 63 | "alterId": 0, 64 | "email": "t@t.tt", 65 | "security": "auto", 66 | "encryption": "none", 67 | "flow": "xtls-rprx-vision" 68 | } 69 | ] 70 | } 71 | ] 72 | }, 73 | "streamSettings": { 74 | "network": "tcp", 75 | "security": "reality", 76 | "realitySettings": { 77 | "serverName": "~server_name~", 78 | "fingerprint": "chrome", 79 | "show": false, 80 | "publicKey": "~public_key~", 81 | "shortId": "~short_id~", 82 | "spiderX": "" 83 | } 84 | }, 85 | "mux": { 86 | "enabled": false, 87 | "concurrency": -1 88 | } 89 | }, 90 | { 91 | "tag": "block", 92 | "protocol": "blackhole", 93 | "settings": { 94 | "response": { 95 | "type": "http" 96 | } 97 | } 98 | } 99 | ], 100 | "routing": { 101 | "domainStrategy": "AsIs", 102 | "rules": [ 103 | { 104 | "type": "field", 105 | "outboundTag": "block", 106 | "domain": "~block~" 107 | }, 108 | { 109 | "type": "field", 110 | "outboundTag": "~outbound~", 111 | "domain": "~pac~" 112 | }, 113 | { 114 | "type": "field", 115 | "outboundTag": "~outbound~", 116 | "ip": "~subnet~" 117 | }, 118 | { 119 | "type": "field", 120 | "outboundTag": "~outbound~", 121 | "domain": "~warp~" 122 | } 123 | ] 124 | } 125 | } -------------------------------------------------------------------------------- /config/wg0.conf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/config/wg0.conf -------------------------------------------------------------------------------- /config/wg1.conf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/config/wg1.conf -------------------------------------------------------------------------------- /config/xray.json: -------------------------------------------------------------------------------- 1 | { 2 | "inbounds": [ 3 | { 4 | "port": 443, 5 | "protocol": "vless", 6 | "settings": { 7 | "clients": [ 8 | ], 9 | "decryption": "none" 10 | }, 11 | "sniffing": { 12 | "destOverride": [ 13 | "http", 14 | "tls" 15 | ], 16 | "enabled": true 17 | }, 18 | "streamSettings": { 19 | "network": "ws", 20 | "wsSettings": { 21 | "path": "/ws" 22 | } 23 | }, 24 | "tag": "vless_tls" 25 | }, 26 | { 27 | "listen": "127.0.0.1", 28 | "port": 8080, 29 | "protocol": "dokodemo-door", 30 | "settings": { 31 | "address": "127.0.0.1" 32 | }, 33 | "tag": "api" 34 | } 35 | ], 36 | "log": { 37 | "loglevel": "info", 38 | "access": "/logs/xray" 39 | }, 40 | "outbounds": [ 41 | { 42 | "protocol": "freedom", 43 | "tag": "direct" 44 | }, 45 | { 46 | "protocol": "blackhole", 47 | "tag": "block" 48 | } 49 | ], 50 | "routing": { 51 | "domainStrategy": "AsIs", 52 | "rules": [ 53 | { 54 | "inboundTag": [ 55 | "api" 56 | ], 57 | "outboundTag": "api", 58 | "type": "field" 59 | } 60 | ] 61 | }, 62 | "stats": {}, 63 | "api": { 64 | "services": [ 65 | "StatsService" 66 | ], 67 | "tag": "api" 68 | }, 69 | "policy": { 70 | "levels": { 71 | "0": { 72 | "statsUserUplink": true, 73 | "statsUserDownlink": true 74 | } 75 | }, 76 | "system": { 77 | "statsInboundUplink": true, 78 | "statsInboundDownlink": true, 79 | "statsOutboundUplink": true, 80 | "statsOutboundDownlink": true 81 | } 82 | } 83 | } -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | x-logging: 2 | &default-logging 3 | driver: "json-file" 4 | options: 5 | max-size: "200k" 6 | max-file: "10" 7 | 8 | networks: 9 | default: 10 | ipam: 11 | config: 12 | - subnet: 10.10.0.0/24 13 | xray: 14 | ipam: 15 | config: 16 | - subnet: 10.10.1.0/24 17 | volumes: 18 | adguard: 19 | warp: 20 | 21 | services: 22 | up: 23 | image: mercurykd/vpnbot-ng:1.1 24 | build: 25 | context: dockerfile 26 | dockerfile: nginx.dockerfile 27 | args: 28 | image: ${IMAGE} 29 | volumes: 30 | - ./config/.profile:/root/.ashrc:ro 31 | - ./config/upstream.conf:/etc/nginx/nginx.conf 32 | - ./config/deny:/etc/nginx/deny 33 | - ./scripts/start_upstream.sh:/start_upstream.sh 34 | - ./ssh:/ssh 35 | - ./config/sshd_config:/etc/ssh/sshd_config 36 | - ./logs/:/logs/ 37 | ports: 38 | - 443:443/tcp 39 | - 443:443/udp 40 | hostname: upstream 41 | container_name: upstream-${VER} 42 | depends_on: 43 | php: 44 | condition: service_healthy 45 | ng: 46 | condition: service_started 47 | ad: 48 | condition: service_started 49 | ss: 50 | condition: service_started 51 | xr: 52 | condition: service_started 53 | oc: 54 | condition: service_started 55 | np: 56 | condition: service_started 57 | env_file: 58 | - path: ./.env 59 | required: true # default 60 | - path: ./override.env 61 | required: false 62 | stop_grace_period: 1s 63 | command: ["/bin/sh", "/start_upstream.sh"] 64 | networks: 65 | default: 66 | ipv4_address: 10.10.0.10 67 | logging: *default-logging 68 | ng: 69 | image: mercurykd/vpnbot-ng:1.1 70 | build: 71 | context: dockerfile 72 | dockerfile: nginx.dockerfile 73 | args: 74 | image: ${IMAGE} 75 | volumes: 76 | - ./config/.profile:/root/.ashrc:ro 77 | - ./config/nginx.conf:/etc/nginx/nginx.conf 78 | - ./config/include.conf:/etc/nginx/include.conf 79 | - ./config/nginx_default.conf:/nginx_default.conf 80 | - ./scripts/start_ng.sh:/start_ng.sh 81 | - ./certs/:/certs/ 82 | - ./ssh:/ssh 83 | - ./config/sshd_config:/etc/ssh/sshd_config 84 | - ./logs/:/logs/ 85 | - ./app/webapp:/app 86 | ports: 87 | - 80:80 88 | hostname: nginx 89 | container_name: nginx-${VER} 90 | env_file: 91 | - path: ./.env 92 | required: true # default 93 | - path: ./override.env 94 | required: false 95 | stop_grace_period: 1s 96 | command: ["/bin/sh", "/start_ng.sh"] 97 | networks: 98 | default: 99 | ipv4_address: 10.10.0.2 100 | xray: 101 | ipv4_address: 10.10.1.2 102 | logging: *default-logging 103 | depends_on: 104 | php: 105 | condition: service_healthy 106 | php: 107 | image: mercurykd/vpnbot-php:1.7 108 | build: 109 | dockerfile: dockerfile/php.dockerfile 110 | args: 111 | image: ${IMAGE} 112 | ports: 113 | - 127.0.0.1:8081:8080 114 | volumes: 115 | - ./config/.profile:/root/.ashrc:ro 116 | - ./config/php.ini:/etc/php81/php.ini 117 | - ./config/:/config/ 118 | - ./certs/:/certs/ 119 | - ./ssh:/ssh 120 | - ./app:/app 121 | - ./logs/:/logs/ 122 | - ./scripts/start_php.sh:/start_php.sh 123 | - ./scripts/check_file.sh:/check_file.sh 124 | - ./version:/version 125 | - ./mirror:/mirror 126 | - ./.env:/mirror/.env 127 | - ./update:/update 128 | - ./.git:/.git 129 | - ./singbox_windows:/singbox 130 | - ./docker-compose.override.yml:/docker/compose 131 | - /var/run/docker.sock:/var/run/docker.sock:ro 132 | environment: 133 | IP: ${IP} 134 | VER: ${VER} 135 | env_file: 136 | - path: ./.env 137 | required: true # default 138 | - path: ./override.env 139 | required: false 140 | hostname: php 141 | container_name: php-${VER} 142 | # restart: unless-stopped 143 | stop_grace_period: 1s 144 | command: ["/bin/sh", "/start_php.sh"] 145 | working_dir: /app 146 | networks: 147 | default: 148 | ipv4_address: 10.10.0.7 149 | extra_hosts: 150 | - "host.docker.internal:host-gateway" 151 | logging: *default-logging 152 | healthcheck: 153 | test: ["CMD", "/bin/sh", "/check_file.sh"] 154 | interval: 5s 155 | timeout: 5s 156 | retries: 5 157 | service: 158 | image: mercurykd/vpnbot-php:1.7 159 | build: 160 | dockerfile: dockerfile/php.dockerfile 161 | args: 162 | image: ${IMAGE} 163 | volumes: 164 | - ./config/.profile:/root/.ashrc:ro 165 | - ./config/php.ini:/etc/php81/php.ini 166 | - ./config/:/config/ 167 | - ./certs/:/certs/ 168 | - ./ssh:/ssh 169 | - ./app:/app 170 | - ./logs/:/logs/ 171 | - ./version:/version 172 | - ./update:/update 173 | - ./.git:/.git 174 | - ./scripts/start_service.sh:/start_service.sh 175 | - ./docker-compose.override.yml:/docker/compose 176 | - /var/run/docker.sock:/var/run/docker.sock:ro 177 | environment: 178 | IP: ${IP} 179 | VER: ${VER} 180 | env_file: 181 | - path: ./.env 182 | required: true # default 183 | - path: ./override.env 184 | required: false 185 | hostname: service 186 | container_name: service-${VER} 187 | # restart: unless-stopped 188 | stop_grace_period: 1s 189 | command: ["/bin/sh", "/start_service.sh"] 190 | working_dir: /app 191 | networks: 192 | default: 193 | ipv4_address: 10.10.0.15 194 | logging: *default-logging 195 | depends_on: 196 | - up 197 | - ng 198 | - php 199 | - wg 200 | - wg1 201 | - ad 202 | - tg 203 | - xr 204 | - oc 205 | - np 206 | - proxy 207 | - ss 208 | wg: 209 | image: mercurykd/vpnbot-wg:1.1 210 | build: 211 | dockerfile: dockerfile/wireguard.dockerfile 212 | args: 213 | image: ${IMAGE} 214 | volumes: 215 | - ./config/.profile:/root/.ashrc:ro 216 | - ./config/wg0.conf:/etc/wireguard/wg0.conf 217 | - ./config/pac.json:/pac.json 218 | - ./scripts/start_wg.sh:/start_wg.sh 219 | - ./scripts/reset_wg.sh:/reset_wg.sh 220 | - ./scripts/block_torrent.sh:/block_torrent.sh 221 | - ./scripts/block_exchange.sh:/block_exchange.sh 222 | - ./ssh:/ssh 223 | - ./config/sshd_config:/etc/ssh/sshd_config 224 | hostname: wireguard 225 | container_name: wireguard-${VER} 226 | depends_on: 227 | php: 228 | condition: service_healthy 229 | env_file: 230 | - path: ./.env 231 | required: true # default 232 | - path: ./override.env 233 | required: false 234 | environment: 235 | ADDRESS: ${WGADDRESS} 236 | cap_add: 237 | - NET_ADMIN 238 | devices: 239 | - /dev/net/tun:/dev/net/tun 240 | stop_grace_period: 1s 241 | command: ["/bin/sh", "/start_wg.sh"] 242 | networks: 243 | default: 244 | ipv4_address: 10.10.0.4 245 | logging: *default-logging 246 | wg1: 247 | image: mercurykd/vpnbot-wg:1.1 248 | build: 249 | dockerfile: dockerfile/wireguard.dockerfile 250 | args: 251 | image: ${IMAGE} 252 | volumes: 253 | - ./config/.profile:/root/.ashrc:ro 254 | - ./config/wg1.conf:/etc/wireguard/wg0.conf 255 | - ./config/pac.json:/pac.json 256 | - ./scripts/start_wg.sh:/start_wg.sh 257 | - ./scripts/reset_wg.sh:/reset_wg.sh 258 | - ./scripts/block_torrent.sh:/block_torrent.sh 259 | - ./scripts/block_exchange.sh:/block_exchange.sh 260 | - ./ssh:/ssh 261 | - ./config/sshd_config:/etc/ssh/sshd_config 262 | hostname: wireguard1 263 | container_name: wireguard1-${VER} 264 | depends_on: 265 | php: 266 | condition: service_healthy 267 | env_file: 268 | - path: ./.env 269 | required: true # default 270 | - path: ./override.env 271 | required: false 272 | environment: 273 | ADDRESS: ${WG1ADDRESS} 274 | cap_add: 275 | - NET_ADMIN 276 | devices: 277 | - /dev/net/tun:/dev/net/tun 278 | stop_grace_period: 1s 279 | command: ["/bin/sh", "/start_wg.sh"] 280 | networks: 281 | default: 282 | ipv4_address: 10.10.0.14 283 | logging: *default-logging 284 | ad: 285 | image: mercurykd/vpnbot-ad:1.3 286 | build: 287 | dockerfile: dockerfile/adguard.dockerfile 288 | args: 289 | image: ${IMAGE} 290 | volumes: 291 | - ./config/.profile:/root/.ashrc:ro 292 | - type: volume 293 | target: /opt/adguardhome/work 294 | source: adguard 295 | - ./ssh:/ssh 296 | - ./config/sshd_config:/etc/ssh/sshd_config 297 | - ./config/:/config/ 298 | - ./certs/:/certs/ 299 | - ./logs/:/logs/ 300 | - ./scripts/start_ad.sh:/start_ad.sh 301 | hostname: adguard 302 | container_name: adguard-${VER} 303 | depends_on: 304 | php: 305 | condition: service_healthy 306 | env_file: 307 | - path: ./.env 308 | required: true # default 309 | - path: ./override.env 310 | required: false 311 | stop_grace_period: 1s 312 | networks: 313 | default: 314 | ipv4_address: 10.10.0.5 315 | cap_add: 316 | - NET_ADMIN 317 | entrypoint: ["/bin/sh", "/start_ad.sh"] 318 | logging: *default-logging 319 | tg: 320 | image: mercurykd/vpnbot-tg:1.1 321 | build: 322 | dockerfile: dockerfile/telegram.dockerfile 323 | volumes: 324 | - ./config/.profile:/root/.ashrc:ro 325 | - ./ssh:/ssh 326 | - ./config/sshd_config:/etc/ssh/sshd_config 327 | - ./scripts/start_tg.sh:/start_tg.sh 328 | - ./config/mtprotosecret:/mtprotosecret 329 | hostname: telegram 330 | container_name: mtproto-${VER} 331 | depends_on: 332 | php: 333 | condition: service_healthy 334 | environment: 335 | IP: ${IP} 336 | env_file: 337 | - path: ./.env 338 | required: true # default 339 | - path: ./override.env 340 | required: false 341 | stop_grace_period: 1s 342 | command: ["/bin/sh", "/start_tg.sh"] 343 | networks: 344 | default: 345 | ipv4_address: 10.10.0.8 346 | logging: *default-logging 347 | xr: 348 | image: mercurykd/vpnbot-xr:1.4 349 | build: 350 | dockerfile: dockerfile/xray.dockerfile 351 | args: 352 | image: ${IMAGE} 353 | volumes: 354 | - ./config/.profile:/root/.ashrc:ro 355 | - ./ssh:/ssh 356 | - ./config/sshd_config:/etc/ssh/sshd_config 357 | - ./config/xray.json:/xray.json 358 | - ./scripts/start_xray.sh:/start_xray.sh 359 | - ./logs:/logs 360 | hostname: xray 361 | container_name: xray-${VER} 362 | depends_on: 363 | php: 364 | condition: service_healthy 365 | env_file: 366 | - path: ./.env 367 | required: true # default 368 | - path: ./override.env 369 | required: false 370 | stop_grace_period: 1s 371 | command: ["/bin/sh", "/start_xray.sh"] 372 | networks: 373 | default: 374 | ipv4_address: 10.10.0.9 375 | xray: 376 | ipv4_address: 10.10.1.9 377 | logging: *default-logging 378 | oc: 379 | image: mercurykd/vpnbot-oc:1.2 380 | build: 381 | dockerfile: dockerfile/ocserv.dockerfile 382 | args: 383 | image: ${IMAGE} 384 | volumes: 385 | - ./config/.profile:/root/.ashrc:ro 386 | - ./ssh:/ssh 387 | - ./config/sshd_config:/etc/ssh/sshd_config 388 | - ./config:/etc/ocserv 389 | - ./certs:/certs 390 | - ./scripts/start_oc.sh:/start_oc.sh 391 | hostname: ocserv 392 | container_name: openconnect-${VER} 393 | depends_on: 394 | php: 395 | condition: service_healthy 396 | env_file: 397 | - path: ./.env 398 | required: true # default 399 | - path: ./override.env 400 | required: false 401 | stop_grace_period: 1s 402 | command: ["/bin/sh", "/start_oc.sh"] 403 | cap_add: 404 | - NET_ADMIN 405 | devices: 406 | - /dev/net/tun:/dev/net/tun 407 | networks: 408 | default: 409 | ipv4_address: 10.10.0.11 410 | logging: *default-logging 411 | np: 412 | image: mercurykd/vpnbot-np:1.1 413 | build: 414 | dockerfile: dockerfile/naive.dockerfile 415 | args: 416 | image: ${IMAGE} 417 | volumes: 418 | - ./config/.profile:/root/.ashrc:ro 419 | - ./ssh:/ssh 420 | - ./config/sshd_config:/etc/ssh/sshd_config 421 | - ./config:/config 422 | - ./certs:/certs 423 | - ./scripts/start_np.sh:/start_np.sh 424 | hostname: naive 425 | container_name: naive-${VER} 426 | depends_on: 427 | php: 428 | condition: service_healthy 429 | env_file: 430 | - path: ./.env 431 | required: true # default 432 | - path: ./override.env 433 | required: false 434 | stop_grace_period: 1s 435 | command: ["/bin/sh", "/start_np.sh"] 436 | cap_add: 437 | - NET_ADMIN 438 | networks: 439 | default: 440 | ipv4_address: 10.10.0.12 441 | logging: *default-logging 442 | wp: 443 | image: mercurykd/vpnbot-wp:1.3 444 | build: 445 | dockerfile: dockerfile/warp.dockerfile 446 | args: 447 | image: ${IMAGE} 448 | cap_add: 449 | - NET_ADMIN 450 | devices: 451 | - /dev/net/tun:/dev/net/tun 452 | volumes: 453 | - ./config/.profile:/root/.bashrc:ro 454 | - ./ssh:/ssh 455 | - ./config/sshd_config:/etc/ssh/sshd_config 456 | - ./config:/config 457 | - ./certs:/certs 458 | - ./scripts/start_wp.sh:/start_wp.sh 459 | - warp:/var/lib/cloudflare-warp 460 | hostname: warp 461 | container_name: warp-${VER} 462 | depends_on: 463 | php: 464 | condition: service_healthy 465 | env_file: 466 | - path: ./.env 467 | required: true # default 468 | - path: ./override.env 469 | required: false 470 | stop_grace_period: 1s 471 | command: ["/bin/sh", "/start_wp.sh"] 472 | networks: 473 | default: 474 | ipv4_address: 10.10.0.13 475 | logging: *default-logging 476 | proxy: 477 | image: mercurykd/vpnbot-ss:1.2 478 | build: 479 | dockerfile: dockerfile/shadowsocks.dockerfile 480 | args: 481 | image: ${IMAGE} 482 | volumes: 483 | - ./config/.profile:/root/.ashrc:ro 484 | - ./config/sslocal.json:/config.json 485 | - ./ssh:/ssh 486 | - ./config/sshd_config:/etc/ssh/sshd_config 487 | - ./scripts/start_proxy.sh:/start_proxy.sh 488 | hostname: proxy 489 | container_name: proxy-${VER} 490 | depends_on: 491 | php: 492 | condition: service_healthy 493 | networks: 494 | default: 495 | ipv4_address: 10.10.0.3 496 | environment: 497 | TZ: ${TZ} 498 | env_file: 499 | - path: ./.env 500 | required: true # default 501 | - path: ./override.env 502 | required: false 503 | stop_grace_period: 1s 504 | command: ["/bin/sh", "/start_proxy.sh"] 505 | logging: *default-logging 506 | ss: 507 | image: mercurykd/vpnbot-ss:1.2 508 | build: 509 | dockerfile: dockerfile/shadowsocks.dockerfile 510 | args: 511 | image: ${IMAGE} 512 | volumes: 513 | - ./config/.profile:/root/.ashrc:ro 514 | - ./config/ssserver.json:/config.json 515 | - ./ssh:/ssh 516 | - ./config/sshd_config:/etc/ssh/sshd_config 517 | - ./scripts/start_ss.sh:/start_ss.sh 518 | hostname: shadowsocks 519 | container_name: shadowsocks-${VER} 520 | depends_on: 521 | php: 522 | condition: service_healthy 523 | env_file: 524 | - path: ./.env 525 | required: true # default 526 | - path: ./override.env 527 | required: false 528 | stop_grace_period: 1s 529 | command: ["/bin/sh", "/start_ss.sh"] 530 | networks: 531 | default: 532 | ipv4_address: 10.10.0.6 533 | logging: *default-logging 534 | -------------------------------------------------------------------------------- /dockerfile/adguard.dockerfile: -------------------------------------------------------------------------------- 1 | FROM adguard/adguardhome 2 | RUN apk add --no-cache --update openssh \ 3 | && mkdir /root/.ssh 4 | ENV ENV="/root/.ashrc" 5 | -------------------------------------------------------------------------------- /dockerfile/naive.dockerfile: -------------------------------------------------------------------------------- 1 | ARG image 2 | FROM golang:alpine as go 3 | RUN go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest \ 4 | && /go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive 5 | FROM $image 6 | COPY --from=go /go/caddy /usr/local/bin/ 7 | RUN apk add openssh \ 8 | && mkdir /root/.ssh -------------------------------------------------------------------------------- /dockerfile/nginx.dockerfile: -------------------------------------------------------------------------------- 1 | ARG image 2 | FROM $image 3 | RUN apk add nginx-mod-stream openssh \ 4 | && mkdir /root/.ssh \ 5 | && mkdir /var/cache/nginx 6 | ENV ENV="/root/.ashrc" 7 | -------------------------------------------------------------------------------- /dockerfile/ocserv.dockerfile: -------------------------------------------------------------------------------- 1 | ARG image 2 | FROM $image 3 | RUN apk add --update openssh \ 4 | iptables \ 5 | gnutls-dev \ 6 | libev-dev \ 7 | linux-pam-dev \ 8 | lz4-dev \ 9 | libseccomp-dev \ 10 | && apk add --no-cache --virtual .build-deps \ 11 | xz \ 12 | linux-headers \ 13 | libnl3-dev \ 14 | g++ \ 15 | gpgme \ 16 | curl \ 17 | make \ 18 | readline-dev \ 19 | tar \ 20 | autoconf \ 21 | automake \ 22 | gperf \ 23 | protobuf-c-compiler \ 24 | git \ 25 | && git clone https://gitlab.com/openconnect/ocserv.git \ 26 | && cd /ocserv \ 27 | && autoreconf -fvi \ 28 | && ./configure \ 29 | && make \ 30 | && make install \ 31 | && apk del .build-deps \ 32 | && mkdir /root/.ssh 33 | -------------------------------------------------------------------------------- /dockerfile/php.dockerfile: -------------------------------------------------------------------------------- 1 | ARG image 2 | FROM $image 3 | RUN apk add --no-cache --update php81 \ 4 | php81-mbstring \ 5 | php81-session \ 6 | php81-phar \ 7 | php81-zip \ 8 | php81-curl \ 9 | php81-opcache \ 10 | php81-openssl \ 11 | php81-iconv \ 12 | php81-intl \ 13 | php81-pecl-ssh2 \ 14 | php81-pecl-yaml \ 15 | unit \ 16 | unit-php81 \ 17 | xxd \ 18 | certbot \ 19 | libqrencode \ 20 | openssh \ 21 | openssl \ 22 | curl \ 23 | git \ 24 | py3-qt5 \ 25 | && mkdir /root/.ssh \ 26 | && wget https://github.com/ameshkov/dnslookup/releases/download/v1.11.1/dnslookup-linux-amd64-v1.11.1.tar.gz \ 27 | && tar -xf dnslookup-linux-amd64-v1.11.1.tar.gz \ 28 | && mv linux-amd64/dnslookup /usr/bin \ 29 | && rm dnslookup-linux-amd64-v1.11.1.tar.gz \ 30 | && rm -rf /linux-amd64 \ 31 | && wget https://github.com/SagerNet/sing-box/releases/download/v1.10.3/sing-box-1.10.3-linux-amd64.tar.gz \ 32 | && tar -xf sing-box-1.10.3-linux-amd64.tar.gz \ 33 | && mv sing-box-1.10.3-linux-amd64/sing-box /usr/bin \ 34 | && rm sing-box-1.10.3-linux-amd64.tar.gz \ 35 | && rm -rf /sing-box-1.10.3-linux-amd64 \ 36 | && wget https://github.com/MetaCubeX/mihomo/releases/download/v1.18.10/mihomo-linux-amd64-v1.18.10.gz \ 37 | && gunzip mihomo-linux-amd64-v1.18.10.gz \ 38 | && mv mihomo-linux-amd64-v1.18.10 /usr/bin/mihomo -------------------------------------------------------------------------------- /dockerfile/shadowsocks.dockerfile: -------------------------------------------------------------------------------- 1 | ARG image 2 | FROM $image 3 | RUN apk add openssh git xz \ 4 | && mkdir /root/.ssh \ 5 | && wget -O shadowsocks-rust.x86_64-unknown-linux-musl.tar.xz $(wget -q -O - https://api.github.com/repos/shadowsocks/shadowsocks-rust/releases/latest | grep browser_download_url | cut -d\" -f4 | egrep '.x86_64-unknown-linux-musl.tar.xz$') \ 6 | && tar -xf shadowsocks-rust.x86_64-unknown-linux-musl.tar.xz \ 7 | && wget -O v2ray-plugin-linux-amd64.tar.gz $(wget -q -O - https://api.github.com/repos/teddysun/v2ray-plugin/releases/latest | grep browser_download_url | cut -d\" -f4 | egrep 'v2ray-plugin-linux-amd64') \ 8 | && tar -xf v2ray-plugin-linux-amd64.tar.gz \ 9 | && mv sslocal /usr/bin/ \ 10 | && mv ssserver /usr/bin/ \ 11 | && mv ssmanager /usr/bin/ \ 12 | && mv ssservice /usr/bin/ \ 13 | && mv ssurl /usr/bin/ \ 14 | && mv v2ray-plugin_linux_amd64 /usr/bin/v2ray-plugin \ 15 | && rm v2ray-plugin-linux-amd64.tar.gz \ 16 | && rm shadowsocks-rust.x86_64-unknown-linux-musl.tar.xz 17 | ENV ENV="/root/.ashrc" 18 | -------------------------------------------------------------------------------- /dockerfile/telegram.dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.6 2 | RUN apk add --no-cache --virtual .build-deps alpine-sdk linux-headers openssl-dev \ 3 | && git clone --single-branch --depth 1 https://github.com/TelegramMessenger/MTProxy.git /mtproxy/sources \ 4 | && mkdir /mtproxy/patches && wget -P /mtproxy/patches https://raw.githubusercontent.com/alexdoesh/mtproxy/master/patches/randr_compat.patch \ 5 | && cd /mtproxy/sources && patch -p0 -i /mtproxy/patches/randr_compat.patch \ 6 | && make \ 7 | && mkdir /root/.ssh \ 8 | && cp /mtproxy/sources/objs/bin/mtproto-proxy /usr/bin \ 9 | && rm -rf /mtproxy \ 10 | && apk del .build-deps\ 11 | && apk add --no-cache --update curl openssh \ 12 | && ln -s /usr/lib/libcrypto.so.41 /usr/lib/libcrypto.so.1.0.0 13 | ENV ENV="/root/.ashrc" 14 | -------------------------------------------------------------------------------- /dockerfile/warp.dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:22.04 2 | RUN apt update && apt install -y curl gpg socat jq lsb-release openssh-server \ 3 | && curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg \ 4 | && echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/cloudflare-client.list \ 5 | && apt update && apt install -y cloudflare-warp \ 6 | && mkdir /root/.ssh 7 | -------------------------------------------------------------------------------- /dockerfile/wireguard.dockerfile: -------------------------------------------------------------------------------- 1 | ARG image 2 | FROM $image 3 | COPY --from=golang:1.22.3-alpine /usr/local/go/ /usr/local/go/ 4 | ENV PATH="/usr/local/go/bin:${PATH}" 5 | RUN apk add --no-cache --virtual .build-deps alpine-sdk git \ 6 | && apk add iproute2 linux-headers iptables xtables-addons openssh wireguard-tools jq bash htop \ 7 | && git clone https://github.com/amnezia-vpn/amneziawg-go \ 8 | && git clone https://github.com/amnezia-vpn/amneziawg-tools.git \ 9 | && cd /amneziawg-go \ 10 | && make install \ 11 | && cd /amneziawg-tools/src \ 12 | && make install WITH_WGQUICK=yes \ 13 | && apk del .build-deps \ 14 | && rm -rf /amneziawg-go \ 15 | && rm -rf /amneziawg-tools \ 16 | && mkdir /root/.ssh 17 | -------------------------------------------------------------------------------- /dockerfile/xray.dockerfile: -------------------------------------------------------------------------------- 1 | ARG image 2 | FROM $image 3 | RUN apk add openssh openssl jq \ 4 | && mkdir /root/.ssh \ 5 | && wget -O Xray-linux-64.zip $(wget -q -O - https://api.github.com/repos/XTLS/Xray-core/releases/latest | grep browser_download_url | cut -d\" -f4 | egrep 'Xray-linux-64.zip$') \ 6 | && unzip Xray-linux-64.zip \ 7 | && mv xray /usr/bin/ \ 8 | && rm Xray-linux-64.zip \ 9 | && rm geoip.dat \ 10 | && rm geosite.dat \ 11 | && chmod +x /usr/bin/xray 12 | ENV ENV="/root/.ashrc" 13 | -------------------------------------------------------------------------------- /logs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/logs/.gitkeep -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | b: 2 | docker compose build 3 | u: # запуск контейнеров 4 | $(eval IP := $(shell curl -s -t 1 2ip.io || curl -s -t 1 ipinfo.io/ip || curl -s -t 1 ifconfig.me)) 5 | bash ./update/update.sh & 6 | touch ./override.env ./docker-compose.override.yml 7 | IP=$(IP) VER=$(shell git describe --tags) docker compose --env-file ./.env --env-file ./override.env up -d --force-recreate 8 | d: # остановка контейнеров 9 | -kill -9 $(shell cat ./update/update_pid) > /dev/null 10 | docker compose down --remove-orphans 11 | dv: # остановка контейнеров 12 | docker compose down -v 13 | r: d u 14 | ps: # список контейнеров 15 | docker compose ps 16 | l: # логи из контейнеров 17 | docker compose logs 18 | php: # консоль сервиса 19 | docker compose exec php /bin/sh 20 | wg: # консоль сервиса 21 | docker compose exec wg /bin/sh 22 | wg1: # консоль сервиса 23 | docker compose exec wg1 /bin/sh 24 | ss: # консоль сервиса 25 | docker compose exec ss /bin/sh 26 | ng: # консоль сервиса 27 | docker compose exec ng /bin/sh 28 | np: # консоль сервиса 29 | docker compose exec np /bin/sh 30 | up: # консоль сервиса 31 | docker compose exec up /bin/sh 32 | ad: # консоль сервиса 33 | docker compose exec ad /bin/sh 34 | wp: # консоль сервиса 35 | docker compose exec wp bash 36 | proxy: # консоль сервиса 37 | docker compose exec proxy /bin/sh 38 | tg: # консоль сервиса 39 | docker compose exec tg /bin/sh 40 | xr: # консоль сервиса 41 | docker compose exec xr /bin/sh 42 | oc: # консоль сервиса 43 | docker compose exec oc /bin/sh 44 | service: # консоль сервиса 45 | docker compose exec service /bin/sh 46 | clean: 47 | docker image prune 48 | docker builder prune 49 | cleanf: 50 | docker image prune -f > /dev/null 51 | docker builder prune -f > /dev/null 52 | cleanall: 53 | docker image prune -a -f 54 | docker builder prune -a -f 55 | push: 56 | docker compose push 57 | s: 58 | git status -su 59 | c: 60 | git add config/ 61 | git checkout . 62 | git reset 63 | webhook: 64 | docker compose exec php php checkwebhook.php 65 | reset: 66 | make d 67 | git reset --hard 68 | git clean -fd 69 | docker volume rm vpnbot_adguard vpnbot_warp 70 | make u 71 | backup: 72 | docker compose exec php php backup.php > backup.json -------------------------------------------------------------------------------- /mirror/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | 3 | services: 4 | socat: 5 | build: 6 | dockerfile: ./dockerfile 7 | ports: 8 | - 80:80 9 | - 443:443 10 | - 853:853 11 | - ${TGPORT}:${TGPORT} 12 | - ${SSPORT}:${SSPORT} 13 | - ${SSPORT}:${SSPORT}/udp 14 | - ${WGPORT}:${WGPORT}/udp 15 | volumes: 16 | - ./start_socat.sh:/start_socat.sh 17 | command: /bin/sh /start_socat.sh 18 | stop_grace_period: 1s 19 | -------------------------------------------------------------------------------- /mirror/dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.18 2 | RUN apk add socat htop net-tools -------------------------------------------------------------------------------- /mirror/makefile: -------------------------------------------------------------------------------- 1 | b: 2 | docker compose build --no-cache 3 | u: 4 | docker compose up -d --build 5 | d: 6 | docker compose down 7 | ps: 8 | docker compose ps 9 | e: 10 | docker compose exec socat sh 11 | r: d u -------------------------------------------------------------------------------- /mirror/start_socat.sh: -------------------------------------------------------------------------------- 1 | socat TCP-LISTEN:80,fork TCP:{ip}:80 & 2 | socat TCP-LISTEN:443,fork TCP:{ip}:443 & 3 | socat TCP-LISTEN:853,fork TCP:{ip}:853 & 4 | socat TCP-LISTEN:{tg},fork TCP:{ip}:{tg} & 5 | socat TCP-LISTEN:{ss},fork TCP:{ip}:{ss} & 6 | socat UDP-LISTEN:{ss},fork UDP:{ip}:{ss} & 7 | socat UDP-LISTEN:{wg},fork UDP:{ip}:{wg} & 8 | tail -f /dev/null -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | telegram bot to manage servers (inside the bot) 2 | 3 | - VLESS (Reality OR Websocket) 4 | - NaiveProxy 5 | - OpenConnect 6 | - Wireguard 7 | - Amnezia 8 | - AdguardHome 9 | - MTProto 10 | - PAC 11 | - automatic ssl 12 | 13 | --- 14 | environment: ubuntu 22.04/24.04, debian 11/12 15 | 16 | ## Install: 17 | 18 | ```shell 19 | wget -O- https://raw.githubusercontent.com/mercurykd/vpnbot/master/scripts/init.sh | sh -s YOUR_TELEGRAM_BOT_KEY master 20 | ``` 21 | #### Restart: 22 | ```shell 23 | make r 24 | ``` 25 | #### autoload: 26 | ```shell 27 | crontab -e 28 | ``` 29 | add `@reboot cd /root/vpnbot && make r` and save 30 | -------------------------------------------------------------------------------- /scripts/block_exchange.sh: -------------------------------------------------------------------------------- 1 | iptables -I FORWARD -i wg0 -o wg0 -j REJECT 2 | -------------------------------------------------------------------------------- /scripts/block_torrent.sh: -------------------------------------------------------------------------------- 1 | iptables -I FORWARD -p tcp -m ipp2p --bit -j DROP 2 | iptables -I FORWARD -p udp -m ipp2p --bit -j DROP 3 | iptables -I FORWARD -m string --algo bm --string "BitTorrent" -j DROP 4 | iptables -I FORWARD -m string --algo bm --string "BitTorrent protocol" -j DROP 5 | iptables -I FORWARD -m string --algo bm --string "peer_id=" -j DROP 6 | iptables -I FORWARD -m string --algo bm --string ".torrent" -j DROP 7 | iptables -I FORWARD -m string --algo bm --string "announce.php?passkey=" -j DROP 8 | iptables -I FORWARD -m string --algo bm --string "torrent" -j DROP 9 | iptables -I FORWARD -m string --algo bm --string "announce" -j DROP 10 | iptables -I FORWARD -m string --algo bm --string "info_hash" -j DROP 11 | iptables -I OUTPUT -p tcp -m ipp2p --bit -j DROP 12 | iptables -I OUTPUT -p udp -m ipp2p --bit -j DROP 13 | -------------------------------------------------------------------------------- /scripts/check_file.sh: -------------------------------------------------------------------------------- 1 | if [[ -f "/start" && -f "/ssh/key.pub" && -s "/ssh/key.pub" ]]; then 2 | exit 0; 3 | else 4 | exit 1; 5 | fi 6 | -------------------------------------------------------------------------------- /scripts/init.sh: -------------------------------------------------------------------------------- 1 | TAG="${2:-master}" 2 | apt update 3 | apt install -y \ 4 | ca-certificates \ 5 | curl \ 6 | gnupg \ 7 | lsb-release \ 8 | make \ 9 | git \ 10 | iptables \ 11 | iproute2 \ 12 | xtables-addons-common \ 13 | xtables-addons-dkms 14 | curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh 15 | git clone https://github.com/mercurykd/vpnbot.git 16 | cd ./vpnbot 17 | git checkout $TAG 18 | echo " '$1'];" > ./app/config.php 21 | make u 22 | -------------------------------------------------------------------------------- /scripts/install_as_service.sh: -------------------------------------------------------------------------------- 1 | path=`pwd` 2 | sed "s|path|$path|g" "$path/scripts/vpnbot.service" > /etc/systemd/system/vpnbot.service 3 | systemctl daemon-reload 4 | systemctl enable vpnbot 5 | -------------------------------------------------------------------------------- /scripts/reset_wg.sh: -------------------------------------------------------------------------------- 1 | INTERFACE=$(route | grep '^default' | grep -o '[^ ]*$') 2 | PRIVATEKEY=$(wg genkey | tee /etc/wireguard/privatekey) 3 | echo "[Interface]" > /etc/wireguard/wg0.conf 4 | echo "PrivateKey = $PRIVATEKEY" >> /etc/wireguard/wg0.conf 5 | echo "Address = $1" >> /etc/wireguard/wg0.conf 6 | echo "ListenPort = $2" >> /etc/wireguard/wg0.conf 7 | echo "PostUp = iptables -t nat -A POSTROUTING --destination 10.10.0.5 -j ACCEPT;iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE" >> /etc/wireguard/wg0.conf 8 | echo "PostDown = iptables -t nat -D POSTROUTING --destination 10.10.0.5 -j ACCEPT;iptables -t nat -D POSTROUTING -o $INTERFACE -j MASQUERADE" >> /etc/wireguard/wg0.conf 9 | wg-quick down wg0 10 | wg-quick up wg0 11 | -------------------------------------------------------------------------------- /scripts/start_ad.sh: -------------------------------------------------------------------------------- 1 | route add -net 10.0.1.0 netmask 255.255.255.0 gw wg 2 | route add -net 10.0.3.0 netmask 255.255.255.0 gw wg1 3 | route add -net 10.0.2.0 netmask 255.255.255.0 gw oc 4 | cat /ssh/key.pub > /root/.ssh/authorized_keys 5 | ssh-keygen -A 6 | exec /usr/sbin/sshd -D -e "$@" & 7 | /opt/adguardhome/AdGuardHome --no-check-update --pidfile /opt/adguardhome/pid -c /config/AdGuardHome.yaml -h 0.0.0.0 -w /opt/adguardhome/work 8 | tail -f /dev/null 9 | -------------------------------------------------------------------------------- /scripts/start_ng.sh: -------------------------------------------------------------------------------- 1 | cat /ssh/key.pub > /root/.ssh/authorized_keys 2 | ssh-keygen -A 3 | exec /usr/sbin/sshd -D -e "$@" & 4 | sed "s/ss:[0-9]\+/ss:$SSPORT/" /nginx_default.conf > change_port 5 | cat change_port > /nginx_default.conf 6 | sed "s/ss:[0-9]\+/ss:$SSPORT/" /etc/nginx/nginx.conf > change_port 7 | cat change_port > /etc/nginx/nginx.conf 8 | nginx -g "daemon off;" 9 | -------------------------------------------------------------------------------- /scripts/start_np.sh: -------------------------------------------------------------------------------- 1 | cat /ssh/key.pub > /root/.ssh/authorized_keys 2 | ssh-keygen -A 3 | exec /usr/sbin/sshd -D -e "$@" & 4 | caddy run -c /config/Caddyfile > /dev/null 2>&1 & 5 | tail -f /dev/null 6 | -------------------------------------------------------------------------------- /scripts/start_oc.sh: -------------------------------------------------------------------------------- 1 | INTERFACE=$(route | grep '^default' | grep -o '[^ ]*$') 2 | cat /ssh/key.pub > /root/.ssh/authorized_keys 3 | ssh-keygen -A 4 | exec /usr/sbin/sshd -D -e "$@" & 5 | iptables -t nat -A POSTROUTING --destination 10.10.0.5 -j ACCEPT 6 | iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE 7 | ocserv -c /etc/ocserv/ocserv.conf 8 | tail -f /dev/null 9 | -------------------------------------------------------------------------------- /scripts/start_php.sh: -------------------------------------------------------------------------------- 1 | rm /ssh/key* 2 | ssh-keygen -m PEM -t rsa -f /ssh/key -N '' 3 | openssl req -newkey rsa:2048 -sha256 -nodes -x509 -days 365 -keyout /certs/self_private -out /certs/self_public -subj "/C=NN/ST=N/L=N/O=N/CN=$IP" 4 | php init.php 5 | if [[ -f "/start" && -f "/ssh/key.pub" && -s "/ssh/key.pub" ]]; then 6 | unitd --log /logs/unit_error 7 | curl -X PUT --data-binary @/config/unit.json --unix-socket /var/run/control.unit.sock http://localhost/config 8 | pkill unitd 9 | unitd --no-daemon --control 0.0.0.0:8080 --log /logs/unit_error 10 | else 11 | exit 1; 12 | fi 13 | -------------------------------------------------------------------------------- /scripts/start_proxy.sh: -------------------------------------------------------------------------------- 1 | cat /ssh/key.pub > /root/.ssh/authorized_keys 2 | ssh-keygen -A 3 | exec /usr/sbin/sshd -D -e "$@" & 4 | sed -n "s/\"server_port\": \([0-9]\+\),/\1/p" /config.json > current_port 5 | CURRENT_PORT=$(cat current_port | tr -d " ") 6 | if [ "$CURRENT_PORT" -ne "443" ] 7 | then 8 | sed "s/\"server_port\": [0-9]\+/\"server_port\": $SSPORT/" /config.json > change_port 9 | cat change_port > /config.json 10 | fi 11 | sslocal -v -d -c /config.json 12 | tail -f /dev/null 13 | -------------------------------------------------------------------------------- /scripts/start_service.sh: -------------------------------------------------------------------------------- 1 | cat /ssh/key.pub > /root/.ssh/authorized_keys 2 | ssh-keygen -A 3 | exec /usr/sbin/sshd -D -e "$@" & 4 | php service.php 5 | php iplimit.php & 6 | php cron.php -------------------------------------------------------------------------------- /scripts/start_ss.sh: -------------------------------------------------------------------------------- 1 | cat /ssh/key.pub > /root/.ssh/authorized_keys 2 | ssh-keygen -A 3 | exec /usr/sbin/sshd -D -e "$@" & 4 | sed "s/\"server_port\": [0-9]\+/\"server_port\": $SSPORT/" /config.json > change_port 5 | cat change_port > /config.json 6 | ssserver -v -d -c /config.json 7 | tail -f /dev/null 8 | -------------------------------------------------------------------------------- /scripts/start_tg.sh: -------------------------------------------------------------------------------- 1 | echo 'root:dummy_passwd'|chpasswd 2 | cat /ssh/key.pub > /root/.ssh/authorized_keys 3 | ssh-keygen -A 4 | exec /usr/sbin/sshd -D -e "$@" & 5 | curl -s https://core.telegram.org/getProxySecret -o proxy-secret 6 | curl -s https://core.telegram.org/getProxyConfig -o proxy-multi.conf 7 | tail -f /dev/null 8 | -------------------------------------------------------------------------------- /scripts/start_upstream.sh: -------------------------------------------------------------------------------- 1 | cat /ssh/key.pub > /root/.ssh/authorized_keys 2 | ssh-keygen -A 3 | exec /usr/sbin/sshd -D -e "$@" & 4 | nginx -g "daemon off;" 5 | -------------------------------------------------------------------------------- /scripts/start_wg.sh: -------------------------------------------------------------------------------- 1 | cat /ssh/key.pub > /root/.ssh/authorized_keys 2 | ssh-keygen -A 3 | exec /usr/sbin/sshd -D -e "$@" & 4 | 5 | INTERFACE=$(route | grep '^default' | grep -o '[^ ]*$') 6 | if [ "$HOSTNAME" = "wireguard1" ] 7 | then 8 | if [ $(cat /etc/wireguard/wg0.conf | wc -c) -eq 0 ] 9 | then 10 | PRIVATEKEY=$(wg genkey | tee /etc/wireguard/privatekey) 11 | echo "[Interface]" > /etc/wireguard/wg0.conf 12 | echo "PrivateKey = $PRIVATEKEY" >> /etc/wireguard/wg0.conf 13 | echo "Address = $ADDRESS" >> /etc/wireguard/wg0.conf 14 | echo "ListenPort = $WG1PORT" >> /etc/wireguard/wg0.conf 15 | else 16 | sed "s/ListenPort = [0-9]\+/ListenPort = $WG1PORT/" /etc/wireguard/wg0.conf > change_port 17 | cat change_port > /etc/wireguard/wg0.conf 18 | fi 19 | else 20 | if [ $(cat /etc/wireguard/wg0.conf | wc -c) -eq 0 ] 21 | then 22 | PRIVATEKEY=$(wg genkey | tee /etc/wireguard/privatekey) 23 | echo "[Interface]" > /etc/wireguard/wg0.conf 24 | echo "PrivateKey = $PRIVATEKEY" >> /etc/wireguard/wg0.conf 25 | echo "Address = $ADDRESS" >> /etc/wireguard/wg0.conf 26 | echo "ListenPort = $WGPORT" >> /etc/wireguard/wg0.conf 27 | else 28 | sed "s/ListenPort = [0-9]\+/ListenPort = $WGPORT/" /etc/wireguard/wg0.conf > change_port 29 | cat change_port > /etc/wireguard/wg0.conf 30 | fi 31 | fi 32 | iptables -t nat -A POSTROUTING --destination 10.10.0.5 -j ACCEPT 33 | iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE 34 | ln -s /etc/wireguard/wg0.conf /etc/amnezia/amneziawg/wg0.conf 35 | if [ "$HOSTNAME" = "wireguard1" ] 36 | then 37 | if [ $(cat /pac.json | jq .wg1_amnezia) -eq 1 ] 38 | then 39 | awg-quick up wg0 40 | else 41 | wg-quick up wg0 42 | fi 43 | if [ $(cat /pac.json | jq .wg1_blocktorrent) -eq 1 ] 44 | then 45 | sh /block_torrent.sh 46 | fi 47 | if [ $(cat /pac.json | jq .wg1_exchange) -eq 1 ] 48 | then 49 | sh /block_exchange.sh 50 | fi 51 | else 52 | if [ $(cat /pac.json | jq .amnezia) -eq 1 ] 53 | then 54 | awg-quick up wg0 55 | else 56 | wg-quick up wg0 57 | fi 58 | if [ $(cat /pac.json | jq .blocktorrent) -eq 1 ] 59 | then 60 | sh /block_torrent.sh 61 | fi 62 | if [ $(cat /pac.json | jq .exchange) -eq 1 ] 63 | then 64 | sh /block_exchange.sh 65 | fi 66 | fi 67 | tail -f /dev/null 68 | -------------------------------------------------------------------------------- /scripts/start_wp.sh: -------------------------------------------------------------------------------- 1 | cat /ssh/key.pub > /root/.ssh/authorized_keys 2 | echo 'HostKeyAlgorithms +ssh-rsa' >> /etc/ssh/sshd_config 3 | echo 'PubkeyAcceptedKeyTypes +ssh-rsa' >> /etc/ssh/sshd_config 4 | service ssh start 5 | off=$(cat /config/pac.json | jq -r .warpoff) 6 | key=$(cat /config/pac.json | jq -r .warp) 7 | if [ "$off" = 'null' ] 8 | then 9 | warp-svc > /dev/null & 10 | sleep 3 11 | if [ ! -f /var/lib/cloudflare-warp/conf.json ] 12 | then 13 | warp-cli --accept-tos registration new 14 | if [ ! -z "$key" ] 15 | then 16 | warp-cli --accept-tos registration license $key 17 | fi 18 | fi 19 | warp-cli --accept-tos mode proxy 20 | warp-cli --accept-tos connect 21 | fi 22 | socat TCP-LISTEN:4000,fork TCP:127.0.0.1:40000 23 | -------------------------------------------------------------------------------- /scripts/start_xray.sh: -------------------------------------------------------------------------------- 1 | cat /ssh/key.pub > /root/.ssh/authorized_keys 2 | ssh-keygen -A 3 | exec /usr/sbin/sshd -D -e "$@" & 4 | if [ $(cat /xray.json | jq -r '.inbounds[0].settings.clients[0].id' | wc -c) -gt 1 ] 5 | then 6 | xray run -config /xray.json > /dev/null & 7 | fi 8 | tail -f /dev/null 9 | -------------------------------------------------------------------------------- /scripts/vpnbot.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=VPN: Docker Compose Application Service 3 | Requires=docker.service 4 | After=docker.service 5 | [Service] 6 | Type=oneshot 7 | RemainAfterExit=yes 8 | WorkingDirectory=path 9 | ExecStartPre=/bin/sh -c "touch ./override.env ./docker-compose.override.yml" 10 | ExecStart=/bin/sh -c "IP=$(curl https://ipinfo.io/ip) VER=$(git describe --tags) docker compose --env-file ./.env --env-file ./override.env up -d --force-recreate" 11 | ExecStartPost=/bin/sh -c "bash ./update/update.sh &" 12 | ExecStop=/bin/sh -c "docker compose down --remove-orphans" 13 | ExecStopPost=/bin/sh -c "kill -9 $(cat ./update/update_pid) > /dev/null" 14 | TimeoutStartSec=0 15 | [Install] 16 | WantedBy=multi-user.target 17 | -------------------------------------------------------------------------------- /singbox_windows/singbox.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/singbox_windows/singbox.zip -------------------------------------------------------------------------------- /singbox_windows/winsw3.xml: -------------------------------------------------------------------------------- 1 | 2 | singbox 3 | singbox 4 | singbox 5 | %BASE%\sing-box.exe 6 | run -c %BASE%\config.json 7 | rotate 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /ssh/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mercurykd/vpnbot/3a8a843d8c28c973efef9f1510cc7fc75c661c75/ssh/.gitkeep -------------------------------------------------------------------------------- /unit.rest: -------------------------------------------------------------------------------- 1 | @url = http://127.0.0.1:8081 2 | ### 3 | 4 | GET {{url}}/status 5 | ### 6 | GET {{url}}/config 7 | -------------------------------------------------------------------------------- /update/update.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | pwd=`pwd` 3 | process_name="$pwd/update/update.sh" 4 | current_pid=$$ 5 | pids=$(pgrep -f $process_name) 6 | for pid in $pids; do 7 | if [ $pid -ne $current_pid ]; then 8 | kill -9 $pid 9 | fi 10 | done 11 | 12 | > $pwd/update/pipe 13 | echo "$$" > $pwd/update/update_pid 14 | 15 | while true 16 | do 17 | cmd=$(cat $pwd/update/pipe) 18 | branch=$(cat $pwd/update/branch 2>/dev/null) 19 | if [[ -n "$cmd" ]] 20 | then 21 | key=$(cat $pwd/update/key) 22 | curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "stopping the bot"/')" 23 | docker compose down --remove-orphans 24 | if [[ "$cmd" == "1" ]] 25 | then 26 | curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "clearing the directory"/')" 27 | git reset --hard && git clean -fd 28 | curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "downloading the update"/')" 29 | git fetch 30 | if [[ -n "$branch" ]] 31 | then 32 | curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "changing branch"/')" 33 | git checkout -t origin/$branch || git checkout $branch 34 | fi 35 | curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "applying updates"/')" 36 | git pull > ./update/message 37 | fi 38 | curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "launching the bot"/')" 39 | > $pwd/update/key 40 | > $pwd/update/curl 41 | IP=$(curl -s -t 1 2ip.io || curl -s -t 1 ipinfo.io/ip || curl -s -t 1 ifconfig.me) VER=$(git describe --tags) docker compose --env-file ./.env --env-file ./override.env up -d --force-recreate 42 | bash $pwd/update/update.sh & 43 | exit 0 44 | fi 45 | sleep 1 46 | done -------------------------------------------------------------------------------- /version: -------------------------------------------------------------------------------- 1 | 20.05.2025 v2.20 2 | - коррекция главного меню 3 | - vless: опция обнуления статы ежемесячно 4 | 17.05.2025 v2.19 5 | - фикс падения vless при одинаковом имени пользователей 6 | - фикс падения vless при установке таймера для выключенного пользователя 7 | - подсветка в меню работы процесса контейнера 8 | - overwrite=no для импорта клеш подписки (legiz) 9 | 18.04.2025 v2.18 10 | - фикс отсутствия ssl при первом старте 11 | - iplimit уведомляет без отключения пользователя 12 | - включение udp в mihomo-шаблоне 13 | - удаление лишнего образа пхп 14 | 07.04.2025 v2.17 15 | - фикс циклической перезагрузки панели adguardHome 16 | 07.04.2025 v2.16 17 | - фикс warp 18 | 07.04.2025 v2.15 19 | - миграция поддоменов np/oc вместе в с бэкапом 20 | 02.03.2025 v2.14 21 | - vless ip limit: фикс выключения юзера 22 | 22.02.2025 v2.13 23 | - vless: улучшение сбора статы 24 | - vless: фикс добавления правил srs для block outbound 25 | 11.02.2025 v2.12 26 | - vless: хранение статы в отдельном файле 27 | - vless ip limit: возможность указать кол-во айпи 28 | 08.02.2025 v2.11 29 | - vless: singbox 1.11 30 | 07.02.2025 v2.10 31 | - vless: ip limit 32 | - vless: общая стата 33 | - vless: пакетное добавление профилей 34 | - vless: при добавлении можно указывать свой uuid (name:uuid, name:uuid, ...) 35 | - автоудаление логов 36 | - хэш бота сохраняется в настройках и восстанавливается с бэкапом. можно накатывать бэкап на нового бота 37 | 02.02.2025 v2.9 38 | - откат sing-box 1.11 39 | 02.02.2025 v2.8 40 | - vless: корректировка статы юзера 41 | - sing-box 1.11 42 | 29.01.2025 v2.7 43 | - vless: сброс статистики юзера 44 | 24.01.2025 v2.6 45 | - правки меню 46 | - vless:добавлена возможность маршрутизировать список ip-сетей 47 | 18.01.2025 v2.5 48 | - фикс скачивания шаблона михомо 49 | - обновлен singbox.exe 50 | - вывод статистики vless пользователей 51 | - смягчил паттерн поиска reality degenerate в логах 52 | 07.01.2025 v2.4 53 | - вернул shadowsocks (спасибо за донат) 54 | 04.01.2025 55 | - возможность установить нужную версию с нуля 56 | - корректировка автосканера под новую версию 57 | - улучшение основного меню 58 | 26.12.2024 v2.2 59 | - возможность менять поддомен для naive/openconnect 60 | 26.12.2024 v2.1 61 | - обновление версии singbox и конфига под него 62 | 22.12.2024 v2.0 63 | !!! версия не совместима с предыдущими, возможно прийдется накатывать руками. старые конфиги (кроме вг) не будут работать! перед обновлением: 64 | - включить все порты или удалить docker-compose.override.yml 65 | - переключить vless на вебсокет 66 | - запустить обновление, если бот запуститься: 67 | - перевыпустить сертификаты 68 | - все ссылки на конфиги будут новыми (старые не будут работать) 69 | - переключить vless на нужный режим (передернуть тумблер) 70 | - включить нужные вам порты (по умолчанию включено только 80 и 443) 71 | 72 | что нового: 73 | - по умолчанию включены только 80, 443 порты 74 | - у каждого инстанса бота теперь индивидуальные ссылки и поддомены 75 | - отключены заголовки в ответах по которым можно было идентифицировать бота 76 | - стандартная заглушка на главной заменена на basic auth. если есть override.html - то покажет его 77 | - любая ссылка 'не по адресам бота' выдает непроходимый basic auth 78 | - поддомены np и oc теперь у каждого индивидуальные 79 | - выпилен shadowsocks (10.10.0.3 прокси теперь нет) 80 | - добавлен direct rule в origin-singbox шаблон 81 | - заменены значки для silence mode анализатора логов 82 | - переработано главное меню аля дашбоард 83 | - куча отрефакторенного кода - возможны баги 84 | 85 | 19.12.2024 v1.115 86 | - генерация устойчивого пароля shadowsocks, если он равен test или пуст 87 | 19.12.2024 v1.114 88 | - убран дефолтный пароль у shadowsocks 89 | 13.12.2024 v1.113 90 | - обновлен adguardHome 91 | - фикс краша adg при удалении dns-upstream из бота 92 | 10.12.2024 v1.112 93 | - mihomo: встроенные списки теперь отдаются через rule-providers(т.е подгружаются ядром без обновления конфига) 94 | - обновлены ядра 95 | 09.12.2024 v1.111 96 | - mihomo: фикс rule-providers format 97 | 06.12.2024 v1.110 98 | - ruleset для mihomo 99 | 28.11.2024 v1.109 100 | - фикс автоскана 101 | - добавление clash-шаблонов 102 | 21.11.2024 v1.108 103 | - xray: addruleset для direct 104 | - openconnect:ограничение формата при добавлении подсети 105 | - новый механизм сверки ip для анализатора айпи 106 | - мелкие фиксы меню и текста 107 | 21.11.2024 v1.107 108 | - xray: добавлены теги ~cdndomain~, ~directdomain~ 109 | - xray: возможность менять имя главного аутбаунда(тот аутбаунд который заполняет бот, в шаблонах идет как ~outbound~) для клиентских конфигов 110 | - xray: в шаблонах теперь надо явно указывать ключ addruleset в route -> rules, чтобы бот заполнил их правилами из списка ruleset (см origin шаблон) 111 | - openconnect: добавлена маршрутизация (список подсетей общий с wireguard) 112 | - ip ban: фикс обработки подсетей в белом/черном списках 113 | - ip ban: в белый список можно импортировать адреса от telegram, gcore, cloudflare 114 | - добавлена в игнор папка app/webapp/override. она не будет перезатираться после обновления, туда можно положить ваши ресурсы к override.html 115 | - make backup - сохранит в корень backup.json 116 | - make reset - обнуляет все настройки 117 | 18.11.2024 v1.106 118 | - фикс отвала бота при пустых логах телеги 119 | 17.11.2024 v1.105 120 | - фикс установки домена при первом запуске 121 | 16.11.2024 v1.104 122 | - единая механика закрепления бэкапа 123 | - фикс текста уведомления о новой версии 124 | 16.11.2024 v1.103 125 | - фикс уведомления о новой версии 126 | 16.11.2024 v1.102 127 | - переделан раздел списка ip под управление кнопками 128 | - возможность добавить свои айпи в blocklist/whitelist 129 | 15.11.2024 v1.101 130 | - кнопка добавления https://github.com/legiz-ru/sb-rule-sets/raw/main/ru-bundle.lst 131 | - переделан раздел списка ip для читаемости 132 | 15.11.2024 v1.100 133 | - несколько режимов silence для сканера 134 | - анализ сканера скидывает файл всех найденных айпи 135 | - команда /searchLogs (пока только для айпи) 136 | - логи переехали в меню сканера 137 | - обновление текстов и подсказок 138 | 14.11.2024 v1.99.1 139 | - анализ логов и бан айпишников, фиксы 140 | 14.11.2024 v1.99 141 | - анализ логов и бан айпишников 142 | 11.11.2024 v1.98 143 | - фикс заполнения clientId при наполнении белого списка клиентов adg 144 | 09.11.2024 v1.97 145 | - новая ссылка на чат поддержки. пожалуйста не размещайте ее на форумах и чатах во избежание набега leafers https://www.youtube.com/watch?v=9tlNJmjuKD4 146 | 06.11.2024 v1.96 147 | - фикс пароля adguard 148 | - таймаоут для проверки статуса adguard 149 | 04.11.2024 v1.95 150 | - отключение портов контейнеров из меню 151 | - перезагрузка из меню 152 | 04.11.2024 v1.94 153 | - xray: возможность перемещать и переименовывать outbound заполняемый ботом 154 | 04.11.2024 v1.93 155 | - adguardHome: сброс настроек 156 | - adguardHome: статус работоспособности 157 | - xray: выбор outbound для списков 158 | - xray: выбор outbound для final 159 | - xray: дефолтный домен reality microsoft.com заменен на telegram.org 160 | - xray: создание шаблона путем копирования оригинала 161 | - xray: редактирование шаблона прямо в боте 162 | 30.10.2024 v1.92 163 | - возможность скачать origin шаблон 164 | 30.10.2024 v1.91 165 | - кнопка nip.io для быстрой смены домена 166 | 27.10.2024 v1.90 167 | - очередной фикс запуска warp после апдейта 168 | - правки фраз меню 169 | 26.10.2024 v1.89 170 | - xray rulesset: фикс меню при отсутствующих правилах 171 | 26.10.2024 v1.88 172 | - xray rulesset: дублирование кнопок текстом 173 | - singbox 1.10.1 для windows x64 174 | - фикс с включенным warp после апдейта 175 | - фикс с нерабочей кнопкой апдейта, обновится можно через /autoupdate если поймали не рабочую кнопку апдейта 176 | 25.10.2024 v1.87 177 | - xray: в routes добавлен раздел proxy - зеркало раздела Pac 178 | 25.10.2024 v1.86 179 | - фикс не срабатывания автобэкапа во время старта 180 | - adguard: вывод списка разрешенных клиентов 181 | - adguard: кнопка заполнения разрешенных клиентов - собирает все clientId со всех контейнеров 182 | - adguard: вывод статуса безопасного поиска 183 | - warp: при выключении удаляется регистрация deviceid 184 | 24.10.2024 v1.85 185 | - фикс удаления состояния warp после рестарта 186 | - возможность перезаписать фразы меню бота через app/override.php 187 | 24.10.2024 v1.84 188 | - фикс показа ссылки для openconnect 189 | 24.10.2024 v1.83 190 | - фикс ошибок доступа контейнеров при автообновлении 191 | 23.10.2024 v1.82 192 | - фикс автобэкапа 193 | 23.10.2024 v1.81 194 | - фикс краша wireguard после апдейта 195 | 23.10.2024 v1.80 196 | - фикс пустых правил для singbox 197 | 23.10.2024 v1.79 198 | - улучшение процесса обновления 199 | 23.10.2024 v1.78 200 | - фикс двойного импорта при обновлении, когда админов больше одного 201 | - рестарт бота сбрасывает очередь сообщений от телеграма 202 | - при старте статус крона не показывается, т.к он еще не успел запуститься 203 | 23.10.2024 v1.77 204 | - вывод статуса cron 205 | - фикс с отправкой бэкапа при спецсимволах в названии бота 206 | - проверка формата времени в автобэкапе 207 | 22.10.2024 v1.76 208 | - улучшение определения ip бота при старте 209 | 22.10.2024 v1.75 210 | - openconnect: isolate-workers = false 211 | 21.10.2024 v1.74 212 | - openconnect: expose-iroutes on/off 213 | 21.10.2024 v1.73 214 | - openconnect: ограничение контейнера по цпу и памяти 215 | 21.10.2024 v1.72 216 | - xray: теги в кастомных шаблонах 217 | 21.10.2024 v1.71 218 | - фикс установки nip.io при первом запуске 219 | - фикс инициализации вебпанели adguardHome при первом запуске 220 | 14.10.2024 v1.70 221 | - xray route: учет регистра в process_name, package_name 222 | 14.10.2024 v1.69 223 | - xray route: добавлен список process_name 224 | 14.10.2024 v1.68 225 | - singbox template: package_name -> ruleset 226 | 13.10.2024 v1.67 227 | - sslip.io -> nip.io 228 | 13.10.2024 v1.66 229 | - singbox template: изменен порядок правил маршрутизации для package_name 230 | 10.10.2024 v1.65.1 231 | - фикс создания архива windows service singbox 2 232 | 09.10.2024 v1.65 233 | - фикс создания архива windows service singbox 234 | 06.10.2024 v1.64.1 235 | - добавление html заглушки через меню 236 | 06.10.2024 v1.64 237 | - возможность установить свою html-заглушку 238 | 06.10.2024 v1.63 239 | - приоритет правила block над остальными в стандартном шаблоне sing-box 240 | 30.09.2024 v1.62 241 | - импорт профиля xray в karing 242 | 30.09.2024 v1.61.1 243 | - фикс удаления ключа варпа через ноль 244 | 29.09.2024 v1.61 245 | - включение/отключение процесса warp 246 | 29.09.2024 v1.60 247 | - ускорение сборки архива sing-box windows 248 | 23.09.2024 v1.59 249 | - docker compose v2.29.6 (при установке бота) 250 | 22.09.2024 v1.58 251 | - фикс запуска бота с правильными параметрами после обновления 252 | 22.09.2024 v1.57 253 | - выбор типа endpoint для wireguard/amnezia 254 | 22.09.2024 v1.56.2 255 | - фикс разных доменов при указании cdn для xray 256 | 19.09.2024 v1.56.1 257 | - cdn для xray 258 | 17.09.2024 v1.55 259 | - возможность подменить домен в ссылках на конфиги 260 | 16.09.2024 v1.54.2 261 | - фикс нэйминга клиентов в adguardHome: замена на uuid 262 | 16.09.2024 v1.54.1 263 | - фикс нэйминга клиентов в adguardHome 264 | 16.09.2024 v1.54 265 | - ~dns~ в шаблоне сингбокса подменяятся на https://DOMAIN/dns-query/USERNAME 266 | - при добавлении пользователя в XRAY, он также добавляется в AdguardHome как сохраненый клиент 267 | 10.09.2024 v1.53 268 | - домен в endpoint для амнезии 269 | 10.09.2024 v1.52 270 | - фикс спамящего уведомления о просрочке сертификата 271 | 10.09.2024 v1.51 272 | - фикс ipinfo 273 | 08.09.2024 v1.50 274 | - fix import with transport 275 | 08.09.2024 v1.49 276 | - fix add user xray with transport 277 | 08.09.2024 v1.48 278 | - fix change xray transport, save private key xray 279 | 08.09.2024 v1.47 280 | - fix websocket -> reality 281 | 03.09.2024 v1.46.2 282 | - fix link v2ray 283 | 03.09.2024 v1.46.1 284 | - fix import 285 | - fix websocket domain 286 | 03.09.2024 v1.46 287 | - возможность добавить кастомный поддомен для Letsencrypt 288 | 03.09.2024 v1.45 289 | - выбор транспорта reality/websocket 290 | 26.08.2024 v1.44 291 | - qr для xtls 292 | - фикс действий на элементом списков 293 | 21.08.2024 v1.43 294 | - singbox:поддержка кастомных outbound для ruleset 295 | 16.08.2024 v1.42.1 296 | - фикс добавления рулсетов с длинными урл 297 | 16.08.2024 v1.42 298 | - добавлена возможность сохранять/восстанавливать список доменов/правил маршрутизации 299 | - изменена ссылка на сингбокс-конфиг для совместимости с клиентом сингбокса (фикс импорта в sing-box) 300 | - sing-box: добавлена возможность добавлять свои packagename (outbound:proxy) 301 | - sing-box: добавлена возможность добавлять свои ruleset с указанием outbound и временем обновления 302 | - sing-box: списки доменов pac/warp/block трансформируются в собственный ruleset и присутствуют в шаблоне origin всегда, даже если они пустые. это дает возможность не ждать перезагрузки конфига клиентом 303 | 09.08.2024 v1.41.1 304 | - фикс для "удалить все" в списках доменов 305 | 06.08.2024 v1.41 306 | - возможность очистить РАС лист 307 | 03.08.2024 v1.40 308 | - возможность менять MTU для Wireguard/Amnezia 309 | - раздельный qr для AmneziaWG + AmneziaVPN 310 | 18.05.2024 v1.39 311 | - изменен автобэкап 312 | 04.05.2024 v1.38 313 | - changelog в сообщении новой версии 314 | 04.05.2024 v1.37.1 315 | - warp на образе alpine (thx @zmeyzloy) 316 | - фикс выбора шаблона singbox 317 | 22.04.2024 v1.35 318 | - очистка старых образов 319 | 19.04.2024 v1.34 320 | - формирование rule_set из шаблона singbox 321 | 18.04.2024 v1.33 322 | - вывод статуса warp в меню 323 | 18.04.2024 v1.32 324 | - фиксы в названии и отображении выбранного шаблона xtls 325 | 18.04.2024 v1.31 326 | - возможность устанавливать ключ для warp 327 | 16.04.2024 v1.30.1 328 | - улучшение сообщения об обновлениях 329 | 16.04.2024 v1.30 330 | - улучшение скрипта обновления 331 | 16.04.2024 v1.29 332 | - рефакторинг подписок 333 | - кнопки импорта для различных клиентов 334 | - шаблоны для v2ray 335 | 15.04.2024 v1.28 336 | - xtls: список блокировки, список warp 337 | - улучшение отображения таймера 338 | 14.04.2024 v1.27.1 339 | - singbox windows: замена winsw на winsw3, + скрипт обновления подписки 340 | 13.04.2024 v1.27 341 | - архив сингбокса для windows, работает как служба 342 | 12.04.2024 v1.26 343 | - имя клиента xtls подтягивается по подписке из бота 344 | 11.04.2024 v1.25 345 | - подпись дефолтного шаблона в разделе пользователя xtls 346 | 11.04.2024 v1.24 347 | - обновлен раздел PAC, добавлена возможность добавить домены из https://community.antifilter.download/ 348 | 11.04.2024 v1.23 349 | - фикс совместимости старого конфига xray из бэкапа 350 | 11.04.2024 v1.22 351 | - улучшение гибкости выбора шаблона sing-box 352 | 11.04.2024 v1.21 353 | - фикс доступности адгвард панели при первом запуске 354 | 10.04.2024 v1.20 355 | - выбор дефолтного шаблона sing-box 356 | 10.04.2024 v1.19 357 | - загрузка шаблонов sing-box 358 | - выбор шаблона sing-box для пользователя 359 | 10.04.2024 v1.18 360 | - включение/выключение xtls юзеров 361 | 09.04.2024 v1.17 362 | - редактируемые конфиги v2ray/sing-box 363 | 09.04.2024 v1.16 364 | - редактируемые конфиги v2ray/sing-box 365 | 09.04.2024 v1.15.4 366 | - замена domain на domain_suffix 367 | 09.04.2024 v1.15.2 368 | - фикс подписки v2ray 369 | 09.04.2024 v1.15.2 370 | - редиректы вместо кнопки-подписки 371 | - фикс добавления подписки 372 | 09.04.2024 v1.15.1 373 | - кнопка sing-box 374 | - фикс пустого списка РАС для sing-box 375 | 09.04.2024 v1.15.1 376 | - кнопка sing-box 377 | - фикс пустого списка РАС для sing-box 378 | 08.04.2024 v1.15 379 | - подписка с маршрутизацией для singbox 380 | 07.04.2024 v1.14 381 | - раздельные пользователи для XTLS-Reality 382 | - подписка с маршрутизацией для v2rayN/nginx 383 | - обновление ядра xray 1.8.10 384 | - упрощение PAC 385 | 28.03.2024 v1.13 386 | - кнопка обновления показывает есть ли обновления 387 | 21.03.2024 v1.12 388 | - доработка скрипта обновления 389 | 20.03.2024 v1.11 390 | - XTLS-Reality steal from yourself 391 | 18.03.2024 v1.10 392 | - MTProto Fake-TLS 393 | 17.03.2024 v1.9 394 | - автоматический технический домен sslip 395 | 13.03.2024 v1.8.10 396 | - фикс override.env 397 | 10.03.2024 v1.8.9 398 | - веб морда адгварда "встроена" в телеграм 399 | - мелкие улучшения меню 400 | 07.03.2024 v1.8.8 401 | - фикс не работающего wireguard 402 | 07.03.2024 v1.8.7 403 | - фикс порта амнезии 404 | - у кого ошибка запуска обновите докер и докер композ 405 | 07.03.2024 v1.8.6 406 | - фикс синхронизации клиентов амнезии, бот падал после рестарта, клиенты пропадали 407 | - возможность переназначить порты в override.env, файл не отслеживаемый, обновление не будет его сбрасывать 408 | - убрал дублирование образа php 409 | 06.03.2024 410 | - короткие ссылки для амнезии 411 | - фикс работы openconnect 412 | - фикс экспорта пользователей openconnect 413 | - фикс скрипта установки бота как сервиса 414 | 04.03.2024 415 | - решение "серого айпи" при запуске 416 | - фикс стартового скрипта второго контейнера wireguard 417 | 03.03.2024 возможность обновления бота по кнопке из самого бота 418 | - git pull && make r 419 | 02.03.2024 2 сервера wireguard, для возможности один запускать как wireguard а второй как amnezia 420 | - git pull && make r 421 | 01.03.2024 фикс блокировок торрентов и обмена между пользователями 422 | - git pull && make r 423 | 01.03.2024 фикс установки домена с длинным названием 424 | - make update 425 | 29.02.2024 образы теперь будут скачиваться с docker hub 426 | - git pull && make d cleanall u 427 | 28.02.2024 v1.1 добавлен раздел "зеркало" 428 | - git pull && make r 429 | 27.02.2024 оптимизация размеров образов, сборка naive из исходников 430 | - git pull && make r 431 | 19.02.2024 добавлен NaiveProxy 432 | - сделать бэкап 433 | - git reset --hard && git pull && make r 434 | - восстановить бэкап 435 | - обновить сертификат 436 | 08.02.2024 добавлена amnezia + мелкие правки 437 | git pull 438 | make r 439 | 29.01.2024 добавлен openconnect 440 | git pull 441 | make r 442 | 17.11.2023 уведомление о скорой просрочке сертификата 443 | git pull 444 | make r 445 | 12.11.2023 AdGuardHome latest docker image 446 | git pull 447 | make r 448 | настройки адгварда сбросятcя, можно воспользоваться бэкапом 449 | 16.10.2023 AdGuardHome v0.107.39 450 | git pull 451 | make r 452 | 12.09.2023 AdGuardHome v0.107.38 453 | git pull 454 | make r 455 | 10.09.2023 фикс сертбота 456 | git pull 457 | make r 458 | 09.09.2023 AdGuardHome v0.107.37 459 | git pull 460 | make r 461 | 24.08.2023 показ пароля в меню Shadowsocks 462 | git pull 463 | 21.08.2023 фикс прокси через 10.10.0.3 464 | git pull 465 | make r 466 | щелкнуть кнопку v2ray 2 раза 467 | 19.08.2023 фикс xtls 468 | git stash 469 | git pull 470 | git stash pop 471 | make r 472 | 19.08.2023 показывает в логах и в адгварде реальные айпи пользователей 473 | сделать бэкап 474 | git reset --hard 475 | git pull 476 | импорт бэкапа 477 | make r 478 | сделать новый бэкап 479 | 07.08.2023 AdGuardHome v0.107.36 480 | git pull 481 | 21.07.2023 уведомления при нажатии кнопки 482 | git pull 483 | 20.07.2023 кнопка блокировки обмена между пирами 484 | git pull 485 | make r 486 | 16.07.2023 AdGuardHome v0.107.34 487 | git pull 488 | make r 489 | 16.07.2023 490 | - настройка кол-ва итемов пагинации 491 | - добавлен config/include.conf для подключения доп конфигов nginx 492 | - добавлена команда обновления make update для обхода конфликтов при слиянии конфигов 493 | git stash 494 | git pull 495 | git stash pop stash@{0} 496 | make r 497 | 08.07.2023 update AdGuard Home v0.107.33 498 | git pull 499 | make r 500 | 28.06.2023 нэйминг бэкапов 501 | git pull 502 | 28.06.2023 XTLS-Reality 503 | git pull 504 | make r 505 | 23.06.2023 миграция на alpine образы 506 | ЭКСПОРТ!!! 507 | make d 508 | git reset --hard 509 | git pull 510 | make cleanall (два раза подтверждаем Y) 511 | make u 512 | ИМПОРТ!!! 513 | 20.06.2023 раздел логов 514 | git pull 515 | 18.06.2023 улучшение меню вг 516 | git pull 517 | 18.06.2023 adguardHome v0.107.32 518 | git pull 519 | 18.06.2023 бэкап по крону 520 | git pull 521 | make r 522 | 18.06.2023 изменение меню MTProto 523 | git pull 524 | 16.06.2023 время пира в абсолютном формате 525 | git pull 526 | 16.06.2023 527 | - новые правила наименования пира 528 | - улучшение отображения статуса пиров, отображение трафика 529 | git pull 530 | 16.06.2023 исправлен скрипт автозагрузки 531 | cd /root/vpnbot 532 | git pull 533 | bash scripts/install_as_service.sh 534 | 12.06.2023 535 | - обновлен adguard до v0.107.31 536 | git pull 537 | make r 538 | 11.06.2023 539 | - улучшен дашборд пиров под мобилку 540 | - фикс показа выключенного пира 541 | - фикс обновления статуса пиров 542 | - сокращения подписей 543 | 11.06.2023 544 | - переделан дашборд пиров 545 | - включение/выключение пира теперь всегда сбрасывает таймер 546 | - фикс рассинхрона конфигов при удалении пира 547 | - фикс, при добавлении пира учитываются айпи выключенных пиров 548 | git pull 549 | make r 550 | 10.06.2023 фикс добавления пира вг "список подсетей" 551 | git pull 552 | 09.06.2023 фикс поведения кнопки подсетей 553 | git pull 554 | 07.06.2023 фикс рассинхрона пароля в ss 555 | git pull 556 | 07.06.2023 установка таймера включает пир, если он был выключен 557 | git pull 558 | 07.06.2023 адаптация конфига wg под текущий домен/айпи/порт 559 | git pull 560 | 06.06.2023 отображение времени жизни пира в виде счетчика 561 | git pull 562 | 06.06.2023 изменена логика запуска MTProto и кнопки генерации секрета 563 | git pull 564 | 06.06.2023 фикс зависания wireguard после ребута 565 | git pull 566 | в файле
config/wg0.conf
удалите строчку с DNS, если она там есть 567 | перезапустите make r 568 | 05.06.2023 пофиксил "автозагрузку": 569 | service vpnbot stop 570 | git pull 571 | bash scripts/install_as_service.sh 572 | service vpnbot start 573 | 05.06.2023 уведомление о старте бота 574 | 05.06.2023 версионирование 575 | --------------------------------------------------------------------------------