{"id":489614,"date":"2026-08-03T18:22:35","date_gmt":"2026-08-03T18:22:35","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=489614"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=489614","title":{"rendered":"\u0420\u0435\u043b\u0438\u0437 DataSafeS3 v1.3.0"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><strong>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/strong> <a href=\"https:\/\/github.com\/DirektorBani\/DataSafeS3\" rel=\"noopener noreferrer nofollow\">github.com\/DirektorBani\/DataSafeS3<\/a><br \/> <strong>\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f:<\/strong> Apache-2.0<br \/> <strong>\u0420\u0435\u043b\u0438\u0437:<\/strong> <a href=\"https:\/\/github.com\/DirektorBani\/DataSafeS3\/releases\/tag\/v1.3.0\" rel=\"noopener noreferrer nofollow\">DataSafeS3 CE v1.3.0<\/a> (3 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2026)<\/p>\n<hr\/>\n<h4>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438 \u0431\u043e\u043b\u044c<\/h4>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/1055644\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e v1.1.0<\/a> HA v2 \u043e\u0441\u0442\u0430\u043b\u0441\u044f lab-\u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c: erasure, Postgres leader lock, \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432 <code>scripts\/ha\/<\/code>. Trusted clusters \u0437\u0430\u043a\u0440\u044b\u043b\u0438 pairing \u0434\u0432\u0443\u0445 \u0441\u0430\u0439\u0442\u043e\u0432. \u041a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0439 \u00ab\u0442\u0440\u0438 \u043d\u043e\u0434\u044b \u2192 Apply \u2192 failover\u00bb \u0434\u043e \u0442\u0435\u0433\u0430 \u043c\u044b \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438.<\/p>\n<p>\u041c\u0435\u0436\u0434\u0443 1.1.0 \u0438 1.3.0 \u0432\u044b\u0448\u043b\u0438 v1.1.1 (MinIO migration kit) \u0438 v1.2.0 (Object Lock + versioning \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438). \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u044b \u043f\u043e\u0434 \u043d\u0438\u0445 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u2014 \u044d\u0442\u043e \u0430\u0434\u043c\u0438\u043d\u0441\u043a\u0438\u0435 \u0433\u0430\u0439\u0434\u044b \u0430 \u043d\u0435 \u0441\u043c\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u043a \u0440\u0435\u043b\u0438\u0437\u0443. <strong>v1.3.0<\/strong> \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0440\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u0432\u0435\u0440\u0438\u044f: \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <strong>cluster installer<\/strong> \u0438 <strong>SSH Docker lab<\/strong>, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c release gate \u043f\u0440\u043e\u0448\u0451\u043b \u0441 <strong>0 SKIP<\/strong>.<\/p>\n<p>\u0421\u0435\u0440\u0438\u044f, \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0432\u043f\u0435\u0440\u0432\u044b\u0435:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1051586\/\" rel=\"noopener noreferrer nofollow\">v1.0.0 \u2014 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1053082\/\" rel=\"noopener noreferrer nofollow\">v1.0.1 \/ v1.0.2 \u2014 \u0447\u0442\u043e \u0447\u0438\u043d\u0438\u043b\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1055644\/\" rel=\"noopener noreferrer nofollow\">v1.1.0 \u2014 trusted clusters, metrics, Teams<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0431\u043e\u043b\u044c \u043f\u043e\u0441\u043b\u0435 1.1.0 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0442\u0430\u043a.<\/p>\n<p><strong>1. Offline compose-lab \u0437\u0435\u043b\u0451\u043d\u044b\u0439, \u043d\u043e VIP\/Patroni &#8212; \u0441\u043a\u0438\u043f\u0430\u043b\u0438\u0441\u044c.<\/strong><br \/> etcd + Postgres + erasure \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 registry. Keepalived (multicast VRRP) \u0438 Patroni promote \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043c\u044b <strong>\u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e<\/strong> \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043b\u0438: Docker Desktop \u0438 L2 multicast \u0436\u0438\u0432\u0443\u0442 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0438\u0440\u0430\u0445. \u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u2014 \u043e\u043a. \u0414\u043b\u044f annotated tag \u2014 \u043f\u043b\u043e\u0445\u043e: \u00ab\u0432\u0441\u0435 \u0437\u0435\u043b\u0451\u043d\u043e\u0435\u00bb, \u0430 \u0441\u0430\u043c\u043e\u0435 \u0440\u0438\u0441\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0435 \u0433\u043e\u043d\u044f\u043b\u0438.<\/p>\n<p><strong>2. \u0420\u0443\u0447\u043d\u043e\u0439 Apply \u043d\u0430 \u0442\u0440\u0451\u0445 \u00ab\u043d\u043e\u0434\u0430\u0445\u00bb \u0432 2 \u0447\u0430\u0441\u0430 \u043d\u043e\u0447\u0438.<\/strong><br \/> Inventory \u0440\u0430\u0437\u044a\u0435\u0437\u0436\u0430\u0435\u0442\u0441\u044f. HAProxy \u0438 Patroni \u0434\u0435\u0440\u0443\u0442\u0441\u044f \u0437\u0430 <code>:5432<\/code>. storage-server \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0434\u043e \u043a\u0432\u043e\u0440\u0443\u043c\u0430. \u0412 secrets \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 replication password \u0432\u043c\u0435\u0441\u0442\u043e superuser: <code>healthz<\/code> 200, \u0431\u0430\u043a\u0435\u0442\u044b \u00ab\u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e\u00bb \u043f\u0443\u0441\u0442\u044b\u0435.<\/p>\n<p>\u041d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u043d\u0435 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d README, \u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0439 \u043f\u0443\u0442\u044c: inventory \u2192 plan \u2192 render \u2192 apply \u2192 drills, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434 <code>v1.3.0<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>fail=0 skip=0<\/code>.<\/p>\n<h4>\u0427\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0432 v1.3.0<\/h4>\n<h3>Cluster installer (Waves 1\u20132)<\/h3>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442\u044b: <code>scripts\/cluster\/<\/code>. \u0428\u0430\u0431\u043b\u043e\u043d\u044b: <code>deploy\/cluster\/templates\/<\/code>. \u0422\u0435\u0441\u0442\u044b: <code>scripts\/tests\/cluster-installer-w1|w2<\/code>.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">Wave<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">inventory \/ plan \/ render \/ \u043a\u0430\u0440\u043a\u0430\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">etcd, Patroni, keepalived, HAProxy, storage <strong>\u043f\u043e\u0441\u043b\u0435<\/strong> quorum<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0414\u0432\u0430 \u0444\u0438\u043a\u0441\u0430 \u0438\u0437 \u0441\u0442\u0435\u043d\u0434\u0430, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 Apply \u00ab\u043f\u043e\u0447\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00bb:<\/p>\n<ol>\n<li>\n<p><strong>HAProxy \u0431\u0438\u043d\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 VIP<\/strong>; Patroni \u0441\u043b\u0443\u0448\u0430\u0435\u0442 fabric <code>NODE_IP:5432<\/code>. \u0418\u043d\u0430\u0447\u0435 colocated LB + Postgres \u0434\u0435\u043b\u044f\u0442 \u043f\u043e\u0440\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>storage-server \u043f\u043e\u0441\u043b\u0435 Patroni quorum<\/strong>; \u0432 secrets \u2014 \u043f\u0430\u0440\u043e\u043b\u044c <strong>superuser<\/strong>, \u043d\u0435 replication.<\/p>\n<\/li>\n<\/ol>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f Patroni \u0438 \u043d\u0435 automatic multi-AZ. \u042d\u0442\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0439 Apply + \u043d\u0430\u0431\u043e\u0440 installer-\u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 SSH Docker lab<\/h3>\n<p>\u0422\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430-VM: <code>ds-lab-node0..2<\/code> \u043d\u0430 <code>10.88.0.10\u201312<\/code>, SSH host ports <code>:2221\u20132223<\/code>, VIP <code>10.88.0.100<\/code> (S3), <code>.101<\/code> (console), <code>.102<\/code> (Postgres) \u0447\u0435\u0440\u0435\u0437 <strong>unicast<\/strong> keepalived.<\/p>\n<pre><code>flowchart LR  subgraph host[\"Host \/ Docker Desktop\"]    OPS[\"Apply + drills&lt;br\/&gt;via SSH :2221\u20132223\"]  end  subgraph fab[\"fabric 10.88.0.0\/24\"]    N0[\"ds-lab-node0&lt;br\/&gt;10.88.0.10\"]    N1[\"ds-lab-node1&lt;br\/&gt;10.88.0.11\"]    N2[\"ds-lab-node2&lt;br\/&gt;10.88.0.12\"]    VIP_S3[\"VIP .100 S3\"]    VIP_UI[\"VIP .101 console\"]    VIP_PG[\"VIP .102 Postgres\"]  end  OPS --&gt;|ssh| N0  OPS --&gt;|ssh| N1  OPS --&gt;|ssh| N2  N0 --- N1  N1 --- N2  N0 -. unicast VRRP .-&gt; VIP_S3  N1 -. unicast VRRP .-&gt; VIP_UI  N2 -. unicast VRRP .-&gt; VIP_PG  N0 --- etcd[\"etcd \u00d73\"]  N1 --- Patroni[\"Patroni \/ Postgres\"]  N2 --- HAP[\"HAProxy on VIP only\"]  HAP --&gt; Patroni  HAP --&gt; storage[\"storage-server&lt;br\/&gt;after quorum\"]<\/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<blockquote>\n<p>Unicast VRRP \u0432\u044b\u0431\u0440\u0430\u043d \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430 Docker bridge multicast keepalived \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0434\u0430\u0451\u0442 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 L2-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439. Lab \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 Apply\/drill-path, \u043d\u0435 parity \u0441 bare-metal.<\/p>\n<\/blockquote>\n<h3>Release gate: \u043a\u0430\u043a \u0433\u043e\u043d\u044f\u043b\u0438<\/h3>\n<p><strong>\u041d\u0430 Windows-\u0445\u043e\u0441\u0442\u0435 (PowerShell) \u2014 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0441\u043e\u0431\u0440\u0430\u0442\u044c offline-\u0431\u0430\u043d\u0434\u043b \u0438 \u043e\u0431\u0440\u0430\u0437 \u043d\u043e\u0434\u044b<\/strong> (\u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u043a\u043b\u043e\u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f):<\/p>\n<pre><code class=\"powershell\">powershell -NoProfile -File scripts\\cluster\\lab\\fetch-offline-bundle.ps1powershell -NoProfile -File scripts\\cluster\\lab\\fetch-apk-closure.ps1docker build -f deploy\\cluster\\lab\\Dockerfile.offline -t datasafe-cluster-node:lab deploy\\cluster\\lab<\/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>\u0414\u0430\u043b\u044c\u0448\u0435 lab-\u0441\u043a\u0440\u0438\u043f\u0442\u044b (Bash \/ Git Bash \/ WSL):<\/strong><\/p>\n<pre><code class=\"bash\">bash scripts\/cluster\/lab\/up-ssh.shbash scripts\/cluster\/lab\/run-apply-ssh.shbash scripts\/cluster\/lab\/run-drills-ssh.sh# \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435: skip=0 fail=0<\/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\u0440\u043e\u0433\u043e\u043d 3 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2026: Apply PASS; drills <strong>9 PASS \/ 0 FAIL \/ 0 SKIP<\/strong>; Patroni promote \u2248 <strong>36 \u0441<\/strong> (\u043f\u043e\u0440\u043e\u0433 \u2264 60 \u0441). README: <a href=\"https:\/\/github.com\/DirektorBani\/DataSafeS3\/blob\/main\/deploy\/cluster\/lab\/README.md\" rel=\"noopener noreferrer nofollow\"><code>deploy\/cluster\/lab\/README.md<\/code><\/a>.<\/p>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u0433\u0440\u0430\u0431\u043b\u0438 \u0441\u0442\u0435\u043d\u0434\u0430 (\u0442\u043e, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u00abApply \u0431\u044b\u043b \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0434\u0435\u00bb):<\/p>\n<ul>\n<li>\n<p>Alpine account lock \u2192 <code>usermod -p '*'<\/code><\/p>\n<\/li>\n<li>\n<p><code>ssh<\/code> \u0431\u0435\u0437 <code>-n<\/code> \u0441\u044a\u0435\u0434\u0430\u0435\u0442 stdin \u2192 Apply \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e node1\/node2<\/p>\n<\/li>\n<li>\n<p>CRLF \u0432 render\/apply \u043d\u0430 Windows<\/p>\n<\/li>\n<li>\n<p>etcd: \u043d\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>ETCD_*<\/code>, \u0435\u0441\u043b\u0438 CLI \u0443\u0436\u0435 \u043d\u0430 \u0444\u043b\u0430\u0433\u0430\u0445<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 Grafana + install entrypoints<\/h3>\n<p>Gauge\u2019\u0438 <code>datasafe_cluster_node_*<\/code> \/ overall \/ HA, \u0434\u0430\u0448\u0431\u043e\u0440\u0434 <code>deploy\/docker\/grafana\/dashboards\/datasafe-cluster.json<\/code>. \u041f\u0443\u0441\u0442\u043e\u0439 Admin <code>Cluster.Nodes<\/code> \u2192 fallback <code>localhost:9000<\/code>.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/fe5\/ec1\/8a2\/fe5ec18a26850be17bcd6862bc0a058d.png\" alt=\"\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 DataSafeS3\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/fe5\/ec1\/8a2\/fe5ec18a26850be17bcd6862bc0a058d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/fe5\/ec1\/8a2\/fe5ec18a26850be17bcd6862bc0a058d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 DataSafeS3<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/fe5\/ec1\/8a2\/fe5ec18a26850be17bcd6862bc0a058d.png\" alt=\"Grafana Overview\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/fe5\/ec1\/8a2\/fe5ec18a26850be17bcd6862bc0a058d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/fe5\/ec1\/8a2\/fe5ec18a26850be17bcd6862bc0a058d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Grafana Overview<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p>SSH lab \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 compose \u2014 <strong>\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0435\u0442\u0438<\/strong>. \u00ab\u041f\u0443\u0441\u0442\u0430\u044f\u00bb Grafana \u0447\u0430\u0449\u0435 \u0437\u043d\u0430\u0447\u0438\u0442 \u00ab\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0435 \u0442\u043e\u0442 Prometheus\u00bb, \u0430 \u043d\u0435 \u00ab\u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u043b\u043e\u043c\u0430\u043d\u044b\u00bb.<\/p>\n<\/blockquote>\n<p>\u0412 \u043a\u043e\u0440\u043d\u0435: <code>install.ps1<\/code> \/ <code>install.sh<\/code> \/ <code>install.cmd<\/code>, optional <code>identity<\/code> profile; \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 login-options \u0434\u043b\u044f LDAP\/OIDC \u043a\u043d\u043e\u043f\u043e\u043a \u0431\u0435\u0437 \u0443\u0442\u0435\u0447\u043a\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432; overlays \u0432 <code>deploy\/compose\/<\/code>.<\/p>\n<h3>\u041c\u0435\u0436\u0434\u0443 1.1.0 \u0438 1.3.0<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0412\u0435\u0440\u0441\u0438\u044f<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0434\u0430\u0451\u0442 \u0430\u0434\u043c\u0438\u043d\u0443<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">v1.1.1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/DirektorBani\/DataSafeS3\/blob\/main\/docs\/operations-guide\/ru\/migrate-from-minio.md\" rel=\"noopener noreferrer nofollow\">migrate-from-minio<\/a>, <code>storage-cli migrate checklist<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">v1.2.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">Object Lock + versioning Suspend \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438; WORM \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 Object Lock \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0451\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">v1.3.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">cluster installer + SSH lab release gate (0 SKIP) + cluster metrics<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430 1.1.0 \u0438 \u0446\u0435\u043b\u044c \u2014 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0439 lab, \u0440\u0430\u0437\u0443\u043c\u043d\u0435\u0435 \u0441\u0440\u0430\u0437\u0443 <strong>1.3.0<\/strong>.<\/p>\n<h4>\u0427\u0435\u0441\u0442\u043d\u043e \u043f\u0440\u043e \u043f\u0440\u0435\u0434\u0435\u043b\u044b<\/h4>\n<ul>\n<li>\n<p>Unicast VRRP \u043d\u0430 Docker Desktop <strong>\u2260<\/strong> bare-metal L2 multicast keepalived.<\/p>\n<\/li>\n<li>\n<p>Offline compose-lab \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 <strong>SKIP<\/strong> VIP\/Patroni \u2014 no-skip path \u0442\u043e\u043b\u044c\u043a\u043e SSH lab.<\/p>\n<\/li>\n<li>\n<p>Installer + drills <strong>\u043d\u0435<\/strong> \u0434\u0435\u043b\u0430\u044e\u0442 \u0438\u0437 CE automatic multi-AZ orchestrator \u0438 \u043d\u0435 \u00ab\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u00bb Patroni.<\/p>\n<\/li>\n<li>\n<p>Grafana multi-node \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 <code>Cluster.Nodes<\/code> (\u0438 reachable targets); \u0438\u043d\u0430\u0447\u0435 \u043e\u0434\u0438\u043d localhost-fallback.<\/p>\n<\/li>\n<li>\n<p>Object Lock \u0438\u0437 1.2.0 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u043a\u0435\u0442 \u0432 WORM \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041a\u0430\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c<\/h4>\n<p>\u041e\u0431\u0440\u0430\u0437\u044b \u0440\u0435\u043b\u0438\u0437\u0430:<\/p>\n<pre><code class=\"bash\">docker pull ghcr.io\/direktorbani\/datasafe-storage-server:v1.3.0docker pull ghcr.io\/direktorbani\/datasafe-console:v1.3.0<\/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<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0417\u0430\u0447\u0435\u043c<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">storage-server <strong>\u0438<\/strong> console = v1.3.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0434\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f API\/UI<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>run-drills-ssh.sh<\/code> \u2192 skip=0 fail=0<\/p>\n<\/td>\n<td>\n<p align=\"left\">release gate<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>cluster-installer-w1<\/code> \/ <code>w2<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f installer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>Cluster.Nodes<\/code> + Grafana dashboard<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c lab \u0438 main stack<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Object Lock \/ <code>retention_mode<\/code> (\u0435\u0441\u043b\u0438 \u0448\u043b\u0438 \u0441 1.2.0)<\/p>\n<\/td>\n<td>\n<p align=\"left\">GOVERNANCE vs COMPLIANCE \u044f\u0432\u043d\u043e<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>CHANGELOG: <a href=\"https:\/\/github.com\/DirektorBani\/DataSafeS3\/blob\/main\/CHANGELOG.md\" rel=\"noopener noreferrer nofollow\">CHANGELOG.md<\/a>. Notes: <a href=\"https:\/\/github.com\/DirektorBani\/DataSafeS3\/releases\/tag\/v1.3.0\" rel=\"noopener noreferrer nofollow\">v1.3.0<\/a>. Upgrade: <a href=\"https:\/\/github.com\/DirektorBani\/DataSafeS3\/blob\/main\/docs\/operations-guide\/ru\/upgrade.md\" rel=\"noopener noreferrer nofollow\">operations-guide\/ru\/upgrade.md<\/a>.<\/p>\n<h4>\u0418\u0442\u043e\u0433 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438<\/h4>\n<p>v1.3.0 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u044b\u0432 \u043c\u0435\u0436\u0434\u0443 \u00abHA lab \u0435\u0441\u0442\u044c \u0432 README\u00bb \u0438 \u00ab\u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u0433\u043e\u043c \u043f\u0440\u043e\u0433\u043d\u0430\u043b\u0438 Apply + promote + VIP move \u0441 \u043d\u0443\u043b\u0451\u043c SKIP\u00bb. \u042d\u0442\u043e CE \u0438 Docker-lab \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e, \u043d\u0435 \u043f\u0430\u0441\u043f\u043e\u0440\u0442 \u0426\u041e\u0414.<\/p>\n<p>\u0423\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u2014 <a href=\"https:\/\/github.com\/DirektorBani\/DataSafeS3\/SECURITY.md\" rel=\"noopener noreferrer nofollow\">SECURITY.md<\/a>. \u0411\u0430\u0433\u0438 \u2014 GitHub Issues.<\/p>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441 \u043a \u0442\u0435\u043c, \u043a\u0442\u043e \u0443\u0436\u0435 \u043a\u0440\u0443\u0442\u0438\u0442 Patroni\/keepalived \u043d\u0435 \u0432 Docker: <strong>\u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0432\u0430\u0441 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c unicast VRRP \u043a\u0430\u043a \u044f\u0432\u043d\u044b\u0439 lab-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442<\/strong>, \u0438\u043b\u0438 release gate \u043e\u0431\u044f\u0437\u0430\u043d \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c multicast \u043d\u0430 \u00ab\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445\u00bb VM? \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435, \u0433\u0434\u0435 \u0431\u044b \u0432\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0447\u0435\u0440\u0442\u0443 \u2014 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e ops-\u043e\u043f\u044b\u0442 \u0430 \u043d\u0435 \u00ab\u043d\u0443\u0436\u0435\u043d Enterprise\u00bb.<\/p>\n<h4>\u0421\u0435\u0440\u0438\u044f \u043d\u0430 Habr<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">#<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0422\u0435\u043c\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u0441\u044b\u043b\u043a\u0430<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0431\u0437\u043e\u0440 v1.0.0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/habr.com\/ru\/articles\/1051586\/\" rel=\"noopener noreferrer nofollow\">\u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">v1.0.1, v1.0.2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/habr.com\/ru\/articles\/1053082\/\" rel=\"noopener noreferrer nofollow\">\u0447\u0442\u043e \u043d\u0430\u0448\u043b\u0438 \u0438 \u043f\u043e\u0447\u0438\u043d\u0438\u043b\u0438<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">v1.1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/habr.com\/ru\/articles\/1055644\/\" rel=\"noopener noreferrer nofollow\">trusted clusters<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">v1.3.0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><em>\u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f<\/em><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr\/>\n<p><em>\u0410\u0432\u0442\u043e\u0440:<\/em> <em>\u0418\u043b\u044c\u044f \u0422\u0440\u0430\u0447\u0443\u043a<\/em> <em>\u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a DataSafeS3<\/em><\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1066236\/\">https:\/\/habr.com\/ru\/articles\/1066236\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439: github.com\/DirektorBani\/DataSafeS3 \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f: Apache-2.0 \u0420\u0435\u043b\u0438\u0437: DataSafeS3 CE v1.3.0 (3 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2026)\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438 \u0431\u043e\u043b\u044c\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e v1.1.0 HA v2 \u043e\u0441\u0442\u0430\u043b\u0441\u044f lab-\u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c: erasure, Postgres leader lock, \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432 scripts\/ha\/. Trusted clusters \u0437\u0430\u043a\u0440\u044b\u043b\u0438 pairing \u0434\u0432\u0443\u0445 \u0441\u0430\u0439\u0442\u043e\u0432. \u041a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0439 \u00ab\u0442\u0440\u0438 \u043d\u043e\u0434\u044b \u2192 Apply \u2192 failover\u00bb \u0434\u043e \u0442\u0435\u0433\u0430 \u043c\u044b \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438.\u041c\u0435\u0436\u0434\u0443 1.1.0 \u0438 1.3.0 \u0432\u044b\u0448\u043b\u0438 v1.1.1 (MinIO migration kit) \u0438 v1.2.0 (Object Lock + versioning \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438). \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u044b \u043f\u043e\u0434 \u043d\u0438\u0445 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u2014 \u044d\u0442\u043e \u0430\u0434\u043c\u0438\u043d\u0441\u043a\u0438\u0435 \u0433\u0430\u0439\u0434\u044b \u0430 \u043d\u0435 \u0441\u043c\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u043a \u0440\u0435\u043b\u0438\u0437\u0443. v1.3.0 \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0440\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u0432\u0435\u0440\u0438\u044f: \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f cluster installer \u0438 SSH Docker lab, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c release gate \u043f\u0440\u043e\u0448\u0451\u043b \u0441 0 SKIP.\u0421\u0435\u0440\u0438\u044f, \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0432\u043f\u0435\u0440\u0432\u044b\u0435:v1.0.0 \u2014 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440v1.0.1 \/ v1.0.2 \u2014 \u0447\u0442\u043e \u0447\u0438\u043d\u0438\u043b\u0438v1.1.0 \u2014 trusted clusters, metrics, Teams\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0431\u043e\u043b\u044c \u043f\u043e\u0441\u043b\u0435 1.1.0 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0442\u0430\u043a.1. Offline compose-lab \u0437\u0435\u043b\u0451\u043d\u044b\u0439, \u043d\u043e VIP\/Patroni &#8212; \u0441\u043a\u0438\u043f\u0430\u043b\u0438\u0441\u044c. etcd + Postgres + erasure \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 registry. Keepalived (multicast VRRP) \u0438 Patroni promote \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043c\u044b \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043b\u0438: Docker Desktop \u0438 L2 multicast \u0436\u0438\u0432\u0443\u0442 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0438\u0440\u0430\u0445. \u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u2014 \u043e\u043a. \u0414\u043b\u044f annotated tag \u2014 \u043f\u043b\u043e\u0445\u043e: \u00ab\u0432\u0441\u0435 \u0437\u0435\u043b\u0451\u043d\u043e\u0435\u00bb, \u0430 \u0441\u0430\u043c\u043e\u0435 \u0440\u0438\u0441\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0435 \u0433\u043e\u043d\u044f\u043b\u0438.2. \u0420\u0443\u0447\u043d\u043e\u0439 Apply \u043d\u0430 \u0442\u0440\u0451\u0445 \u00ab\u043d\u043e\u0434\u0430\u0445\u00bb \u0432 2 \u0447\u0430\u0441\u0430 \u043d\u043e\u0447\u0438. Inventory \u0440\u0430\u0437\u044a\u0435\u0437\u0436\u0430\u0435\u0442\u0441\u044f. HAProxy \u0438 Patroni \u0434\u0435\u0440\u0443\u0442\u0441\u044f \u0437\u0430 :5432. storage-server \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0434\u043e \u043a\u0432\u043e\u0440\u0443\u043c\u0430. \u0412 secrets \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 replication password \u0432\u043c\u0435\u0441\u0442\u043e superuser: healthz 200, \u0431\u0430\u043a\u0435\u0442\u044b \u00ab\u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e\u00bb \u043f\u0443\u0441\u0442\u044b\u0435.\u041d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u043d\u0435 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d README, \u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0439 \u043f\u0443\u0442\u044c: inventory \u2192 plan \u2192 render \u2192 apply \u2192 drills, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434 v1.3.0 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c fail=0 skip=0.\u0427\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0432 v1.3.0Cluster installer (Waves 1\u20132)\u0421\u043a\u0440\u0438\u043f\u0442\u044b: scripts\/cluster\/. \u0428\u0430\u0431\u043b\u043e\u043d\u044b: deploy\/cluster\/templates\/. \u0422\u0435\u0441\u0442\u044b: scripts\/tests\/cluster-installer-w1|w2.Wave\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u04351inventory \/ plan \/ render \/ \u043a\u0430\u0440\u043a\u0430\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a2etcd, Patroni, keepalived, HAProxy, storage \u043f\u043e\u0441\u043b\u0435 quorum\u0414\u0432\u0430 \u0444\u0438\u043a\u0441\u0430 \u0438\u0437 \u0441\u0442\u0435\u043d\u0434\u0430, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 Apply \u00ab\u043f\u043e\u0447\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00bb:HAProxy \u0431\u0438\u043d\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 VIP; Patroni \u0441\u043b\u0443\u0448\u0430\u0435\u0442 fabric NODE_IP:5432. \u0418\u043d\u0430\u0447\u0435 colocated LB + Postgres \u0434\u0435\u043b\u044f\u0442 \u043f\u043e\u0440\u0442.storage-server \u043f\u043e\u0441\u043b\u0435 Patroni quorum; \u0432 secrets \u2014 \u043f\u0430\u0440\u043e\u043b\u044c superuser, \u043d\u0435 replication.\u042d\u0442\u043e \u043d\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f Patroni \u0438 \u043d\u0435 automatic multi-AZ. \u042d\u0442\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0439 Apply + \u043d\u0430\u0431\u043e\u0440 installer-\u0442\u0435\u0441\u0442\u043e\u0432.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 SSH Docker lab\u0422\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430-VM: ds-lab-node0..2 \u043d\u0430 10.88.0.10\u201312, SSH host ports :2221\u20132223, VIP 10.88.0.100 (S3), .101 (console), .102 (Postgres) \u0447\u0435\u0440\u0435\u0437 unicast keepalived.flowchart LR  subgraph host[&#171;Host \/ Docker Desktop&#187;]    OPS[&#171;Apply + drills&lt;br\/&gt;via SSH :2221\u20132223&#187;]  end  subgraph fab[&#171;fabric 10.88.0.0\/24&#187;]    N0[&#171;ds-lab-node0&lt;br\/&gt;10.88.0.10&#187;]    N1[&#171;ds-lab-node1&lt;br\/&gt;10.88.0.11&#187;]    N2[&#171;ds-lab-node2&lt;br\/&gt;10.88.0.12&#187;]    VIP_S3[&#171;VIP .100 S3&#187;]    VIP_UI[&#171;VIP .101 console&#187;]    VIP_PG[&#171;VIP .102 Postgres&#187;]  end  OPS &#8212;&gt;|ssh| N0  OPS &#8212;&gt;|ssh| N1  OPS &#8212;&gt;|ssh| N2  N0 &#8212; N1  N1 &#8212; N2  N0 -. unicast VRRP .-&gt; VIP_S3  N1 -. unicast VRRP .-&gt; VIP_UI  N2 -. unicast VRRP .-&gt; VIP_PG  N0 &#8212; etcd[&#171;etcd \u00d73&#187;]  N1 &#8212; Patroni[&#171;Patroni \/ Postgres&#187;]  N2 &#8212; HAP[&#171;HAProxy on VIP only&#187;]  HAP &#8212;&gt; Patroni  HAP &#8212;&gt; storage[&#171;storage-server&lt;br\/&gt;after quorum&#187;]Unicast VRRP \u0432\u044b\u0431\u0440\u0430\u043d \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430 Docker bridge multicast keepalived \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0434\u0430\u0451\u0442 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 L2-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439. Lab \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 Apply\/drill-path, \u043d\u0435 parity \u0441 bare-metal.Release gate: \u043a\u0430\u043a \u0433\u043e\u043d\u044f\u043b\u0438\u041d\u0430 Windows-\u0445\u043e\u0441\u0442\u0435 (PowerShell) \u2014 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0441\u043e\u0431\u0440\u0430\u0442\u044c offline-\u0431\u0430\u043d\u0434\u043b \u0438 \u043e\u0431\u0440\u0430\u0437 \u043d\u043e\u0434\u044b (\u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u043a\u043b\u043e\u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f):powershell -NoProfile -File scripts\\cluster\\lab\\fetch-offline-bundle.ps1powershell -NoProfile -File scripts\\cluster\\lab\\fetch-apk-closure.ps1docker build -f deploy\\cluster\\lab\\Dockerfile.offline -t datasafe-cluster-node:lab deploy\\cluster\\lab\u0414\u0430\u043b\u044c\u0448\u0435 lab-\u0441\u043a\u0440\u0438\u043f\u0442\u044b (Bash \/ Git Bash \/ WSL):bash scripts\/cluster\/lab\/up-ssh.shbash scripts\/cluster\/lab\/run-apply-ssh.shbash scripts\/cluster\/lab\/run-drills-ssh.sh# \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435: skip=0 fail=0\u041f\u0440\u043e\u0433\u043e\u043d 3 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2026: Apply PASS; drills 9 PASS \/ 0 FAIL \/ 0 SKIP; Patroni promote \u2248 36 \u0441 (\u043f\u043e\u0440\u043e\u0433 \u2264 60 \u0441). README: deploy\/cluster\/lab\/README.md.\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u0433\u0440\u0430\u0431\u043b\u0438 \u0441\u0442\u0435\u043d\u0434\u0430 (\u0442\u043e, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u00abApply \u0431\u044b\u043b \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0434\u0435\u00bb):Alpine account lock \u2192 usermod -p &#8216;*&#8217;ssh \u0431\u0435\u0437 -n \u0441\u044a\u0435\u0434\u0430\u0435\u0442 stdin \u2192 Apply \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e node1\/node2CRLF \u0432 render\/apply \u043d\u0430 Windowsetcd: \u043d\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c ETCD_*, \u0435\u0441\u043b\u0438 CLI \u0443\u0436\u0435 \u043d\u0430 \u0444\u043b\u0430\u0433\u0430\u0445\u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 Grafana + install entrypointsGauge\u2019\u0438 datasafe_cluster_node_* \/ overall \/ HA, \u0434\u0430\u0448\u0431\u043e\u0440\u0434 deploy\/docker\/grafana\/dashboards\/datasafe-cluster.json. \u041f\u0443\u0441\u0442\u043e\u0439 Admin Cluster.Nodes \u2192 fallback localhost:9000.\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 DataSafeS3Grafana OverviewSSH lab \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 compose \u2014 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0435\u0442\u0438. \u00ab\u041f\u0443\u0441\u0442\u0430\u044f\u00bb Grafana \u0447\u0430\u0449\u0435 \u0437\u043d\u0430\u0447\u0438\u0442 \u00ab\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0435 \u0442\u043e\u0442 Prometheus\u00bb, \u0430 \u043d\u0435 \u00ab\u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u043b\u043e\u043c\u0430\u043d\u044b\u00bb.\u0412 \u043a\u043e\u0440\u043d\u0435: install.ps1 \/ install.sh \/ install.cmd, optional identity profile; \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 login-options \u0434\u043b\u044f LDAP\/OIDC \u043a\u043d\u043e\u043f\u043e\u043a \u0431\u0435\u0437 \u0443\u0442\u0435\u0447\u043a\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432; overlays \u0432 deploy\/compose\/.\u041c\u0435\u0436\u0434\u0443 1.1.0 \u0438 1.3.0\u0412\u0435\u0440\u0441\u0438\u044f\u0427\u0442\u043e \u0434\u0430\u0451\u0442 \u0430\u0434\u043c\u0438\u043d\u0443v1.1.1migrate-from-minio, storage-cli migrate checklistv1.2.0Object Lock + versioning Suspend \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438; WORM \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 Object Lock \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0451\u043dv1.3.0cluster installer + SSH lab release gate (0 SKIP) + cluster metrics\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430 1.1.0 \u0438 \u0446\u0435\u043b\u044c \u2014 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0439 lab, \u0440\u0430\u0437\u0443\u043c\u043d\u0435\u0435 \u0441\u0440\u0430\u0437\u0443 1.3.0.\u0427\u0435\u0441\u0442\u043d\u043e \u043f\u0440\u043e \u043f\u0440\u0435\u0434\u0435\u043b\u044bUnicast VRRP \u043d\u0430 Docker Desktop \u2260 bare-metal L2 multicast keepalived.Offline compose-lab \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 SKIP VIP\/Patroni \u2014 no-skip path \u0442\u043e\u043b\u044c\u043a\u043e SSH lab.Installer + drills \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0438\u0437 CE automatic multi-AZ orchestrator \u0438 \u043d\u0435 \u00ab\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u00bb Patroni.Grafana multi-node \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 Cluster.Nodes (\u0438 reachable targets); \u0438\u043d\u0430\u0447\u0435 \u043e\u0434\u0438\u043d localhost-fallback.Object Lock \u0438\u0437 1.2.0 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u043a\u0435\u0442 \u0432 WORM \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435.\u041a\u0430\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u041e\u0431\u0440\u0430\u0437\u044b \u0440\u0435\u043b\u0438\u0437\u0430:docker pull ghcr.io\/direktorbani\/datasafe-storage-server:v1.3.0docker pull ghcr.io\/direktorbani\/datasafe-console:v1.3.0\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u0417\u0430\u0447\u0435\u043cstorage-server \u0438 console = v1.3.0\u043e\u0434\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f API\/UIrun-drills-ssh.sh \u2192 skip=0 fail=0release gatecluster-installer-w1 \/ w2\u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f installerCluster.Nodes + Grafana dashboard\u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c lab \u0438 main stackObject Lock \/ retention_mode (\u0435\u0441\u043b\u0438 \u0448\u043b\u0438 \u0441 1.2.0)GOVERNANCE vs COMPLIANCE \u044f\u0432\u043d\u043eCHANGELOG: CHANGELOG.md. Notes: v1.3.0. Upgrade: operations-guide\/ru\/upgrade.md.\u0418\u0442\u043e\u0433 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438v1.3.0 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u044b\u0432 \u043c\u0435\u0436\u0434\u0443 \u00abHA lab \u0435\u0441\u0442\u044c \u0432 README\u00bb \u0438 \u00ab\u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u0433\u043e\u043c \u043f\u0440\u043e\u0433\u043d\u0430\u043b\u0438 Apply + promote + VIP move \u0441 \u043d\u0443\u043b\u0451\u043c SKIP\u00bb. \u042d\u0442\u043e CE \u0438 Docker-lab \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e, \u043d\u0435 \u043f\u0430\u0441\u043f\u043e\u0440\u0442 \u0426\u041e\u0414.\u0423\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u2014 SECURITY.md. \u0411\u0430\u0433\u0438 \u2014 GitHub Issues.\u0412\u043e\u043f\u0440\u043e\u0441 \u043a \u0442\u0435\u043c, \u043a\u0442\u043e \u0443\u0436\u0435 \u043a\u0440\u0443\u0442\u0438\u0442 Patroni\/keepalived \u043d\u0435 \u0432 Docker: \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0432\u0430\u0441 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c unicast VRRP \u043a\u0430\u043a \u044f\u0432\u043d\u044b\u0439 lab-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442, \u0438\u043b\u0438 release gate \u043e\u0431\u044f\u0437\u0430\u043d \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c multicast \u043d\u0430 \u00ab\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445\u00bb VM? \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435, \u0433\u0434\u0435 \u0431\u044b \u0432\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0447\u0435\u0440\u0442\u0443 \u2014 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e ops-\u043e\u043f\u044b\u0442 \u0430 \u043d\u0435 \u00ab\u043d\u0443\u0436\u0435\u043d Enterprise\u00bb.\u0421\u0435\u0440\u0438\u044f \u043d\u0430 Habr#\u0422\u0435\u043c\u0430\u0421\u0441\u044b\u043b\u043a\u04301\u041e\u0431\u0437\u043e\u0440 v1.0.0\u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u04402v1.0.1, v1.0.2\u0447\u0442\u043e \u043d\u0430\u0448\u043b\u0438 \u0438 \u043f\u043e\u0447\u0438\u043d\u0438\u043b\u04383v1.1.0trusted clusters4v1.3.0\u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f\u0410\u0432\u0442\u043e\u0440: \u0418\u043b\u044c\u044f \u0422\u0440\u0430\u0447\u0443\u043a \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a DataSafeS3\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1066236\/<\/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-489614","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/489614","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=489614"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/489614\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=489614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=489614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=489614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}