{"id":487100,"date":"2026-07-13T11:40:51","date_gmt":"2026-07-13T11:40:51","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=487100"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=487100","title":{"rendered":"\u0421\u0432\u043e\u044f self-hosted \u0434\u0432\u0443\u0445\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f VPN-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u0435\u043d\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043c\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u042f \u0440\u0435\u0448\u0438\u043b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0451 \u0441 \u043d\u0443\u043b\u044f. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u044d\u0442\u043e \u0431\u044b\u043b \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u043b\u0438 \u0440\u0443\u043a\u0438.<\/p>\n<p>\u0410\u0440\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0449\u043d\u044b\u0435 VPS \u043f\u043e\u0434 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0435\u043c\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043d\u043e \u0434\u043e\u0440\u043e\u0433\u043e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u043c\u0430 \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0431\u044b\u043b \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u0442\u0442\u043e\u043f (\u043c\u0438\u043d\u0438-\u041f\u041a) \u0441 16 \u0413\u0411 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0431\u0430\u0437\u0435 \u044d\u043d\u0435\u0440\u0433\u043e\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 Intel N95.<\/p>\n<p>\u041f\u0440\u043e\u0439\u0434\u044f \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 Bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u0440\u043e\u0435\u043a\u0442 ServeHub-2. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0443, \u043a\u0430\u043a \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0441\u0435\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0431\u0435\u0434\u0438\u043b \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c\u0438 \u0431\u0430\u0433\u0430\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<h2>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/h2>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Tuna<\/h3>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0435\u0449\u0435 \u043d\u0435 \u0434\u0443\u043c\u0430\u043b \u043e VPN \u043a\u0430\u043a \u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u043f\u0440\u043e\u0431\u0438\u0442\u0438\u044f NAT \u0438 \u043e\u0441\u043d\u043e\u0432\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u0432\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u041f\u0435\u0440\u0432\u043e\u0435, \u043a \u0447\u0435\u043c\u0443 \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u2014 \u0441\u0435\u0440\u0432\u0438\u0441 Tuna. \u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 Cloudflare Tunnel \u0437\u0430 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 300 \u0440\u0443\u0431\u043b\u0435\u0439. \u0423 \u043d\u0435\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043e\u043d \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u0435\u043b \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440\u0430 Tuna \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439, \u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u043c.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0434\u043b\u044f tuna (\u0432\u0441\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0434\u043b\u044f ssh \u0442\u0443\u043d\u043d\u0435\u043b\u044f, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f ssh, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 http \u0442\u0443\u043d\u043d\u0435\u043b\u044c \u0441 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u043a nginx \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u043c\u0443 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u0440\u043e\u043a\u0441\u0438 \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0435\u0441\u0442\u044c):<\/p>\n<pre><code class=\"yaml\">tuna_matrix:    container_name: tuna_matrix    image: yuccastream\/tuna:latest    restart: always    environment:      - TUNA_TOKEN=${TUNA_TOKEN}      - SYNAPSE_SERVER_NAME=${SYNAPSE_SERVER_NAME}    command: http nginx:80 --domain=${SYNAPSE_SERVER_NAME} --https-redirect    depends_on:      - nginx  tuna_ssh:    container_name: tuna_ssh    image: yuccastream\/tuna:latest    restart: always    network_mode: \"host\"    environment:      - TUNA_TOKEN=${TUNA_TOKEN}    command: tcp 22 --port=${TUNA_SSH_PORT}<\/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<h3>\u0412 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438: \u0442\u0435\u0441\u0442\u044b Pangolin \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a FRP<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 Tuna \u044f \u0440\u0435\u0448\u0438\u043b \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b <strong>Pangolin<\/strong>. \u041e\u0434\u043d\u0430\u043a\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u044c: \u0434\u043b\u044f \u0434\u0435\u0448\u0451\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043e\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u00ab\u0442\u044f\u0436\u0451\u043b\u044b\u043c\u00bb \u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u043c. \u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u043c\u0438\u043d\u0443\u0441\u044b \u2014 \u043e\u0449\u0443\u0442\u0438\u043c\u044b\u0439 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u043f\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u0438 \u043b\u0438\u0448\u043d\u0438\u0439 \u0441\u043b\u043e\u0439 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0431-\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434 \u0441\u0430\u043c\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438. \u042d\u0442\u043e \u043b\u043e\u043c\u0430\u043b\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 (\u0432\u0440\u043e\u0434\u0435 Element \u0434\u043b\u044f Matrix \u0438\u043b\u0438 Bitwarden \u0434\u043b\u044f \u043f\u0430\u0440\u043e\u043b\u0435\u0439), \u0433\u0434\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u0430.<\/p>\n<p>\u041d\u0430 \u0441\u043c\u0435\u043d\u0443 \u043f\u0440\u0438\u0448\u0435\u043b <strong>FRP (Fast Reverse Proxy)<\/strong>. \u041e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u0442\u0443 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430, \u043d\u043e \u0445\u043e\u0441\u0442\u0438\u043b \u044f \u0435\u0433\u043e \u0443\u0436\u0435 \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0430\u0440\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u043c VPS \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Layer 4 (TCP). \u042d\u0442\u043e \u0434\u0430\u043b\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c: \u0432\u043d\u0435\u0448\u043d\u0438\u0439 VPS \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u044c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u043b, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u043b \u0441\u044b\u0440\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u043e\u043c\u043e\u0439. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u044b: \u0432\u043c\u0435\u0441\u0442\u043e 300 \u0440\u0443\u0431\u043b\u0435\u0439 \u0437\u0430 Tuna \u0438 \u0435\u0449\u0451 300 \u0440\u0443\u0431\u043b\u0435\u0439 \u0437\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 VPN, \u044f \u0441\u0442\u0430\u043b \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u0435\u0433\u043e 500 \u0440\u0443\u0431\u043b\u0435\u0439 \u0437\u0430 \u043e\u0434\u0438\u043d \u0441\u0442\u043e\u0439\u043a\u0438\u0439 VPS, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0433 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0445\u043e\u0447\u0443. (\u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0434\u0430\u0436\u0435 \u0434\u0435\u0448\u0435\u0432\u043b\u0435, \u0442\u0430\u043a \u043a\u0430\u043a VPS \u0441 4 \u0433\u0431 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043d\u0430 40%, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0432\u0441\u0435\u0433\u043e \u043d\u0430 20%-40%)<\/p>\n<p>FRP \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 2 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 (\u043e\u0434\u0438\u043d \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 frp server, \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c frp client), \u0432\u0441\u0435 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043b\u043e\u044f\u0445. \u0423 \u043c\u0435\u043d\u044f \u043e\u043d \u0431\u0440\u0430\u043b \u0442\u0440\u0430\u0444\u0438\u043a \u0437\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 TCP \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b \u0435\u0433\u043e \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u043f. \u0444\u0438\u0448\u043a\u0430 \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 frpc, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0430 frp \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/p>\n<p>frpc.toml:<\/p>\n<pre><code>serverAddr = \"{{ .Envs.FRP_SERVER_IP }}\"serverPort = 7000auth.method = \"token\"auth.token = \"{{ .Envs.FRP_TOKEN }}\"[[proxies]]name = \"http_traffic\"type = \"tcp\"localIP = \"nginx_proxy\"localPort = 80remotePort = 8080transport.proxyProtocolVersion = \"v2\"[[proxies]]name = \"https_traffic\"type = \"tcp\"localIP = \"nginx_proxy\"localPort = 443remotePort = 8443transport.proxyProtocolVersion = \"v2\"[[proxies]]name = \"secure_ssh\"type = \"tcp\"localIP = \"host.docker.internal\"localPort = 22remotePort = 2222<\/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>frps.toml:<\/p>\n<pre><code>bindPort = 7000auth.method = \"token\"auth.token = \"{{ .Envs.FRP_TOKEN }}\"maxPortsPerClient = 10<\/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<h3>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0435\u0437\u0434 \u043d\u0430 WireGuard (AmneziaWG) \u0438 8 \u0447\u0430\u0441\u043e\u0432 \u043e\u0442\u043b\u0430\u0434\u043a\u0438<\/h3>\n<p>\u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 VPN-\u0441\u0435\u0442\u0438 \u043d\u0430 \u0431\u0430\u0437\u0435 WireGuard, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u2014 \u0435\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 <strong>AmneziaWG<\/strong>. \u041f\u0440\u0438\u0447\u0438\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e:<\/p>\n<ul>\n<li>\n<p><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c:<\/strong> FRP \u0432\u0441\u0451 \u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0438\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432 \u043f\u043e\u0440\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438:<\/strong> \u0412\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u0435\u0442\u0438 \u0441\u0442\u0430\u043b\u0438 \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0435\u0442\u0438. \u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u043e\u0434\u043d\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u043e\u043d\u0443\u0441:<\/strong> \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 VPS \u0431\u044b\u043b \u043a\u0443\u043f\u043b\u0435\u043d \u0432 \u041d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0430\u0445, \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u0436\u0435 VPN \u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c VPS \u0431\u044b\u043b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>wg-easy<\/code> \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 AmneziaWG, \u0430 \u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u043c\u0438\u043d\u0438-\u041f\u041a \u2014 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Amnezia (\u0441\u0431\u043e\u0440\u043a\u0430 \u0438\u0437 Dockerfile \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>amnezia-tools<\/code> \u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u044f\u0434\u0440\u0430 \u0445\u043e\u0441\u0442\u0430).<\/p>\n<p>\u0418 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u0439\u043c\u0430\u043b \u0441\u0430\u043c\u044b\u0439 \u0438\u0437\u043d\u0443\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0433 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0430\u0444\u0438\u043a \u0443\u043f\u043e\u0440\u043d\u043e \u0448\u0451\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443. \u0427\u0430\u0441\u043e\u0432 8 \u0443\u0448\u043b\u043e \u043d\u0430 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0443 iptables, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u0443\u043c\u043e\u0432 (\u0447\u0442\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443 \u043d\u0430\u0448\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a). \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0440\u043e\u043f\u0430\u043b \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e WireGuard, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0430\u043a\u0435\u0442\u044b \u0448\u043b\u0438 \u0431\u0435\u0437 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u043a\u0438. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043a\u0440\u044b\u043b\u0430\u0441\u044c \u0432 <code>docker-compose.yml<\/code>: \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043e <code>image: ghcr.io\/wg-easy\/wg-easy:latest<\/code>. \u041a\u0430\u043a \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0442\u0435\u0433 <code>latest<\/code> \u043d\u0430 Docker Hub \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u043f\u0440\u0438\u043b\u0438\u043f \u043a \u0441\u0442\u0430\u0440\u043e\u0439 14-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 AmneziaWG \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0432\u0435\u0442\u043a\u0435 <code>15.x<\/code>. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u0433\u0430 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e (<code>15.3<\/code>) \u0440\u0435\u0448\u0438\u043b\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443.<\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u0432 \u043a\u043e\u0434\u0435: (\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0442\u043e, \u043d\u0430 \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u043b\u0433\u043e \u0440\u044b\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e)<\/p>\n<pre><code class=\"yaml\"> wg-easy:    image: ghcr.io\/wg-easy\/wg-easy:15.3 # \u0441\u0430\u043c\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f    container_name: wg-easy    environment:      - LANG=en      - WG_HOST=${VPS_PUBLIC_IP}      - PORT=51821      - WG_PORT=51820      - WEBROOT_BIND_ADDRESS=127.0.0.1      - WG_DEFAULT_ADDRESS=10.8.0.x      - INIT_DNS=10.8.0.1 # \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f adguard home (\u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435), \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c ip      - WG_PERSISTENT_KEEPALIVE=25      - WG_ALLOWED_IPS=0.0.0.0\/0      - EXPERIMENTAL_AWG=true # \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 amnezia, \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430 \u043d\u0430 \u0445\u043e\u0441\u0442      - OVERRIDE_AUTO_AWG=awg # \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c wg      - INSECURE=true # \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 INSECURE, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438      - WG_DEVICE=eth0      - INIT_ENABLED=true      - INIT_USERNAME=${ADMIN_USER}      - INIT_PASSWORD=${ADMIN_PASSWORD}      - INIT_HOST=${VPS_PUBLIC_IP}      - INIT_PORT=51820    volumes:      - .\/apps-data\/wg-easy:\/etc\/wireguard      - \/lib\/modules:\/lib\/modules:ro    network_mode: \"host\"    restart: unless-stopped    cap_add:      - NET_ADMIN      - SYS_MODULE    healthcheck:      test: [\"CMD\", \"awg\", \"show\", \"wg0\"]      interval: 30s      timeout: 10s      retries: 3      start_period: 10s<\/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<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Nginx<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0431\u044b\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 VPN, \u044f \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b Nginx. \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0431\u044b\u043b \u0436\u0435\u0441\u0442\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u2014 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 <code>10.8.0.0\/24<\/code>. \u041b\u044e\u0431\u044b\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0431\u0435\u0437 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e VPN-\u0442\u0443\u043d\u043d\u0435\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f Nginx.<\/p>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u0430 \u043d\u0430 proxy-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435: Nginx \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c VPS \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a, \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c IP-\u0430\u0434\u0440\u0435\u0441\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043d\u043d\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Nginx \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0436\u0435 \u0441\u0430\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 SSL \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u043f\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 IP \u0432 \u043b\u043e\u0433\u0430\u0445 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0412\u0441\u0442\u0430\u0432\u043b\u044e \u043e\u0434\u0438\u043d \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430 \u0438\u0437 nginx \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0442\u0430\u043a \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0435 (\u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0435 .template):<\/p>\n<pre><code>map $http_upgrade $connection_upgrade {    default upgrade;    ''      close;} # \u0437\u0434\u0435\u0441\u044c \u0443\u043c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 websockets, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043eserver {    listen 443 ssl; # \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c ssl    server_name adguard.${SERVER_NAME}; # \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u044b    ssl_certificate \/etc\/letsencrypt\/live\/${SERVER_NAME}\/fullchain.pem;    ssl_certificate_key \/etc\/letsencrypt\/live\/${SERVER_NAME}\/privkey.pem;    client_max_body_size 2G; # \u0440\u0435\u0448\u0438\u043b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u0435\u0440\u0435\u043a\u0430\u0447\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432    add_header Strict-Transport-Security \"max-age=15552000; includeSubDomains; preload\" always;    set_real_ip_from 172.16.0.0\/12; # \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 ip    set_real_ip_from 10.0.0.0\/8;    set_real_ip_from 127.0.0.1;    real_ip_recursive on; # \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0442\u0430\u043c \u0433\u0434\u0435 nginx \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0438\u0434\u0435\u043b ip    allow 127.0.0.1;  # \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u0432 \u0430\u0434\u0440\u0435\u0441\u043e\u0432    allow 172.16.0.0\/12;    allow 10.8.0.0\/24;    deny all;    location \/ {        proxy_pass http:\/\/127.0.0.1:8082; # \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440        proxy_http_version 1.1;        proxy_set_header Upgrade $http_upgrade;        proxy_set_header Connection $connection_upgrade;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header X-Forwarded-Proto https;    }}<\/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<h3>SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b<\/h3>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Certbot \u043f\u043e challenge-\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 <code>DNS-01<\/code> c API Webnames. \u0421\u0430\u043c \u0434\u043e\u043c\u0435\u043d \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c\u0443 IP-\u0430\u0434\u0440\u0435\u0441\u0443 <code>10.8.0.1<\/code>. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 DNS \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0430 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u0439 wildcard-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u0430 \u0432\u0435\u0441\u044c \u0434\u043e\u043c\u0435\u043d \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0434\u043e\u043c\u0435\u043d\u044b \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c 80-\u0439 \u043f\u043e\u0440\u0442 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430\u0440\u0443\u0436\u0443.<\/p>\n<p>\u0423\u0442\u043e\u0447\u043d\u044e, \u0447\u0442\u043e certbot \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Ansible \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0430\u043c\u043e\u043c\u0443 \u043a\u0440\u043e\u043c\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<pre><code class=\"yaml\"># =========================================================================# 3. \u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0410 \u041f\u041b\u0410\u0413\u0418\u041d\u0410 WEBNAMES DNS \u0414\u041b\u042f CERTBOT# =========================================================================- name: \"[Certbot] \u041a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 certbot-dns-webnames\"  ansible.builtin.git:    repo: \"https:\/\/github.com\/regtime-ltd\/certbot-dns-webnames.git\"    dest: \"\/home\/{{ deploy_user }}\/ServeHub-2\/certbot\/certbot-dns-webnames\"    version: master    update: no- name: \"[Certbot] \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Certbot \u0447\u0435\u0440\u0435\u0437 API Webnames\"  ansible.builtin.get_url:    url: \"https:\/\/www.webnames.ru\/scripts\/json_domain_zone_manager.pl?action=get_config_certbot&amp;domain={{ server_name }}&amp;apikey={{ webnames_apikey }}\"    dest: \"\/home\/{{ deploy_user }}\/ServeHub-2\/certbot\/certbot-dns-webnames\/config.sh\"    mode: \"0755\"- name: \"[Certbot] \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f: \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439\"  ansible.builtin.stat:    path: \"\/home\/{{ deploy_user }}\/ServeHub-2\/certbot\/certbot-dns-webnames\/config.sh\"  register: webnames_config_stat  failed_when: webnames_config_stat.stat.size == 0- name: \"[Certbot] \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0430\u0432 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\"  ansible.builtin.shell:    cmd: \"chmod +x *.sh\"    chdir: \"\/home\/{{ deploy_user }}\/ServeHub-2\/certbot\/certbot-dns-webnames\"  changed_when: 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>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u0445\u0435\u043c\u0430, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0430\u043c \u0441 HTTPS, \u043d\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430.<\/p>\n<p>\u0412\u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 certbot:<\/p>\n<pre><code class=\"yaml\">  certbot:    build:      context: .      dockerfile: Dockerfile.certbot    container_name: certbot    logging: *default-logging    volumes:      - .\/certbot\/certs:\/etc\/letsencrypt      - .\/certbot\/certs-data:\/var\/lib\/letsencrypt      - .\/certbot\/certbot-dns-webnames:\/opt\/certbot-dns-webnames    environment:      - SERVER_NAME=${SERVER_NAME}    command: &gt;      certonly      --manual      --manual-auth-hook \/opt\/certbot-dns-webnames\/authenticator.sh # \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e DNS, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442      --manual-cleanup-hook \/opt\/certbot-dns-webnames\/cleanup.sh      --preferred-challenges dns-01      --agree-tos      --no-eff-email      --non-interactive      --force-renewal      -d \"${SERVER_NAME}\"      -d \"*.${SERVER_NAME}\"      --email \"${EMAIL}\"    deploy:      resources:        limits:          memory: 1G<\/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<h2>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0444\u0442\u0430<\/h2>\n<p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0441\u044f \u0438 \u0441\u0430\u043c \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c, \u043d\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0435\u043b\u0444\u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0430 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0448\u044c: \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043a\u0438\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043c\u0438\u043d\u0438-\u041f\u041a \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u0432 \u043a\u0430\u0448\u0443.<\/p>\n<h3>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u0435\u043a \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c\u0438 \u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u0440\u0438\u0436\u0438\u043b\u0438\u0441\u044c \u043c\u0435\u0434\u0438\u0430-\u0441\u0435\u0440\u0432\u0438\u0441\u044b: <strong>Navidrome<\/strong> \u0434\u043b\u044f \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430 \u043c\u0443\u0437\u044b\u043a\u0438 \u0438 <strong>Audiobookshelf<\/strong> \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u043e\u043a\u043d\u0438\u0433 \u0438 \u043f\u043e\u0434\u043a\u0430\u0441\u0442\u043e\u0432. \u041e\u043d\u0438 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0435, \u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u043c\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0437\u0436\u0435 \u043a \u043d\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f <strong>Nextcloud<\/strong> \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u043e\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0435 \u043e\u0431\u043b\u0430\u043a\u043e \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u0438 \u0441\u0435\u043c\u0435\u0439\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u0435\u0439. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e Bitwarden, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u044f \u0432\u044b\u0431\u0440\u0430\u043b <strong>Vaultwarden<\/strong> \u2014 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 Rust, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0441 API Bitwarden. \u041e\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442\u044b \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 Docker-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d <strong>Portainer<\/strong>. (+ Portainer Agent \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440)<\/p>\n<p>\u0418\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u0433\u0434\u0435 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f, \u0447\u0435\u043c \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u044d\u0442\u043e nextcloud \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430:<\/p>\n<pre><code class=\"yaml\"> nextcloud:    image: nextcloud:34.0.0-apache    container_name: nextcloud    logging: *default-logging    restart: unless-stopped    expose:      - 80    depends_on:      nextcloud-db:        condition: service_healthy    environment:      - POSTGRES_HOST=nextcloud-db      - POSTGRES_DB=${POSTGRES_DB_NEXTCLOUD}      - POSTGRES_USER=${POSTGRES_USER}      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}      - NEXTCLOUD_ADMIN_USER=${ADMIN_USER}      - NEXTCLOUD_ADMIN_PASSWORD=${ADMIN_PASSWORD}      - OVERWRITEWEBROOT=\/nextcloud # \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b nextcloud \u043d\u0435 \u0432 \u043a\u043e\u0440\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430      - OVERWRITEPROTOCOL=https      - HTACCESS_OVERRIDE_CURRENT=1      - NEXTCLOUD_TRUSTED_DOMAINS=${SERVER_NAME}      - TRUSTED_PROXIES=172.16.0.0\/12 10.8.0.0\/24      - NC_maintenance_window_start=2 # \u0437\u0430\u0434\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438      - NC_default_phone_region=RU      - NC_filelocking.enabled=true # \u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f       - 'NC_memcache.local=\\OC\\Memcache\\APCu' # \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e APCu, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044e Redis    volumes:      - .\/apps-data\/nextcloud\/html:\/var\/www\/html      - \/home\/${LOCAL_USER}\/PersonalData\/NextcloudData:\/var\/www\/html\/data    deploy:      resources:        limits:          memory: 3G    healthcheck:      test:        [          \"CMD-SHELL\",          \"test -f \/var\/www\/html\/config\/config.php &amp;&amp; php occ status\",        ]      interval: 1m30s      timeout: 30s      retries: 5      start_period: 30s<\/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<h3>\u041e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0443\u0434\u0430\u043b\u0438\u043b Matrix (Synapse)<\/h3>\n<p>\u041d\u0435 \u0432\u0441\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0448\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c. \u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Tuna \u0438 FRP \u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b \u0441\u0435\u0440\u0432\u0435\u0440 <strong>Matrix (Synapse)<\/strong> \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u041c\u043d\u0435 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e\u0439 \u0438\u0434\u0435\u0435\u0439, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u044f \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u043d\u0430 AmneziaWG, \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u0441\u043e\u0448\u043b\u0430 \u043d\u0430 \u043d\u0435\u0442.<\/p>\n<p>Synapse \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0432\u043f\u0443\u0441\u0442\u0443\u044e \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432\u0430\u043b \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0443 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u041f\u041a \u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u043b \u043a\u043e\u043d\u0444\u0438\u0433 Nginx. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u044b \u0434\u043b\u044f \u0441\u0435\u043c\u044c\u0438 \u043e\u043d \u043d\u0435 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u043b. \u0414\u043b\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0435\u0440\u0442\u043e\u0432 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0449\u0435 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Telegram. (\u043f\u043b\u044e\u0441 \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e) \u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u043f\u0438\u043b\u0438\u043b Synapse \u0438\u0437 \u0441\u0442\u0435\u043a\u0430, \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u044b.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0441\u0432\u044f\u0437\u043a\u0443 \u043a <code>wg-easy<\/code> \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 <strong>AdGuard Home<\/strong>. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0432\u043d\u0443\u0442\u0440\u0438 VPN-\u0441\u0435\u0442\u0438: \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u043e\u0442 \u0440\u0435\u043a\u043b\u0430\u043c\u044b \u0438 \u0442\u0440\u0435\u043a\u0435\u0440\u043e\u0432 \u043d\u0430 \u043b\u0435\u0442\u0443, \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442 DNS-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043d\u0435 \u0434\u0430\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0432\u0435\u0431-\u0441\u0435\u0440\u0444\u0438\u043d\u0433\u0430 \u0443\u043b\u0435\u0442\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 AdGuard Home, \u0442\u0430\u043a \u044d\u0442\u043e \u0442\u043e \u0447\u0442\u043e \u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u043e\u043d\u044f\u043b \u043a\u0430\u043a \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c AmneziaVPN \u043a\u043b\u0438\u0435\u043d\u0442 AdGuard \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 DNS, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c AmneziaWG \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e. \u041a\u0430\u043a \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c \u0447\u0442\u043e AmneziaWG \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 ip \u0438 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442\u0443 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0440\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0430.<\/p>\n<h3>\u041e\u0442 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u043d\u0430 Bash \u043a \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 Ansible<\/h3>\n<p>\u0412\u0435\u0441\u044c \u0441\u0442\u0435\u043a \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b\u0441\u044f \u0447\u0435\u0440\u0435\u0437 bash \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0443\u0436 \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438. \u0412\u043e \u043f\u0435\u0440\u0432\u044b\u0445 \u0438\u0437-\u0437\u0430 bash \u043c\u043d\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u044f \u0438\u0445 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0441 \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0432 \u0444\u0430\u0439\u043b\u044b \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c.<\/p>\n<p>\u0422\u0430\u043a \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443 \u0438 <strong>Ansible<\/strong>. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432 \u0438 \u0440\u043e\u043b\u0435\u0439, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0445 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u0444\u0430\u0439\u043b <code>secrets.yml<\/code>, \u0430 \u0445\u0440\u0443\u043f\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u044b Jinja2. \u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u0442\u0430\u043b \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u043c: \u0435\u0441\u043b\u0438 \u0448\u0430\u0433\u0438 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b, Ansible \u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e yaml \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (bootstrap_os.yml) \u0438 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0445\u043e\u0441\u0442\u043e\u0432 (setup_local.yml \u0438 setup_remote.yml). \u0412 \u0438\u0442\u043e\u0433\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441 \u043d\u0443\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 &#8212; \u0441\u043a\u0430\u0447\u0430\u0442\u044c Ansible, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d manage_deploy.sh, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f Ansible \u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f Ansible \u044f \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043c\u0430 docker, \u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u044e \u0432\u0441\u0435 \u0432 \u043f\u0430\u043f\u043a\u0430\u0445, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 apps-data \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0435 \u0432 \u043d\u0443\u0436\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0438 \u0432\u0441\u0435 \u0441\u0430\u043c\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412 Ansible \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u0443\u0437\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430 deploy.yml:<\/p>\n<pre><code class=\"yaml\">- name: \"[Bootstrap] \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430: \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043b\u0438 root?\"  hosts: vps, local  gather_facts: no  vars_files:    - vars\/secrets.yml  tags: bootstrap  vars:    ansible_password: \"{{ user_pass }}\"    ansible_ssh_pass: \"{{ user_pass }}\"  pre_tasks:    - name: \"[SSH] \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430: \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043b\u0438 root?\"      ansible.builtin.ping:      ignore_errors: yes      ignore_unreachable: yes      vars:        ansible_user: root      register: root_auth_check    - name: \"[SSH] \u041b\u043e\u0433\u0438\u043a\u0430: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434 root\"      set_fact:        ansible_user: root        ansible_become: no      when: root_auth_check.ping is defined    - name: \"[SSH] \u041b\u043e\u0433\u0438\u043a\u0430: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 sudo \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"      set_fact:        ansible_become: yes        ansible_become_method: sudo        ansible_become_password: \"{{ user_pass }}\"      when: root_auth_check.ping is not defined  tasks:    - name: \"[Python] \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Python3 (\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Ansible)\"      raw: |        if [ \"$USER\" != \"root\" ]; then SUDO=\"sudo\"; else SUDO=\"\"; fi                if command -v apt-get &gt;\/dev\/null; then            $SUDO apt-get update &amp;&amp; $SUDO env DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=l apt-get install -y python3        elif command -v pacman &gt;\/dev\/null; then            $SUDO pacman -Sy --noconfirm --overwrite \"*\" archlinux-keyring &amp;&amp; $SUDO pacman -Syu --noconfirm --overwrite \"*\" python3        else            echo \"Unsupported distribution\" &gt;&amp;2            exit 1        fi      changed_when: false    - name: \"[Facts] \u0421\u0431\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0444\u0430\u043a\u0442\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Python\"      setup:    - name: \"[\u041e\u0431\u0449\u0435\u0435] \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u041e\u0421 (Debian\/Ubuntu \u0438\u043b\u0438 Arch)\"      fail:        msg: \"\u041d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u041e\u0421. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f Debian\/Ubuntu \u0438\u043b\u0438 Arch Linux\"      when:        - ansible_facts['os_family'] != 'Debian'        - ansible_facts['os_family'] != 'Archlinux'    - name: \"[Bootstrap] \u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041e\u0421\"      include_tasks: tasks\/bootstrap_os.yml  handlers:    - name: Restart SSH      ansible.builtin.systemd:        name: \"{{ 'ssh' if ansible_facts['os_family'] == 'Debian' else 'sshd' }}\"        state: restarted- name: \"[Git] \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f ServeHub-2\"  hosts: vps, local  vars_files:    - vars\/secrets.yml  become: yes  tasks:    - name: \"[Git] \u041a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f ServeHub-2\"      ansible.builtin.git:        repo: \"{{ project_repo_url }}\"        dest: \"\/home\/{{ deploy_user }}\/ServeHub-2\"        clone: yes        update: yes        force: yes      become: true      become_user: \"{{ deploy_user }}\"    - name: \"[\u041e\u0431\u0449\u0435\u0435] \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u0439\u043b\u0430 .env \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 env.j2\"      ansible.builtin.template:        src: env.j2        dest: \"\/home\/{{ deploy_user }}\/ServeHub-2\/.env\"        owner: \"{{ deploy_user }}\"        group: \"{{ deploy_user }}\"        mode: \"0600\"- name: \"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (VPS)\"  hosts: vps  vars_files:    - vars\/secrets.yml  become: yes  tasks:    - name: \"[VPS] \u0417\u0430\u043f\u0443\u0441\u043a \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430\"      include_tasks: tasks\/setup_remote.yml- name: \"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (Local Server)\"  hosts: local  vars_files:    - vars\/secrets.yml  become: yes  tasks:    - name: \"[Local] \u0417\u0430\u043f\u0443\u0441\u043a \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430\"      include_tasks: tasks\/setup_local.yml<\/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<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Vagrant<\/h2>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0442\u0430\u0447\u0438\u0432\u0430\u043b\u0441\u044f \u043f\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430 \u0442\u0440\u0435\u0445 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u0445: Ubuntu, Debian \u0438 Arch Linux. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c Ansible-\u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438 \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (\u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 EndeavourOS) \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0440\u0438\u0441\u043a\u043e\u0432\u0430\u043d\u043d\u043e, \u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0440\u0443\u043a\u0430\u043c\u0438 \u2014 \u0434\u043e\u043b\u0433\u043e \u0438 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u043b <strong>Vagrant<\/strong>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u0430\u0440\u0443 \u043c\u0438\u043d\u0443\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0447\u0438\u0441\u0442\u044b\u0435 \u041e\u0421 \u0432 VirtualBox \u0438\u0437 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u041d\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u0432\u0435\u043d\u0434\u043e\u0440\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043c\u043e\u0441\u0442\u0430 (<code>public_network<\/code>) \u0432\u0441\u043f\u043b\u044b\u043b\u0438 \u0434\u0432\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<ol>\n<li>\n<p><strong>\u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 DNS:<\/strong> \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e Vagrant \u0441\u043e\u0437\u0434\u0430\u0435\u0442 NAT-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0434\u043e\u0439. \u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e (\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e) \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u043b\u043e\u043c\u0430\u043b\u0441\u044f \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 DNS-\u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u043e\u0439 \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0444\u0430\u0439\u043b\u0430 <code>\/etc\/resolv.conf<\/code> \u0447\u0435\u0440\u0435\u0437 inline-\u0441\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 Vagrant.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 GRUB \u043d\u0430 Debian:<\/strong> \u0412 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0437\u0435 <code>generic\/debian12<\/code> \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f GRUB \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0430 \u0436\u0435\u0441\u0442\u043a\u0443\u044e \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438 \u0434\u0438\u0441\u043a\u0430 \u0438\u0437 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430. \u041f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u043e\u0432 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0441\u0442\u0435\u043d\u0434\u0435 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u0441\u0431\u043e\u044f\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0443, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u043b\u0435\u0442\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u043c\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 <code>lsblk<\/code> \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u0447\u0435\u0440\u0435\u0437 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 <code>debconf-set-selections<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u043e\u0442 \u043a\u043e\u0434 Vagrantfile: (\u0432 node.vm.provision \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a)<\/p>\n<pre><code class=\"ruby\">Vagrant.configure(\"2\") do |config|  boxes = {    \"arch-node\"    =&gt; { box: \"generic\/arch\" },    \"debian-node\"  =&gt; { box: \"generic\/debian12\" },    \"ubuntu-node\"  =&gt; { box: \"generic\/ubuntu2204\" }  }  boxes.each do |name, cfg|    config.vm.define name do |node|      node.vm.box = cfg[:box]      node.vm.network \"public_network\", use_dhcp_assigned_default_route: true            node.vm.provision \"shell\", inline: &lt;&lt;-SHELL        echo \"=== [Vagrant Fix] \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e DNS \u0434\u043b\u044f \u043c\u043e\u0441\u0442\u0430 ===\"        rm -f \/etc\/resolv.conf        echo -e \"nameserver 8.8.8.8\\nnameserver 1.1.1.1\" &gt; \/etc\/resolv.conf        if [ -f \/etc\/debian_version ]; then          echo \"=== [Vagrant Fix] \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 GRUB \u043a \u0434\u0438\u0441\u043a\u0443 ===\"          PRIMARY_DISK=$(lsblk -ndrio NAME,TYPE | awk '$2==\"disk\" {print \"\/dev\/\"$1; exit}')                    echo \"grub-pc grub-pc\/install_devices string $PRIMARY_DISK\" | debconf-set-selections        fi      SHELL            node.vm.provider \"virtualbox\" do |vb|        vb.memory = \"8192\"        vb.cpus = 4        vb.name = \"servehub-test-#{name}\"        vb.customize [\"modifyvm\", :id, \"--graphicscontroller\", \"vmsvga\"]      end    end  endend<\/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<h2>\u041d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0431\u044d\u043a\u0430\u043f\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 Borgmatic<\/h2>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439 \u044f \u0432\u043d\u0435\u0434\u0440\u0438\u043b <strong>Borgmatic<\/strong> (\u0443\u0434\u043e\u0431\u043d\u0443\u044e \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043d\u0430\u0434 \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c Borg Backup). \u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u044f\u0437\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u044e\u043d\u0438\u0442\u043e\u0432 <code>borgmatic.service<\/code> \u0438 <code>borgmatic.timer<\/code>. \u0412 \u0431\u044d\u043a\u0430\u043f \u0443\u0445\u043e\u0434\u044f\u0442 \u0434\u0432\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438: <code>apps-data<\/code> (\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445) \u0438 <code>PersonalData<\/code> (\u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430: \u043c\u0443\u0437\u044b\u043a\u0430, \u043a\u043d\u0438\u0433\u0438, \u043f\u043e\u0434\u043a\u0430\u0441\u0442\u044b, \u0444\u0430\u0439\u043b\u044b Nextcloud).<\/p>\n<p>\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u044d\u043a\u0430\u043f\u043e\u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f Ansible. \u041c\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c UUID \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0436\u0435\u0441\u0442\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 \u2014 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0430\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442 \u0435\u0433\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043f\u0440\u0438\u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0440\u043e\u0442\u0430\u0446\u0438\u0438 (\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 7 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445, 4 \u0435\u0436\u0435\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0438 6 \u0435\u0436\u0435\u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439). \u0422\u0430\u043a\u0436\u0435 \u0432 Prometheus \u0432\u044b\u0432\u0435\u0434\u0435\u043d \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u0430\u043c\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <code>.borg<\/code> \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0431\u044d\u043a\u0430\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u2014 \u0440\u0438\u0441\u043a \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u00ab\u0431\u0438\u0442\u043e\u043c\u00bb \u0438\u043b\u0438 \u043d\u0435\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0435\u0441\u043b\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0432\u0430 \u0432 \u043d\u0435\u0435 \u0448\u043b\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u044f \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0445\u0443\u043a\u043e\u0432 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Borgmatic.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (<code>docker compose down<\/code>), \u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f (\u0438\u043b\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438) \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <strong>Borg UI<\/strong>.<\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f borgmatic: (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043a\u0430\u043a Jinja2 \u0448\u0430\u0431\u043b\u043e\u043d, \u0447\u0442\u043e\u0431\u044b Ansible \u0432 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430\u0445 \u0441\u0430\u043c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435)<\/p>\n<pre><code class=\"yaml\">source_directories: # \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0442\u043e\u043c\u0430 docker \u0434\u043b\u044f \u043b\u0435\u0433\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0431\u044d\u043a\u0430\u043f\u043e\u0432  - \/home\/{{ local_user }}\/ServeHub-2\/apps-data\/  - \/home\/{{ local_user }}\/PersonalData\/Music  - \/home\/{{ local_user }}\/PersonalData\/NextcloudData  - \/home\/{{ local_user }}\/PersonalData\/Books  - \/home\/{{ local_user }}\/PersonalData\/Podcasts  - \/home\/{{ local_user }}\/PersonalData\/Audiobooksrepositories:  - path: \/mnt\/backup_storage\/server_backup.borgkeep_daily: 7keep_weekly: 4keep_monthly: 6compression: lz4encryption_passphrase: {{ borgmatic_encryption_passphrase }}# \u0422\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u0431\u044d\u043a\u0430\u043f\u043e\u043c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u0442\u043e\u043c \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0437\u0430\u043d\u043e\u0432\u043ecommands:  - before: action    when:      - create    run:      - echo \"Starting backup pipeline...\"      - cd \/home\/{{ local_user }}\/ServeHub-2 &amp;&amp; docker compose -f docker-compose.local.yaml down  - after: action    when:      - create    states:      - finish    run:      - cd \/home\/{{ local_user }}\/ServeHub-2 &amp;&amp; docker compose -f docker-compose.local.yaml up -d      - echo \"Backup completed successfully!\"  - after: error    run:      - cd \/home\/{{ local_user }}\/ServeHub-2 &amp;&amp; docker compose -f docker-compose.local.yaml up -d<\/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<h2>\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c (Observability) \u0443\u0440\u043e\u0432\u043d\u044f Enterprise<\/h2>\n<p>\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0440\u0435\u043b\u0438\u0437\u0430\u0445 (v1.2.0 \u0438 v1.3.0) \u0444\u043e\u043a\u0443\u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u043d\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438.<\/p>\n<h3>\u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433\u0430 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 Gatus<\/h3>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u044f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0430 <em>Uptime Kuma<\/em>, \u043d\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0438. \u0417\u0430\u0442\u0435\u043c \u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b \u0441\u0432\u044f\u0437\u043a\u0443 <em>Blackbox Exporter \u0438 Alertmanager<\/em> \u0441 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 Matrix. \u041d\u043e \u0442\u0443\u0442 \u043a\u0440\u044b\u043b\u0430\u0441\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043d\u0435\u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0430: \u0432\u0435\u0441\u044c \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433 \u0431\u044b\u043b \u0437\u0430\u0432\u044f\u0437\u0430\u043d \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u041f\u041a, \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0433\u043e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043e\u0442\u043a\u0430\u0437\u0430 \u044f \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0438\u0448\u0438\u043b\u0441\u044f \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u0435\u0440\u043d\u0443\u0442\u044c Uptime Kuma, \u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c VPS \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u00ab\u0441\u0442\u043e\u0440\u043e\u0436\u0430\u00bb \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 Python-\u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 <code>uptime-kuma-api<\/code>. \u041d\u043e \u0438 \u0442\u0443\u0442 \u0436\u0434\u0430\u043b\u0438 \u00ab\u0433\u0440\u0430\u0431\u043b\u0438\u00bb \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u0430\u0441\u044c \u0442\u0440\u0438 \u0433\u043e\u0434\u0430 \u0438 \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u043b\u043e\u043c\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u0441\u0432\u0435\u0436\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Kuma.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u043b <strong>Gatus<\/strong>. \u041e\u043d \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 YAML-\u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0430\u043b\u0435\u0440\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442. \u0418\u0437-\u0437\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 Gatus (\u043e\u043d \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0437 \u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0442\u0438\u043f\u0430 <code>\/gatus<\/code>), \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0438 <code>wg-easy<\/code> \u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u0441\u0443\u0431\u0434\u043e\u043c\u0435\u043d\u044b <code>gatus.<\/code> \u0438 <code>wireguard.<\/code>.<\/p>\n<p>\u0414\u043b\u044f Gatus \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433:<\/p>\n<pre><code class=\"yaml\">web:  address: \"127.0.0.1\"  port: 51822alerting: # \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0434\u043b\u044f \u0430\u043b\u0435\u0440\u0442\u043e\u0432  telegram:    token: \"${TELEGRAM_TOKEN}\"    id: \"${TELEGRAM_CHAT_ID}\"endpoints:  - name: \"Is Local Server Alive?\"    url: \"http:\/\/host.docker.internal:8080\/health-check\"    interval: 60s    conditions:      - \"[STATUS] == 200\"    alerts:      - type: telegram        failure-threshold: 3        success-threshold: 2        send-on-resolved: true        description: \"\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d!\"  - name: \"Is VPS Server Alive?\"    url: \"http:\/\/host.docker.internal:8080\/vps-health-check\"    interval: 60s    conditions:      - \"[STATUS] == 200\"    alerts:      - type: telegram        failure-threshold: 3        success-threshold: 2        send-on-resolved: true        description: \"\u0412\u0435\u0431-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 VPS \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442!\"  - name: SSL Certificate    url: \"https:\/\/${SERVER_NAME}\"    interval: 1h    conditions:      - \"[CERTIFICATE_EXPIRATION] &gt; 720h\"    alerts:      - type: telegram        description: \"SSL \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u043a\u043e\u0440\u043e \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442\"        failure-threshold: 3        success-threshold: 2        send-on-resolved: 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\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0431\u044b\u043b\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u0430 \u0441\u0432\u044f\u0437\u043a\u0430 <code>node-exporter<\/code> \u0438 <code>cAdvisor<\/code>. \u0412\u0441\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0432 Telegram-\u0431\u043e\u0442\u0430. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043b\u0430\u0432\u0438\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0445\u043e\u0441\u0442\u0430), \u0432 Alertmanager \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0436\u0435\u0441\u0442\u043a\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440 \u0434\u043b\u044f AdGuard Home, \u0432\u044b\u0432\u043e\u0434\u044f\u0449\u0438\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Grafana.<\/p>\n<h3>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043b\u043e\u0433\u0438: Loki + Grafana Alloy<\/h3>\n<p>\u0412 \u0440\u0435\u043b\u0438\u0437\u0435 v1.3.0 \u0432 \u0441\u0442\u0435\u043a \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u0430 \u043b\u043e\u0433\u043e\u0432 <strong>Loki<\/strong>. \u0412\u043c\u0435\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0433\u043e Promtail \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0433\u0435\u043d\u0442\u0430 \u0441\u0431\u043e\u0440\u0430 \u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b <strong>Grafana Alloy<\/strong>.<\/p>\n<p>\u041e\u043d \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043b\u043e\u0433\u0438 \u0441\u043e \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043f\u0430\u0440\u0441\u0438\u0442 \u0438\u0445 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0432 Loki. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 Nginx \u0438\u043b\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u0435\u0434\u0438\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 Grafana \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 LogQL, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0443.<\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433 Loki:<\/p>\n<pre><code class=\"yaml\">auth_enabled: falseserver:  http_listen_port: 3100  grpc_listen_port: 9096common:  instance_addr: 0.0.0.0  path_prefix: \/loki  storage:    filesystem:      chunks_directory: \/loki\/chunks      rules_directory: \/loki\/rules  replication_factor: 1  ring:    kvstore:      store: inmemoryschema_config:  configs:    - from: 2024-01-01      store: tsdb      object_store: filesystem      schema: v13      index:        prefix: index_        period: 24hlimits_config:  allow_structured_metadata: true  reject_old_samples: true  reject_old_samples_max_age: 168h  retention_period: 30dcompactor:  working_directory: \/loki\/compactor  compaction_interval: 10m  retention_enabled: true  delete_request_store: filesystem  retention_delete_delay: 2h  retention_delete_worker_count: 150<\/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\u043e\u043d\u0444\u0438\u0433 Grafana Alloy: (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433)<\/p>\n<pre><code>discovery.docker \"local_containers\" {   host = \"unix:\/\/\/var\/run\/docker.sock\" # c\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 docker-\u0434\u0435\u043c\u043e\u043d \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432} discovery.relabel \"docker_logs_relabel\" {  targets = discovery.docker.local_containers.targets  rule {    source_labels = [\"__meta_docker_container_name\"]    regex         = \"\/(.*)\"    target_label  = \"container_name\"  } # \u0423\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0441\u043b\u044d\u0448 \"\/\" \u0438\u0437 \u0438\u043c\u0435\u043d\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \/nextcloud -&gt; nextcloud). \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e, \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e  rule {    target_label = \"server\"    replacement  = \"local-minipc\"  } # \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0438\u043c\u0435\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u043e\u043c\u0435\u0442\u043a\u0438 \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0441 \u043a\u0430\u043a\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043b\u043e\u0433\u0438}# \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u043e\u0433\u0438 \u0438\u0437 Docker \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432loki.source.docker \"docker_logs\" {  host       = \"unix:\/\/\/var\/run\/docker.sock\"  targets    = discovery.relabel.docker_logs_relabel.output  forward_to = [loki.write.loki_storage.receiver]}# \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u043e\u0433\u0438 \u0432 Lokiloki.write \"loki_storage\" {  endpoint {    url = \"http:\/\/loki:3100\/loki\/api\/v1\/push\" # \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e ip 10.8.0.2  }}<\/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<h2>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441: \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 Homepage<\/h2>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u0443\u044e HTML-\u043f\u0430\u043d\u0435\u043b\u044c \u0441 Glassmorphism-\u0434\u0438\u0437\u0430\u0439\u043d\u043e\u043c. \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u044d\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u043f\u0440\u0430\u0432\u043a\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0431\u044b\u043b\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1b0\/ec7\/2de\/1b0ec72deda5cd3fe44ed811281193fc.jpg\" alt=\"HTML + CSS\" title=\"HTML + CSS\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1b0\/ec7\/2de\/1b0ec72deda5cd3fe44ed811281193fc.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1b0\/ec7\/2de\/1b0ec72deda5cd3fe44ed811281193fc.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>HTML + CSS<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u043f\u0440\u043e\u0435\u043a\u0442 <strong>Homepage<\/strong>. \u042d\u0442\u043e \u0434\u0430\u043b\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c: \u0432\u0441\u044f \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 YAML-\u0444\u0430\u0439\u043b\u044b \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0430\u044f, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u044e \u0447\u0442\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0435.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4dd\/9ad\/0d8\/4dd9ad0d8d255bd7aac7730791cc2774.png\" alt=\"Homepage\" title=\"Homepage\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4dd\/9ad\/0d8\/4dd9ad0d8d255bd7aac7730791cc2774.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4dd\/9ad\/0d8\/4dd9ad0d8d255bd7aac7730791cc2774.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Homepage<\/figcaption><\/div>\n<\/figure>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043a\u0430\u043a \u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u0435\u043b, \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u044f \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u0442 \u0437\u0430\u0439\u0434\u0435\u0442, \u0442\u043e \u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0439\u0434\u0443\u0441\u044c \u043f\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c: \u043a\u0430\u043a \u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b Matrix \u0438 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u0435\u0433\u043e \u0443\u0431\u0440\u0430\u0442\u044c, \u043a\u0430\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u043b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 amnezia \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440-\u043a\u043b\u0438\u0435\u043d\u0442, \u0447\u0442\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0440\u0435\u043b\u0438\u0437\u0435 1.4.0 \u0438 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0441 manage_deploy.sh \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 GUI \u043a\u043b\u0438\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a deploy. \u0421\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Go + Wails). \u041f\u0440\u043e \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u044e \u0441\u0442\u0430\u0442\u044c\u044e.<\/p>\n<p>\u0412\u0441\u044f \u043a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u043e\u0442\u043a\u0440\u044b\u0442\u044b \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430:<\/p>\n<p>\ud83d\udd17 <strong>GitHub-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/strong> <a href=\"https:\/\/github.com\/canntstand\/ServeHub-2\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/canntstand\/ServeHub-2<\/a><\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438 \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u044f \u043e\u0442\u0434\u0430\u043b \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (3 \u043c\u0435\u0441\u044f\u0446\u0430). \u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u0430\u0448\u0435\u043c\u0443 \u0444\u0438\u0434\u0431\u0435\u043a\u0443 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445!<\/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\/1058580\/\">https:\/\/habr.com\/ru\/articles\/1058580\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u0435\u043d\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043c\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u042f \u0440\u0435\u0448\u0438\u043b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0451 \u0441 \u043d\u0443\u043b\u044f. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u044d\u0442\u043e \u0431\u044b\u043b \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u043b\u0438 \u0440\u0443\u043a\u0438.\u0410\u0440\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0449\u043d\u044b\u0435 VPS \u043f\u043e\u0434 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0435\u043c\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043d\u043e \u0434\u043e\u0440\u043e\u0433\u043e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u043c\u0430 \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0431\u044b\u043b \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u0442\u0442\u043e\u043f (\u043c\u0438\u043d\u0438-\u041f\u041a) \u0441 16 \u0413\u0411 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0431\u0430\u0437\u0435 \u044d\u043d\u0435\u0440\u0433\u043e\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 Intel N95.\u041f\u0440\u043e\u0439\u0434\u044f \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 Bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u0440\u043e\u0435\u043a\u0442 ServeHub-2. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0443, \u043a\u0430\u043a \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0441\u0435\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0431\u0435\u0434\u0438\u043b \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c\u0438 \u0431\u0430\u0433\u0430\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438.\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Tuna\u0412 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0435\u0449\u0435 \u043d\u0435 \u0434\u0443\u043c\u0430\u043b \u043e VPN \u043a\u0430\u043a \u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u043f\u0440\u043e\u0431\u0438\u0442\u0438\u044f NAT \u0438 \u043e\u0441\u043d\u043e\u0432\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u0432\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u041f\u0435\u0440\u0432\u043e\u0435, \u043a \u0447\u0435\u043c\u0443 \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u2014 \u0441\u0435\u0440\u0432\u0438\u0441 Tuna. \u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 Cloudflare Tunnel \u0437\u0430 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 300 \u0440\u0443\u0431\u043b\u0435\u0439. \u0423 \u043d\u0435\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043e\u043d \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u0435\u043b \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:\u0421\u0435\u0440\u0432\u0435\u0440\u0430 Tuna \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\u041d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b.\u0412 \u0446\u0435\u043b\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439, \u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u043c.\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0434\u043b\u044f tuna (\u0432\u0441\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0434\u043b\u044f ssh \u0442\u0443\u043d\u043d\u0435\u043b\u044f, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f ssh, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 http \u0442\u0443\u043d\u043d\u0435\u043b\u044c \u0441 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u043a nginx \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u043c\u0443 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u0440\u043e\u043a\u0441\u0438 \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0435\u0441\u0442\u044c):tuna_matrix:    container_name: tuna_matrix    image: yuccastream\/tuna:latest    restart: always    environment:      &#8212; TUNA_TOKEN=${TUNA_TOKEN}      &#8212; SYNAPSE_SERVER_NAME=${SYNAPSE_SERVER_NAME}    command: http nginx:80 &#8212;domain=${SYNAPSE_SERVER_NAME} &#8212;https-redirect    depends_on:      &#8212; nginx  tuna_ssh:    container_name: tuna_ssh    image: yuccastream\/tuna:latest    restart: always    network_mode: &#171;host&#187;    environment:      &#8212; TUNA_TOKEN=${TUNA_TOKEN}    command: tcp 22 &#8212;port=${TUNA_SSH_PORT}\u0412 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438: \u0442\u0435\u0441\u0442\u044b Pangolin \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a FRP\u041f\u043e\u0441\u043b\u0435 Tuna \u044f \u0440\u0435\u0448\u0438\u043b \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b Pangolin. \u041e\u0434\u043d\u0430\u043a\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u044c: \u0434\u043b\u044f \u0434\u0435\u0448\u0451\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043e\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u00ab\u0442\u044f\u0436\u0451\u043b\u044b\u043c\u00bb \u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u043c. \u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u043c\u0438\u043d\u0443\u0441\u044b \u2014 \u043e\u0449\u0443\u0442\u0438\u043c\u044b\u0439 \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u043f\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u0438 \u043b\u0438\u0448\u043d\u0438\u0439 \u0441\u043b\u043e\u0439 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0431-\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434 \u0441\u0430\u043c\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438. \u042d\u0442\u043e \u043b\u043e\u043c\u0430\u043b\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 (\u0432\u0440\u043e\u0434\u0435 Element \u0434\u043b\u044f Matrix \u0438\u043b\u0438 Bitwarden \u0434\u043b\u044f \u043f\u0430\u0440\u043e\u043b\u0435\u0439), \u0433\u0434\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u0430.\u041d\u0430 \u0441\u043c\u0435\u043d\u0443 \u043f\u0440\u0438\u0448\u0435\u043b FRP (Fast Reverse Proxy). \u041e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u0442\u0443 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430, \u043d\u043e \u0445\u043e\u0441\u0442\u0438\u043b \u044f \u0435\u0433\u043e \u0443\u0436\u0435 \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0430\u0440\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u043c VPS \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Layer 4 (TCP). \u042d\u0442\u043e \u0434\u0430\u043b\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c: \u0432\u043d\u0435\u0448\u043d\u0438\u0439 VPS \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u044c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u043b, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u043b \u0441\u044b\u0440\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u043e\u043c\u043e\u0439. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u044b: \u0432\u043c\u0435\u0441\u0442\u043e 300 \u0440\u0443\u0431\u043b\u0435\u0439 \u0437\u0430 Tuna \u0438 \u0435\u0449\u0451 300 \u0440\u0443\u0431\u043b\u0435\u0439 \u0437\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 VPN, \u044f \u0441\u0442\u0430\u043b \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u0435\u0433\u043e 500 \u0440\u0443\u0431\u043b\u0435\u0439 \u0437\u0430 \u043e\u0434\u0438\u043d \u0441\u0442\u043e\u0439\u043a\u0438\u0439 VPS, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0433 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0445\u043e\u0447\u0443. (\u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0434\u0430\u0436\u0435 \u0434\u0435\u0448\u0435\u0432\u043b\u0435, \u0442\u0430\u043a \u043a\u0430\u043a VPS \u0441 4 \u0433\u0431 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043d\u0430 40%, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0432\u0441\u0435\u0433\u043e \u043d\u0430 20%-40%)FRP \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 2 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 (\u043e\u0434\u0438\u043d \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 frp server, \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c frp client), \u0432\u0441\u0435 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043b\u043e\u044f\u0445. \u0423 \u043c\u0435\u043d\u044f \u043e\u043d \u0431\u0440\u0430\u043b \u0442\u0440\u0430\u0444\u0438\u043a \u0437\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 TCP \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b \u0435\u0433\u043e \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.\u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u043f. \u0444\u0438\u0448\u043a\u0430 \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 frpc, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0430 frp \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435.frpc.toml:serverAddr = &#171;{{ .Envs.FRP_SERVER_IP }}&#187;serverPort = 7000auth.method = &#171;token&#187;auth.token = &#171;{{ .Envs.FRP_TOKEN }}&#187;[[proxies]]name = &#171;http_traffic&#187;type = &#171;tcp&#187;localIP = &#171;nginx_proxy&#187;localPort = 80remotePort = 8080transport.proxyProtocolVersion = &#171;v2&#8243;[[proxies]]name = &#171;https_traffic&#187;type = &#171;tcp&#187;localIP = &#171;nginx_proxy&#187;localPort = 443remotePort = 8443transport.proxyProtocolVersion = &#171;v2&#8243;[[proxies]]name = &#171;secure_ssh&#187;type = &#171;tcp&#187;localIP = &#171;host.docker.internal&#187;localPort = 22remotePort = 2222frps.toml:bindPort = 7000auth.method = &#171;token&#187;auth.token = &#171;{{ .Envs.FRP_TOKEN }}&#187;maxPortsPerClient = 10\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0435\u0437\u0434 \u043d\u0430 WireGuard (AmneziaWG) \u0438 8 \u0447\u0430\u0441\u043e\u0432 \u043e\u0442\u043b\u0430\u0434\u043a\u0438\u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 VPN-\u0441\u0435\u0442\u0438 \u043d\u0430 \u0431\u0430\u0437\u0435 WireGuard, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u2014 \u0435\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 AmneziaWG. \u041f\u0440\u0438\u0447\u0438\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e:\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c: FRP \u0432\u0441\u0451 \u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0438\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432 \u043f\u043e\u0440\u0442\u043e\u0432.\u0423\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438: \u0412\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u0435\u0442\u0438 \u0441\u0442\u0430\u043b\u0438 \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0435\u0442\u0438. \u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u043e\u0434\u043d\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u044b.\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u043e\u043d\u0443\u0441: \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 VPS \u0431\u044b\u043b \u043a\u0443\u043f\u043b\u0435\u043d \u0432 \u041d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0430\u0445, \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u0436\u0435 VPN \u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c.\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c VPS \u0431\u044b\u043b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 wg-easy \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 AmneziaWG, \u0430 \u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u043c\u0438\u043d\u0438-\u041f\u041a \u2014 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Amnezia (\u0441\u0431\u043e\u0440\u043a\u0430 \u0438\u0437 Dockerfile \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c amnezia-tools \u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u044f\u0434\u0440\u0430 \u0445\u043e\u0441\u0442\u0430).\u0418 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u0439\u043c\u0430\u043b \u0441\u0430\u043c\u044b\u0439 \u0438\u0437\u043d\u0443\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0433 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0430\u0444\u0438\u043a \u0443\u043f\u043e\u0440\u043d\u043e \u0448\u0451\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443. \u0427\u0430\u0441\u043e\u0432 8 \u0443\u0448\u043b\u043e \u043d\u0430 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0443 iptables, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u0443\u043c\u043e\u0432 (\u0447\u0442\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443 \u043d\u0430\u0448\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a). \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0440\u043e\u043f\u0430\u043b \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e WireGuard, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0430\u043a\u0435\u0442\u044b \u0448\u043b\u0438 \u0431\u0435\u0437 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u043a\u0438. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043a\u0440\u044b\u043b\u0430\u0441\u044c \u0432 docker-compose.yml: \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043e image: ghcr.io\/wg-easy\/wg-easy:latest. \u041a\u0430\u043a \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0442\u0435\u0433 latest \u043d\u0430 Docker Hub \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u043f\u0440\u0438\u043b\u0438\u043f \u043a \u0441\u0442\u0430\u0440\u043e\u0439 14-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 AmneziaWG \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0432\u0435\u0442\u043a\u0435 15.x. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u0433\u0430 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e (15.3) \u0440\u0435\u0448\u0438\u043b\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443.\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u0432 \u043a\u043e\u0434\u0435: (\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0442\u043e, \u043d\u0430 \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u043b\u0433\u043e \u0440\u044b\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e) wg-easy:    image: ghcr.io\/wg-easy\/wg-easy:15.3 # \u0441\u0430\u043c\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f    container_name: wg-easy    environment:      &#8212; LANG=en      &#8212; WG_HOST=${VPS_PUBLIC_IP}      &#8212; PORT=51821      &#8212; WG_PORT=51820      &#8212; WEBROOT_BIND_ADDRESS=127.0.0.1      &#8212; WG_DEFAULT_ADDRESS=10.8.0.x      &#8212; INIT_DNS=10.8.0.1 # \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f adguard home (\u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435), \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c ip      &#8212; WG_PERSISTENT_KEEPALIVE=25      &#8212; WG_ALLOWED_IPS=0.0.0.0\/0      &#8212; EXPERIMENTAL_AWG=true # \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 amnezia, \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430 \u043d\u0430 \u0445\u043e\u0441\u0442      &#8212; OVERRIDE_AUTO_AWG=awg # \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c wg      &#8212; INSECURE=true # \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 INSECURE, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438      &#8212; WG_DEVICE=eth0      &#8212; INIT_ENABLED=true      &#8212; INIT_USERNAME=${ADMIN_USER}      &#8212; INIT_PASSWORD=${ADMIN_PASSWORD}      &#8212; INIT_HOST=${VPS_PUBLIC_IP}      &#8212; INIT_PORT=51820    volumes:      &#8212; .\/apps-data\/wg-easy:\/etc\/wireguard      &#8212; \/lib\/modules:\/lib\/modules:ro    network_mode: &#171;host&#187;    restart: unless-stopped    cap_add:      &#8212; NET_ADMIN      &#8212; SYS_MODULE    healthcheck:      test: [&#171;CMD&#187;, &#171;awg&#187;, &#171;show&#187;, &#171;wg0&#8243;]      interval: 30s      timeout: 10s      retries: 3      start_period: 10s\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Nginx\u0427\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0431\u044b\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 VPN, \u044f \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b Nginx. \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0431\u044b\u043b \u0436\u0435\u0441\u0442\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u2014 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 10.8.0.0\/24. \u041b\u044e\u0431\u044b\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0431\u0435\u0437 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e VPN-\u0442\u0443\u043d\u043d\u0435\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f Nginx.\u041b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u0430 \u043d\u0430 proxy-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435: Nginx \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c VPS \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a, \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c IP-\u0430\u0434\u0440\u0435\u0441\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043d\u043d\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Nginx \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0436\u0435 \u0441\u0430\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 SSL \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u043f\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 IP \u0432 \u043b\u043e\u0433\u0430\u0445 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.\u0412\u0441\u0442\u0430\u0432\u043b\u044e \u043e\u0434\u0438\u043d \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430 \u0438\u0437 nginx \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0442\u0430\u043a \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0435 (\u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0435 .template):map $http_upgrade $connection_upgrade {    default upgrade;    &#187;      close;} # \u0437\u0434\u0435\u0441\u044c \u0443\u043c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 websockets, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043eserver {    listen 443 ssl; # \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c ssl    server_name adguard.${SERVER_NAME}; # \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u044b    ssl_certificate \/etc\/letsencrypt\/live\/${SERVER_NAME}\/fullchain.pem;    ssl_certificate_key \/etc\/letsencrypt\/live\/${SERVER_NAME}\/privkey.pem;    client_max_body_size 2G; # \u0440\u0435\u0448\u0438\u043b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u0435\u0440\u0435\u043a\u0430\u0447\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432    add_header Strict-Transport-Security &#171;max-age=15552000; includeSubDomains; preload&#187; always;    set_real_ip_from 172.16.0.0\/12; # \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 ip    set_real_ip_from 10.0.0.0\/8;    set_real_ip_from 127.0.0.1;    real_ip_recursive on; # \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0442\u0430\u043c \u0433\u0434\u0435 nginx \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0438\u0434\u0435\u043b ip    allow 127.0.0.1;  # \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u0432 \u0430\u0434\u0440\u0435\u0441\u043e\u0432    allow 172.16.0.0\/12;    allow 10.8.0.0\/24;    deny all;    location \/ {        proxy_pass http:\/\/127.0.0.1:8082; # \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440        proxy_http_version 1.1;        proxy_set_header Upgrade $http_upgrade;        proxy_set_header Connection $connection_upgrade;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header X-Forwarded-Proto https;    }}SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Certbot \u043f\u043e challenge-\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 DNS-01 c API Webnames. \u0421\u0430\u043c \u0434\u043e\u043c\u0435\u043d \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c\u0443 IP-\u0430\u0434\u0440\u0435\u0441\u0443 10.8.0.1. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 DNS \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0430 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u0439 wildcard-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u0430 \u0432\u0435\u0441\u044c \u0434\u043e\u043c\u0435\u043d \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0434\u043e\u043c\u0435\u043d\u044b \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c 80-\u0439 \u043f\u043e\u0440\u0442 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430\u0440\u0443\u0436\u0443.\u0423\u0442\u043e\u0447\u043d\u044e, \u0447\u0442\u043e certbot \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f&#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-487100","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/487100","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=487100"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/487100\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=487100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=487100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=487100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}