{"id":257565,"date":"2015-05-20T10:12:02","date_gmt":"2015-05-20T06:12:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=257565"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=257565","title":{"rendered":"\u041a\u0430\u043a \u044f \u043f\u0438\u0441\u0430\u043b \u0430\u0443\u0434\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043d\u0430 Go"},"content":{"rendered":"<p>     \t\u0412\u0441\u0435\u043e\u0431\u0449\u0430\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u0438\u0440. \u041d\u0435 \u043e\u0431\u043e\u0448\u043b\u0430 \u044d\u0442\u0430 \u044d\u043f\u0438\u0434\u0435\u043c\u0438\u044f \u0438 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0448\u0435\u0441\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432, \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u043d\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c DevOps. \u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/www.docker.com\/\">Docker<\/a>, \u0432\u0435\u0434\u044c \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c, \u0438 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0441 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043c\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0442\u0435\u0447\u0435\u043d\u0438\u044e \u2014 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0443\u0440\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044e \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435. \u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0448\u044c, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0438\u0445 \u0436\u0438\u0437\u043d\u0438 \u0438 \u0441\u043c\u0435\u0440\u0442\u0438 \u0432 \u043e\u0442\u043d\u044e\u0434\u044c \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u043e\u0431\u0438\u0442\u0430\u043d\u0438\u044f. \u0410 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043e\u043d\u0443\u0441\u0430 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0448\u044c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435, \u043f\u043e\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0434\u0430 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435.<\/p>\n<p>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0437\u0430 \u0442\u0440\u0438 \u0432\u0435\u0447\u0435\u0440\u0430 \u0438 \u043a\u0443\u0441\u043e\u0447\u0435\u043a \u043d\u043e\u0447\u0438 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u0438 \u0441\u0431\u043e\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.<br \/>  <a name=\"habracut\"><\/a><\/p>\n<h1>\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0434\u0435\u043b\u0430<\/h1>\n<p>  \u0411\u0435\u0433\u043b\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0432 \u0433\u0443\u0433\u043b\u0435 \u043d\u0435 \u043f\u0440\u0438\u0432\u0451\u043b \u043a \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044e \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c\u0438. <br \/>  \u0427\u0442\u043e \u043d\u0443\u0436\u043d\u043e:  <\/p>\n<ul>\n<li>\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0437\u044f\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/li>\n<li>\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0438 \u0432 \u043d\u0435\u043a\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/li>\n<li>\u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430<\/li>\n<\/ul>\n<p>  \u041f\u0435\u0440\u0432\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0435\u0448\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/gliderlabs\/registrator\">registrator<\/a>. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 \u0440\u0435\u0431\u044f\u0442 \u0438\u0437 GliderLabs, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0421onsul \u0438\u043b\u0438 Netflix Eurika. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u044b \u043f\u043e\u0434 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443: \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b, \u0438 \u0433\u0434\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 (\u0437\u0430\u043f\u0443\u0441\u043a \u0438\u043b\u0438 \u0441\u043c\u0435\u0440\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430) \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u043b\u043e\u0433\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0442\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c ElasticSearch, \u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u2014 Kibana.<\/p>\n<p>  \u041d\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0443\u043d\u043a\u0442, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043a\u0443 \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0438 \u044d\u043b\u0430\u0441\u0442\u0438\u043a\u043e\u043c.<\/p>\n<h1>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440<\/h1>\n<p>  \u0412\u0441\u044f\u043a\u043e\u0435 \u0440\u0430\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0444\u043e\u0440\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043c\u0435\u043b\u043e \u0436\u043c\u0451\u043c \u043a\u043d\u043e\u043f\u043e\u0447\u043a\u0443 \u043d\u0430 GitHub-\u0435 \u0434\u043b\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f (https:\/\/github.com\/gliderlabs\/registrator). \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0431\u0435 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435:<\/p>\n<pre><code class=\"bash\">registrator.go     \/\/ \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f   modules.go         \/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 (consul, etcd \u0438 \u0442.\u0434.)   Dockerfile         \/\/ \u0444\u0430\u0439\u043b \u0441\u0431\u043e\u0440\u043a\u0438 docker-\u043a\u043e\u043d\u0442\u0439\u043d\u0435\u0440\u0430   Dockerfile.dev     \/\/ \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 dev-\u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430   \/bridge            \/\/ \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u043d\u0435 \/consul            \/\/ \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 consul <\/code><\/pre>\n<p>  \u0421\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f. \u0412 registrator.go \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f Docker-\u043a\u043b\u0438\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0441\u043e\u043a\u0435\u0442, \u0438, \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f (\u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438\u043b\u0438 \u0441\u043c\u0435\u0440\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430), \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0432 bridge \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0441 \u043d\u0438\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435. \u0412\u043d\u0443\u0442\u0440\u0438 bridge-\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0430\u0434\u0430\u043f\u0442\u0435\u0440 (\u043c\u043e\u0434\u0443\u043b\u044c), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0443\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0434\u043b\u044f \u0435\u0451 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 ElasticSearch.<\/p>\n<h1>make dev<\/h1>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442. \u0412 Makefile-\u0435 \u0435\u0441\u0442\u044c \u0442\u0430\u0441\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 Docker-\u043e\u0431\u0440\u0430\u0437:<\/p>\n<pre><code class=\"bash\">dev:       docker build -f Dockerfile.dev -t $(NAME):dev .     docker run --rm --net host \\         -v \/var\/run\/docker.sock:\/tmp\/docker.sock \\         $(NAME):dev \/bin\/registrator consul: <\/code><\/pre>\n<p>  consul \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442 \u043d\u0430\u043c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043c\u0430\u0441\u0442\u0435\u0440-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0432 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 standalone:<\/p>\n<pre><code class=\"bash\">$ docker run -p 8400:8400 -p 8500:8500 -p 53:53\/udp \\      -h node1 progrium\/consul -server -bootstrap <\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0431\u043e\u0440\u043a\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"bash\">make dev   <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0434\u0430\u0447\u043d\u043e (\u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0443\u0434\u0430\u0447\u0430 \u043e\u043d\u0430 \u0442\u0430\u043a\u0430\u044f \u0448\u0442\u0443\u043a\u0430), \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"bash\">2015\/04\/04 19:55:48 Starting registrator dev ...   2015\/04\/04 19:55:48 Using elastic adapter: consul:\/\/   2015\/04\/04 19:55:48 Listening for Docker events ...   2015\/04\/04 19:55:48 Syncing services on 4 containers   2015\/04\/04 19:55:48 ignored: cedfd1ae9f68 no published ports   2015\/04\/04 19:55:48 added: b4455d0f7d50 ubuntu:kibana:80   2015\/04\/04 19:55:48 added: 3d598d184eb6 ubuntu:nginx:80   2015\/04\/04 19:55:48 ignored: 3d598d184eb6 port 443 not published on host   2015\/04\/04 19:55:48 added: bcad15ac5759 ubuntu:determined_goldstine:9200   2015\/04\/04 19:55:48 added: bcad15ac5759 ubuntu:determined_goldstine:9300   <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e 4 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0423 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u0440\u0442\u043e\u0432, \u0443 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u2014 \u043f\u043e\u0440\u0442 443 \u043d\u0435 \u0431\u044b\u043b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0438 \u0442.\u0434. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 dig<\/p>\n<pre><code class=\"bash\">dig @localhost nginx-80.service.consul   <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c -80 \u043a \u0438\u043c\u0435\u043d\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 nginx \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0440\u0443\u0436\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0440\u0442\u043e\u0432, \u0438 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f Consul-\u0430 \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434.<\/p>\n<h1>Go Go Go<\/h1>\n<p>  \u0410\u0434\u0430\u043f\u0442\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u0412\u043e\u043e\u0431\u0449\u0435 \u0432 Go \u043c\u043e\u0434\u0443\u043b\u044c \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u043d\u044f\u0442\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u043f\u043a\u0430, \u0442\u0430\u043a \u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 GitHub-\u0435, \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0442.<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430: \/elastic \u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u043d\u0435\u0439 \u0444\u0430\u0439\u043b \u0441 \u043d\u0430\u0448\u0435\u0439 \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: elastic.go.<\/p>\n<p>  \u0414\u0430\u0434\u0438\u043c \u0438\u043c\u044f \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f<\/p>\n<pre><code class=\"go\">package elastic   <\/code><\/pre>\n<p>  \u0417\u0430\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u043e\u0431\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b:<\/p>\n<pre><code class=\"go\">import (       &quot;net\/url&quot;     &quot;errors&quot;     &quot;encoding\/json&quot;     &quot;time&quot;      &quot;github.com\/gliderlabs\/registrator\/bridge&quot;     elasticapi &quot;github.com\/olivere\/elastic&quot; ) <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/p>\n<pre><code class=\"go\">type RegistryAdapter interface {       Ping() error \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0436\u0438\u0432 \u043b\u0438 \u043d\u0430\u0448 \u0431\u044d\u043a\u0435\u043d\u0434     Register(service *Service) error     Deregister(service *Service) error     Refresh(service *Service) error \/\/ \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c :) } <\/code><\/pre>\n<p>  \u0410\u0434\u0430\u043f\u0442\u0435\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 init(), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u044f:<\/p>\n<pre><code class=\"go\">func init() {       bridge.Register(new(Factory), &quot;elastic&quot;) } <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043a ElasticSearch:<\/p>\n<pre><code class=\"go\">func (f *Factory) New(uri *url.URL) bridge.RegistryAdapter {     urls := &quot;http:\/\/127.0.0.1:9200&quot;    if uri.Host != &quot;&quot; {       urls = &quot;http:\/\/&quot;+uri.Host   }    client, err := elasticapi.NewClient(elasticapi.SetURL(urls))   if err != nil {       log.Fatal(&quot;elastic: &quot;, uri.Scheme)   }    return &ElasticAdapter{client: client} }  type ElasticAdapter struct {       client   *elasticapi.Client } <\/code><\/pre>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 isRunning() \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0436\u0438\u0432<\/p>\n<pre><code class=\"go\">func (r *ElasticAdapter) Ping() error {       status := r.client.IsRunning()      if !status {         return errors.New(&quot;client is not Running&quot;)     }      return nil } <\/code><\/pre>\n<p>  \u041f\u0443\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<pre><code class=\"go\">type Container struct {     Name string `json:&quot;container_name&quot;`   Action string `json:&quot;action&quot;` \/\/start and stop   Message string `json:&quot;message&quot;`   Timestamp string `json:&quot;@timestamp&quot;` } <\/code><\/pre>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430:<\/p>\n<pre><code class=\"go\">func (r *ElasticAdapter) Register(service *bridge.Service) error   <\/code><\/pre>\n<p>  \u0414\u0430\u043c\u043f\u0438\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0432 json.<\/p>\n<pre><code class=\"go\">serviceAsJson, err := json.Marshal(service)   if err != nil {       return err } <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f. \u0412 Go \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0431\u0430\u0432\u043d\u0430\u044f \u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0434\u0430\u0442\u044b<\/p>\n<pre><code class=\"go\">timestamp := time.Now().Local().Format(&quot;2006-01-02T15:04:05.000Z07:00&quot;)   <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u043b\u043e\u0433\u0430:<\/p>\n<pre><code class=\"go\">container := Container {       Name: service.Name,      Action: &quot;start&quot;,      Message: string(serviceAsJson),      Timestamp: timestamp  } <\/code><\/pre>\n<p>  \u0418 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0451 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441<\/p>\n<pre><code class=\"go\">_, err = r.client.Index().       Index(&quot;containers&quot;).     Type(&quot;audit&quot;).     BodyJson(container).     Timestamp(timestamp).     Do() if err != nil {       return err } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f Deregister \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e, \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c action-\u043e\u043c.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432 Makefile-\u0435 consul \u043d\u0430 elastic, \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0432 modules.go.<\/p>\n<h1>All together now<\/h1>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ElasticSearch<\/p>\n<pre><code class=\"bash\">docker run -d --name elastic -p 9200:9200 \\       -p 9300:9300 dockerfile\/elasticsearch <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b Kibana \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u043e\u0442 logstash-\u0430:<\/p>\n<pre><code class=\"bash\">{   &quot;template&quot; : &quot;containers*&quot;,   &quot;settings&quot; : {     &quot;index.refresh_interval&quot; : &quot;5s&quot;   },   &quot;mappings&quot; : {     &quot;_default_&quot; : {        &quot;_all&quot; : {&quot;enabled&quot; : true},        &quot;dynamic_templates&quot; : [ {          &quot;string_fields&quot; : {            &quot;match&quot; : &quot;*&quot;,            &quot;match_mapping_type&quot; : &quot;string&quot;,            &quot;mapping&quot; : {              &quot;type&quot; : &quot;string&quot;, &quot;index&quot; : &quot;analyzed&quot;, &quot;omit_norms&quot; : true,                &quot;fields&quot; : {                  &quot;raw&quot; : {&quot;type&quot;: &quot;string&quot;, &quot;index&quot; : &quot;not_analyzed&quot;, &quot;ignore_above&quot; : 256}                }            }          }        } ],         &quot;_ttl&quot;: {          &quot;enabled&quot;: true,          &quot;default&quot;: &quot;1d&quot;        },        &quot;properties&quot; : {          &quot;@version&quot;: { &quot;type&quot;: &quot;string&quot;, &quot;index&quot;: &quot;not_analyzed&quot; },          &quot;geoip&quot;  : {            &quot;type&quot; : &quot;object&quot;,              &quot;dynamic&quot;: true,              &quot;path&quot;: &quot;full&quot;,              &quot;properties&quot; : {                &quot;location&quot; : { &quot;type&quot; : &quot;geo_point&quot; }              }          }        }     }   } } <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Kibana<\/p>\n<pre><code class=\"bash\">docker run -d -p 8080:80 -e KIBANA_SECURE=false \\       --name kibana --link elastic:es \\     balsamiq\/docker-kibana <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440:<\/p>\n<pre><code class=\"bash\">make dev   <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 nginx-\u043e\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/p>\n<pre><code class=\"bash\">docker run -d --name nginx -p 80:80 nginx <\/code><\/pre>\n<p>  \u0412 Kibana \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 containers, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c nginx-\u0435.<\/p>\n<p>  \u0424\u0430\u0439\u043b \u0441 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043b\u0435\u0436\u0438\u0442 <a href=\"https:\/\/github.com\/aatarasoff\/registrator\/blob\/master\/elastic\/elastic.go\">\u0442\u0443\u0442<\/a>. <\/p>\n<h1>\u0412 \u0431\u0430\u0440 \u0432\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f logstash<\/h1>\n<p>  \u0412\u0441\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u043e \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441, \u0438 \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043d\u0430\u043a\u0430\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0441 mapping-\u0430\u043c\u0438. \u0427\u0442\u043e\u0431\u044b \u043b\u044e\u0434\u0438 \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u044b \u043b\u043e\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043c\u0435\u044e\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u043d\u043e \u0438 \u0441\u0434\u0435\u043b\u0430\u044e\u0442 \u0437\u0430 \u043d\u0430\u0441 \u0432\u0441\u044e \u0433\u0440\u044f\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u043e\u0432 \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0443. \u041c\u044b \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 logstash.<\/p>\n<p>  \u041f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c logstash \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435. \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Docker-\u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f logstash-\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e. \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043a \u0441\u043b\u043e\u0432\u0443, \u043d\u0430\u0448\u0435\u0434\u0448\u0438\u0439\u0441\u044f \u043d\u0430 github-e <a href=\"https:\/\/github.com\/pblittle\/docker-logstash\">\u043e\u0431\u0440\u0430\u0437<\/a> \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u0438 ElasticSearch \u0438 Kibana, \u0447\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442 \u0438\u0434\u0435\u0435 \u00ab\u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u2014 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u00bb. \u0422\u0430\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u0443\u044e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \u0444\u043b\u0430\u0433\u043e\u0432, \u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u043e\u043d \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043b\u0435\u0437 \u0431\u0440\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043b\u044e\u0447\u0438 \u0441 \u0441\u0430\u0439\u0442\u0430 \u0430\u0432\u0442\u043e\u0440\u0430. \u041d\u0430 DockerHub-\u0435 \u0431\u044b\u043b\u043e \u0435\u0449\u0451 \u0441 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043e\u0442 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043c\u043d\u0435 \u043b\u0438\u0446, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441\u0430\u043c\u0438 \u043f\u043e\u0434 \u043d\u0430\u0448\u0438 \u043d\u0443\u0436\u0434\u044b. \u0412\u0441\u0451 \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u2014 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 Dockerfile:<\/p>\n<pre><code class=\"bash\">FROM dockerfile\/java:oracle-java8   MAINTAINER aatarasoff@gmail.com  RUN echo 'deb http:\/\/packages.elasticsearch.org\/logstash\/1.5\/debian stable main' | sudo tee \/etc\/apt\/sources.list.d\/logstash.list && \\           apt-get -y update && \\         apt-get -y --force-yes install logstash  EXPOSE 5959  VOLUME [&quot;\/opt\/conf&quot;, &quot;\/opt\/certs&quot;, &quot;\/opt\/logs&quot;]  ENTRYPOINT exec \/opt\/logstash\/bin\/logstash agent -f \/opt\/conf\/logstash.conf   <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u043d\u043e\u0440\u043c\u0430. \u0421\u043e\u0431\u0435\u0440\u0451\u043c \u043e\u0431\u0440\u0430\u0437 \u0438 \u0437\u0430\u043b\u044c\u0451\u043c \u0435\u0433\u043e \u043d\u0430 Docker Hub:<\/p>\n<pre><code class=\"bash\">docker build -t aatarasoff\/logstash .   docker push aatarasoff\/logstash   <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \/mnt\/logstash\/conf\/logstash.conf \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code class=\"bash\">input {     tcp {     type =&gt; &quot;audit&quot;     port =&gt; 5959     codec =&gt; json   } }  output {     elasticsearch {     embedded =&gt; false     host =&gt; &quot;10.211.55.8&quot;     port =&gt; &quot;9200&quot;     protocol =&gt; &quot;http&quot;   } } <\/code><\/pre>\n<p>  type =&gt; \u00abaudit\u00bb \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u043b\u043e\u0433\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435 type, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043b\u043e\u0433\u043e\u0432 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0434\u0438\u0441\u043a\u0440\u0438\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0443. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0432\u0435\u0436\u0435\u0438\u0441\u043f\u0435\u0447\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440:<\/p>\n<pre><code class=\"bash\">docker run -d -p 5959:5959 -v \/mnt\/logstash\/conf:\/opt\/conf \\       --name logstash aatarasoff\/logstash <\/code><\/pre>\n<p>  \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043b\u043e\u0433\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e tcp \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c json.<\/p>\n<h1>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u21162<\/h1>\n<p>  \u041c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0443\u0436\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u043e\u0432\u0451\u043c <a href=\"https:\/\/github.com\/aatarasoff\/auditor\">auditor<\/a>. \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0435\u0435\u0441\u044f \u00ab\u043c\u044f\u0441\u043e\u00bb \u0438\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0440\u0451\u043c \u043d\u0430\u0448 \u0444\u043e\u0440\u043a \u0438 \u043d\u0430\u0433\u043b\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 \u0441\u0435\u0431\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0443 \u043d\u0430\u0441 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443: make dev.<\/p>\n<p>  \u0417\u0430\u043c\u0435\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 regitrator.go \u043c\u043e\u0434\u0443\u043b\u044c bridge \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u0442\u0443 \u043f\u0430\u043f\u043a\u0443. \u0421\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>  \u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c Dockerfile.dev:<\/p>\n<pre><code class=\"bash\">FROM gliderlabs\/alpine:3.1   CMD [&quot;\/bin\/auditor&quot;]  ENV GOPATH \/go   RUN apk-install go git mercurial   COPY . \/go\/src\/github.com\/aatarasoff\/auditor   RUN cd \/go\/src\/github.com\/aatarasoff\/auditor \\       && go get -v && go build -ldflags &quot;-X main.Version dev&quot; -o \/bin\/auditor <\/code><\/pre>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u0435\u043d\u044f\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0439 Dockefile. \u0423\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u0438\u0448\u043d\u0438\u0435 \u0442\u0430\u0441\u043a\u0438 \u0438 \u043c\u0435\u043d\u044f\u0435\u043c \u0438\u043c\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432 Makefile:<\/p>\n<pre><code class=\"bash\">NAME=auditor   VERSION=$(shell cat VERSION)  dev:       docker build -f Dockerfile.dev -t $(NAME):dev .     docker run --rm --net host \\         -v \/var\/run\/docker.sock:\/tmp\/docker.sock \\         $(NAME):dev \/bin\/auditor elastic:  build:       mkdir -p build     docker build -t $(NAME):$(VERSION) .     docker save $(NAME):$(VERSION) | gzip -9 &gt; build\/$(NAME)_$(VERSION).tgz <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \/logstash \u0438 \u0444\u0430\u0439\u043b logstash.go \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043b\u044f logstash-\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0443\u043f \u043a\u0430\u043a \u043f\u0440\u043e\u0431\u043a\u0430, \u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 net: <a href=\"https:\/\/github.com\/heatxsink\/go-logstash\">github.com\/heatxsink\/go-logstash<\/a>.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<pre><code class=\"go\">type Container struct {     Name string `json:&quot;container_name&quot;`   Action string `json:&quot;action&quot;`   Service *bridge.Service `json:&quot;info&quot;` } <\/code><\/pre>\n<p>  \u0421\u0432\u044f\u0437\u0430\u043d\u043e \u044d\u0442\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 json \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 logstash, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0443 \u0444\u0430\u0431\u0440\u0438\u043a\u0443:<\/p>\n<pre><code class=\"go\">func init() {     bridge.Register(new(Factory), &quot;logstash&quot;) } <\/code><\/pre>\n<p>  \u0418 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430:<\/p>\n<pre><code class=\"go\">func (f *Factory) New(uri *url.URL) bridge.RegistryAdapter {     urls := &quot;127.0.0.1:5959&quot;    if uri.Host != &quot;&quot; {     urls = uri.Host   }    host, port, err := net.SplitHostPort(urls)   if err != nil {     log.Fatal(&quot;logstash: &quot;, &quot;split error&quot;)   }    intPort, _ := strconv.Atoi(port)   client := logstashapi.New(host, intPort, 5000)    return &LogstashAdapter{client: client} }  type LogstashAdapter struct {     client   *logstashapi.Logstash } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0442\u0438\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 net.SplitHostPort(urls), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0432\u044b\u0447\u043b\u0435\u043d\u044f\u0442\u044c \u0445\u043e\u0441\u0442 \u0438 \u043f\u043e\u0440\u0442 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e, \u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043e\u043d\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 uri.Host.<\/p>\n<p>  \u0427\u0438\u0441\u043b\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u043c\u0435\u0442\u043e\u0434 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0447\u0438\u0441\u043b\u043e: intPort, _ := strconv.Atoi(port). \u0417\u043d\u0430\u043a \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0448\u0438\u0431\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c.<\/p>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 Ping \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439:<\/p>\n<pre><code class=\"go\">func (r *LogstashAdapter) Ping() error {     _, err := r.client.Connect()   if err != nil {     return err   }    return nil } <\/code><\/pre>\n<p>  \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u043e tcp \u043a logstash-\u0443. \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Connect \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0443\u0436\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"go\">func (r *LogstashAdapter) Register(service *bridge.Service) error {     container := Container{Name: service.Name, Action: &quot;start&quot;, Service: service}   asJson, err := json.Marshal(container)   if err != nil {     return err   }    _, err = r.client.Connect()   if err != nil {     return err   }    err = r.client.Writeln(string(asJson))   if err != nil {     return err   }    return nil } <\/code><\/pre>\n<p>  \u0414\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u0435\u043d \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u043a\u0440\u043e\u043c\u0435 \u043e\u0434\u043d\u043e\u0433\u043e. \u0412\u044b\u0437\u043e\u0432 Connect \u043f\u0435\u0440\u0435\u0434 Writeln \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041c\u0435\u0442\u043e\u0434 Deregister \u043f\u043e\u043b\u043d\u0430\u044f \u043a\u043e\u043f\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u044b\u0448\u0435.<\/p>\n<p>  \u041c\u0435\u043d\u044f\u0435\u043c \u0432 Dockerfile.dev \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 elastic \u043d\u0430 logstash, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 ElasticSearch:<\/p>\n<pre><code class=\"bash\">curl 'http:\/\/localhost:9200\/_search?pretty' <\/code><\/pre>\n<h1>\u2026 \u0441\u0447\u0430\u0441\u0442\u044c\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0441\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c<\/h1>\n<p>  \u041a\u043e\u043c\u043c\u0438\u0442\u0438\u043c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 GitHub \u0438 \u0438\u0434\u0451\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f DockerHub-\u0430. \u041d\u0430 <a href=\"https:\/\/hub.docker.com\/\">hub.docker.com<\/a>, \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0441\u0432\u043e\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0438 \u0436\u043c\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 +Add Repository. \u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f logstash-a, \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043f\u043e\u0434\u043f\u0443\u043d\u043a\u0442 Repository, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043e\u0431\u0440\u0430\u0437\u044b, \u043d\u043e \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0443\u0442\u044c \u2014 Automated Build. \u041d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043d\u0435\u0433\u043e, Docker Hub \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0441\u0432\u043e\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u043d\u0430 GitHub-\u0435 \u0438\u043b\u0438 BitBucket-\u0435. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043d\u0443\u0436\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443, \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u0430, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0443\u0436\u043d\u043e. \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0437 README.MD \u0432\u043e\u0437\u044c\u043c\u0451\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f Docker Hub.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432\u043e\u0442 \u043e\u043d \u2014 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 <a href=\"https:\/\/registry.hub.docker.com\/u\/aatarasoff\/auditor\/\">\u043e\u0431\u0440\u0430\u0437<\/a>.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">docker run -d --net=host \\       -v \/var\/run\/docker.sock:\/tmp\/docker.sock \\     --name auditor aatarasoff\/auditor logstash:\/\/ <\/code><\/pre>\n<p>  <b>PS.<\/b> \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435, \u0438 \u0441 \u043c\u043e\u0435\u0439 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u0438\u043b\u0430, \u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0432\u0448\u0438\u0439 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u043e\u0436\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438, \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438, \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c.     \t<\/p>\n<div class=\"clear\"><\/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=\"http:\/\/habrahabr.ru\/post\/257913\/\"> http:\/\/habrahabr.ru\/post\/257913\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t\u0412\u0441\u0435\u043e\u0431\u0449\u0430\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u0438\u0440. \u041d\u0435 \u043e\u0431\u043e\u0448\u043b\u0430 \u044d\u0442\u0430 \u044d\u043f\u0438\u0434\u0435\u043c\u0438\u044f \u0438 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0448\u0435\u0441\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432, \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u043d\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c DevOps. \u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/www.docker.com\/\">Docker<\/a>, \u0432\u0435\u0434\u044c \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c, \u0438 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0441 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043c\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0442\u0435\u0447\u0435\u043d\u0438\u044e \u2014 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0443\u0440\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044e \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435. \u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0448\u044c, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0438\u0445 \u0436\u0438\u0437\u043d\u0438 \u0438 \u0441\u043c\u0435\u0440\u0442\u0438 \u0432 \u043e\u0442\u043d\u044e\u0434\u044c \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u043e\u0431\u0438\u0442\u0430\u043d\u0438\u044f. \u0410 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043e\u043d\u0443\u0441\u0430 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0448\u044c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435, \u043f\u043e\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0434\u0430 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435.<\/p>\n<p>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0437\u0430 \u0442\u0440\u0438 \u0432\u0435\u0447\u0435\u0440\u0430 \u0438 \u043a\u0443\u0441\u043e\u0447\u0435\u043a \u043d\u043e\u0447\u0438 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u0438 \u0441\u0431\u043e\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.  <\/p>\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-257565","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/257565","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=257565"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/257565\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=257565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=257565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=257565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}