{"id":344285,"date":"2023-01-21T15:00:53","date_gmt":"2023-01-21T15:00:53","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=344285"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=344285","title":{"rendered":"<span>\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u0438\u044f<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/88d\/2a8\/e73\/88d2a8e736f6a0078df11853af534f8b.png\" width=\"2802\" height=\"1040\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/88d\/2a8\/e73\/88d2a8e736f6a0078df11853af534f8b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0433\u0430\u0434\u0430\u0439, \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043b ChatGPT \u0438\u043b\u0438 \u043d\u0435\u0442?<\/p>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0438\u043b\u0438 \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442? \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0448\u0443 \u0442\u043e, \u043a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u043d\u0430 Linux. \u0421\u0442\u0435\u043d\u0434 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0434\u043e\u043c\u0435\u043d\u0430\u043c\u0438, \u0443\u043c\u0435\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c TLS \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 IaaC, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u0438\u043b\u0438 SCM, \u0435\u0441\u0442\u044c UI, \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<p>\u042f \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u043c \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u0434\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0441\u0447\u0438\u0442\u0430\u044e &#171;\u043f\u0442\u0438\u0447\u0438\u0439&#187; \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434 \u0441 \u0432\u043a\u0440\u0430\u043f\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u044d\u0442\u0430\u043f\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0432. \u0410 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u0436\u0435 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430. \u041a\u0440\u043e\u043c\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u043e\u043f\u0438\u0448\u0443 \u0442\u0435 \u043f\u043b\u044e\u0441\u044b \u0438 \u0442\u0435 \u043c\u0438\u043d\u0443\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b \u044d\u0442\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u043a\u0430\u043a \u0431\u044b \u0433\u0440\u043e\u043c\u043a\u043e \u044d\u0442\u043e \u043d\u0435 \u0437\u0432\u0443\u0447\u0430\u043b\u043e. <\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u044b\u0434\u0435\u043d\u043d\u0430\u044f \u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043c\u043e\u0435\u0433\u043e \u043e\u043f\u044b\u0442\u0430, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430\u043c \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0438\u0448\u0443\u0442 \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447, \u043d\u043e \u043d\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0438.<\/p>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h3>\n<p>Nomad \u2014 <a href=\"https:\/\/www.nomadproject.io\" rel=\"noopener noreferrer nofollow\">https:\/\/www.nomadproject.io<\/a><br \/>Consul \u2014 <a href=\"https:\/\/www.consul.io\" rel=\"noopener noreferrer nofollow\">https:\/\/www.consul.io<\/a><br \/>Vault    \u2014 <a href=\"https:\/\/www.vaultproject.io\" rel=\"noopener noreferrer nofollow\">https:\/\/www.vaultproject.io<\/a><br \/>Traefik \u2014 <a href=\"https:\/\/traefik.io\" rel=\"noopener noreferrer nofollow\">https:\/\/traefik.io<\/a><br \/>Packer \u2014 <a href=\"https:\/\/www.packer.io\" rel=\"noopener noreferrer nofollow\">https:\/\/www.packer.io<\/a><br \/>Docker \u2014 <a href=\"http:\/\/docker.io\" rel=\"noopener noreferrer nofollow\">http:\/\/docker.io<\/a><\/p>\n<h4>\u041f\u043b\u044e\u0441\u044b<\/h4>\n<ul>\n<li>\n<p>\u041d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u0443\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043f\u043e \u0440\u0435\u043b\u0438\u0437\u0443 \u0438 \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0442\u0435\u043d\u0434 \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0431\u043e\u0435\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435. \u041e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f MVP \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<\/li>\n<\/ul>\n<h4>\u041c\u0438\u043d\u0443\u0441\u044b<\/h4>\n<ul>\n<li>\n<p>\u041d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 &#171;\u043d\u0430 \u043b\u0435\u0442\u0443&#187;, \u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0435\u0441\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h3>\n<p>\u041a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>Packer<\/strong>  \u0432 \u043e\u0431\u0440\u0430\u0437 \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 (\u0430\u043d\u0430\u043b\u043e\u0433 Docker Registry). \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445.<\/p>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <strong>Docker <\/strong>\u0438<strong> <\/strong>\u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0442. \u0435. \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432 \u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>Nomad<\/strong>. \u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 go-template \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0437 <strong>Vault<\/strong>.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 Web-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u0432 <strong>Traefik<\/strong> \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 HTTPS \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438 TLS \u043e\u0442 Let&#8217;sEncrypt.<\/p>\n<h4>\u041a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/h4>\n<p>\u042f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f <strong>Ubuntu<\/strong>, \u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<h4>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430<\/h4>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0441 2 \u044f\u0434\u0440\u0430\u043c\u0438, 4\u0413 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0434\u0438\u0441\u043a\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u043c 20\u0413.  \u041c\u043e\u0436\u0435\u0442\u0435 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0435\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430:<\/p>\n<pre><code class=\"bash\"> 3236 root     traefik traefik                  N\/A    1.37%    1.37%    1.37%  3488 root     bin\/console bot run              N\/A    1.16%    1.28%    1.42%  3416 root     bin\/console bot run              N\/A    1.17%    1.28%    1.42%   858 root     \/usr\/bin\/containerd              N\/A    1.49%    1.49%    1.52%  3300 nobody   \/bin\/prometheus --config.fi      N\/A    1.56%    1.56%    1.56%   986 root     \/usr\/bin\/dockerd -H unix:\/\/      N\/A    2.13%    2.13%    2.21%   928 consul   \/usr\/bin\/consul agent -conf      N\/A    2.35%    2.35%    2.35%  3840 root     \/usr\/bin\/nomad agent -confi      N\/A    1.57%    1.67%    2.48%   934 vault    \/usr\/bin\/vault server -conf      N\/A    5.45%    5.45%    5.45% -------------------------------------------------------------------------------    88 12                                        N\/A   25.49%   28.31%   45.90%<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 5 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 4\u0413 \u043f\u0430\u043c\u044f\u0442\u0438 (45% \u0437\u0430\u043d\u044f\u0442\u043e). \u0414\u043e\u0440\u043e\u0436\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432<\/h3>\n<p><a href=\"https:\/\/developer.hashicorp.com\/nomad\/downloads\" rel=\"noopener noreferrer nofollow\">https:\/\/developer.hashicorp.com\/nomad\/downloads<\/a><br \/><a href=\"https:\/\/docs.docker.com\/engine\/install\/ubuntu\/\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.docker.com\/engine\/install\/ubuntu\/<\/a><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0437 \u0420\u043e\u0441\u0441\u0438\u0438.<\/p>\n<\/div>\n<\/details>\n<pre><code>mkdir -p \/etc\/apt\/keyrings curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg curl -fsSL https:\/\/apt.releases.hashicorp.com\/gpg | gpg --dearmor -o \/usr\/share\/keyrings\/hashicorp-archive-keyring.gpg echo \"deb [signed-by=\/usr\/share\/keyrings\/hashicorp-archive-keyring.gpg] https:\/\/apt.releases.hashicorp.com \\     $(lsb_release -cs) main\" > \/etc\/apt\/sources.list.d\/hashicorp.list echo \"deb [arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/ubuntu \\     $(lsb_release -cs) stable\" > \/etc\/apt\/sources.list.d\/docker.list<\/code><\/pre>\n<h4>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u044b<\/h4>\n<pre><code>apt update apt install nomad vault consul docker-ce docker-compose packer jq<\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Docker + Docker Registry<\/h3>\n<pre><code>systemctl start docker<\/code><\/pre>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u043b\u0430\u043a\u0443 \u0438\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c\u0443 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>docker-compose.yml<\/code><\/p>\n<pre><code>cat >docker-compose.yml &lt;&lt;EndOfText version: \"3.9\" services:   registry:     container_name: registry     image: registry:2     ports:       - 5000:5000     volumes:       - .\/config.yml:\/etc\/docker\/registry\/config.yml       - \/var\/lib\/registry:\/var\/lib\/registry EndOfText<\/code><\/pre>\n<p>\u0418 \u0444\u0430\u0439\u043b \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>config.yml<\/code><\/p>\n<pre><code class=\"bash\">cat >config.yml &lt;&lt;EndOfText version: 0.1 log:   fields:     service: registry storage:   cache:     blobdescriptor: inmemory   filesystem:     rootdirectory: \/var\/lib\/registry http:   addr: :5000   headers:     X-Content-Type-Options: [nosniff] health:   storagedriver:     enabled: true     interval: 10s     threshold: 3 EndOfText<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430\u0448\u0438 \u043e\u0431\u0440\u0430\u0437\u044b \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 <code>\/var\/lib\/registry<\/code><\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c<\/p>\n<pre><code>docker-compose up -d<\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Consul<\/h3>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<pre><code>CONSUL_KEY=$(consul keygen)<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>\/etc\/consul.d\/lab_consul.hcl<\/code><\/p>\n<pre><code>cat >\/etc\/consul.d\/lab_consul.hcl &lt;&lt;EndOfText client_addr = \"0.0.0.0\" acl {   enabled = true } ui_config {   enabled = true } bind_addr = \"127.0.0.1\" bootstrap_expect = 1 server = true encrypt = \"$CONSUL_KEY\" EndOfText<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c<\/p>\n<pre><code>systemctl restart consul; sleep 10 consul acl bootstrap --format json > .\/acl-token-bootstrap-consul.json export CONSUL_HTTP_TOKEN=`cat .\/acl-token-bootstrap-consul.json | jq -r \".SecretID\"`<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c<\/p>\n<pre><code># consul members Node  Address         Status  Type    Build   Protocol  DC   Partition  Segment test  127.0.0.1:8301  alive   server  1.14.0  2         dc1  default    &lt;all><\/code><\/pre>\n<p>\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<\/p>\n<pre><code>echo \"http:\/\/$(curl -s ifconfig.me):8500\"<\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Vault<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>\/etc\/vault.d\/vault.hcl<\/code><\/p>\n<pre><code>cat >\/etc\/vault.d\/vault.hcl &lt;&lt;EndOfText ui = true storage \"file\" {   path = \"\/opt\/vault\/data\" } listener \"tcp\" {   address       = \"0.0.0.0:8200\"   tls_disable = \"true\" } api_addr = \"http:\/\/127.0.0.1:8200\" cluster_addr = \"https:\/\/127.0.0.1:8201\" EndOfText<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c<\/p>\n<pre><code>systemctl restart vault; sleep 10 export VAULT_ADDR='http:\/\/127.0.0.1:8200' vault operator init -key-threshold 1 -key-shares 1 -format json > .\/acl-token-bootstrap-vault.json export VAULT_TOKEN=$(cat .\/acl-token-bootstrap-vault.json | jq -r \".root_token\") export VAULT_UNSEAL_KEY=$(cat .\/acl-token-bootstrap-vault.json | jq -r \".unseal_keys_b64 | .[]\") vault operator unseal $VAULT_UNSEAL_KEY vault login $VAULT_TOKEN<\/code><\/pre>\n<p>\u0412 Vault \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 <\/p>\n<pre><code>vault secrets enable -version=2 kv<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0442\u043e\u043a\u0435\u043d Consul \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 Vault<\/p>\n<pre><code>vault kv put kv\/consul\/token value=$CONSUL_HTTP_TOKEN<\/code><\/pre>\n<p>\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<\/p>\n<pre><code>echo \"http:\/\/$(curl -s ifconfig.me):8200\"<\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Nomad<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>\/etc\/nomad.d\/lab_nomad.hcl<\/code><\/p>\n<pre><code>cat >\/etc\/nomad.d\/lab_nomad.hcl &lt;&lt;EndOfText consul {   address = \"127.0.0.1:8500\"   token   = \"$CONSUL_HTTP_TOKEN\" } acl {   enabled = true } telemetry {   publish_allocation_metrics = true   publish_node_metrics       = true } plugin \"docker\" {   config {     volumes {       enabled = true     }   } } vault {   enabled = true   address = \"http:\/\/localhost:8200\"   token = \"$VAULT_TOKEN\" } EndOfText<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c<\/p>\n<pre><code>systemctl restart nomad; sleep 10 nomad acl bootstrap -json > .\/acl-token-bootstrap-nomad.json export NOMAD_TOKEN=`cat .\/acl-token-bootstrap-nomad.json | jq -r \".SecretID\"`<\/code><\/pre>\n<p>\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<\/p>\n<pre><code>echo \"http:\/\/$(curl -s ifconfig.me):4646\"<\/code><\/pre>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a Traefik<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b  <code>traefik.nomad<\/code><\/p>\n<pre><code>export MY_MAIL=\"some@domain.ltd\" cat >traefik.nomad &lt;&lt;EndOfText job \"traefik\" {   datacenters = [\"dc1\"]   type        = \"service\"   group \"traefik\" {     count = 1     network {       port \"http\"  {static = 80}       port \"https\" {static = 443}       port \"api\"   {static = 8081}     }     service {       name = \"traefik\"       port = \"api\"       tags = [\"traefik.enable=true\", \"traefik.port=8081\"]     }     task \"traefik\" {       driver = \"docker\"       config {          image        = \"traefik:v2.2\"         network_mode = \"host\"         volumes = [ \"local\/traefik.yaml:\/etc\/traefik\/traefik.yaml\" ]       }       template {         destination = \"local\/traefik.yaml\"         data = &lt;&lt;EOF entryPoints:   http:     address: ':80'   https:     address: ':443'   traefik:     address: ':8081' api:   dashboard: true   insecure: true log:   level: DEBUG certificatesResolvers:   myresolver:     acme:       email: $MY_MAIL       storage: \/data\/acme.json       httpChallenge:         entryPoint: http providers:   consulCatalog:     prefix: traefik     exposedByDefault: false     endpoint:       address: 127.0.0.1:8500       scheme: http       token: {{with secret \"kv\/consul\/token\"}}{{.Data.data.value}}{{end}}       tls:         insecureSkipVerify: true EOF       }     }   } } EndOfText<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u043d\u0444\u0438\u0433 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c<\/p>\n<pre><code>nomad plan traefik.nomad nomad run traefik.nomad<\/code><\/pre>\n<p>\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<\/p>\n<pre><code>echo \"http:\/\/$(curl -s ifconfig.me):8081\"<\/code><\/pre>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>whoami.pkr.hcl<\/code><\/p>\n<pre><code>cat >whoami.pkr.hcl &lt;&lt;EndOfText packer {   required_plugins {     docker = {       version = \">= 1.0.1\"       source = \"github.com\/hashicorp\/docker\"     }   } } source \"docker\" \"whoami\" {   image  = \"traefik\/whoami\"   commit = true   run_command = [     \"-d\", \"-i\", \"--rm\", \"-t\", \"--\", \"{{.Image}}\"   ] } build {   sources = [\"source.docker.whoami\"]   post-processors {     post-processor \"docker-tag\" {       repository =  \"localhost:5000\/dev\/whoami\"         tags = [\"0.0.1\"]       }     post-processor \"docker-push\" {}   } } EndOfText<\/code><\/pre>\n<p>\u0418 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443<\/p>\n<pre><code>packer init . packer build .<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d \u0430\u0434\u0440\u0435\u0441 \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1ab\/e94\/c3e\/1abe94c3e8080c136af4be71eed2bc77.png\" alt=\"\" title=\"\" width=\"1882\" height=\"226\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1ab\/e94\/c3e\/1abe94c3e8080c136af4be71eed2bc77.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>whoami.nomad<\/code><\/p>\n<pre><code>cat >whoami.nomad &lt;&lt;EndOfText job \"whoami\" {   datacenters = [\"dc1\"]   type        = \"service\"   group \"whoami\" {     count = 1     network {       port \"http\" {to = 80}     }     service {       name = \"whoami\"       port = \"http\"       tags = [         \"traefik.enable=true\",         \"traefik.http.routers.whoami.entrypoints=http\",         \"traefik.http.routers.whoami.rule=host(\\`$(curl -s ifconfig.me)\\`)\",         \"traefik.http.routers.whoami.middlewares=whoami-to-https\",         \"traefik.http.middlewares.whoami-to-https.redirectscheme.scheme=https\",         \"traefik.http.middlewares.whoami-to-https.redirectscheme.permanent=true\",         \"traefik.http.routers.whoami-https.entrypoints=https\",         \"traefik.http.routers.whoami-https.rule=host(\\`$(curl -s ifconfig.me)\\`)\",         \"traefik.http.routers.whoami-https.tls.certresolver=myresolver\"]     }     task \"whoami\" {       driver = \"docker\"       config {         image = \"localhost:5000\/dev\/whoami:0.0.1\"         ports = [\"http\"]       }     }   } } EndOfText<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441<\/p>\n<pre><code>nomad plan whoami.nomad nomad run whoami.nomad<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<\/p>\n<pre><code>echo \"http:\/\/$(curl -s ifconfig.me)\"<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u043f\u0438\u043b\u044c\u043d\u0438\u043a\u043e\u043c&#8230;<\/p>\n<p>\u0414\u0443\u043c\u0430\u044e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043f\u0440\u043e\u0449\u0435.<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u0435\u043d\u0434\u0430<\/h3>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0435 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u0439, \u0431\u0443\u0434\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b! \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 Ubuntu.<\/p>\n<pre><code>curl https:\/\/git.sr.ht\/~wilful\/Shared\/blob\/master\/init.sh | bash -x<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0430\u043d\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a<\/p>\n<pre><code>journalctl -t laboratory -xe<\/code><\/pre>\n<h4>\u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c?<\/h4>\n<p><a href=\"https:\/\/www.waypointproject.io\" rel=\"noopener noreferrer nofollow\">https:\/\/www.waypointproject.io<\/a>?<\/p>\n<p>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b <a href=\"https:\/\/blog.itmage.ru\/h1Ednt1IkgA\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \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\/post\/711984\/\"> https:\/\/habr.com\/ru\/post\/711984\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0433\u0430\u0434\u0430\u0439, \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043b ChatGPT \u0438\u043b\u0438 \u043d\u0435\u0442?<\/p>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0438\u043b\u0438 \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442? \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0448\u0443 \u0442\u043e, \u043a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u043d\u0430 Linux. \u0421\u0442\u0435\u043d\u0434 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0434\u043e\u043c\u0435\u043d\u0430\u043c\u0438, \u0443\u043c\u0435\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c TLS \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 IaaC, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u0438\u043b\u0438 SCM, \u0435\u0441\u0442\u044c UI, \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<p>\u042f \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u043c \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u0434\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0441\u0447\u0438\u0442\u0430\u044e &#171;\u043f\u0442\u0438\u0447\u0438\u0439&#187; \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434 \u0441 \u0432\u043a\u0440\u0430\u043f\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u044d\u0442\u0430\u043f\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0432. \u0410 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u0436\u0435 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430. \u041a\u0440\u043e\u043c\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u043e\u043f\u0438\u0448\u0443 \u0442\u0435 \u043f\u043b\u044e\u0441\u044b \u0438 \u0442\u0435 \u043c\u0438\u043d\u0443\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b \u044d\u0442\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u043a\u0430\u043a \u0431\u044b \u0433\u0440\u043e\u043c\u043a\u043e \u044d\u0442\u043e \u043d\u0435 \u0437\u0432\u0443\u0447\u0430\u043b\u043e. <\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u044b\u0434\u0435\u043d\u043d\u0430\u044f \u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043c\u043e\u0435\u0433\u043e \u043e\u043f\u044b\u0442\u0430, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430\u043c \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0438\u0448\u0443\u0442 \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447, \u043d\u043e \u043d\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0438.<\/p>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h3>\n<p>Nomad \u2014 <a href=\"https:\/\/www.nomadproject.io\" rel=\"noopener noreferrer nofollow\">https:\/\/www.nomadproject.io<\/a><br \/>Consul \u2014 <a href=\"https:\/\/www.consul.io\" rel=\"noopener noreferrer nofollow\">https:\/\/www.consul.io<\/a><br \/>Vault    \u2014 <a href=\"https:\/\/www.vaultproject.io\" rel=\"noopener noreferrer nofollow\">https:\/\/www.vaultproject.io<\/a><br \/>Traefik \u2014 <a href=\"https:\/\/traefik.io\" rel=\"noopener noreferrer nofollow\">https:\/\/traefik.io<\/a><br \/>Packer \u2014 <a href=\"https:\/\/www.packer.io\" rel=\"noopener noreferrer nofollow\">https:\/\/www.packer.io<\/a><br \/>Docker \u2014 <a href=\"http:\/\/docker.io\" rel=\"noopener noreferrer nofollow\">http:\/\/docker.io<\/a><\/p>\n<h4>\u041f\u043b\u044e\u0441\u044b<\/h4>\n<ul>\n<li>\n<p>\u041d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u0443\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043f\u043e \u0440\u0435\u043b\u0438\u0437\u0443 \u0438 \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0442\u0435\u043d\u0434 \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0431\u043e\u0435\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435. \u041e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f MVP \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<\/li>\n<\/ul>\n<h4>\u041c\u0438\u043d\u0443\u0441\u044b<\/h4>\n<ul>\n<li>\n<p>\u041d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 &#171;\u043d\u0430 \u043b\u0435\u0442\u0443&#187;, \u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0435\u0441\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h3>\n<p>\u041a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>Packer<\/strong>  \u0432 \u043e\u0431\u0440\u0430\u0437 \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 (\u0430\u043d\u0430\u043b\u043e\u0433 Docker Registry). \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445.<\/p>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <strong>Docker <\/strong>\u0438<strong> <\/strong>\u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0442. \u0435. \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432 \u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>Nomad<\/strong>. \u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 go-template \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0437 <strong>Vault<\/strong>.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 Web-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u0432 <strong>Traefik<\/strong> \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 HTTPS \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438 TLS \u043e\u0442 Let&#8217;sEncrypt.<\/p>\n<h4>\u041a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/h4>\n<p>\u042f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f <strong>Ubuntu<\/strong>, \u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<h4>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430<\/h4>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0441 2 \u044f\u0434\u0440\u0430\u043c\u0438, 4\u0413 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0434\u0438\u0441\u043a\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u043c 20\u0413.  \u041c\u043e\u0436\u0435\u0442\u0435 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0435\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430:<\/p>\n<pre><code class=\"bash\"> 3236 root     traefik traefik                  N\/A    1.37%    1.37%    1.37%  3488 root     bin\/console bot run              N\/A    1.16%    1.28%    1.42%  3416 root     bin\/console bot run              N\/A    1.17%    1.28%    1.42%   858 root     \/usr\/bin\/containerd              N\/A    1.49%    1.49%    1.52%  3300 nobody   \/bin\/prometheus --config.fi      N\/A    1.56%    1.56%    1.56%   986 root     \/usr\/bin\/dockerd -H unix:\/\/      N\/A    2.13%    2.13%    2.21%   928 consul   \/usr\/bin\/consul agent -conf      N\/A    2.35%    2.35%    2.35%  3840 root     \/usr\/bin\/nomad agent -confi      N\/A    1.57%    1.67%    2.48%   934 vault    \/usr\/bin\/vault server -conf      N\/A    5.45%    5.45%    5.45% -------------------------------------------------------------------------------    88 12                                        N\/A   25.49%   28.31%   45.90%<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 5 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 4\u0413 \u043f\u0430\u043c\u044f\u0442\u0438 (45% \u0437\u0430\u043d\u044f\u0442\u043e). \u0414\u043e\u0440\u043e\u0436\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432<\/h3>\n<p><a href=\"https:\/\/developer.hashicorp.com\/nomad\/downloads\" rel=\"noopener noreferrer nofollow\">https:\/\/developer.hashicorp.com\/nomad\/downloads<\/a><br \/><a href=\"https:\/\/docs.docker.com\/engine\/install\/ubuntu\/\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.docker.com\/engine\/install\/ubuntu\/<\/a><\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0437 \u0420\u043e\u0441\u0441\u0438\u0438.<\/p>\n<\/div>\n<\/details>\n<pre><code>mkdir -p \/etc\/apt\/keyrings curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg curl -fsSL https:\/\/apt.releases.hashicorp.com\/gpg | gpg --dearmor -o \/usr\/share\/keyrings\/hashicorp-archive-keyring.gpg echo \"deb [signed-by=\/usr\/share\/keyrings\/hashicorp-archive-keyring.gpg] https:\/\/apt.releases.hashicorp.com \\     $(lsb_release -cs) main\" > \/etc\/apt\/sources.list.d\/hashicorp.list echo \"deb [arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/ubuntu \\     $(lsb_release -cs) stable\" > \/etc\/apt\/sources.list.d\/docker.list<\/code><\/pre>\n<h4>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u044b<\/h4>\n<pre><code>apt update apt install nomad vault consul docker-ce docker-compose packer jq<\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Docker + Docker Registry<\/h3>\n<pre><code>systemctl start docker<\/code><\/pre>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u043b\u0430\u043a\u0443 \u0438\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c\u0443 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>docker-compose.yml<\/code><\/p>\n<pre><code>cat >docker-compose.yml &lt;&lt;EndOfText version: \"3.9\" services:   registry:     container_name: registry     image: registry:2     ports:       - 5000:5000     volumes:       - .\/config.yml:\/etc\/docker\/registry\/config.yml       - \/var\/lib\/registry:\/var\/lib\/registry EndOfText<\/code><\/pre>\n<p>\u0418 \u0444\u0430\u0439\u043b \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 <code>config.yml<\/code><\/p>\n<pre><code class=\"bash\">cat >config.yml &lt;&lt;EndOfText version: 0.1 log:   fields:     service: registry storage:   cache:     blobdescriptor: inmemory   filesystem:     rootdirectory: \/var\/lib\/registry http:   addr: :5000   headers:     X-Content-Type-Options: [nosniff] health:   storagedriver:     enabled: true     interval: 10s     threshold: 3 EndOfText<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430\u0448\u0438 \u043e\u0431\u0440\u0430\u0437\u044b \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 <code>\/var\/lib\/registry<\/code><\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c<\/p>\n<pre><code>docker-compose up -d<\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Consul<\/h3>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<pre><code>CONSUL_KEY=$(consul keygen)<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>\/etc\/consul.d\/lab_consul.hcl<\/code><\/p>\n<pre><code>cat >\/etc\/consul.d\/lab_consul.hcl &lt;&lt;EndOfText client_addr = \"0.0.0.0\" acl {   enabled = true } ui_config {   enabled = true } bind_addr = \"127.0.0.1\" bootstrap_expect = 1 server = true encrypt = \"$CONSUL_KEY\" EndOfText<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c<\/p>\n<pre><code>systemctl restart consul; sleep 10 consul acl bootstrap --format json > .\/acl-token-bootstrap-consul.json export CONSUL_HTTP_TOKEN=`cat .\/acl-token-bootstrap-consul.json | jq -r \".SecretID\"`<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c<\/p>\n<pre><code># consul members Node  Address         Status  Type    Build   Protocol  DC   Partition  Segment test  127.0.0.1:8301  alive   server  1.14.0  2         dc1  default    &lt;all><\/code><\/pre>\n<p>\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<\/p>\n<pre><code>echo \"http:\/\/$(curl -s ifconfig.me):8500\"<\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Vault<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>\/etc\/vault.d\/vault.hcl<\/code><\/p>\n<pre><code>cat >\/etc\/vault.d\/vault.hcl &lt;&lt;EndOfText ui = true storage \"file\" {   path = \"\/opt\/vault\/data\" } listener \"tcp\" {   address       = \"0.0.0.0:8200\"   tls_disable = \"true\" } api_addr = \"http:\/\/127.0.0.1:8200\" cluster_addr = \"https:\/\/127.0.0.1:8201\" EndOfText<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c<\/p>\n<pre><code>systemctl restart vault; sleep 10 export VAULT_ADDR='http:\/\/127.0.0.1:8200' vault operator init -key-threshold 1 -key-shares 1 -format json > .\/acl-token-bootstrap-vault.json export VAULT_TOKEN=$(cat .\/acl-token-bootstrap-vault.json | jq -r \".root_token\") export VAULT_UNSEAL_KEY=$(cat .\/acl-token-bootstrap-vault.json | jq -r \".unseal_keys_b64 | .[]\") vault operator unseal $VAULT_UNSEAL_KEY vault login $VAULT_TOKEN<\/code><\/pre>\n<p>\u0412 Vault \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 <\/p>\n<pre><code>vault secrets enable -version=2 kv<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0442\u043e\u043a\u0435\u043d Consul \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 Vault<\/p>\n<pre><code>vault kv put kv\/consul\/token value=$CONSUL_HTTP_TOKEN<\/code><\/pre>\n<p>\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<\/p>\n<pre><code>echo \"http:\/\/$(curl -s ifconfig.me):8200\"<\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Nomad<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>\/etc\/nomad.d\/lab_nomad.hcl<\/code><\/p>\n<pre><code>cat >\/etc\/nomad.d\/lab_nomad.hcl &lt;&lt;EndOfText consul {   address = \"127.0.0.1:8500\"   token   = \"$CONSUL_HTTP_TOKEN\" } acl {   enabled = true } telemetry {   publish_allocation_metrics = true   publish_node_metrics       = true } plugin \"docker\" {   config {     volumes {       enabled = true     }   } } vault {   enabled = true   address = \"http:\/\/localhost:8200\"   token = \"$VAULT_TOKEN\" } EndOfText<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c<\/p>\n<pre><code>systemctl restart nomad; sleep 10 nomad acl bootstrap -json > .\/acl-token-bootstrap-nomad.json export NOMAD_TOKEN=`cat .\/acl-token-bootstrap-nomad.json | jq -r \".SecretID\"`<\/code><\/pre>\n<p>\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<\/p>\n<pre><code>echo \"http:\/\/$(curl -s ifconfig.me):4646\"<\/code><\/pre>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a Traefik<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b  <code>traefik.nomad<\/code><\/p>\n<pre><code>export MY_MAIL=\"some@domain.ltd\" cat >traefik.nomad &lt;&lt;EndOfText job \"traefik\" {   datacenters = [\"dc1\"]   type        = \"service\"   group \"traefik\" {     count = 1     network {       port \"http\"  {static = 80}       port \"https\" {static = 443}       port \"api\"   {static = 8081}     }     service {       name = \"traefik\"       port = \"api\"       tags = [\"traefik.enable=true\", \"traefik.port=8081\"]     }     task \"traefik\" {       driver = \"docker\"       config {          image        = \"traefik:v2.2\"         network_mode = \"host\"         volumes = [ \"local\/traefik.yaml:\/etc\/traefik\/traefik.yaml\" ]       }       template {         destination = \"local\/traefik.yaml\"         data = &lt;&lt;EOF entryPoints:   http:     address: ':80'   https:     address: ':443'   traefik:     address: ':8081' api:   dashboard: true   insecure: true log:   level: DEBUG certificatesResolvers:   myresolver:     acme:       email: $MY_MAIL       storage: \/data\/acme.json       httpChallenge:         entryPoint: http providers:   consulCatalog:     prefix: traefik     exposedByDefault: false     endpoint:       address: 127.0.0.1:8500       scheme: http       token: {{with secret \"kv\/consul\/token\"}}{{.Data.data.value}}{{end}}       tls:         insecureSkipVerify: true EOF       }     }   } } EndOfText<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u043d\u0444\u0438\u0433 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c<\/p>\n<pre><code>nomad plan traefik.nomad nomad run traefik.nomad<\/code><\/pre>\n<p>\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443<\/p>\n<pre><code>echo \"http:\/\/$(curl -s ifconfig.me):8081\"<\/code><\/pre>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b <code>whoami.pkr.hcl<\/code><\/p>\n<pre><code>cat >whoami.pkr.hcl &lt;&lt;EndOfText packer {   required_plugins {     docker = {       version = \">= 1.0.1\"       source = \"github.com\/hashicorp\/docker\"     }   } } source \"docker\" \"whoami\" {   image  = \"traefik\/whoami\"   commit = true   run_command = [     \"-d\", \"-i\", \"--rm\", \"-t\", \"--\", \"{{.Image}}\"   ] } build {   sources =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-344285","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/344285","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=344285"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/344285\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=344285"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=344285"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=344285"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}