{"id":483381,"date":"2026-06-12T02:54:58","date_gmt":"2026-06-12T02:54:58","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=483381"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=483381","title":{"rendered":"\u041a\u0430\u043a \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043b\u0438\u0447\u043d\u044b\u0439 \u0446\u0435\u043d\u0442\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f VLESS \u0434\u043b\u044f Android TV, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043b \u0440\u0443\u043a\u0430\u043c\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0438"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440.<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u043b\u0438\u0435\u0432 \u0410\u0440\u0442\u0443\u0440. \u041f\u043e\u043a\u0430 \u043c\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 <a href=\"https:\/\/habr.com\/ru\/articles\/1038580\/\" rel=\"noopener noreferrer nofollow\">EvertyDesk<\/a>, \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0421\u043a\u043e\u0440\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u043d\u0430\u0448\u0438 \u043d\u043e\u0432\u0438\u043d\u043a\u0438, \u0442\u0440\u044e\u043a\u0438 \u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c, \u043d\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 &#8212; \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0442\u043e\u0432\u043e\u0439, \u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u043e\u0447\u0435\u043d\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043c\u043d\u043e\u0433\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043f\u043e\u0435\u0445\u0430\u043b\u0438.<\/p>\n<p>\u0420\u0435\u0447\u044c \u043f\u0440\u043e Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043b \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0431\u043e\u043b\u044c: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u0441\u043c\u0435\u043d\u0443 VLESS-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 Android TV, \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0445 \u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430\u0445 \u0431\u043b\u0438\u0437\u043a\u0438\u0445.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0443 \u0432\u0430\u0436\u043d\u0443\u044e \u0432\u0435\u0449\u044c: \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u043e\u0431\u0445\u043e\u0434 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. \u042d\u0442\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e \u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u0435\u0435 \u0436\u0438\u0442\u044c \u0440\u043e\u0434\u043d\u044b\u043c \u0438 \u0431\u043b\u0438\u0437\u043a\u0438\u043c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u043e\u043c\u0443-\u0442\u043e \u0438\u0437 \u0432\u0430\u0441 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0442\u043e\u0436\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u0435\u043d.  <\/p>\n<p><strong>\u0411\u043e\u043b\u044c: \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u2014 \u043f\u043b\u043e\u0445\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f  <\/strong><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 Wi-Fi \u043d\u0430 Android TV \u0441 \u043f\u0443\u043b\u044c\u0442\u0430, \u0442\u043e \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u043e \u0447\u0451\u043c \u044f. \u041d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u0443\u044e <code>vless:\/\/...<\/code> \u0441\u0441\u044b\u043b\u043a\u0443 \u2014 \u0434\u0435\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434. \u041d\u0430 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435: \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043d\u0443\u0436\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b, \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u043b\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0431\u043b\u0438\u0437\u043a\u0438\u043c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0441\u043d\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432 VLESS \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u043e\u043c. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u0438. \u042f \u043a\u0430\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043f\u043b\u043e\u0445\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0448\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435, \u0441\u043a\u0443\u0447\u043d\u043e\u0435, \u043b\u0435\u0433\u043a\u043e \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u0438\u0437-\u0437\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u043d\u0435 \u043d\u0435\u0441\u0451\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e: \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u043c. \u0410 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0436\u0438\u0442\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u0443\u0434\u043e\u0431\u043d\u043e \u2014 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0438\u043b\u0438 \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435.<\/p>\n<p>\u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f Everty VLESS: \u043b\u0438\u0447\u043d\u044b\u0439 control plane \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 Android TV \u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043e\u0432. \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 QR-\u043a\u043e\u0434 \u0438\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043a\u043e\u0434, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u043c\u0443 VLESS-\u0443\u0437\u043b\u044b, \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f split-tunnel \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a failover.<\/p>\n<p><strong>\u0427\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <\/strong><\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0431\u044b\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439:<\/p>\n<ol>\n<li>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Android TV.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0436\u0438\u043c\u0430\u044e \u00ab\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438\u00bb.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f QR-\u043a\u043e\u0434 \u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u043a\u043e\u0434.<\/p>\n<\/li>\n<li>\n<p>\u0421 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044e QR \u0438\u043b\u0438 \u0432\u0432\u043e\u0436\u0443 \u043a\u043e\u0434.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u043e\u043c \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0443\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439: \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e VLESS-\u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432, \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0443\u0437\u0435\u043b, \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u0443\u0437\u043b\u044b, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c split-tunnel \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u043c\u0435\u043d\u044b \u0438 IP\/CIDR-\u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0436\u0438\u0432 \u043b\u0438 VPN \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u043d\u0435 \u00abVPN-\u043a\u043b\u0438\u0435\u043d\u0442 \u0440\u0430\u0434\u0438 VPN-\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u00bb. \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u2014 \u0443\u0431\u0440\u0430\u0442\u044c \u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0433\u0434\u0435 \u0440\u0443\u0447\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u0430.<\/p>\n<p><strong>\u041e\u0431\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/strong><\/p>\n<ul>\n<li>\n<p>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435:<br \/>Android Phone (\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440) \u2500\u2500\u25ba Controller Token \u2500\u2500\u25ba WordPress REST API (<em>\u043b\u0438\u0447\u043d\u044b\u0439 wordpress, \u0431\u0435\u0437 \u0441\u0441\u044b\u043b\u043e\u043a ;<\/em>)<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 (\u041e\u043f\u0440\u043e\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432):<br \/>WordPress REST API (<em>\u043b\u0438\u0447\u043d\u044b\u0439 wordpress<\/em>) \u25c4\u2500\u2500 [Polling \/ Heartbeat] \u2500\u2500\u25ba Android TV \/ Windows Client<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:<\/strong><\/p>\n<ul>\n<li>\n<p>Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Kotlin \u0438 Jetpack Compose;<\/p>\n<\/li>\n<li>\n<p>VPN-\u0441\u043b\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 Android <code>VpnService<\/code>;<\/p>\n<\/li>\n<li>\n<p>Xray-core \u0447\u0435\u0440\u0435\u0437 <code>libv2ray<\/code>;<\/p>\n<\/li>\n<li>\n<p>TUN -&gt; SOCKS \u043c\u043e\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 <code>hev-socks5-tunnel<\/code>;<\/p>\n<\/li>\n<li>\n<p>WordPress-\u043f\u043b\u0430\u0433\u0438\u043d \u043a\u0430\u043a backend\/control plane;<\/p>\n<\/li>\n<li>\n<p>Windows WPF-\u043a\u043b\u0438\u0435\u043d\u0442 \u043a\u0430\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u043b\u044c\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 WordPress? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0431\u044b\u043b \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0430\u0439\u0442, \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u0431\u0430\u0437\u0430, \u0443\u0436\u0435 \u0431\u044b\u043b PHP-\u043e\u043f\u044b\u0442, \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430. \u042f \u0434\u0430\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 PHP \u0438 WordPress, \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0438\u0448\u0443 \u043f\u043e\u0434 \u043d\u0435\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u043e\u0442\u043d\u043e\u0448\u0443\u0441\u044c \u043a \u043d\u0435\u043c\u0443 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0435\u0439. \u0414\u0430, backend \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c, \u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 WordPress \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c \u043f\u0443\u0442\u0451\u043c \u043e\u0442 \u0438\u0434\u0435\u0438 \u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443.  <\/p>\n<p>\u041c\u043d\u0435 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0430\u0440\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 VPS \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u0438 \u043b\u0438\u0447\u043d\u043e\u0433\u043e control plane. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0430\u0439\u0442 \u0438\u043b\u0438 \u0431\u043b\u043e\u0433, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d \u0442\u0443\u0434\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a backend. \u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p><strong>WordPress \u043a\u0430\u043a control plane<\/strong><\/p>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0431\u043b\u0438\u0446: \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\/\u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b, \u0443\u0437\u043b\u044b, \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438, pairing-\u043a\u043e\u0434\u044b \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u0441\u0451 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e: REST API, \u0442\u043e\u043a\u0435\u043d\u044b, polling \u0438 heartbeat.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 endpoint\u2019\u044b:<\/p>\n<pre><code>register_rest_route('everty\/v1', '\/pairing\/start', [ 'methods' =&gt; 'POST', 'callback' =&gt; [$this, 'pairing_start'], 'permission_callback' =&gt; '__return_true', ]); register_rest_route('everty\/v1', '\/pairing\/claim', [ 'methods' =&gt; 'POST', 'callback' =&gt; [$this, 'pairing_claim'], 'permission_callback' =&gt; '__return_true', ]); register_rest_route('everty\/v1', '\/device\/config', [ 'methods' =&gt; 'GET', 'callback' =&gt; [$this, 'device_config'], 'permission_callback' =&gt; '__return_true', ]); register_rest_route('everty\/v1', '\/device\/heartbeat', [ 'methods' =&gt; 'POST', 'callback' =&gt; [$this, 'device_heartbeat'], 'permission_callback' =&gt; '__return_true', ]);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0445\u043e\u0434\u0438\u0442 \u0432 API \u043f\u043e <code>deviceId + deviceToken<\/code>, \u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u2014 \u043f\u043e <code>licenseKey + controllerToken<\/code>. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043e\u0431\u044b\u0447\u043d\u044b\u0439 license key \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438. \u0414\u043b\u044f \u043b\u0438\u0447\u043d\u043e\u0433\u043e MVP \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, \u043d\u043e \u044f \u0441\u0440\u0430\u0437\u0443 \u0445\u043e\u0442\u0435\u043b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u00ab\u043a\u043b\u044e\u0447 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430\u00bb \u0438 \u00ab\u0442\u043e\u043a\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u00bb. <\/p>\n<p>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 WordPress \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: <\/p>\n<pre><code>private function require_device_auth(WP_REST_Request $request) { global $wpdb; $device_id = sanitize_text_field($request-&gt;get_header('X-Everty-Device-Id')); $device_token = sanitize_text_field($request-&gt;get_header('X-Everty-Device-Token')); if (!$device_id || !$device_token) { return new WP_Error('unauthorized', 'Missing device credentials', ['status' =&gt; 401]); } $device = $wpdb-&gt;get_row($wpdb-&gt;prepare( \"SELECT * FROM {$this-&gt;devices_table} WHERE device_id = %s LIMIT 1\", $device_id )); if (!$device || !hash_equals($device-&gt;device_token, $device_token)) { return new WP_Error('unauthorized', 'Invalid device credentials', ['status' =&gt; 401]); } return $device; }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f production \u0437\u0434\u0435\u0441\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0443\u0436\u0435\u043d \u0431\u043e\u043b\u0435\u0435 \u0436\u0451\u0441\u0442\u043a\u0438\u0439 \u0441\u043b\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438: rate limit, \u0430\u0443\u0434\u0438\u0442, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 bootstrap-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e &#8212; \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041d\u043e \u0434\u043b\u044f \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e MVP \u0442\u0430\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0443\u0436\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p><strong>\u0425\u0438\u0442\u0440\u043e\u0441\u0442\u044c \u21161: \u0434\u043e\u043c\u0435\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0436\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435<\/strong><\/p>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 &#8212; \u0434\u043e\u043c\u0435\u043d \u0447\u0430\u0441\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d \u00ab\u043d\u0430 \u043f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442\u00bb, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u044f\u0442\u0438 \u043c\u0435\u0441\u0442\u0430\u0445. \u0423 \u043c\u0435\u043d\u044f \u043e\u043d \u0431\u044b\u043b \u0432 Android-\u043a\u043b\u0438\u0435\u043d\u0442\u0435, Windows-\u043a\u043b\u0438\u0435\u043d\u0442\u0435, \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0440\u043e\u0432\u043d\u043e \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0447\u0442\u043e-\u0431\u044b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \ud83d\ude09<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u0432\u044b\u043d\u0435\u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 WordPress \u0432 \u043e\u0434\u043d\u043e \u043c\u0435\u0441\u0442\u043e.<\/p>\n<p>\u0412 Android \u0434\u043e\u043c\u0435\u043d \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 <code>WORDPRESS_BASE_URL<\/code> \u0447\u0435\u0440\u0435\u0437 <code>BuildConfig<\/code>. \u0412 <code>app\/build.gradle.kts<\/code> \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code>android { defaultConfig { val wordpressBaseUrl = providers .gradleProperty(\"WORDPRESS_BASE_URL\") .orElse(\"https:\/\/everty.ru\") .get() buildConfigField( \"String\", \"WORDPRESS_BASE_URL\", \"\\\"$wordpressBaseUrl\\\"\" ) } buildFeatures { buildConfig = true } }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 <code>SyncSettings<\/code> \u0438 \u0432\u0435\u0441\u044c <code>VlessRepository<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0443\u0436\u0435 \u043d\u0435 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0430 <code>BuildConfig.WORDPRESS_BASE_URL<\/code>:  <\/p>\n<pre><code>data class SyncSettings(    val wordpressBaseUrl: String = BuildConfig.WORDPRESS_BASE_URL,    val deviceId: String = \"\",    val deviceToken: String = \"\",    val pairingCode: String = \"\",    val pairingExpiresAt: Long = 0L,    val syncMode: String = \"DEVICE\")\u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 endpoint \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430:private fun endpoint(path: String): String {    val base = settings.wordpressBaseUrl.trimEnd('\/')    return base + path}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Windows-\u043a\u043b\u0438\u0435\u043d\u0442 \u0442\u043e\u0436\u0435 \u0431\u0435\u0440\u0451\u0442 \u0434\u0435\u0444\u043e\u043b\u0442 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>private static string GetDefaultWordPressBaseUrl() { var fromEnv = Environment.GetEnvironmentVariable(\"WORDPRESS_BASE_URL\"); if (!string.IsNullOrWhiteSpace(fromEnv)) return fromEnv.TrimEnd('\/'); return \"https:\/\/everty.ru\"; }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 WordPress-\u043f\u043b\u0430\u0433\u0438\u043d \u043e\u0442\u0434\u0430\u0451\u0442 \u0434\u043e\u043c\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0430\u0439\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 <code>home_url()<\/code>: <\/p>\n<pre><code>$payload = [ 'siteUrl' =&gt; home_url(), 'pairingCode' =&gt; $pairing_code, 'deviceName' =&gt; $device_name, 'expiresAt' =&gt; $expires_at, ];<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0432 <code>.env.example<\/code> \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code>WORDPRESS_BASE_URL=https:\/\/your-domain.example<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0432\u0435\u0449\u044c, \u043d\u043e \u043e\u043d\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c. \u041f\u043b\u0430\u0433\u0438\u043d \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0430\u0439\u0442, \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043e\u043c\u0435\u043d \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0441\u043e\u0431\u0440\u0430\u0442\u044c Android-\u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434 \u0441\u0435\u0431\u044f \u0438 \u043d\u0435 \u043e\u0445\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u0437\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0443.  <\/p>\n<p><strong>\u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0435\u0440\u0435\u0437 QR \u0438 \u043a\u043e\u0434 <\/strong><\/p>\n<p>\u041d\u0430 Android TV \u043a\u0430\u043c\u0435\u0440\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 QR. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430: QR-\u043a\u043e\u0434 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 pairing code \u043a\u0430\u043a fallback.  <\/p>\n<p> QR \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 JSON:  <\/p>\n<pre><code>{ \"siteUrl\": \"https:\/\/your-domain.example\", \"pairingCode\": \"A7K4Q2\", \"deviceName\": \"Living Room TV\", \"expiresAt\": 1710000000 }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u0442\u0430\u043a\u0430\u044f: \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u0434, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0436\u0434\u0451\u043c, \u043f\u043e\u043a\u0430 controller \u0435\u0433\u043e \u0437\u0430\u0431\u0435\u0440\u0451\u0442. \u0421\u0430\u043c\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438:  <\/p>\n<pre><code>suspend fun checkPairingStatus(): Boolean = withContext(Dispatchers.IO) { val settings = settingsDao.get() ?: SyncSettings() if (settings.pairingCode.isBlank() || settings.deviceToken.isNotBlank()) { return@withContext false } val url = endpoint(\"\/wp-json\/everty\/v1\/pairing\/status\") + \"?pairingCode=\" + URLEncoder.encode(settings.pairingCode, \"UTF-8\") httpClient.newCall(Request.Builder().url(url).build()).execute().use { response -&gt; if (!response.isSuccessful) return@withContext false val json = JSONObject(response.body?.string().orEmpty()) if (json.optString(\"status\") != \"claimed\") { return@withContext false } settingsDao.insert( settings.copy( deviceId = json.optString(\"deviceId\"), deviceToken = json.optString(\"deviceToken\"), pairingCode = \"\", pairingExpiresAt = 0L ) ) pullDeviceConfig() } }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u0434\u0435\u044f: \u043f\u043e\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e, \u043e\u043d\u043e \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 backend \u0447\u0430\u0449\u0435. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c  <\/p>\n<pre><code>private fun startAutoSyncInterval(syncSettings: SyncSettings?) { syncPollingJob?.cancel() syncPollingJob = viewModelScope.launch { while (true) { val intervalMs = when { syncSettings?.pairingCode?.isNotEmpty() == true -&gt; 2_000L syncSettings?.deviceToken?.isNotEmpty() == true -&gt; 5_000L syncSettings?.syncMode == \"CONTROLLER\" -&gt; 10_000L else -&gt; 30_000L } delay(intervalMs) val beforeVersion = routePolicy.value.version val pulled = repository.pullDeviceConfig() val afterVersion = routePolicy.value.version if (pulled &amp;&amp; afterVersion != beforeVersion) { restartVpn() } } } }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 polling, \u0430 \u043d\u0435 WebSocket? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e Android TV, WordPress \u0438 \u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439. Polling \u043f\u0440\u043e\u0449\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u043d \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u0440\u043e\u0449\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0435. \u0414\u043b\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e realtime-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 WebSocket \u0431\u044b\u043b \u0431\u044b \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0435, \u043d\u043e \u0434\u043b\u044f \u0431\u044b\u0442\u043e\u0432\u043e\u0439 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438 polling \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0435\u0435.  <\/p>\n<p><strong>VPN \u043d\u0430 Android: VpnService, Xray \u0438 TUN -&gt; SOCKS<\/strong><\/p>\n<p>\u0421\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u044d\u0442\u043e VPN-\u0441\u043b\u043e\u0439. \u041d\u0430 Android \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0435\u0442\u044c\u00bb \u043a\u0430\u043a \u0443\u0433\u043e\u0434\u043d\u043e. \u041d\u0443\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>VpnService<\/code>, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u0434\u043d\u044f\u0442\u044c TUN-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. <\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 TUN \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: <\/p>\n<pre><code>val builder = Builder() .setSession(\"EvertyVLESS\") .setMtu(1500) .addAddress(\"26.26.26.1\", 24) .addDnsServer(\"1.1.1.1\") .addDnsServer(\"8.8.8.8\") builder.addRoute(\"0.0.0.0\", 0) installedAllowedApps.forEach { appPackage -&gt; builder.addAllowedApplication(appPackage) } tunInterface = builder.establish()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: <code>addAllowedApplication()<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c split-tunnel \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0414\u043b\u044f Android TV \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e. \u041d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0433\u043d\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043d\u043d\u0435\u043b\u044c. \u0418\u043d\u043e\u0433\u0434\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 VPN \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. <\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f Xray-core \u043a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 SOCKS5 proxy:  <\/p>\n<pre><code>Libv2ray.initCoreEnv(filesDir.absolutePath, \"\") coreController = Libv2ray.newCoreController(handler) coreController!!.startLoop(configJson, -1)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e <code>VpnService<\/code> \u0434\u0430\u0451\u0442 \u043d\u0430\u043c TUN, \u0430 Xray \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 SOCKS. \u041d\u0443\u0436\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u043c\u0438\u0440\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>hev-socks5-tunnel<\/code>:  <\/p>\n<pre><code>val cfg = File(filesDir, \"hev.yaml\") val tunFd = tunInterface!!.fd cfg.writeText( \"\"\" tunnel: name: tun0 mtu: 1500 ipv4: 26.26.26.1 route: default fd: $tunFd socks5: address: 127.0.0.1 port: 10808 udp: 'udp' dns: upstream: udp:\/\/1.1.1.1 \"\"\".trimIndent() ) TProxyService.TProxyStartService(cfg.absolutePath, tunFd)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p> \u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439:  <\/p>\n<pre><code>Android apps -&gt; VpnService TUN -&gt; hev-socks5-tunnel -&gt; SOCKS5 127.0.0.1:10808 -&gt; Xray-core -&gt; VLESS server<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432 \u0442\u0430\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: ABI, foreground service, battery optimization, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f Android, lifecycle \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043d\u0430.<\/p>\n<p><strong>\u0425\u0438\u0442\u0440\u043e\u0441\u0442\u044c \u21162: Android VPN \u0434\u043e\u043b\u0436\u0435\u043d \u0436\u0438\u0442\u044c \u043a\u0430\u043a foreground service<\/strong><\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043d\u044f\u0442\u044c VPN \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, Android \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u043e\u043d \u0443\u043c\u043d\u0435\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0438 \u0443\u0431\u044c\u0451\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 VPN-\u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a foreground service \u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435\u043c. <\/p>\n<p>\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e: <\/p>\n<pre><code>private fun startAsForeground() { val notification = NotificationCompat.Builder(this, VPN_CHANNEL_ID) .setContentTitle(\"Everty VLESS\") .setContentText(\"VPN is running\") .setSmallIcon(R.drawable.ic_vpn) .setOngoing(true) .build() startForeground(VPN_NOTIFICATION_ID, notification) }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u043d\u044b\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 Android TV-\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430\u0445, \u0433\u0434\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0438 \u043b\u044e\u0431\u044f\u0442 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e \u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b. \u041d\u043e \u044d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0436\u0434\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.  <\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441: \u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a VPN \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433 <code>VpnService.prepare()<\/code>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c VPN \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e, \u043d\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u042d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 Android, \u0438 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0432 UX.  <\/p>\n<p><strong>Split-tunnel: \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0434\u043e\u043c\u0435\u043d\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e<\/strong><\/p>\n<p>\u0414\u043b\u044f \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043c\u0435\u043b\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0451 \u0447\u0435\u0440\u0435\u0437 VPN\u00bb, \u043d\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u0447\u0435\u0447\u043d\u043e. \u041d\u0430 Android \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>addAllowedApplication()<\/code>:  <\/p>\n<pre><code>builder.addAllowedApplication(\"com.google.android.youtube.tv\") builder.addAllowedApplication(\"com.teamsmart.videomanager.tv\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0418\u043d\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u043e\u043c\u0435\u043d\u044b \u0438\u043b\u0438 IP-\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b. \u042d\u0442\u043e \u0443\u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 Xray config:  <\/p>\n<pre><code>{ \"routing\": { \"domainStrategy\": \"IPIfNonMatch\", \"rules\": [ { \"type\": \"field\", \"domain\": [ \"domain:youtube.com\", \"domain:googlevideo.com\" ], \"outboundTag\": \"proxy\" }, { \"type\": \"field\", \"ip\": [ \"142.250.0.0\/15\" ], \"outboundTag\": \"proxy\" }, { \"type\": \"field\", \"network\": \"tcp,udp\", \"outboundTag\": \"direct\" } ] } }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f include-only \u0440\u0435\u0436\u0438\u043c: \u0447\u0435\u0440\u0435\u0437 VPN \u0438\u0434\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0434\u043e\u043c\u0435\u043d\u044b \u0438 IP\/CIDR. \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0434\u0451\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u0414\u043b\u044f \u0422\u0412 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c full tunnel: \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u044c\u044e \u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u0448\u0430\u043d\u0441\u043e\u0432 \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0442\u0443\u043d\u043d\u0435\u043b\u044f.  <\/p>\n<p><strong>VLESS URI: \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443<\/strong><\/p>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c <code>vless:\/\/...<\/code> \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0451 \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430. \u041d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0437\u043b\u044b, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0430, \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b, \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c transport\/security \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Xray config. <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c URI \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c:  <\/p>\n<pre><code>data class VlessNode( val id: String, val name: String, val uri: String, val host: String, val port: Int, val uuid: String, val security: String, val network: String, val sni: String?, val priority: Int, val enabled: Boolean )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0443\u0436\u0435 \u0438\u0437 \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c outbound \u0434\u043b\u044f Xray:<\/p>\n<pre><code>fun buildVlessOutbound(node: VlessNode): JSONObject { return JSONObject() .put(\"tag\", \"proxy\") .put(\"protocol\", \"vless\") .put(\"settings\", JSONObject() .put(\"vnext\", JSONArray() .put(JSONObject() .put(\"address\", node.host) .put(\"port\", node.port) .put(\"users\", JSONArray() .put(JSONObject() .put(\"id\", node.uuid) .put(\"encryption\", \"none\") ) ) ) ) ) .put(\"streamSettings\", JSONObject() .put(\"network\", node.network) .put(\"security\", node.security) .put(\"tlsSettings\", JSONObject() .put(\"serverName\", node.sni ?: node.host) ) ) }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043b\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 Xray-\u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439: UI \u0438 backend \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0430 \u043d\u0435 \u0441 \u043d\u0435\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438.<\/p>\n<p><strong>Failover: \u043f\u0443\u0441\u0442\u044c \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u0441\u0430\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0436\u0438\u0432\u043e\u0439 \u0443\u0437\u0435\u043b  <\/strong><\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u0431\u044b\u0442\u043e\u0432\u0430\u044f \u0431\u043e\u043b\u044c \u2014 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438. \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u0431\u043b\u0438\u0437\u043a\u0438\u043c \u0432\u0442\u043e\u0440\u043e\u0439 VLESS-\u043a\u043e\u043d\u0444\u0438\u0433 \u0438 \u0441\u043a\u0430\u0437\u0430\u0442\u044c: \u00ab\u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0432\u043a\u043b\u044e\u0447\u0438 \u0432\u0442\u043e\u0440\u043e\u0439\u00bb. \u041d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u043e \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443. <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 backend \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f ordered list \u0443\u0437\u043b\u043e\u0432, \u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u0443\u043c\u0435\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0437\u0434\u043e\u0440\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c:  <\/p>\n<pre><code>val healthy = chooseHealthyProfile() if (healthy != null &amp;&amp; healthy.id != activeRemoteNodeId) { repository.selectProfile(healthy.id) restartVpn(healthy.id) } else { repository.sendHeartbeat( activeNodeId = activeRemoteNodeId, policyVersion = lastPolicyVersion, vpnActive = true ) }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Heartbeat \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439: TCP connect, \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 SOCKS probe, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e Xray-\u043f\u043e\u0440\u0442\u0430. \u042d\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 HA \u0438 \u043d\u0435 \u043c\u0430\u0433\u0438\u044f, \u043d\u043e \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0436\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0443\u0447\u043d\u044b\u0445 \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432. <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0440\u0443\u0431\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e SOCKS: <\/p>\n<pre><code>private suspend fun isLocalSocksAlive(): Boolean = withContext(Dispatchers.IO) { try { Socket().use { socket -&gt; socket.connect(InetSocketAddress(\"127.0.0.1\", 10808), 1500) true } } catch (_: Exception) { false } }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c: \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 HTTP probe \u0447\u0435\u0440\u0435\u0437 SOCKS, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 endpoint, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c cooldown \u0434\u043b\u044f \u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 \u0438 \u043d\u0435 \u043f\u0440\u044b\u0433\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0430\u0441\u0442\u043e.  <\/p>\n<p><strong>Heartbeat: \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 <\/strong><\/p>\n<p>\u0411\u0435\u0437 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 control plane \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0447\u0451\u0440\u043d\u044b\u0439 \u044f\u0449\u0438\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 heartbeat:  <\/p>\n<pre><code>val body = JSONObject() .put(\"activeNodeId\", activeNodeId ?: JSONObject.NULL) .put(\"policyVersion\", policyVersion) .put(\"vpnActive\", vpnActive) .put(\"errors\", errors) .toString() .toRequestBody(jsonMediaType) val request = Request.Builder() .url(endpoint(\"\/wp-json\/everty\/v1\/device\/heartbeat\")) .addHeader(\"X-Everty-Device-Id\", settings.deviceId) .addHeader(\"X-Everty-Device-Token\", settings.deviceToken) .post(body) .build() httpClient.newCall(request).execute().use { response -&gt; response.isSuccessful }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0443\u043b\u044c\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c, online \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438\u043b\u0438 offline, \u043a\u0430\u043a\u043e\u0439 \u0443\u0437\u0435\u043b \u0430\u043a\u0442\u0438\u0432\u0435\u043d, \u043a\u0430\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430, \u0432\u043a\u043b\u044e\u0447\u0451\u043d \u043b\u0438 VPN \u0438 \u043a\u0430\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0431\u044b\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u0438\u0442 \u043d\u0435 \u0443 \u0432\u0430\u0441 \u0434\u043e\u043c\u0430, \u0430 \u0443 \u0440\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u043e\u0432. \u0412\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c: \u00ab\u0410 \u0447\u0442\u043e \u0442\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435?\u00bb \u041b\u0443\u0447\u0448\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.  <\/p>\n<p><strong>\u0425\u0438\u0442\u0440\u043e\u0441\u0442\u044c \u21163: policy version \u0432\u043c\u0435\u0441\u0442\u043e &#171;\u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438 \u043a\u043e\u043d\u0444\u0438\u0433&#187;<\/strong><\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u043d\u0444\u0438\u0433. \u041d\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u044b: \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c VPN, \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439?<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>policyVersion<\/code>.<\/p>\n<p>Backend \u043e\u0442\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439: <\/p>\n<pre><code>{ \"policyVersion\": 42, \"nodes\": [], \"allowedApps\": [], \"domains\": [], \"cidrs\": [] }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438:  <\/p>\n<pre><code>val beforeVersion = routePolicy.value.version val pulled = repository.pullDeviceConfig() val afterVersion = routePolicy.value.version if (pulled &amp;&amp; afterVersion != beforeVersion) { restartVpn() }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u043b\u0438\u0448\u043d\u0438\u0445 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u0432. VPN \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c polling-\u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u041e\u043d \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430.  <\/p>\n<p><strong>Android TV \u0438 ABI: \u0441\u0430\u043c\u0430\u044f \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c <\/strong><\/p>\n<p>\u041d\u0430 Android \u0432\u0441\u0451 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0435\u0441\u0435\u043b\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u043e \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e native-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. <code>libv2ray.aar<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <code>libgojni.so<\/code> \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 ABI:  <\/p>\n<p><em>armeabi-v7a, arm64-v8a, x86, x86_64 <\/em> <\/p>\n<p>\u0410 \u0432\u043e\u0442 <code>libhev-socks5-tunnel.so<\/code> \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434:  <\/p>\n<p><em>arm64-v8a <\/em><\/p>\n<p>\u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e universal APK \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u043e VPN-\u0442\u0443\u043d\u043d\u0435\u043b\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0430\u044f native-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430. \u041d\u0430 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u0438\u043b\u0438 \u0434\u0435\u0448\u0451\u0432\u044b\u0445 Android TV \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0430 \u0442\u0443\u043d\u043d\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f.  <\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0441\u043e\u0431\u0440\u0430\u0442\u044c <code>hev-socks5-tunnel<\/code> \u043f\u043e\u0434 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 ABI \u0438 \u044f\u0432\u043d\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c packaging \u0432 Gradle:  <\/p>\n<pre><code>android { defaultConfig { ndk { abiFilters += listOf( \"armeabi-v7a\", \"arm64-v8a\", \"x86\", \"x86_64\" ) } } }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0435\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0435\u0433\u043a\u043e \u043d\u0435\u0434\u043e\u043e\u0446\u0435\u043d\u0438\u0442\u044c, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0422\u0412-\u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438.  <\/p>\n<p><strong>Windows-\u043a\u043b\u0438\u0435\u043d\u0442: \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 split-tunnel, \u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 proxy<\/strong><\/p>\n<p>\u041f\u043e\u0437\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Windows WPF-\u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0441\u0442\u0438\u043b\u0435. \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c cloud account, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e \u043a\u043e\u0434\u0443, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c VLESS nodes, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c policy \u043d\u0430 Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Xray HTTP\/SOCKS proxy \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 proxy Windows.  <\/p>\n<p>\u041d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0447\u0435\u0441\u0442\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c: \u043f\u0435\u0440\u0432\u0430\u044f Windows-\u0432\u0435\u0440\u0441\u0438\u044f \u2014 \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 per-app split-tunnel. \u042d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 proxy \u0447\u0435\u0440\u0435\u0437 Xray. \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e split-tunnel \u043d\u0430 Windows \u043d\u0443\u0436\u043d\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: WFP, TUN-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u043b\u043e\u0439.  <\/p>\n<p>\u0417\u0430\u0442\u043e \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u00ab\u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c Xray \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 proxy\u00bb \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. <br \/>\u0417\u0430\u043c\u0435\u0447\u0443 \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f Windows \u043e\u0447\u0435\u043d\u044c \u0441\u044b\u0440\u043e\u0439 \u0438 \u044f \u043f\u043e\u0436\u0430\u043b\u0435\u043b \u0447\u0442\u043e \u0437\u0430\u0442\u0435\u044f\u043b\u0441\u044f, \u043f\u0440\u044b\u0436\u043a\u0438 \u043f\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043b\u0438\u0448\u043d\u0438\u0435.<\/p>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u043d\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f WordPress \u0432 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435  <\/strong><\/p>\n<p>\u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e WordPress \u043a\u0430\u043a backend \u0434\u043b\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0448\u0442\u0443\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0443\u043b\u044b\u0431\u043a\u0443. \u041d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440. \u0423 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0435\u0441\u0442\u044c &#171;https:\/\/\u0441\u0432\u043e\u0439 \u0441\u0430\u0439\u0442 \u043d\u0430 wordpress ;)&#187;, \u0435\u0441\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0434\u0435\u043f\u043b\u043e\u0439, \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0435\u0441\u0442\u044c REST API, \u0435\u0441\u0442\u044c \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043d\u0430 PHP. \u0414\u043b\u044f \u043b\u0438\u0447\u043d\u043e\u0433\u043e control plane \u044d\u0442\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e backend \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u0434\u0435\u0438. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e: Laravel, Go, Node.js, Supabase, Firebase, \u0441\u0432\u043e\u0439 VPS, serverless-\u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u043e WordPress \u0445\u043e\u0440\u043e\u0448 \u0442\u0435\u043c, \u0447\u0442\u043e \u0443 \u043c\u043d\u043e\u0433\u0438\u0445 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0430\u0439\u0442 \u0438\u043b\u0438 \u0431\u043b\u043e\u0433. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d, \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u0434\u043e\u043c\u0435\u043d, \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u2014 \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d\u043e \u0441\u0430\u043c\u043e\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0431\u043e\u043b\u044c.<\/p>\n<p><strong>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0445\u043e\u0440\u043e\u0448\u043e<\/strong><\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0441\u0442\u0430\u043b \u043f\u0443\u043b\u044c\u0442\u043e\u043c \u0434\u043b\u044f \u0422\u0412. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u044c VLESS-\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0435, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0431\u043b\u0438\u0437\u043a\u0438\u043c, \u0433\u0434\u0435 \u0447\u0442\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0432\u0432\u043e\u0434\u043e\u043c.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0435 \u0443\u0434\u0430\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 QR \u043f\u043b\u044e\u0441 \u0440\u0443\u0447\u043d\u043e\u0439 \u043a\u043e\u0434. QR \u0443\u0434\u043e\u0431\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0430. \u0420\u0443\u0447\u043d\u043e\u0439 \u043a\u043e\u0434 \u0441\u043f\u0430\u0441\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0435\u0442 \u0438\u043b\u0438 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e. \u0414\u043b\u044f Android TV \u044d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 fallback.<\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u0435 \u2014 split-tunnel. \u0414\u043b\u044f \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0435\u0435 full tunnel. \u041c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 VPN \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u043e\u043c\u0435\u043d\u044b, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.<\/p>\n<p>\u0427\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u0435 \u2014 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0437\u043b\u043e\u0432 \u0438 failover. \u042d\u0442\u043e \u043d\u0435 enterprise HA, \u043d\u043e \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0443\u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u043e: \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u043c\u0435\u0440, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0439 \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p>\u041f\u044f\u0442\u043e\u0435 \u2014 WordPress-\u043f\u043b\u0430\u0433\u0438\u043d \u043a\u0430\u043a backend. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0430\u0439\u0442. <\/p>\n<p><strong>\u0427\u0442\u043e \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c <\/strong><\/p>\n<p>\u0421\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0441\u043e\u0431\u0440\u0430\u0442\u044c <code>hev-socks5-tunnel<\/code> \u043f\u043e\u0434 \u0432\u0441\u0435 Android TV ABI. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0447\u0430\u0441\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u0430\u0434\u0430\u0442\u044c \u0438\u0437 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438.  <\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>vpnDesiredState = on\/off<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f VPN \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0441 \u043f\u0443\u043b\u044c\u0442\u0430.  <\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u044f \u2014 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c TV UX \u043f\u043e\u0434 D-pad: \u043a\u0440\u0443\u043f\u043d\u0435\u0435 \u0444\u043e\u043a\u0443\u0441, \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0435\u043b\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043c\u0435\u043d\u044c\u0448\u0435 \u044d\u043a\u0440\u0430\u043d\u043e\u0432, \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.  <\/p>\n<p>\u0427\u0435\u0442\u0432\u0451\u0440\u0442\u0430\u044f \u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0443\u043c\u043d\u044b\u0439 health-check: \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e TCP connect, \u043d\u043e \u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 probe \u0447\u0435\u0440\u0435\u0437 SOCKS\/VLESS. <\/p>\n<p>\u041f\u044f\u0442\u0430\u044f \u2014 \u0443\u0441\u0438\u043b\u0438\u0442\u044c WordPress backend \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: rate limit, \u0430\u0443\u0434\u0438\u0442, \u0437\u0430\u0449\u0438\u0442\u0430 bootstrap endpoint\u2019\u043e\u0432, \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432.  <\/p>\n<p><strong>\u0418\u0442\u043e\u0433 <\/strong><\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cc3\/ac8\/272\/cc3ac8272ba256816c08b027202750d9.jpg\" alt=\"\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0440\u0435\u0436\u0438\u043c\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0440\u0435\u0436\u0438\u043c\u0430 \u043f\u0443\u043b\u044c\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.\" title=\"\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0440\u0435\u0436\u0438\u043c\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0440\u0435\u0436\u0438\u043c\u0430 \u043f\u0443\u043b\u044c\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.\" width=\"2249\" height=\"1185\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cc3\/ac8\/272\/cc3ac8272ba256816c08b027202750d9.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cc3\/ac8\/272\/cc3ac8272ba256816c08b027202750d9.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0440\u0435\u0436\u0438\u043c\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0440\u0435\u0436\u0438\u043c\u0430 \u043f\u0443\u043b\u044c\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c VPN-\u043a\u043b\u0438\u0435\u043d\u0442. \u041e\u043d \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044f \u0443\u0441\u0442\u0430\u043b \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u043d\u0430 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430\u0445, \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0431\u043b\u0438\u0437\u043a\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043f\u0443\u043b\u044c\u0442\u0430 \u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435, \u0433\u0434\u0435 \u043a\u0430\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0435\u0439\u0447\u0430\u0441 \u0430\u043a\u0442\u0438\u0432\u0435\u043d. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043b\u0438\u0447\u043d\u044b\u0439 \u0446\u0435\u043d\u0442\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f: Android TV \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 QR \u0438\u043b\u0438 \u043a\u043e\u0434, \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u0442\u0443\u0434\u0430, \u0433\u0434\u0435 \u0435\u0439 \u0438 \u043c\u0435\u0441\u0442\u043e \u2014 \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430. <\/p>\n<p>\u0412 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0438\u0434\u0451\u0442 WordPress-\u043f\u043b\u0430\u0433\u0438\u043d. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0430\u0439\u0442 \u0438\u043b\u0438 \u0431\u043b\u043e\u0433, \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0434\u043e\u043c\u0435\u043d \u0447\u0435\u0440\u0435\u0437 <code>WORDPRESS_BASE_URL<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a backend. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0430\u043c\u0430 \u0438\u0434\u0435\u044f \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u0430 \u043a WordPress: backend \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c. \u041f\u0440\u043e\u0441\u0442\u043e \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 WordPress \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0431\u0435\u0437 \u0430\u0440\u0435\u043d\u0434\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e VPS.  <\/p>\n<p>\u0414\u043b\u044f \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f: \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0418\u043d\u043e\u0433\u0434\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0443\u044e \u0440\u0443\u0442\u0438\u043d\u0443 \u0438\u0437 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438. \u0410 \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c \u0435\u0449\u0451 \u0438 \u0431\u043b\u0438\u0437\u043a\u0438\u043c \u2014 \u0437\u043d\u0430\u0447\u0438\u0442, \u0432\u0435\u0447\u0435\u0440 \u0431\u044b\u043b \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d \u043d\u0435 \u0437\u0440\u044f. <\/p>\n<p> \u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u043e\u0439 \u043e\u043f\u044b\u0442 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u0435\u043d. \u0414\u043e \u0441\u043a\u043e\u0440\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447 &#8212; \u0441 \u0432\u0430\u043c\u0438 \u0431\u044b\u043b \u0412\u0430\u043b\u0438\u0435\u0432 \u0410\u0440\u0442\u0443\u0440, \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445! \ud83d\ude09<\/p>\n<p><a href=\"https:\/\/github.com\/vaalimusic\/everty-vless-source\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0442\u0443\u0442<\/a><\/p>\n<p><a href=\"https:\/\/t.me\/Everty_web\" rel=\"noopener noreferrer nofollow\">Telegram<\/a><\/p>\n<p>info@everty.ru<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1046726\/\">https:\/\/habr.com\/ru\/articles\/1046726\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440.\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u043b\u0438\u0435\u0432 \u0410\u0440\u0442\u0443\u0440. \u041f\u043e\u043a\u0430 \u043c\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 EvertyDesk, \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0421\u043a\u043e\u0440\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u043d\u0430\u0448\u0438 \u043d\u043e\u0432\u0438\u043d\u043a\u0438, \u0442\u0440\u044e\u043a\u0438 \u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c, \u043d\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 &#8212; \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0442\u043e\u0432\u043e\u0439, \u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u043e\u0447\u0435\u043d\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043c\u043d\u043e\u0433\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043f\u043e\u0435\u0445\u0430\u043b\u0438.\u0420\u0435\u0447\u044c \u043f\u0440\u043e Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043b \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0431\u043e\u043b\u044c: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u0441\u043c\u0435\u043d\u0443 VLESS-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 Android TV, \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0445 \u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430\u0445 \u0431\u043b\u0438\u0437\u043a\u0438\u0445.\u0421\u0440\u0430\u0437\u0443 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0443 \u0432\u0430\u0436\u043d\u0443\u044e \u0432\u0435\u0449\u044c: \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u043e\u0431\u0445\u043e\u0434 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. \u042d\u0442\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e \u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u0435\u0435 \u0436\u0438\u0442\u044c \u0440\u043e\u0434\u043d\u044b\u043c \u0438 \u0431\u043b\u0438\u0437\u043a\u0438\u043c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u043e\u043c\u0443-\u0442\u043e \u0438\u0437 \u0432\u0430\u0441 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0442\u043e\u0436\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u0435\u043d.  \u0411\u043e\u043b\u044c: \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u2014 \u043f\u043b\u043e\u0445\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f  \u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 Wi-Fi \u043d\u0430 Android TV \u0441 \u043f\u0443\u043b\u044c\u0442\u0430, \u0442\u043e \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u043e \u0447\u0451\u043c \u044f. \u041d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u0443\u044e vless:\/\/&#8230; \u0441\u0441\u044b\u043b\u043a\u0443 \u2014 \u0434\u0435\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434. \u041d\u0430 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435: \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043d\u0443\u0436\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b, \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u043b\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0431\u043b\u0438\u0437\u043a\u0438\u043c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0441\u043d\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432 VLESS \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u043e\u043c. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u0438. \u042f \u043a\u0430\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043f\u043b\u043e\u0445\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0448\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435, \u0441\u043a\u0443\u0447\u043d\u043e\u0435, \u043b\u0435\u0433\u043a\u043e \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u0438\u0437-\u0437\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u043d\u0435 \u043d\u0435\u0441\u0451\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438.\u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e: \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u043c. \u0410 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0436\u0438\u0442\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u0443\u0434\u043e\u0431\u043d\u043e \u2014 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0438\u043b\u0438 \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435.\u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f Everty VLESS: \u043b\u0438\u0447\u043d\u044b\u0439 control plane \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 Android TV \u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043e\u0432. \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 QR-\u043a\u043e\u0434 \u0438\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043a\u043e\u0434, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u043c\u0443 VLESS-\u0443\u0437\u043b\u044b, \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f split-tunnel \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a failover.\u0427\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0431\u044b\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439:\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Android TV.\u041d\u0430\u0436\u0438\u043c\u0430\u044e \u00ab\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438\u00bb.\u041d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f QR-\u043a\u043e\u0434 \u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u043a\u043e\u0434.\u0421 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044e QR \u0438\u043b\u0438 \u0432\u0432\u043e\u0436\u0443 \u043a\u043e\u0434.\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u043e\u043c \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430.\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0443\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439: \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e VLESS-\u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432, \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0443\u0437\u0435\u043b, \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u0443\u0437\u043b\u044b, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c split-tunnel \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u043c\u0435\u043d\u044b \u0438 IP\/CIDR-\u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0436\u0438\u0432 \u043b\u0438 VPN \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441.\u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u043d\u0435 \u00abVPN-\u043a\u043b\u0438\u0435\u043d\u0442 \u0440\u0430\u0434\u0438 VPN-\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u00bb. \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u2014 \u0443\u0431\u0440\u0430\u0442\u044c \u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0433\u0434\u0435 \u0440\u0443\u0447\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u0430.\u041e\u0431\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435:Android Phone (\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440) \u2500\u2500\u25ba Controller Token \u2500\u2500\u25ba WordPress REST API (\u043b\u0438\u0447\u043d\u044b\u0439 wordpress, \u0431\u0435\u0437 \u0441\u0441\u044b\u043b\u043e\u043a ;)\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 (\u041e\u043f\u0440\u043e\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432):WordPress REST API (\u043b\u0438\u0447\u043d\u044b\u0439 wordpress) \u25c4\u2500\u2500 [Polling \/ Heartbeat] \u2500\u2500\u25ba Android TV \/ Windows Client\u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Kotlin \u0438 Jetpack Compose;VPN-\u0441\u043b\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 Android VpnService;Xray-core \u0447\u0435\u0440\u0435\u0437 libv2ray;TUN -&gt; SOCKS \u043c\u043e\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 hev-socks5-tunnel;WordPress-\u043f\u043b\u0430\u0433\u0438\u043d \u043a\u0430\u043a backend\/control plane;Windows WPF-\u043a\u043b\u0438\u0435\u043d\u0442 \u043a\u0430\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u043b\u044c\u0442.\u041f\u043e\u0447\u0435\u043c\u0443 WordPress? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0431\u044b\u043b \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0430\u0439\u0442, \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u0431\u0430\u0437\u0430, \u0443\u0436\u0435 \u0431\u044b\u043b PHP-\u043e\u043f\u044b\u0442, \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430. \u042f \u0434\u0430\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 PHP \u0438 WordPress, \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0438\u0448\u0443 \u043f\u043e\u0434 \u043d\u0435\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u043e\u0442\u043d\u043e\u0448\u0443\u0441\u044c \u043a \u043d\u0435\u043c\u0443 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0435\u0439. \u0414\u0430, backend \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c, \u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 WordPress \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c \u043f\u0443\u0442\u0451\u043c \u043e\u0442 \u0438\u0434\u0435\u0438 \u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443.  \u041c\u043d\u0435 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0430\u0440\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 VPS \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u0438 \u043b\u0438\u0447\u043d\u043e\u0433\u043e control plane. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0430\u0439\u0442 \u0438\u043b\u0438 \u0431\u043b\u043e\u0433, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d \u0442\u0443\u0434\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a backend. \u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e.WordPress \u043a\u0430\u043a control plane\u041f\u043b\u0430\u0433\u0438\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0431\u043b\u0438\u0446: \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\/\u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b, \u0443\u0437\u043b\u044b, \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438, pairing-\u043a\u043e\u0434\u044b \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u0441\u0451 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e: REST API, \u0442\u043e\u043a\u0435\u043d\u044b, polling \u0438 heartbeat.\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 endpoint\u2019\u044b:register_rest_route(&#8216;everty\/v1&#8217;, &#8216;\/pairing\/start&#8217;, [ &#8216;methods&#8217; =&gt; &#8216;POST&#8217;, &#8216;callback&#8217; =&gt; [$this, &#8216;pairing_start&#8217;], &#8216;permission_callback&#8217; =&gt; &#8216;__return_true&#8217;, ]); register_rest_route(&#8216;everty\/v1&#8217;, &#8216;\/pairing\/claim&#8217;, [ &#8216;methods&#8217; =&gt; &#8216;POST&#8217;, &#8216;callback&#8217; =&gt; [$this, &#8216;pairing_claim&#8217;], &#8216;permission_callback&#8217; =&gt; &#8216;__return_true&#8217;, ]); register_rest_route(&#8216;everty\/v1&#8217;, &#8216;\/device\/config&#8217;, [ &#8216;methods&#8217; =&gt; &#8216;GET&#8217;, &#8216;callback&#8217; =&gt; [$this, &#8216;device_config&#8217;], &#8216;permission_callback&#8217; =&gt; &#8216;__return_true&#8217;, ]); register_rest_route(&#8216;everty\/v1&#8217;, &#8216;\/device\/heartbeat&#8217;, [ &#8216;methods&#8217; =&gt; &#8216;POST&#8217;, &#8216;callback&#8217; =&gt; [$this, &#8216;device_heartbeat&#8217;], &#8216;permission_callback&#8217; =&gt; &#8216;__return_true&#8217;, ]);\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0445\u043e\u0434\u0438\u0442 \u0432 API \u043f\u043e deviceId + deviceToken, \u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u2014 \u043f\u043e licenseKey + controllerToken. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043e\u0431\u044b\u0447\u043d\u044b\u0439 license key \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438. \u0414\u043b\u044f \u043b\u0438\u0447\u043d\u043e\u0433\u043e MVP \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, \u043d\u043e \u044f \u0441\u0440\u0430\u0437\u0443 \u0445\u043e\u0442\u0435\u043b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u00ab\u043a\u043b\u044e\u0447 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430\u00bb \u0438 \u00ab\u0442\u043e\u043a\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u00bb. \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 WordPress \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: private function require_device_auth(WP_REST_Request $request) { global $wpdb; $device_id = sanitize_text_field($request-&gt;get_header(&#8216;X-Everty-Device-Id&#8217;)); $device_token = sanitize_text_field($request-&gt;get_header(&#8216;X-Everty-Device-Token&#8217;)); if (!$device_id || !$device_token) { return new WP_Error(&#8216;unauthorized&#8217;, &#8216;Missing device credentials&#8217;, [&#8216;status&#8217; =&gt; 401]); } $device = $wpdb-&gt;get_row($wpdb-&gt;prepare( &#171;SELECT * FROM {$this-&gt;devices_table} WHERE device_id = %s LIMIT 1&#187;, $device_id )); if (!$device || !hash_equals($device-&gt;device_token, $device_token)) { return new WP_Error(&#8216;unauthorized&#8217;, &#8216;Invalid device credentials&#8217;, [&#8216;status&#8217; =&gt; 401]); } return $device; }\u0414\u043b\u044f production \u0437\u0434\u0435\u0441\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0443\u0436\u0435\u043d \u0431\u043e\u043b\u0435\u0435 \u0436\u0451\u0441\u0442\u043a\u0438\u0439 \u0441\u043b\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438: rate limit, \u0430\u0443\u0434\u0438\u0442, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 bootstrap-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e &#8212; \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041d\u043e \u0434\u043b\u044f \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e MVP \u0442\u0430\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0443\u0436\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443.\u0425\u0438\u0442\u0440\u043e\u0441\u0442\u044c \u21161: \u0434\u043e\u043c\u0435\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0436\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435\u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 &#8212; \u0434\u043e\u043c\u0435\u043d \u0447\u0430\u0441\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d \u00ab\u043d\u0430 \u043f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442\u00bb, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u044f\u0442\u0438 \u043c\u0435\u0441\u0442\u0430\u0445. \u0423 \u043c\u0435\u043d\u044f \u043e\u043d \u0431\u044b\u043b \u0432 Android-\u043a\u043b\u0438\u0435\u043d\u0442\u0435, Windows-\u043a\u043b\u0438\u0435\u043d\u0442\u0435, \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0440\u043e\u0432\u043d\u043e \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0447\u0442\u043e-\u0431\u044b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 ;)\u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u0432\u044b\u043d\u0435\u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 WordPress \u0432 \u043e\u0434\u043d\u043e \u043c\u0435\u0441\u0442\u043e.\u0412 Android \u0434\u043e\u043c\u0435\u043d \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 WORDPRESS_BASE_URL \u0447\u0435\u0440\u0435\u0437 BuildConfig. \u0412 app\/build.gradle.kts \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:android { defaultConfig { val wordpressBaseUrl = providers .gradleProperty(&#171;WORDPRESS_BASE_URL&#187;) .orElse(&#171;https:\/\/everty.ru&#187;) .get() buildConfigField( &#171;String&#187;, &#171;WORDPRESS_BASE_URL&#187;, &#171;\\&#187;$wordpressBaseUrl\\&#187;&#187; ) } buildFeatures { buildConfig = true } }\u0414\u0430\u043b\u044c\u0448\u0435 SyncSettings \u0438 \u0432\u0435\u0441\u044c VlessRepository \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0443\u0436\u0435 \u043d\u0435 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0430 BuildConfig.WORDPRESS_BASE_URL:  data class SyncSettings(    val wordpressBaseUrl: String = BuildConfig.WORDPRESS_BASE_URL,    val deviceId: String = &#171;&#187;,    val deviceToken: String = &#171;&#187;,    val pairingCode: String = &#171;&#187;,    val pairingExpiresAt: Long = 0L,    val syncMode: String = &#171;DEVICE&#187;)\u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 endpoint \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430:private fun endpoint(path: String): String {    val base = settings.wordpressBaseUrl.trimEnd(&#8216;\/&#8217;)    return base + path}Windows-\u043a\u043b\u0438\u0435\u043d\u0442 \u0442\u043e\u0436\u0435 \u0431\u0435\u0440\u0451\u0442 \u0434\u0435\u0444\u043e\u043b\u0442 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:private static string GetDefaultWordPressBaseUrl() { var fromEnv = Environment.GetEnvironmentVariable(&#171;WORDPRESS_BASE_URL&#187;); if (!string.IsNullOrWhiteSpace(fromEnv)) return fromEnv.TrimEnd(&#8216;\/&#8217;); return &#171;https:\/\/everty.ru&#187;; }\u0410 WordPress-\u043f\u043b\u0430\u0433\u0438\u043d \u043e\u0442\u0434\u0430\u0451\u0442 \u0434\u043e\u043c\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0430\u0439\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 home_url(): $payload = [ &#8216;siteUrl&#8217; =&gt; home_url(), &#8216;pairingCode&#8217; =&gt; $pairing_code, &#8216;deviceName&#8217; =&gt; $device_name, &#8216;expiresAt&#8217; =&gt; $expires_at, ];\u0418 \u0432 .env.example \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:  WORDPRESS_BASE_URL=https:\/\/your-domain.example\u042d\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0432\u0435\u0449\u044c, \u043d\u043e \u043e\u043d\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c. \u041f\u043b\u0430\u0433\u0438\u043d \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0430\u0439\u0442, \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043e\u043c\u0435\u043d \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0441\u043e\u0431\u0440\u0430\u0442\u044c Android-\u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434 \u0441\u0435\u0431\u044f \u0438 \u043d\u0435 \u043e\u0445\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u0437\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0443.  \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0435\u0440\u0435\u0437 QR \u0438 \u043a\u043e\u0434 \u041d\u0430 Android TV \u043a\u0430\u043c\u0435\u0440\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 QR. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430: QR-\u043a\u043e\u0434 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 pairing code \u043a\u0430\u043a fallback.   QR \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 JSON:  { &#171;siteUrl&#187;: &#171;https:\/\/your-domain.example&#187;, &#171;pairingCode&#187;: &#171;A7K4Q2&#187;, &#171;deviceName&#187;: &#171;Living Room TV&#187;, &#171;expiresAt&#187;: 1710000000 }\u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u0442\u0430\u043a\u0430\u044f: \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u0434, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0436\u0434\u0451\u043c, \u043f\u043e\u043a\u0430 controller \u0435\u0433\u043e \u0437\u0430\u0431\u0435\u0440\u0451\u0442. \u0421\u0430\u043c\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438:  suspend fun checkPairingStatus(): Boolean = withContext(Dispatchers.IO) { val settings = settingsDao.get() ?: SyncSettings() if (settings.pairingCode.isBlank() || settings.deviceToken.isNotBlank()) { return@withContext false } val url = endpoint(&#171;\/wp-json\/everty\/v1\/pairing\/status&#187;) + &#171;?pairingCode=&#187; + URLEncoder.encode(settings.pairingCode, &#171;UTF-8&#187;) httpClient.newCall(Request.Builder().url(url).build()).execute().use { response -&gt; if (!response.isSuccessful) return@withContext false val json = JSONObject(response.body?.string().orEmpty()) if (json.optString(&#171;status&#187;) != &#171;claimed&#187;) { return@withContext false } settingsDao.insert( settings.copy( deviceId = json.optString(&#171;deviceId&#187;), deviceToken = json.optString(&#171;deviceToken&#187;), pairingCode = &#171;&#187;, pairingExpiresAt = 0L ) ) pullDeviceConfig() } }\u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u0434\u0435\u044f: \u043f\u043e\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e, \u043e\u043d\u043e \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 backend \u0447\u0430\u0449\u0435. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c  private fun startAutoSyncInterval(syncSettings: SyncSettings?) { syncPollingJob?.cancel() syncPollingJob = viewModelScope.launch {&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-483381","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483381","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=483381"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483381\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=483381"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=483381"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=483381"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}