├── .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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------