{"id":478918,"date":"2026-05-07T10:33:04","date_gmt":"2026-05-07T10:33:04","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=478918"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=478918","title":{"rendered":"S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433: \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0437\u0430 15 \u043c\u0438\u043d\u0443\u0442"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u0418\u043b\u044c\u044f \u0428\u0443\u0439\u043a\u043e\u0432, \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u0438\u0430\u0441\u043e\u0444\u0442.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/companies\/diasoft_company\/articles\/1003442\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u0437\u0430\u0447\u0435\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0438 \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u0438\u0437\u043d\u0443\u0442\u0440\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u2014 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430: \u0431\u0435\u0440\u0435\u043c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 \u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<h3>\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0435<\/h3>\n<p>S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 <a href=\"https:\/\/catalog.diasoft.ru\/datafactory?utm_source=habr\">\u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb (Digital Q.DataFactory)<\/a> \u2013 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 Data Lakehouse. \u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0435 S3-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<p>\u0423 S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u0435\u0441\u0442\u044c <strong>\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043d\u0430 500 \u0413\u0411<\/strong> \u2013 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0439\u0442\u0435 \u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. S3 API, \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 FUSE, Erasure Coding, tiered storage \u2013 \u0432\u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e. \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u0431\u0435\u0441\u0441\u0440\u043e\u0447\u043d\u0430\u044f \u2013 \u0445\u0432\u0430\u0442\u0438\u0442 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432, \u043f\u0438\u043b\u043e\u0442\u043e\u0432 \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0439.<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043b\u043d\u0430\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 S3 API \u2013 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 S3-\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 SDK<\/p>\n<\/li>\n<li>\n<p>Erasure Coding \u2013 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0434\u043e 50% \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>Tiered storage \u2013 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u044f\u0447\u0438\u043c \u0438 \u0445\u043e\u043b\u043e\u0434\u043d\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c<\/p>\n<\/li>\n<li>\n<p>FUSE\/HDFS \u2013 \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u0430\u043a \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/p>\n<\/li>\n<li>\n<p>\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2013 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0443\u0437\u043b\u044b \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>\u0414\u0432\u0430 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f: Standalone \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0430 \u0438 Kubernetes \u0434\u043b\u044f production. \u0412\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0438\u043d\u0443\u0442 15.<\/p>\n<\/li>\n<\/ul>\n<p>\u00a0S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><strong>Master <\/strong>\u2013 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439<\/p>\n<\/li>\n<li>\n<p><strong>Volume Server<\/strong> \u2013 \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u043e\u043c\u0430<\/p>\n<\/li>\n<li>\n<p><strong>Filer<\/strong> \u2013 \u0441\u043b\u043e\u0439 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 PostgreSQL<\/p>\n<\/li>\n<li>\n<p><strong>S3 Gateway<\/strong> \u2013 S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 API \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p><strong>Admin UI<\/strong> \u2013 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><strong>SFTP Server<\/strong> \u2013 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u043f\u043e SFTP (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 Standalone-\u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u0441\u0435 \u044d\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Docker Compose. \u0412 Kubernetes \u2013 \u0447\u0435\u0440\u0435\u0437 Helm-\u0447\u0430\u0440\u0442\u044b \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c\u044e.<\/p>\n<h3>\u0413\u0434\u0435 \u0432\u0437\u044f\u0442\u044c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432<\/h3>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430 <a href=\"https:\/\/catalog.diasoft.ru\/datafactory?utm_source=habr\">\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430<\/a>, \u0436\u043c\u0435\u043c \u00ab\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u00bb, \u0432\u0432\u043e\u0434\u0438\u043c \u0438\u043c\u044f \u0438 \u043f\u043e\u0447\u0442\u0443. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0430\u0440\u0445\u0438\u0432\u0430.<\/p>\n<p>\u0412 \u0430\u0440\u0445\u0438\u0432\u0435:<br \/>&#8212; Docker-\u043e\u0431\u0440\u0430\u0437 (<code>qs3archipelago-&lt;version&gt;.tar.gz<\/code>)<br \/>&#8212; Helm-\u0447\u0430\u0440\u0442 \u0434\u043b\u044f Kubernetes<br \/>&#8212; \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435<\/p>\n<h4>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 Docker-\u043e\u0431\u0440\u0430\u0437\u0430<\/h4>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u043e\u0431\u0440\u0430\u0437 \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Docker:<\/p>\n<p># \u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430<br \/><code>gunzip -c qs3archipelago-&lt;version&gt;.tar.gz | docker load<\/code><br \/># \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438<br \/><code>docker images | grep qs3archipelago<\/code><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0431\u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0438\u043b\u0438 \u0432 Kubernetes, \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0439\u0442\u0435 \u043e\u0431\u0440\u0430\u0437 \u0432 \u0432\u0430\u0448 container registry:<\/p>\n<p># \u0422\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e registry<br \/><code>docker tag qs3archipelago:latest your-registry.example.com\/qs3archipelago:latest<\/code><br \/># \u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432 registry<br \/><code>docker push your-registry.example.com\/qs3archipelago:latest<\/code><\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: <\/strong>\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u0435 <code>your-registry.example.com<\/code> \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0432\u0430\u0448\u0435\u0433\u043e container registry (Harbor, Nexus, GitLab Registry \u0438 \u0442.\u0434.).<\/p>\n<h3>\u0427\u0430\u0441\u0442\u044c 1: Standalone-\u0440\u0435\u0436\u0438\u043c<\/h3>\n<p>\u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0439 \u0434\u043e 10-20 TB.<\/p>\n<p><strong>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f<\/strong><\/p>\n<ul>\n<li>\n<p>4 \u044f\u0434\u0440\u0430 CPU<\/p>\n<\/li>\n<li>\n<p>8 GB RAM<\/p>\n<\/li>\n<li>\n<p>\u041b\u044e\u0431\u044b\u0435 \u0434\u0438\u0441\u043a\u0438 (SSD \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435)<\/p>\n<\/li>\n<li>\n<p>Docker \u0438 Docker Compose<\/p>\n<\/li>\n<li>\n<p>PostgreSQL 15.6+<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0428\u0430\u0433 0: \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 PostgreSQL<\/strong><\/p>\n<p>\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0435\u0451 \u043f\u0435\u0440\u0432\u043e\u0439.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<p>&#8212; \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u0441\u044c \u043a <code>PostgreSQL<\/code> \u043a\u0430\u043a \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440<\/p>\n<p><code>CREATE USER qs3archipelago WITH PASSWORD 'your_secure_password';<\/code><br \/><code>CREATE DATABASE qs3archipelago OWNER qs3archipelago;<\/code><\/p>\n<p>\u0421\u0445\u0435\u043c\u0430<code> public <\/code>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0445\u0435\u043c\u0430, \u0437\u0430\u0434\u0430\u0439\u0442\u0435 \u0435\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>DB_SCHEMA.<\/code><\/p>\n<p><strong>\u0428\u0430\u0433 1: Docker Compose<\/strong><\/p>\n<p>Docker Compose \u2014 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 Standalone-\u0440\u0435\u0436\u0438\u043c\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b <code>docker-compose.yaml<\/code>:<\/p>\n<pre><code>version: \"3.8\"services:  weed-master:    image: qs3archipelago:latest #\u0438\u043b\u0438 your-registry.example.com\/qs3archipelago:latest    container_name: weed-master    user: \"30002:30002\"    environment:      #\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430      WEED_COMMAND: master      WEED_LOG_LEVEL: \"1\"      # \u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438      WEED_IP: weed-master      WEED_IP_BIND: 0.0.0.0      # \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 Master      WEED_MASTER_PORT: \"9333\"      WEED_MASTER_DIR: \/data      WEED_MASTER_DEFAULT_REPLICATION: \"000\"      WEED_MASTER_VOLUME_SIZE_LIMIT_MB: \"1000\"      # \u041c\u0435\u0442\u0440\u0438\u043a\u0438      WEED_METRICS_PORT: \"9327\"      # Raft \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438      WEED_MASTER_ELECTION_TIMEOUT: \"10s\"      WEED_MASTER_HEARTBEAT_INTERVAL: \"300ms\"      # PostgreSQL (\u0434\u043b\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)      WEED_LEVELDB2_ENABLED: \"false\"      WEED_POSTGRES2_ENABLED: \"true\"      WEED_POSTGRES2_HOSTNAME: \"host.docker.internal\"        # \u0438\u043b\u0438 IP \u0432\u0430\u0448\u0435\u0433\u043e PostgreSQL      WEED_POSTGRES2_PORT: \"5432\"      WEED_POSTGRES2_USERNAME: \"qs3archipelago\"      WEED_POSTGRES2_PASSWORD: \"your_secure_password\"      WEED_POSTGRES2_DATABASE: \"qs3archipelago\"      WEED_POSTGRES2_SSLMODE: \"disable\"    ports:      - \"9333:9333\"        # HTTP API      - \"19333:19333\"      # gRPC      - \"9327:9327\"        # Metrics    volumes:      - weed-master-data:\/data    networks:      - weed-net    restart: unless-stoppedweed-volume:    image: qs3archipelago:latest    container_name: weed-volume    user: \"30002:30002\"    depends_on:      - weed-master    environment:      WEED_COMMAND: volume      WEED_LOG_LEVEL: \"1\"      WEED_IP: weed-volume      WEED_IP_BIND: 0.0.0.0      # \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 Volume Server      WEED_VOLUME_PORT: \"8080\"      WEED_VOLUME_DIR: \/data      WEED_VOLUME_DIR_IDX: \/data      WEED_VOLUME_READ_MODE: proxy      WEED_VOLUME_MIN_FREE_SPACE_PERCENT: \"1\"      WEED_VOLUME_COMPACTION_MBPS: \"50\"      # \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Master      WEED_MASTER_SERVERS: weed-master:9333      WEED_METRICS_PORT: \"9327\"    ports:      - \"8080:8080\"    volumes:      - weed-volume-data:\/data    networks:      - weed-net    restart: unless-stopped  weed-filer:    image: qs3archipelago:latest    container_name: weed-filer    user: \"30002:30002\"    depends_on:      - weed-master      - weed-volume    environment:      WEED_COMMAND: filer      WEED_LOG_LEVEL: \"1\"      # \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 Filer      WEED_IP: weed-filer      WEED_IP_BIND: 0.0.0.0      WEED_FILER_PORT: \"8888\"      WEED_FILER_GRPC_PORT: \"18888\"      WEED_FILER_DIR_LIST_LIMIT: \"100000\"      WEED_FILER_DEFAULT_REPLICA_PLACEMENT: \"000\"      WEED_FILER_BUCKETS_FOLDER: \"\/buckets\"      WEED_FILER_QUEUES_FOLDER: \"\/queues\"      WEED_FILER_OPTIONS_RECURSIVE_DELETE: \"false\"      # \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Master      WEED_MASTER_SERVERS: weed-master:9333      WEED_FILER_MASTER: weed-master:9333      # PostgreSQL (\u0431\u044d\u043a\u0435\u043d\u0434 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)      WEED_LEVELDB2_ENABLED: \"false\"      WEED_POSTGRES2_ENABLED: \"true\"      WEED_POSTGRES2_HOSTNAME: \"host.docker.internal\"      # \u0438\u043b\u0438 IP \u0432\u0430\u0448\u0435\u0433\u043e PostgreSQL      WEED_POSTGRES2_PORT: \"5432\"      WEED_POSTGRES2_USERNAME: \"qs3archipelago\"      WEED_POSTGRES2_PASSWORD: \"your_secure_password\"      WEED_POSTGRES2_DATABASE: \"qs3archipelago\"      WEED_POSTGRES2_SSLMODE: \"disable\"      WEED_METRICS_PORT: \"9327\"    ports:      - \"8888:8888\"      - \"18888:18888\"    volumes:      - weed-filer-data:\/data    networks:      - weed-net    restart: unless-stopped  weed-s3:    image: qs3archipelago:latest    container_name: weed-s3    user: \"30002:30002\"    depends_on:      - weed-filer    environment:      WEED_COMMAND: s3      WEED_LOG_LEVEL: \"1\"      WEED_IP: weed-s3      WEED_IP_BIND: 0.0.0.0      # \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 S3 Gateway      WEED_S3_PORT: \"8333\"      WEED_S3_FILER: weed-filer:8888      WEED_METRICS_PORT: \"9327\"    ports:      - \"8333:8333\"    networks:      - weed-net    restart: unless-stopped  weed-admin:    image: qs3archipelago:latest    container_name: weed-admin    user: \"30002:30002\"    depends_on:      - weed-master    environment:      WEED_COMMAND: admin      WEED_LOG_LEVEL: \"1\"      # \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 Admin UI      WEED_ADMIN_PORT: \"8081\"      WEED_ADMIN_DATA_DIR: \/data      WEED_ADMIN_USER: admin      WEED_ADMIN_PASSWORD: admin    # \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043d\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0438\u0306 \u043f\u0430\u0440\u043e\u043b\u044c!      WEED_ADMIN_MASTERS: weed-master:9333    ports:      - \"8081:8081\"    volumes:      - weed-admin-data:\/data    networks:      - weed-net    restart: unless-stoppednetworks:  weed-net:    driver: bridgevolumes:  weed-master-data:  weed-volume-data:  weed-filer-data:  weed-admin-data:<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0412\u0430\u0436\u043d\u043e \u043e volumes<\/strong>: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 named volumes (\u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435) \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043c\u0438 Docker. \u0410\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 volumes \u0438\u043b\u0438 bind mounts \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a:<br \/><code>docker-compose up -d<\/code><\/p>\n<p>\u00a0\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435:<\/p>\n<ul>\n<li>\n<p>Master UI: <a href=\"http:\/\/localhost:9333\">http:\/\/localhost:9333<\/a><\/p>\n<\/li>\n<li>\n<p>Volume Server: <a href=\"http:\/\/localhost:8080\">http:\/\/localhost:8080<\/a><\/p>\n<\/li>\n<li>\n<p>Filer UI: <a href=\"http:\/\/localhost:8888\">http:\/\/localhost:8888<\/a><\/p>\n<\/li>\n<li>\n<p>S3 API: <a href=\"http:\/\/localhost:8333\">http:\/\/localhost:8333<\/a><\/p>\n<\/li>\n<li>\n<p>Admin UI: <a href=\"http:\/\/localhost:8081\">http:\/\/localhost:8081<\/a><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0428\u0430\u0433 2: \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438<\/strong><\/p>\n<p># \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c Master<br \/><code>curl http:\/\/localhost:9333\/cluster\/status<\/code><\/p>\n<p># \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c Filer<br \/><code>curl http:\/\/localhost:8888\/<\/code><\/p>\n<p># \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c S3<br \/><code>curl http:\/\/localhost:8333\/status<\/code><\/p>\n<p><strong>\u0428\u0430\u0433 3: \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 S3-\u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/strong><\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e S3 Gateway \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430:<\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 Admin UI:<\/p>\n<ol>\n<li>\n<p>\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 <a href=\"http:\/\/localhost:8081\">http:\/\/localhost:8081<\/a><\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0439\u0434\u0438\u0442\u0435 \u0441 credentials \u0438\u0437 WEED_ADMIN_USER \/ WEED_ADMIN_PASSWORD<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b S3 \u2192 Identities<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 Access Key \u0438 Secret Key<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 aws-cli:<\/p>\n<p><code>aws configure<br \/># AWS Access Key ID: your_access_key<br \/># AWS Secret Access Key: your_secret_key<br \/># Default region name: ru-msk-1<br \/># Default output format: json<\/code><\/p>\n<p># \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c<br \/><code>aws s3 mb s3:\/\/test-bucket --endpoint-url http:\/\/localhost:8333<br \/>aws s3 cp \/etc\/hosts s3:\/\/test-bucket\/hosts.txt --endpoint-url http:\/\/localhost:8333<br \/>aws s3 ls s3:\/\/test-bucket\/ --endpoint-url http:\/\/localhost:8333<\/code><\/p>\n<h4>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Standalone<\/h4>\n<p>\u041d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430? \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 Volume Server \u0432 <code>docker-compose.yaml<\/code>:<\/p>\n<pre><code>yaml  weed-volume2:    image: qs3archipelago:latest    container_name: weed-volume2    user: \"30002:30002\"    depends_on:      - weed-master    environment:      WEED_COMMAND: volume      WEED_IP: weed-volume2      WEED_IP_BIND: 0.0.0.0      WEED_VOLUME_PORT: \"8080\"      WEED_VOLUME_DIR: \/data      WEED_MASTER_SERVERS: weed-master:9333    volumes:      - weed-volume2-data:\/data    networks:      - weed-net    restart: unless-stopped<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Master \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u0438\u0442 \u043d\u043e\u0432\u044b\u0439 \u0443\u0437\u0435\u043b.<\/p>\n<h3>\u0427\u0430\u0441\u0442\u044c 2: Kubernetes-\u0440\u0435\u0436\u0438\u043c<\/h3>\n<p>\u0414\u043b\u044f production-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0441 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c\u044e \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/p>\n<p><strong>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p>Kubernetes 1.24+ (\u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u043d\u0430 Deckhouse, vanilla K8s)<\/p>\n<\/li>\n<li>\n<p>Helm 3.x<\/p>\n<\/li>\n<li>\n<p>PostgreSQL 15.6+ (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c Digital Q.DataBase \u0438\u043b\u0438 \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440)<\/p>\n<\/li>\n<li>\n<p>StorageClass \u0434\u043b\u044f persistent volumes<\/p>\n<\/li>\n<li>\n<p>Container registry \u0441 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043b\u044f Kubernetes<\/h4>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 Docker-\u043e\u0431\u0440\u0430\u0437 \u0432 \u0432\u0430\u0448 container registry:<\/p>\n<p># \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430<br \/><code>gunzip -c qs3archipelago-&lt;version&gt;.tar.gz | docker load<\/code><\/p>\n<p># \u0422\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e registry<br \/><code>docker tag qs3archipelago:latest your-registry.example.com\/qs3archipelago:latest<\/code><\/p>\n<p>\u00a0# \u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c<br \/><code>docker push your-registry.example.com\/qs3archipelago:latest<\/code><\/p>\n<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/h4>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 production-\u043a\u043b\u0430\u0441\u0442\u0435\u0440:<\/p>\n<p><strong>Control Plane (3 \u0443\u0437\u043b\u0430 \u0434\u043b\u044f Master + Filer):<\/strong><\/p>\n<ul>\n<li>\n<p>CPU: 8-16 \u044f\u0434\u0435\u0440<\/p>\n<\/li>\n<li>\n<p>RAM: 32-64 GB<\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u0441\u043a\u0438: 2x SSD 500 GB (RAID1 \u0434\u043b\u044f \u0411\u0414 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0442\u044c: 10GbE<\/p>\n<\/li>\n<\/ul>\n<p><strong>Data Plane (6+ \u0443\u0437\u043b\u043e\u0432 \u0434\u043b\u044f Volume Servers):<\/strong><\/p>\n<ul>\n<li>\n<p>CPU: 8-16 \u044f\u0434\u0435\u0440<\/p>\n<\/li>\n<li>\n<p>RAM: 32-64 GB<\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u0441\u043a\u0438: 8-12x HDD\/SSD<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0442\u044c: 10GbE (\u0438\u043b\u0438 25GbE \u0434\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a)<\/p>\n<\/li>\n<\/ul>\n<h4>\u0428\u0430\u0433 1: \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 PostgreSQL<\/h4>\n<p>\u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0438\u0306 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0411\u0414 (\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0431\u0430\u0437\u044b, \u0441\u0445\u0435\u043c\u044b, \u0442\u0430\u0431\u043b\u0438\u0446) \u0441\u043a\u0440\u0438\u043f\u0442\u0443 <code>init-db.sh <\/code>\u043d\u0443\u0436\u043d\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u0432 PostgreSQL.<\/p>\n<p><strong>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 A: \u0420\u0443\u0447\u043d\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)<\/strong><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0431\u0430\u0437\u0443 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e:<\/p>\n<p>&#8212; \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u0441\u044c \u043a\u0430\u043a \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 (<code>postgres<\/code>)<\/p>\n<p><code>CREATE USER qs3archipelago WITH PASSWORD 'your_secure_password';<\/code><br \/><code>CREATE DATABASE qs3archipelago OWNER qs3archipelago;<\/code><\/p>\n<p>\u00a0\u0417\u0430\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 Secret \u0441 credentials \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>apiVersion: v1kind: Secretmetadata:  name: postgres-credentials  namespace: qs3archipelagotype: OpaquestringData:  hostname: \"postgres-service.postgres-namespace.svc.cluster.local\"  port: \"5432\"  username: \"qs3archipelago\"  password: \"your_secure_password\"  database: \"qs3archipelago\"kubectl apply -f postgres-secret.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 <code>filemeta <\/code>\u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 Filer.<\/p>\n<p><strong>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 B: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/strong><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b <code>init-db.sh<\/code> \u0441\u043e\u0437\u0434\u0430\u043b \u0432\u0441\u0451 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 <strong>\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435<\/strong> credentials:<\/p>\n<p><strong>\u0421\u043f\u043e\u0441\u043e\u0431 1: <\/strong>\u0423\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0430 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 <code>WEED_POSTGRES2_USERNAME<\/code>:  <\/p>\n<pre><code>apiVersion: v1kind: Secretmetadata:  name: postgres-credentials  namespace: qs3archipelagotype: OpaquestringData:  hostname: \"postgres-service.postgres-namespace.svc.cluster.local\"  port: \"5432\"  # \u0410\u0434\u043c\u0438\u043d PostgreSQL \u0434\u043b\u044f DDL-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\u0306 (CREATE DATABASE, CREATE USER)  username: \"postgres\"  password: \"postgres_admin_password\"  database: \"qs3archipelago\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0421\u043f\u043e\u0441\u043e\u0431 2: <\/strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0430. \u0415\u0441\u043b\u0438 <code>WEED_POSTGRES2_USERNAME<\/code> \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0411\u0414 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446, \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432 <code>extraEnvironmentVars<\/code> \u0434\u043b\u044f master \u0438 filters:<\/p>\n<p><code>DB_ADMIN: \"postgres\"<br \/>DB_ADMINPASSWORD: \"postgres_admin_password\"<\/code><\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>DB_ADMIN \/ DB_ADMINPASSWORD<\/code> \u0434\u043b\u044f DDL-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0430 <code>WEED_POSTGRES2_USERNAME<\/code> \u2013 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c<\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f <code>qs3archipelago<\/code>, \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0445\u0435\u043c\u0443 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <code>filemeta<\/code>.<\/p>\n<p><strong>\u0428\u0430\u0433 2: \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 namespace \u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432<\/strong><\/p>\n<p># \u0421\u043e\u0437\u0434\u0430\u0435\u043c <code>namespace<\/code><br \/><code>kubectl create namespace qs3archipelago<\/code><\/p>\n<p>\u00a0# \u0421\u0435\u043a\u0440\u0435\u0442 \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d-\u043f\u0430\u043d\u0435\u043b\u0438<br \/><code>kubectl create secret generic qs3archipelago-admin-configuration \\<\/code><br \/><code>\u00a0 --namespace qs3archipelago \\<\/code><br \/><code>\u00a0 --from-literal=username=admin \\<\/code><br \/><code>\u00a0 --from-literal=password=your_admin_password<\/code><\/p>\n<p><strong>\u0428\u0430\u0433 3: \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 values.yaml<\/strong><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b values.yaml \u0434\u043b\u044f Helm:<\/p>\n<pre><code>nameOverride: \"qs3archipelago\"global:  createClusterRole: true  # \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441 \u0432\u0430\u0448\u0435\u0433\u043e container registry  registry: \"your-registry.example.com\"  repository: \"qs3archipelago\"  imageName: qs3archipelago  imagePullPolicy: IfNotPresent  serviceAccountName: \"qs3archipelago\"  enableSecurity: false  enableReplication: false  replicationPlacement: \"000\"  # \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 Prometheus (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)  monitoring:    enabled: false    namespace: monitoring    gatewayHost: null    gatewayPort: null  extraEnvironmentVars:    # \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0438\u0306 \u043f\u0443\u0442\u044c \u0434\u043b\u044f Admin UI (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)   # WEED_ADMIN_CONTEXT_PATH: \"\/qs3arc\"  # \u0418\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438  WEED_CLUSTER_DEFAULT: \"qs3archipelago\"  # \u0410\u0434\u0440\u0435\u0441 Master-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0438\u0306 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0438  WEED_CLUSTER_SW_MASTER: \"qs3archipelago-master.qs3archipelago:9333\"  # \u0410\u0434\u0440\u0435\u0441 Filer \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0438\u0306 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0438  WEED_CLUSTER_SW_FILER: \"qs3archipelago-filer-client.qs3archipelago:8888\"  # \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u0431\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0432 Filer  WEED_FILER_BUCKETS_FOLDER: \"\/buckets\"  # \u0417\u0430\u043f\u0440\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f (\u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 rm -rf)  WEED_FILER_OPTIONS_RECURSIVE_DELETE: \"false\"  # \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0438\u0306  WEED_FILER_QUEUES_FOLDER: \"\/queues\"  # \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e LevelDB (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c PostgreSQL)  WEED_LEVELDB2_ENABLED: \"false\"  # \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 PostgreSQL \u043a\u0430\u043a \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445  WEED_POSTGRES2_ENABLED: \"true\"  # \u0420\u0435\u0436\u0438\u043c SSL \u0434\u043b\u044f PostgreSQL     # \u0412\u0410\u0416\u041d\u041e: \u0414\u043b\u044f production \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0438\u0306\u0442\u0435 verify-full \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438     # disable - \u0442\u0440\u0430\u0444\u0438\u043a \u043a \u0411\u0414 \u0438\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c  WEED_POSTGRES2_SSLMODE: \"disable\"image:  # \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441 \u0432\u0430\u0448\u0435\u0433\u043e container registry  registry: \"your-registry.example.com\"  repository: \"qs3archipelago\"  tag: \"latest\"   # \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u043b\u044f production# Master Server - \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430master:  enabled: true  replicas: 3     # \u0414\u043b\u044f HA \u043d\u0443\u0436\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c 3  updatePartition: 0  serviceAccountName: \"qs3archipelago\"  podSecurityContext:    enabled: true    fsGroup: 30002  data:    type: \"emptyDir\"   # \u0418\u043b\u0438 persistentVolumeClaim \u0434\u043b\u044f production  logs:    type: \"emptyDir\"  extraEnvironmentVars:    # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043c\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438    WEED_MASTER_VOLUME_GROWTH_COPY_1: '2'    WEED_MASTER_VOLUME_GROWTH_COPY_2: '2'    WEED_MASTER_VOLUME_GROWTH_COPY_3: '1'    WEED_MASTER_VOLUME_GROWTH_COPY_OTHER: '1'    # PostgreSQL credentials \u0438\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430    WEED_POSTGRES2_USERNAME:      secretKeyRef:        name: postgres-credentials        key: username    WEED_POSTGRES2_PASSWORD:      secretKeyRef:        name: postgres-credentials        key: password    WEED_POSTGRES2_DATABASE:      secretKeyRef:        name: postgres-credentials        key: database    WEED_POSTGRES2_HOSTNAME:      secretKeyRef:        name: postgres-credentials        key: hostname    WEED_POSTGRES2_PORT:      secretKeyRef:        name: postgres-credentials        key: port# Volume Server - \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445volume:  enabled: true  replicas: 2   # \u041c\u0438\u043d\u0438\u043c\u0443\u043c 2 \u0434\u043b\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0438\u0306\u0447\u0438\u0432\u043e\u0441\u0442\u0438  serviceAccountName: \"qs3archipelago\"  podManagementPolicy: Parallel  # \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 MB\/s  compactionMBps: \"80\"  # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0438\u0306 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435  minFreeSpacePercent: 5  podSecurityContext:    enabled: true    fsGroup: 30002  dataDirs:    - name: data1      type: \"persistentVolumeClaim\"      size: 100Gi      # \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0432\u0430\u0448 StorageClass      # \u041f\u0440\u0438\u043c\u0435\u0440\u044b: standard, gp2, yc-network-ssd, local-path      storageClass: \"local-storage-class\"      annotations: {}      maxVolumes: 0  logs:    type: \"persistentVolumeClaim\"    size: 10Gi    storageClass: \"local-storage-class\"    annotations: {}  idx:    type: \"persistentVolumeClaim\"    size: 10Gi    storageClass: \"local-storage-class\"    annotations: {}# Filer - \u0441\u043b\u043e\u0438\u0306 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445filer:  enabled: true  replicas: 2  defaultReplicaPlacement: \"000\"  serviceAccountName: \"qs3archipelago\"  podSecurityContext:    enabled: true    fsGroup: 30002  data:    type: \"persistentVolumeClaim\"    size: 10Gi    storageClass: \"local-storage-class\"    annotations: {}  logs:    type: \"persistentVolumeClaim\"    size: 10Gi    storageClass: \"local-storage-class\"    annotations: {}  extraEnvironmentVars:    WEED_MYSQL_ENABLED: \"false\"    WEED_LEVELDB2_ENABLED: \"false\"    WEED_POSTGRES2_ENABLED: \"true\"    WEED_POSTGRES2_SSLMODE: \"disable\"# \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a PostgreSQL \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u043a\u0440\u0435\u0442  secretExtraEnvironmentVars:    WEED_POSTGRES2_USERNAME:      secretKeyRef:        name: postgres-credentials        key: username    WEED_POSTGRES2_PASSWORD:      secretKeyRef:        name: postgres-credentials        key: password    WEED_POSTGRES2_DATABASE:      secretKeyRef:        name: postgres-credentials        key: database    WEED_POSTGRES2_HOSTNAME:      secretKeyRef:        name: postgres-credentials        key: hostname    WEED_POSTGRES2_PORT:      secretKeyRef:        name: postgres-credentials        key: port# Ingress \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430  ingress:    enabled: true    className: \"istio\"   # \u0414\u043b\u044f production \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0438\u0306\u0442\u0435 istio    # className: \"nginx\" # \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0434\u043b\u044f dev\/test    host: \"filer.your-domain.com\"    path: \"\/\"    pathType: Prefix    annotations:      cert-manager.io\/cluster-issuer: cluster-acme-issuer    tls:      - secretName: filer-tls-secret        hosts:          - \"filer.your-domain.com\"# S3 Gateways3:  enabled: true  replicas: 2  enableAuth: true   # \u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 \u043a\u043b\u044e\u0447\u0435\u0438\u0306 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u0441\u043c. \u0428\u0430\u0433 6)  existingConfigSecret: null  podSecurityContext:    enabled: true    fsGroup: 30002  logs:    type: \"emptyDir\"  ingress:    enabled: true    className: \"istio\"    host: \"s3.your-domain.com\"    path: \"\/\"    pathType: Prefix    annotations:      cert-manager.io\/cluster-issuer: cluster-acme-issuer    tls:      - secretName: s3-tls-secret        hosts:          - \"s3.your-domain.com\"# SFTP Server (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)sftp:  enabled: false# Worker (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)worker:  enabled: false# Admin UIadmin:  enabled: true  replicas: 1  secret:    existingSecret: \"qs3archipelago-admin-configuration\"    userKey: \"username\"    pwKey: \"password\"  masters: \"qs3archipelago-master.qs3archipelago:9333\"  podSecurityContext:    enabled: true    fsGroup: 30002  data:    type: \"persistentVolumeClaim\"    size: 5Gi    storageClass: \"local-storage-class\"  logs:    type: \"emptyDir\"  ingress:    enabled: true    className: \"istio\"    host: \"admin.your-domain.com\"    path: \"\/\"    pathType: Prefix    annotations:      cert-manager.io\/cluster-issuer: cluster-acme-issuer    tls:      - secretName: admin-tls-secret        hosts:          - \"admin.your-domain.com\"# All-in-One \u0440\u0435\u0436\u0438\u043c (\u0434\u043b\u044f dev\/test)allInOne:  enabled: false# COSI Drivercosi:  enabled: false<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0428\u0430\u0433 4: \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 Helm<\/strong><\/p>\n<p><code>helm install qs3archipelago .\/qs3archipelago \\<br \/>\u00a0 --namespace qs3archipelago \\<br \/>\u00a0 --values values.yaml \\<br \/>\u00a0 --create-namespace<\/code><\/p>\n<p>\u00a0<strong>\u0428\u0430\u0433 5: \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/strong><\/p>\n<p># \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0434\u044b<br \/><code>kubectl get pods -n qs3archipelago<\/code><\/p>\n<p>\u00a0# \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<p><code># NAME\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 READY\u00a0\u00a0 STATUS\u00a0\u00a0\u00a0 RESTARTS\u00a0\u00a0 AGE<\/code><br \/><code># qs3archipelago-master-0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\/1\u00a0\u00a0\u00a0\u00a0 Running\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2m<\/code><br \/><code># qs3archipelago-master-1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\/1\u00a0\u00a0\u00a0\u00a0 Running\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2m<\/code><br \/><code># qs3archipelago-master-2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a01\/1\u00a0\u00a0\u00a0\u00a0 Running\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2m<\/code><br \/><code># qs3archipelago-volume-0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a01\/1\u00a0\u00a0\u00a0\u00a0 Running\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2m<\/code><br \/><code># qs3archipelago-volume-1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a01\/1\u00a0\u00a0\u00a0\u00a0 Running\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2m<\/code><br \/><code># qs3archipelago-filer-0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\/1\u00a0\u00a0\u00a0\u00a0 Running\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2m<\/code><br \/><code># qs3archipelago-filer-1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\/1\u00a0\u00a0\u00a0\u00a0 Running\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2m<\/code><br \/><code># qs3archipelago-s3-xxxxx-xxxxx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\/1\u00a0\u00a0\u00a0\u00a0 Running\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2m<\/code><br \/><code># qs3archipelago-admin-0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\/1\u00a0\u00a0\u00a0\u00a0 Running\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2m<\/code><\/p>\n<p>\u00a0# \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u044b<br \/><code>kubectl get svc -n qs3archipelago<\/code><\/p>\n<p>\u00a0# \u041b\u043e\u0433\u0438 Filer (\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414)<br \/><code>kubectl logs -n qs3archipelago qs3archipelago-filer-0 | head -50<\/code><\/p>\n<p><strong>\u0428\u0430\u0433 6: \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 S3-\u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/strong><\/p>\n<p>S3 Gateway \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0441 <code>enableAuth: true<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430.<\/p>\n<p><strong>\u0427\u0435\u0440\u0435\u0437 Admin UI:<\/strong><\/p>\n<ol>\n<li>\n<p>\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 Admin UI (\u0447\u0435\u0440\u0435\u0437 Ingress \u0438\u043b\u0438 port-forward)<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b S3 \u2192 Identities<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 Access Key \u0438 Secret Key<\/p>\n<\/li>\n<\/ol>\n<p>\u0427\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<p><code># Port-forward \u043a Filer<br \/>kubectl port-forward -n qs3archipelago svc\/qs3archipelago-filer-client 8888:8888 &amp;<\/code><\/p>\n<p>\u00a0# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 S3-\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<br \/><code>kubectl exec -it -n qs3archipelago qs3archipelago-filer-0 -- \\<br \/>\u00a0 \/usr\/bin\/weed s3 configure \\<br \/>\u00a0 -filer=localhost:8888 \\<br \/>\u00a0 -user=s3admin \\<br \/>\u00a0 -access_key=your_access_key \\<br \/>\u00a0 -secret_key=your_secret_key \\<br \/>\u00a0 -actions=Admin,Read,Write,List,Tagging<\/code><\/p>\n<p><strong>\u0428\u0430\u0433 7: \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 S3 API<\/strong><\/p>\n<p># <code>Port-forward<\/code> \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<br \/><code>kubectl port-forward -n qs3archipelago svc\/qs3archipelago-s3 8333:8333 &amp;<\/code><\/p>\n<p># \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 aws-cli \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0438\u0437 \u0428\u0430\u0433\u0430 6<br \/><code>aws configure<br \/># AWS Access Key ID: your_access_key<br \/># AWS Secret Access Key: your_secret_key # Default region name: ru-msk-1<br \/># Default output format: json<\/code><\/p>\n<p># \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c<br \/><code>aws s3 mb s3:\/\/test-bucket --endpoint-url http:\/\/localhost:8333<br \/>aws s3 cp \/etc\/hosts s3:\/\/test-bucket\/hosts.txt --endpoint-url http:\/\/localhost:8333<br \/>aws s3 ls s3:\/\/test-bucket\/ --endpoint-url http:\/\/localhost:8333<\/code><\/p>\n<p><strong>\u0428\u0430\u0433 8: \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 CSI Driver (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/strong><\/p>\n<p>CSI Driver \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043e\u0432 Kubernetes \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043c\u043e\u0432.<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u043e<\/strong>: \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0439\u0442\u0435 CSI Driver \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440 S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u0428\u0430\u0433\u0438 4-7). CSI Driver \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Filer.<\/p>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u043e\u0431\u0440\u0430\u0437 CSI Driver \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430 \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0439\u0442\u0435 \u0432 \u0432\u0430\u0448 registry:<br \/><code>gunzip -c s3archcsidriver-&lt;version&gt;.tar.gz | docker load<br \/>docker tag s3archcsidriver:latest your-registry.example.com\/s3archcsidriver:latest<br \/>docker push your-registry.example.com\/s3archcsidriver:latest<\/code><\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 Helm:<\/p>\n<p><code>helm install s3archipelago-csi-driver .\/s3archcsidriver <br \/> \u00a0 --namespace kube-system <br \/> \u00a0 --set image.registry=your-registry.example.com <br \/> \u00a0 --set image.repository=s3archcsidriver <br \/> \u00a0 --set seaweedfs.filer=qs3archipelago-filer-client.qs3archipelago:8888<\/code><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 StorageClass:<\/p>\n<pre><code>apiVersion: storage.k8s.io\/v1kind: StorageClassmetadata:  name: s3archipelago-storageprovisioner: seaweedfs-csi-driverparameters:  collection: \"default\"  replication: \"000\"reclaimPolicy: DeletevolumeBindingMode: ImmediateallowVolumeExpansion: truekubectl apply -f storageclass.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0427\u0430\u0441\u0442\u044c 3: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 CSI Driver<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 CSI Driver \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c PersistentVolumeClaim, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0438\u0437\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433\u0435.<\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 PVC<\/strong><\/p>\n<pre><code>apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: my-app-dataspec:  accessModes:    - ReadWriteMany  storageClassName: s3archipelago-storage  resources:    requests:      storage: 10Gi<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u043e\u0434\u0435<\/strong>   <\/p>\n<pre><code>apiVersion: v1kind: Podmetadata:  name: my-appspec:  containers:    - name: app      image: nginx      volumeMounts:        - name: data          mountPath: \/data  volumes:    - name: data      persistentVolumeClaim:        claimName: my-app-data<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0427\u0430\u0441\u0442\u044c 4: \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 SSO (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/h3>\n<p>S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 Keycloak \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 (SSO).<\/p>\n<p><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Keycloak<\/strong><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 <code>global.extraEnvironmentVars<\/code>:<\/p>\n<pre><code>global:  extraEnvironmentVars:    # ... \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 ...    # SSO \u0447\u0435\u0440\u0435\u0437 Keycloak    SEAWEED_SSO_KEYCLOAK_ENABLED: \"true\"    SEAWEED_SSO_KEYCLOAK_URL: \"https:\/\/keycloak.your-domain.com\/auth\"    SEAWEED_SSO_KEYCLOAK_REALM: \"your-realm\"    SEAWEED_SSO_KEYCLOAK_CLIENT_ID: \"qs3archipelago\"    SEAWEED_SSO_KEYCLOAK_CLIENT_SECRET: \"your-client-secret\"    SEAWEED_SSO_KEYCLOAK_ADMIN_URL: \"https:\/\/admin.qs3archipelago.your-domain.com\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f SSO \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u043c\u043e\u0433\u0443\u0442 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u0432 Admin UI \u0447\u0435\u0440\u0435\u0437 Keycloak.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p><strong>\u041e\u0431\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/p>\n<\/td>\n<td data-colwidth=\"340\" width=\"340\">\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">WEED_COMMAND<\/p>\n<\/td>\n<td data-colwidth=\"340\" width=\"340\">\n<p align=\"left\">\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430: master, volume, filer, s3, admin, server<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">WEED_LOG_LEVEL<\/p>\n<\/td>\n<td data-colwidth=\"340\" width=\"340\">\n<p align=\"left\">\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (0-4)<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">WEED_IP<\/p>\n<\/td>\n<td data-colwidth=\"340\" width=\"340\">\n<p align=\"left\">IP-\u0430\u0434\u0440\u0435\u0441 \u0438\u043b\u0438 hostname \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">WEED_IP_BIND<\/p>\n<\/td>\n<td data-colwidth=\"340\" width=\"340\">\n<p align=\"left\">IP \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 (0.0.0.0 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.0.0.0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">WEED_DIR<\/p>\n<\/td>\n<td data-colwidth=\"340\" width=\"340\">\n<p align=\"left\">\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0440\u0435\u0436\u0438\u043c server)<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">WEED_METRICS_PORT<\/p>\n<\/td>\n<td data-colwidth=\"340\" width=\"340\">\n<p align=\"left\">\u041f\u043e\u0440\u0442 \u0434\u043b\u044f \u043c\u0435\u0442\u0440\u0438\u043a Prometheus<\/p>\n<\/td>\n<td>\n<p align=\"left\">9327<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/p>\n<\/td>\n<td data-colwidth=\"336\" width=\"336\">\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">WEED_CLUSTER_DEFAULT<\/p>\n<\/td>\n<td data-colwidth=\"336\" width=\"336\">\n<p align=\"left\">\u0418\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0434\u043b\u044f   \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">WEED_CLUSTER_SW_MASTER<\/p>\n<\/td>\n<td data-colwidth=\"336\" width=\"336\">\n<p align=\"left\">\u0410\u0434\u0440\u0435\u0441 Master-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 (host:port)<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"276\" width=\"276\">\n<p align=\"left\">WEED_CLUSTER_SW_FILER<\/p>\n<\/td>\n<td data-colwidth=\"336\" width=\"336\">\n<p align=\"left\">\u0410\u0434\u0440\u0435\u0441 Filer-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 (host:port)<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 Master<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_PORT<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">HTTP-\u043f\u043e\u0440\u0442 Master<\/p>\n<\/td>\n<td>\n<p align=\"left\">9333<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_DIR<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 Master<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_DEFAULT_REPLICATION<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u0421\u0445\u0435\u043c\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<td>\n<p align=\"left\">000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_VOLUME_SIZE_LIMIT_MB<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u043e\u043c\u0430 (MB)<\/p>\n<\/td>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_ELECTION_TIMEOUT<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u0432\u044b\u0431\u043e\u0440\u043e\u0432 \u043b\u0438\u0434\u0435\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">10s<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_HEARTBEAT_INTERVAL<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b heartbeat<\/p>\n<\/td>\n<td>\n<p align=\"left\">300ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_SERVERS<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u0410\u0434\u0440\u0435\u0441\u0430 Master-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_VOLUME_GROWTH_COPY_1<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043c\u043e\u0432 \u043f\u0440\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 x1<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_VOLUME_GROWTH_COPY_2<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043c\u043e\u0432 \u043f\u0440\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 x2<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_VOLUME_GROWTH_COPY_3<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043c\u043e\u0432 \u043f\u0440\u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 x3<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"433\" width=\"433\">\n<p align=\"left\">WEED_MASTER_VOLUME_GROWTH_COPY_OTHER<\/p>\n<\/td>\n<td data-colwidth=\"197\" width=\"197\">\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043c\u043e\u0432 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0445\u0435\u043c<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 Volume Server<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"362\" width=\"362\">\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/p>\n<\/td>\n<td data-colwidth=\"170\" width=\"170\">\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"362\" width=\"362\">\n<p align=\"left\">WEED_VOLUME_PORT<\/p>\n<\/td>\n<td data-colwidth=\"170\" width=\"170\">\n<p align=\"left\">HTTP-\u043f\u043e\u0440\u0442 Volume Server<\/p>\n<\/td>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">8080<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"362\" width=\"362\">\n<p align=\"left\">WEED_VOLUME_DIR<\/p>\n<\/td>\n<td data-colwidth=\"170\" width=\"170\">\n<p align=\"left\">\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"362\" width=\"362\">\n<p align=\"left\">WEED_VOLUME_DIR_IDX<\/p>\n<\/td>\n<td data-colwidth=\"170\" width=\"170\">\n<p align=\"left\">\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432<\/p>\n<\/td>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"362\" width=\"362\">\n<p align=\"left\">WEED_VOLUME_READ_MODE<\/p>\n<\/td>\n<td data-colwidth=\"170\" width=\"170\">\n<p align=\"left\">\u0420\u0435\u0436\u0438\u043c \u0447\u0442\u0435\u043d\u0438\u044f: proxy \u0438\u043b\u0438   redirect<\/p>\n<\/td>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">proxy<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"362\" width=\"362\">\n<p align=\"left\">WEED_VOLUME_MIN_FREE_SPACE_PERCENT<\/p>\n<\/td>\n<td data-colwidth=\"170\" width=\"170\">\n<p align=\"left\">\u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430   (%)<\/p>\n<\/td>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"362\" width=\"362\">\n<p align=\"left\">WEED_VOLUME_COMPACTION_MBPS<\/p>\n<\/td>\n<td data-colwidth=\"170\" width=\"170\">\n<p align=\"left\">\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438   (MB\/s)<\/p>\n<\/td>\n<td data-colwidth=\"91\" width=\"91\">\n<p align=\"left\">50<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 Filer<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"290\" width=\"290\">\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/p>\n<\/td>\n<td data-colwidth=\"164\" width=\"164\">\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td data-colwidth=\"79\" width=\"79\">\n<p align=\"left\">\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"290\" width=\"290\">\n<p align=\"left\">WEED_FILER_PORT<\/p>\n<\/td>\n<td data-colwidth=\"164\" width=\"164\">\n<p align=\"left\">HTTP-\u043f\u043e\u0440\u0442 Filer<\/p>\n<\/td>\n<td data-colwidth=\"79\" width=\"79\">\n<p align=\"left\">8888<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"290\" width=\"290\">\n<p align=\"left\">WEED_FILER_GRPC_PORT<\/p>\n<\/td>\n<td data-colwidth=\"164\" width=\"164\">\n<p align=\"left\">gRPC-\u043f\u043e\u0440\u0442 Filer<\/p>\n<\/td>\n<td data-colwidth=\"79\" width=\"79\">\n<p align=\"left\">18888<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"290\" width=\"290\">\n<p align=\"left\">WEED_FILER_DIR_LIST_LIMIT<\/p>\n<\/td>\n<td data-colwidth=\"164\" width=\"164\">\n<p align=\"left\">\u041b\u0438\u043c\u0438\u0442 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0435<\/p>\n<\/td>\n<td data-colwidth=\"79\" width=\"79\">\n<p align=\"left\">100000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"290\" width=\"290\">\n<p align=\"left\">WEED_FILER_DEFAULT_REPLICA_PLACEMENT<\/p>\n<\/td>\n<td data-colwidth=\"164\" width=\"164\">\n<p align=\"left\">\u0421\u0445\u0435\u043c\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<td data-colwidth=\"79\" width=\"79\">\n<p align=\"left\">000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"290\" width=\"290\">\n<p align=\"left\">WEED_FILER_BUCKETS_FOLDER<\/p>\n<\/td>\n<td data-colwidth=\"164\" width=\"164\">\n<p align=\"left\">\u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0431\u0430\u043a\u0435\u0442\u043e\u0432<\/p>\n<\/td>\n<td data-colwidth=\"79\" width=\"79\">\n<p align=\"left\">\/buckets<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"290\" width=\"290\">\n<p align=\"left\">WEED_FILER_QUEUES_FOLDER<\/p>\n<\/td>\n<td data-colwidth=\"164\" width=\"164\">\n<p align=\"left\">\u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439<\/p>\n<\/td>\n<td data-colwidth=\"79\" width=\"79\">\n<p align=\"left\">\/queues<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"290\" width=\"290\">\n<p align=\"left\">WEED_FILER_OPTIONS_RECURSIVE_DELETE<\/p>\n<\/td>\n<td data-colwidth=\"164\" width=\"164\">\n<p align=\"left\">\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td data-colwidth=\"79\" width=\"79\">\n<p align=\"left\">false<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"290\" width=\"290\">\n<p align=\"left\">WEED_FILER_MASTER<\/p>\n<\/td>\n<td data-colwidth=\"164\" width=\"164\">\n<p align=\"left\">\u0410\u0434\u0440\u0435\u0441 Master-\u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"79\" width=\"79\">\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 S3 Gateway<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"289\" width=\"289\">\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/p>\n<\/td>\n<td data-colwidth=\"222\" width=\"222\">\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"289\" width=\"289\">\n<p align=\"left\">WEED_S3_PORT<\/p>\n<\/td>\n<td data-colwidth=\"222\" width=\"222\">\n<p align=\"left\">HTTP-\u043f\u043e\u0440\u0442 S3 Gateway<\/p>\n<\/td>\n<td>\n<p align=\"left\">8333<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"289\" width=\"289\">\n<p align=\"left\">WEED_S3_FILER<\/p>\n<\/td>\n<td data-colwidth=\"222\" width=\"222\">\n<p align=\"left\">\u0410\u0434\u0440\u0435\u0441 Filer (host:port)<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 Admin UI<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"288\" width=\"288\">\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"288\" width=\"288\">\n<p align=\"left\">WEED_ADMIN_PORT<\/p>\n<\/td>\n<td>\n<p align=\"left\">HTTP-\u043f\u043e\u0440\u0442 Admin UI<\/p>\n<\/td>\n<td>\n<p align=\"left\">8081<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"288\" width=\"288\">\n<p align=\"left\">WEED_ADMIN_DATA_DIR<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"288\" width=\"288\">\n<p align=\"left\">WEED_ADMIN_USER<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">admin<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"288\" width=\"288\">\n<p align=\"left\">WEED_ADMIN_PASSWORD<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0430\u0440\u043e\u043b\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"288\" width=\"288\">\n<p align=\"left\">WEED_ADMIN_MASTERS<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0410\u0434\u0440\u0435\u0441\u0430 Master-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"288\" width=\"288\">\n<p align=\"left\">WEED_ADMIN_CONTEXT_PATH<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c (\u0434\u043b\u044f   reverse proxy)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\/<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 PostgreSQL<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"286\" width=\"286\">\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"286\" width=\"286\">\n<p align=\"left\">WEED_POSTGRES2_ENABLED<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c PostgreSQL \u0431\u044d\u043a\u0435\u043d\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\">false<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"286\" width=\"286\">\n<p align=\"left\">WEED_POSTGRES2_HOSTNAME<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0425\u043e\u0441\u0442 PostgreSQL<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"286\" width=\"286\">\n<p align=\"left\">WEED_POSTGRES2_PORT<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0440\u0442 PostgreSQL<\/p>\n<\/td>\n<td>\n<p align=\"left\">5432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"286\" width=\"286\">\n<p align=\"left\">WEED_POSTGRES2_USERNAME<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"286\" width=\"286\">\n<p align=\"left\">WEED_POSTGRES2_PASSWORD<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0430\u0440\u043e\u043b\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"286\" width=\"286\">\n<p align=\"left\">WEED_POSTGRES2_DATABASE<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043c\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"286\" width=\"286\">\n<p align=\"left\">WEED_POSTGRES2_SSLMODE<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0435\u0436\u0438\u043c SSL: disable, require, verify-full<\/p>\n<\/td>\n<td>\n<p align=\"left\">disable<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"286\" width=\"286\">\n<p align=\"left\">WEED_LEVELDB2_ENABLED<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c LevelDB (\u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u0435   \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 PostgreSQL)<\/p>\n<\/td>\n<td>\n<p align=\"left\">true<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0423\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u043e\u043b\u0430\u0434\u043e\u043a<\/h3>\n<p><strong>Filer \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f<\/strong><\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a PostgreSQL:<\/p>\n<p># \u0412 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 Filer<br \/><code>kubectl exec -it -n qs3archipelago qs3archipelago-filer-0 -- \\<br \/>\u00a0 psql \"postgresql:\/\/user:password@host:5432\/database?sslmode=disable\" -c \"SELECT 1\"<\/code><\/p>\n<p><strong>Volume Server \u043d\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f<\/strong><\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u0441 Master:<br \/><code>kubectl exec -it -n qs3archipelago qs3archipelago-volume-0 -- \\<br \/>\u00a0 curl http:\/\/qs3archipelago-master:9333\/cluster\/status<\/code><\/p>\n<p><strong>S3 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 403<\/strong><\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u043a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 aws-cli.<\/p>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h3>\n<ul>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0447\u0435\u0440\u0435\u0437 Prometheus\/Grafana<\/p>\n<\/li>\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 lifecycle policies \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0440\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0441 \u0432\u0430\u0448\u0438\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 S3 SDK<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1032522\/\">https:\/\/habr.com\/ru\/articles\/1032522\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u0418\u043b\u044c\u044f \u0428\u0443\u0439\u043a\u043e\u0432, \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u0438\u0430\u0441\u043e\u0444\u0442.\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u0437\u0430\u0447\u0435\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0438 \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u0438\u0437\u043d\u0443\u0442\u0440\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u2014 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430: \u0431\u0435\u0440\u0435\u043c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 \u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0435S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb (Digital Q.DataFactory) \u2013 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 Data Lakehouse. \u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0435 S3-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.\u0423 S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u0435\u0441\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043d\u0430 500 \u0413\u0411 \u2013 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0439\u0442\u0435 \u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. S3 API, \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 FUSE, Erasure Coding, tiered storage \u2013 \u0432\u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e. \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u0431\u0435\u0441\u0441\u0440\u043e\u0447\u043d\u0430\u044f \u2013 \u0445\u0432\u0430\u0442\u0438\u0442 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432, \u043f\u0438\u043b\u043e\u0442\u043e\u0432 \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0439.\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438:\u041f\u043e\u043b\u043d\u0430\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 S3 API \u2013 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 S3-\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 SDKErasure Coding \u2013 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0434\u043e 50% \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439Tiered storage \u2013 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u044f\u0447\u0438\u043c \u0438 \u0445\u043e\u043b\u043e\u0434\u043d\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043cFUSE\/HDFS \u2013 \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u0430\u043a \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2013 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0443\u0437\u043b\u044b \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0414\u0432\u0430 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f: Standalone \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0430 \u0438 Kubernetes \u0434\u043b\u044f production. \u0412\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0438\u043d\u0443\u0442 15.\u00a0S3 \u0410\u0440\u0445\u0438\u043f\u0435\u043b\u0430\u0433 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432:Master \u2013 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439Volume Server \u2013 \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u043e\u043c\u0430Filer \u2013 \u0441\u043b\u043e\u0439 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 PostgreSQLS3 Gateway \u2013 S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 API \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439Admin UI \u2013 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044fSFTP Server \u2013 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u043f\u043e SFTP (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)\u0412 Standalone-\u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u0441\u0435 \u044d\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Docker Compose. \u0412 Kubernetes \u2013 \u0447\u0435\u0440\u0435\u0437 Helm-\u0447\u0430\u0440\u0442\u044b \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c\u044e.\u0413\u0434\u0435 \u0432\u0437\u044f\u0442\u044c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430, \u0436\u043c\u0435\u043c \u00ab\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u00bb, \u0432\u0432\u043e\u0434\u0438\u043c \u0438\u043c\u044f \u0438 \u043f\u043e\u0447\u0442\u0443. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0430\u0440\u0445\u0438\u0432\u0430.\u0412 \u0430\u0440\u0445\u0438\u0432\u0435:- Docker-\u043e\u0431\u0440\u0430\u0437 (qs3archipelago-&lt;version&gt;.tar.gz)- Helm-\u0447\u0430\u0440\u0442 \u0434\u043b\u044f Kubernetes- \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 Docker-\u043e\u0431\u0440\u0430\u0437\u0430\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u043e\u0431\u0440\u0430\u0437 \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Docker:# \u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430gunzip -c qs3archipelago-&lt;version&gt;.tar.gz | docker load# \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438docker images | grep qs3archipelago\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0431\u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0438\u043b\u0438 \u0432 Kubernetes, \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0439\u0442\u0435 \u043e\u0431\u0440\u0430\u0437 \u0432 \u0432\u0430\u0448 container registry:# \u0422\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e registrydocker tag qs3archipelago:latest your-registry.example.com\/qs3archipelago:latest# \u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432 registrydocker push your-registry.example.com\/qs3archipelago:latest\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u0435 your-registry.example.com \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0432\u0430\u0448\u0435\u0433\u043e container registry (Harbor, Nexus, GitLab Registry \u0438 \u0442.\u0434.).\u0427\u0430\u0441\u0442\u044c 1: Standalone-\u0440\u0435\u0436\u0438\u043c\u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0439 \u0434\u043e 10-20 TB.\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f4 \u044f\u0434\u0440\u0430 CPU8 GB RAM\u041b\u044e\u0431\u044b\u0435 \u0434\u0438\u0441\u043a\u0438 (SSD \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435)Docker \u0438 Docker ComposePostgreSQL 15.6+\u0428\u0430\u0433 0: \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 PostgreSQL\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0435\u0451 \u043f\u0435\u0440\u0432\u043e\u0439.\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:&#8212; \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u0441\u044c \u043a PostgreSQL \u043a\u0430\u043a \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440CREATE USER qs3archipelago WITH PASSWORD &#8216;your_secure_password&#8217;;CREATE DATABASE qs3archipelago OWNER qs3archipelago;\u0421\u0445\u0435\u043c\u0430 public \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0445\u0435\u043c\u0430, \u0437\u0430\u0434\u0430\u0439\u0442\u0435 \u0435\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f DB_SCHEMA.\u0428\u0430\u0433 1: Docker ComposeDocker Compose \u2014 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 Standalone-\u0440\u0435\u0436\u0438\u043c\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435.\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b docker-compose.yaml:version: &#171;3.8&#187;services:  weed-master:    image: qs3archipelago:latest #\u0438\u043b\u0438 your-registry.example.com\/qs3archipelago:latest    container_name: weed-master    user: &#171;30002:30002&#187;    environment:      #\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430      WEED_COMMAND: master      WEED_LOG_LEVEL: &#171;1&#187;      # \u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438      WEED_IP: weed-master      WEED_IP_BIND: 0.0.0.0      # \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 Master      WEED_MASTER_PORT: &#171;9333&#187;      WEED_MASTER_DIR: \/data      WEED_MASTER_DEFAULT_REPLICATION: &#171;000&#187;      WEED_MASTER_VOLUME_SIZE_LIMIT_MB: &#171;1000&#187;      # \u041c\u0435\u0442\u0440\u0438\u043a\u0438      WEED_METRICS_PORT: &#171;9327&#187;      # Raft \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438      WEED_MASTER_ELECTION_TIMEOUT: &#171;10s&#187;      WEED_MASTER_HEARTBEAT_INTERVAL: &#171;300ms&#187;      # PostgreSQL (\u0434\u043b\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)      WEED_LEVELDB2_ENABLED: &#171;false&#187;      WEED_POSTGRES2_ENABLED: &#171;true&#187;      WEED_POSTGRES2_HOSTNAME: &#171;host.docker.internal&#187;        # \u0438\u043b\u0438 IP \u0432\u0430\u0448\u0435\u0433\u043e PostgreSQL      WEED_POSTGRES2_PORT: &#171;5432&#187;      WEED_POSTGRES2_USERNAME: &#171;qs3archipelago&#187;      WEED_POSTGRES2_PASSWORD: &#171;your_secure_password&#187;      WEED_POSTGRES2_DATABASE: &#171;qs3archipelago&#187;      WEED_POSTGRES2_SSLMODE: &#171;disable&#187;    ports:      &#8212; &#171;9333:9333&#187;        # HTTP API      &#8212; &#171;19333:19333&#187;      # gRPC      &#8212; &#171;9327:9327&#187;        # Metrics    volumes:      &#8212; weed-master-data:\/data    networks:      &#8212; weed-net    restart: unless-stoppedweed-volume:    image: qs3archipelago:latest    container_name: weed-volume    user: &#171;30002:30002&#187;    depends_on:      &#8212; weed-master    environment:      WEED_COMMAND: volume      WEED_LOG_LEVEL: &#171;1&#187;      WEED_IP: weed-volume      WEED_IP_BIND: 0.0.0.0      # \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 Volume Server      WEED_VOLUME_PORT: &#171;8080&#187;      WEED_VOLUME_DIR: \/data      WEED_VOLUME_DIR_IDX: \/data      WEED_VOLUME_READ_MODE: proxy      WEED_VOLUME_MIN_FREE_SPACE_PERCENT: &#171;1&#187;      WEED_VOLUME_COMPACTION_MBPS: &#171;50&#187;      # \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Master      WEED_MASTER_SERVERS: weed-master:9333      WEED_METRICS_PORT: &#171;9327&#187;    ports:      &#8212; &#171;8080:8080&#187;    volumes:      &#8212; weed-volume-data:\/data    networks:      &#8212; weed-net    restart: unless-stopped  weed-filer:    image: qs3archipelago:latest    container_name: weed-filer    user: &#171;30002:30002&#187;    depends_on:      &#8212; weed-master      &#8212; weed-volume    environment:      WEED_COMMAND: filer      WEED_LOG_LEVEL: &#171;1&#187;      # \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 Filer      WEED_IP: weed-filer      WEED_IP_BIND: 0.0.0.0      WEED_FILER_PORT: &#171;8888&#187;      WEED_FILER_GRPC_PORT: &#171;18888&#187;      WEED_FILER_DIR_LIST_LIMIT: &#171;100000&#187;      WEED_FILER_DEFAULT_REPLICA_PLACEMENT: &#171;000&#187;      WEED_FILER_BUCKETS_FOLDER: &#171;\/buckets&#187;      WEED_FILER_QUEUES_FOLDER: &#171;\/queues&#187;      WEED_FILER_OPTIONS_RECURSIVE_DELETE: &#171;false&#187;      # \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Master      WEED_MASTER_SERVERS: weed-master:9333      WEED_FILER_MASTER: weed-master:9333      # PostgreSQL (\u0431\u044d\u043a\u0435\u043d\u0434 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445)      WEED_LEVELDB2_ENABLED: &#171;false&#187;      WEED_POSTGRES2_ENABLED: &#171;true&#187;      WEED_POSTGRES2_HOSTNAME: &#171;host.docker.internal&#187;      # \u0438\u043b\u0438 IP \u0432\u0430\u0448\u0435\u0433\u043e PostgreSQL      WEED_POSTGRES2_PORT: &#171;5432&#187;      WEED_POSTGRES2_USERNAME: &#171;qs3archipelago&#187;      WEED_POSTGRES2_PASSWORD: &#171;your_secure_password&#187;      WEED_POSTGRES2_DATABASE: &#171;qs3archipelago&#187;      WEED_POSTGRES2_SSLMODE: &#171;disable&#187;      WEED_METRICS_PORT: &#171;9327&#187;    ports:      &#8212; &#171;8888:8888&#187;      &#8212; &#171;18888:18888&#187;    volumes:      &#8212; weed-filer-data:\/data    networks:      &#8212; weed-net    restart: unless-stopped  weed-s3:    image: qs3archipelago:latest    container_name: weed-s3    user: &#171;30002:30002&#187;    depends_on:      &#8212; weed-filer    environment:      WEED_COMMAND: s3      WEED_LOG_LEVEL: &#171;1&#187;      WEED_IP: weed-s3      WEED_IP_BIND: 0.0.0.0      # \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 S3 Gateway      WEED_S3_PORT: &#171;8333&#187;      WEED_S3_FILER: weed-filer:8888      WEED_METRICS_PORT: &#171;9327&#187;    ports:      &#8212; &#171;8333:8333&#187;    networks:      &#8212; weed-net    restart: unless-stopped  weed-admin:    image: qs3archipelago:latest    container_name: weed-admin    user: &#171;30002:30002&#187;    depends_on:      &#8212; weed-master    environment:      WEED_COMMAND: admin      WEED_LOG_LEVEL: &#171;1&#187;      # \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0306\u043a\u0438 Admin UI      WEED_ADMIN_PORT: &#171;8081&#187;      WEED_ADMIN_DATA_DIR: \/data      WEED_ADMIN_USER: admin      WEED_ADMIN_PASSWORD: admin    # \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043d\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0438\u0306 \u043f\u0430\u0440\u043e\u043b\u044c!      WEED_ADMIN_MASTERS: weed-master:9333    ports:      &#8212; &#171;8081:8081&#187;    volumes:      &#8212; weed-admin-data:\/data    networks:      &#8212; weed-net    restart: unless-stoppednetworks:  weed-net:    driver: bridgevolumes:  weed-master-data:  weed-volume-data:  weed-filer-data:  weed-admin-data:\u0412\u0430\u0436\u043d\u043e \u043e volumes: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 named volumes (\u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435) \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043c\u0438 Docker. \u0410\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 volumes \u0438\u043b\u0438 bind mounts \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.\u0417\u0430\u043f\u0443\u0441\u043a:docker-compose up -d\u00a0\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435:Master UI: http:\/\/localhost:9333Volume Server: http:\/\/localhost:8080Filer UI: http:\/\/localhost:8888S3 API: http:\/\/localhost:8333Admin UI: http:\/\/localhost:8081\u0428\u0430\u0433 2: \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438# \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c Mastercurl http:\/\/localhost:9333\/cluster\/status# \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c Filercurl http:\/\/localhost:8888\/# \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c S3curl http:\/\/localhost:8333\/status\u0428\u0430\u0433 3: \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 S3-\u0434\u043e\u0441\u0442\u0443\u043f\u0430\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e S3 Gateway \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430:\u0427\u0435\u0440\u0435\u0437 Admin UI:\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 http:\/\/localhost:8081\u0412\u043e\u0439\u0434\u0438\u0442\u0435 \u0441 credentials \u0438\u0437 WEED_ADMIN_USER \/ WEED_ADMIN_PASSWORD\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b S3 \u2192 Identities\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 Access Key \u0438 Secret Key\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 aws-cli:aws configure# AWS Access Key ID: your_access_key# AWS Secret Access Key: your_secret_key# Default region name: ru-msk-1# Default output format: json# \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043caws s3 mb s3:\/\/test-bucket &#8212;endpoint-url http:\/\/localhost:8333aws s3 cp \/etc\/hosts s3:\/\/test-bucket\/hosts.txt &#8212;endpoint-url http:\/\/localhost:8333aws s3 ls s3:\/\/test-bucket\/ &#8212;endpoint-url http:\/\/localhost:8333\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Standalone\u041d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430? \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 Volume Server \u0432 docker-compose.yaml:yaml  weed-volume2:    image: qs3archipelago:latest    container_name: weed-volume2    user: &#171;30002:30002&#187;    depends_on:      &#8212; weed-master    environment:      WEED_COMMAND: volume      WEED_IP: weed-volume2      WEED_IP_BIND: 0.0.0.0      WEED_VOLUME_PORT: &#171;8080&#187;      WEED_VOLUME_DIR: \/data      WEED_MASTER_SERVERS: weed-master:9333    volumes:      &#8212; weed-volume2-data:\/data    networks:      &#8212; weed-net    restart: unless-stoppedMaster \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u0438\u0442 \u043d\u043e\u0432\u044b\u0439 \u0443\u0437\u0435\u043b.\u0427\u0430\u0441\u0442\u044c 2: Kubernetes-\u0440\u0435\u0436\u0438\u043c\u0414\u043b\u044f production-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0441 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c\u044e \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:Kubernetes 1.24+ (\u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u043d\u0430 Deckhouse, vanilla K8s)Helm 3.xPostgreSQL 15.6+ (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c Digital Q.DataBase \u0438\u043b\u0438 \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440)StorageClass \u0434\u043b\u044f persistent&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-478918","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478918","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=478918"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478918\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=478918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=478918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=478918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}