{"id":475540,"date":"2026-04-11T15:00:13","date_gmt":"2026-04-11T15:00:13","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=475540"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=475540","title":{"rendered":"\u0427\u0430\u0441\u0442\u044c 2: OpenClaw \u0432 open-source \u2014 \u043f\u043e\u043b\u043d\u044b\u0439 \u0433\u0430\u0439\u0434 \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 AI-\u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0430 VPS"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u0432\u0430 \u0434\u043d\u044f \u043d\u0430\u0437\u0430\u0434 \u044f \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u00ab<a href=\"https:\/\/habr.com\/ru\/articles\/1020824\/\" rel=\"noopener noreferrer nofollow\">\u042f \u043f\u043e\u0441\u0430\u0434\u0438\u043b AI-\u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0432\u043e\u0439 VPS \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c SSH<\/a>\u00bb. \u0420\u0435\u0430\u043a\u0446\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0439: \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0431\u044b\u043b\u043e \u043d\u0435 \u043f\u0440\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u043f\u0440\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0443. \u00ab\u041f\u043e\u043a\u0430\u0436\u0438 docker-compose\u00bb, \u00ab\u0434\u0430\u0439 \u0441\u043a\u0440\u0438\u043f\u0442\u044b\u00bb, \u00ab\u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0443 \u0441\u0435\u0431\u044f\u00bb.<\/p>\n<p>\u041f\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0441\u044c\u0431\u0430\u043c \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u0432\u0441\u0451 \u0432 open-source: \u043a\u043e\u043d\u0444\u0438\u0433\u0438, \u0441\u043a\u0440\u0438\u043f\u0442\u044b, docker-compose, deploy-\u0441\u043a\u0440\u0438\u043f\u0442 \u2014 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0437\u0430 10 \u043c\u0438\u043d\u0443\u0442.<\/p>\n<p><strong>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/strong> <a href=\"https:\/\/github.com\/ShyDamn\/openclaw-devops-kit\" rel=\"noopener noreferrer nofollow\">github.com\/ShyDamn\/openclaw-devops-kit<\/a><\/p>\n<p>\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u2014 MIT. \u0411\u0435\u0440\u0438\u0442\u0435, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0439\u0442\u0435, \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u2014 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u00bb, \u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430: \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d, \u043a\u0430\u043a \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0441\u0435\u0431\u044f. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043d\u0435\u0448\u0442\u0430\u0442\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 \u0447\u0451\u0440\u043d\u043e\u0439 \u043a\u043e\u0440\u043e\u0431\u043a\u043e\u0439.<\/p>\n<hr\/>\n<h3>\u0427\u0442\u043e \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0432 \u0438\u0442\u043e\u0433\u0435<\/h3>\n<p>AI-\u0430\u0433\u0435\u043d\u0442 \u0432 Telegram, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0436\u0438\u0432\u0451\u0442 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c VPS \u0438 \u0443\u043c\u0435\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043b\u043e\u0433\u0438, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 docker compose \u043f\u0440\u043e\u0435\u043a\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 PostgreSQL (\u0441\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043a\u0440\u0435\u0434\u044b \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430)<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u0430\u0439\u0442\u044b \u043f\u043e HTTP \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0443\u043f\u0430\u0432\u0448\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0421\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 Nginx, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c fail2ban, \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0432 YouTrack, \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u0442\u044c n8n-\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0447\u0430\u0441 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (heartbeat)<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438 \u043a\u043e\u0434 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u044b \u043e\u0431\u0449\u0430\u0435\u0442\u0435\u0441\u044c \u0441 \u043d\u0438\u043c \u043d\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435. \u041d\u0435 <code>docker logs --tail 100 my-container-name<\/code>, \u0430 \u00ab\u043f\u043e\u043a\u0430\u0436\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043b\u043e\u0433\u0438 auth-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00bb. \u041d\u0435 <code>docker exec postgres psql -U user -d mydb -c \"SELECT COUNT(*) FROM users WHERE created_at &gt; NOW() - INTERVAL '7 days'\"<\/code>, \u0430 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044e\u0437\u0435\u0440\u043e\u0432 \u0437\u0430\u0440\u0435\u0433\u0430\u043b\u043e\u0441\u044c \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e\u00bb.<\/p>\n<hr\/>\n<h3>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<ul>\n<li>\n<p><strong>VPS \u0441 Ubuntu 20.04+<\/strong> (\u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 Linux \u0441 Docker). \u041c\u0438\u043d\u0438\u043c\u0443\u043c 2 \u0413\u0411 RAM \u2014 \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 ~300\u2013500 \u041c\u0411.<\/p>\n<\/li>\n<li>\n<p><strong>Docker + Docker Compose V2<\/strong>. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c: <code>docker compose version<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 <a href=\"https:\/\/docs.docker.com\/engine\/install\/ubuntu\/\" rel=\"noopener noreferrer nofollow\">docs.docker.com\/engine\/install<\/a>.<\/p>\n<\/li>\n<li>\n<p><strong>API-\u043a\u043b\u044e\u0447 OpenRouter<\/strong> (<a href=\"https:\/\/openrouter.ai\/keys\" rel=\"noopener noreferrer nofollow\">openrouter.ai\/keys<\/a>) \u2014 \u0435\u0434\u0438\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f GPT-4o, Claude, Gemini, DeepSeek. \u0425\u0432\u0430\u0442\u0438\u0442 $5\u201310 \u043d\u0430 \u043c\u0435\u0441\u044f\u0446 \u043f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438. \u041c\u043e\u0436\u043d\u043e \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 OpenAI \u0438\u043b\u0438 Anthropic, \u043d\u043e OpenRouter \u0443\u0434\u043e\u0431\u043d\u0435\u0435: \u0444\u043e\u043b\u0431\u044d\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438, \u0435\u0434\u0438\u043d\u044b\u0439 \u0431\u0438\u043b\u043b\u0438\u043d\u0433, \u0432\u0441\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>Telegram-\u0431\u043e\u0442<\/strong> \u043e\u0442 <a href=\"https:\/\/t.me\/BotFather\" rel=\"noopener noreferrer nofollow\">@BotFather<\/a>.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: \u0447\u0442\u043e \u043c\u044b \u0441\u0442\u0440\u043e\u0438\u043c<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043b\u0435\u0437\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u2014 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0412\u043e\u0442 \u043e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430:<\/p>\n<pre><code>\u0412\u044b (Telegram \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435\/\u0434\u0435\u0441\u043a\u0442\u043e\u043f\u0435)    \u2502    \u25bcTelegram Bot API    \u2502    \u25bcDocker: openclaw-gateway (ghcr.io\/openclaw\/openclaw)    \u2502    \u251c\u2500\u2500 \u0427\u0438\u0442\u0430\u0435\u0442 workspace\/SOUL.md \u2014 \u043a\u0442\u043e \u043e\u043d, \u043a\u0430\u043a \u0441\u0435\u0431\u044f \u0432\u0435\u0441\u0442\u0438    \u251c\u2500\u2500 \u0427\u0438\u0442\u0430\u0435\u0442 workspace\/USER.md \u2014 \u043a\u0442\u043e \u0432\u044b, \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b    \u251c\u2500\u2500 \u0427\u0438\u0442\u0430\u0435\u0442 workspace\/HEARTBEAT.md \u2014 \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0430\u0441    \u2502    \u251c\u2500\u2500 \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \/tools\/*.sh \u2014 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f    \u2502   \u251c\u2500\u2500 docker-status.sh, docker-logs.sh, docker-restart.sh    \u2502   \u251c\u2500\u2500 system-stats.sh, health-check.sh, security-check.sh    \u2502   \u251c\u2500\u2500 db-discover.sh, db-query.sh    \u2502   \u251c\u2500\u2500 nginx-errors.sh, project-restart.sh    \u2502   \u2514\u2500\u2500 youtrack-api.sh, n8n-workflows.sh, firecrawl.sh, context7.sh    \u2502    \u251c\u2500\u2500 \u0418\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a Docker \u0447\u0435\u0440\u0435\u0437 \/var\/run\/docker.sock    \u251c\u2500\u2500 \u0412\u0438\u0434\u0438\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \/var\/www:\/projects    \u2514\u2500\u2500 \u0427\u0438\u0442\u0430\u0435\u0442 \u043b\u043e\u0433\u0438 Nginx \u0447\u0435\u0440\u0435\u0437 \/var\/log\/nginx<\/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>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435: <strong>OpenClaw<\/strong> \u2014 \u044d\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0439 open-source Docker-\u043e\u0431\u0440\u0430\u0437 (<code>ghcr.io\/openclaw\/openclaw<\/code>). \u041c\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u2014 \u043d\u0435 \u0444\u043e\u0440\u043a, \u0430 <strong>\u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0433\u043e\u043b\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0432 DevOps-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430. \u0412\u044b \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u043f\u043e\u0434 \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435.<\/p>\n<hr\/>\n<h3>\u0428\u0430\u0433 1: \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/h3>\n<pre><code class=\"bash\">ssh user@your-servergit clone https:\/\/github.com\/ShyDamn\/openclaw-devops-kit.git \/tmp\/openclaw-setupcd \/tmp\/openclaw-setup<\/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>\u0415\u0441\u043b\u0438 git \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d:<\/p>\n<pre><code class=\"bash\">curl -L https:\/\/github.com\/ShyDamn\/openclaw-devops-kit\/archive\/main.tar.gz | tar xzcd openclaw-devops-kit-main<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438:<\/p>\n<pre><code>openclaw-devops-kit\/\u251c\u2500\u2500 docker-compose.yml          # Docker-\u043a\u043e\u043d\u0444\u0438\u0433\u251c\u2500\u2500 .env.example                # \u0428\u0430\u0431\u043b\u043e\u043d \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u251c\u2500\u2500 deploy.sh                   # \u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u043f\u043b\u043e\u044f\u251c\u2500\u2500 LICENSE                     # MIT\u251c\u2500\u2500 config\/\u2502   \u2514\u2500\u2500 openclaw.json           # \u041a\u043e\u043d\u0444\u0438\u0433 \u0430\u0433\u0435\u043d\u0442\u0430 (\u043c\u043e\u0434\u0435\u043b\u0438, Telegram, heartbeat)\u251c\u2500\u2500 workspace\/\u2502   \u251c\u2500\u2500 SOUL.md                 # \u041b\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0430\u0433\u0435\u043d\u0442\u0430\u2502   \u251c\u2500\u2500 USER.md                 # \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u2502   \u251c\u2500\u2500 HEARTBEAT.md            # \u0427\u0435\u043a\u043b\u0438\u0441\u0442 \u0434\u043b\u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a\u2502   \u2514\u2500\u2500 TOOLS.md                # \u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u2514\u2500\u2500 tools\/                      # 14 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432    \u251c\u2500\u2500 docker-status.sh        # \u0421\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432    \u251c\u2500\u2500 docker-logs.sh          # \u041b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430    \u251c\u2500\u2500 docker-restart.sh       # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430    \u251c\u2500\u2500 project-restart.sh      # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a docker compose \u043f\u0440\u043e\u0435\u043a\u0442\u0430    \u251c\u2500\u2500 system-stats.sh         # RAM, CPU, \u0434\u0438\u0441\u043a    \u251c\u2500\u2500 db-discover.sh          # \u0410\u0432\u0442\u043e-\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 PostgreSQL \u0411\u0414    \u251c\u2500\u2500 db-query.sh             # SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0430\u0432\u0442\u043e-\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u0440\u0435\u0434\u043e\u0432    \u251c\u2500\u2500 health-check.sh         # HTTP-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0430\u0439\u0442\u043e\u0432 + \u0430\u0432\u0442\u043e-\u0440\u0435\u0441\u0442\u0430\u0440\u0442    \u251c\u2500\u2500 nginx-errors.sh         # \u041e\u0448\u0438\u0431\u043a\u0438 Nginx    \u251c\u2500\u2500 security-check.sh       # fail2ban, \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b    \u251c\u2500\u2500 youtrack-api.sh         # YouTrack REST API    \u251c\u2500\u2500 n8n-workflows.sh        # n8n \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438    \u251c\u2500\u2500 firecrawl.sh            # \u0421\u043a\u0440\u0430\u043f\u0438\u043d\u0433 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446    \u2514\u2500\u2500 context7.sh             # \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/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<hr\/>\n<h3>\u0428\u0430\u0433 2: \u0421\u043e\u0437\u0434\u0430\u0451\u043c Telegram-\u0431\u043e\u0442\u0430<\/h3>\n<ol>\n<li>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c <a href=\"https:\/\/t.me\/BotFather\" rel=\"noopener noreferrer nofollow\">@BotFather<\/a> \u0432 Telegram<\/p>\n<\/li>\n<li>\n<p><code>\/newbot<\/code> \u2192 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043c\u044f \u2192 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0432\u0438\u0434\u0430 <code>123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11<\/code><\/p>\n<\/li>\n<li>\n<p>\u0423\u0437\u043d\u0430\u0451\u043c \u0441\u0432\u043e\u0439 Telegram ID \u2014 \u043f\u0438\u0448\u0435\u043c <a href=\"https:\/\/t.me\/userinfobot\" rel=\"noopener noreferrer nofollow\">@userinfobot<\/a>, \u043e\u043d \u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u0447\u0438\u0441\u043b\u043e\u043c \u0432\u0440\u043e\u0434\u0435 <code>778921250<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u0417\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u043e\u0431\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<hr\/>\n<h3>\u0428\u0430\u0433 3: \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c .env<\/h3>\n<pre><code class=\"bash\">cp .env.example .envnano .env<\/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>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code>TELEGRAM_BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11OPENROUTER_API_KEY=sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxx<\/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>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 (\u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 YouTrack, Firecrawl):<\/p>\n<pre><code>YOUTRACK_TOKEN=perm:your-token-hereFIRECRAWL_API_KEY=fc-your-key-here<\/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<hr\/>\n<h3>\u0428\u0430\u0433 4: \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c Telegram ID<\/h3>\n<pre><code class=\"bash\">nano config\/openclaw.json<\/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>\u041d\u0430\u0445\u043e\u0434\u0438\u043c <code>\"allowFrom\"<\/code> \u0438 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0439 ID:<\/p>\n<pre><code class=\"json\">\"allowFrom\": [  \"tg:778921250\"]<\/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>\u042d\u0442\u043e whitelist. \u0411\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c <strong>\u0442\u043e\u043b\u044c\u043a\u043e<\/strong> \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 ID. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u2014 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e ID \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e, \u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u043b\u043b\u0435\u0433\u0435.<\/p>\n<hr\/>\n<h3>\u0428\u0430\u0433 5: \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/h3>\n<p>\u042d\u0442\u043e <strong>\u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u0448\u0430\u0433<\/strong>. \u0418\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u2014 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u00abGPT \u0432 Telegram\u00bb \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043e\u043c. \u0411\u0435\u0437 \u043d\u0438\u0445 \u0430\u0433\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c: \u00ab\u041a\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440? \u041a\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 \u0431\u0430\u0437\u044b? \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443\u00bb.<\/p>\n<h4>SOUL.md \u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f<\/h4>\n<pre><code class=\"bash\">nano workspace\/SOUL.md<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0443\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0427\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<p><strong>1. \u0421\u043f\u0438\u0441\u043e\u043a PostgreSQL-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.<\/strong> \u0410\u0433\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"markdown\">## \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b PostgreSQL: db1, db2, db3<\/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>2. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<\/strong> \u041a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u043f\u043a\u0435, \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043a:<\/p>\n<pre><code class=\"markdown\">| \u041f\u0443\u0442\u044c | \u041f\u0440\u043e\u0435\u043a\u0442 | \u0421\u0442\u0435\u043a ||------|--------|------|| \/projects\/my-app\/ | \u041c\u043e\u0439 SaaS | Next.js + PostgreSQL || \/projects\/api\/ | \u0411\u044d\u043a\u0435\u043d\u0434 | NestJS || \/projects\/landing\/ | \u041b\u0435\u043d\u0434\u0438\u043d\u0433 | HTML + Nginx |<\/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>3. \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/strong> \u0412 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e: \u0447\u0442\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u2014 \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c. \u0410\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e: \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u00ab\u043f\u043e\u043a\u0430\u0436\u0438 \u043b\u043e\u0433\u0438 auth-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00bb, \u0430\u0433\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d <strong>\u0441\u0430\u043c<\/strong> \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e auth-\u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>my-auth-container<\/code>. \u041a\u043e\u0433\u0434\u0430 \u043f\u0438\u0448\u0435\u0442\u0435 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044e\u0437\u0435\u0440\u043e\u0432 \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e\u00bb \u2014 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0431\u0430\u0437\u0430 \u0438 \u043a\u0430\u043a \u043a \u043d\u0435\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f. \u0411\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c, \u0438 \u0432\u0435\u0441\u044c \u0441\u043c\u044b\u0441\u043b \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f.<\/p>\n<h4>USER.md \u2014 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e \u0432\u0430\u0441<\/h4>\n<pre><code class=\"bash\">nano workspace\/USER.md<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0442\u043e \u0432\u044b, \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043a, \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441. \u0410\u0433\u0435\u043d\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<hr\/>\n<h3>\u0428\u0430\u0433 6: \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u0430\u0439\u0442\u043e\u0432<\/h3>\n<pre><code class=\"bash\">nano tools\/health-check.sh<\/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>\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 <code>SITES<\/code> \u0438 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0438 \u0434\u043e\u043c\u0435\u043d\u044b:<\/p>\n<pre><code class=\"bash\">SITES=(  \"mysite.ru|mysite-frontend|mysite\"  \"api.mysite.ru|mysite-api|mysite\"  \"admin.mysite.ru|admin-panel|admin\")<\/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>\u0424\u043e\u0440\u043c\u0430\u0442: <code>\u0434\u043e\u043c\u0435\u043d|\u0438\u043c\u044f_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430|\u043f\u0430\u043f\u043a\u0430_\u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/code>. \u0421\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 HTTP-\u043a\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. \u0415\u0441\u043b\u0438 5xx \u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043d\u043e\u0432\u0430. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u0435 \u043f\u043e\u0447\u0438\u043d\u0438\u043b\u043e\u0441\u044c \u2014 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 <code>RESTART FAILED<\/code>, \u0438 \u0430\u0433\u0435\u043d\u0442 \u043f\u0438\u0448\u0435\u0442 \u0432\u0430\u043c \u0441\u0440\u043e\u0447\u043d\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435.<\/p>\n<hr\/>\n<h3>\u0428\u0430\u0433 7: \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c<\/h3>\n<pre><code class=\"bash\">bash deploy.sh<\/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>\u0421\u043a\u0440\u0438\u043f\u0442 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442, \u0447\u0442\u043e Docker \u0438 Docker Compose V2 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0441\u0442 <code>\/var\/www\/openclaw\/<\/code> \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b\u044b<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442, \u0447\u0442\u043e <code>.env<\/code> \u0438 Telegram ID \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442 GID \u0433\u0440\u0443\u043f\u043f\u044b docker \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 \u0438 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u0442 \u0432 <code>.env<\/code><\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 <code>chmod 600<\/code> \u043d\u0430 <code>.env<\/code><\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0430\u0447\u0430\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437 OpenClaw<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u2014 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c Telegram. \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u043e\u0442\u0443. \u041e\u043d \u043f\u0440\u0438\u0448\u043b\u0451\u0442 \u043a\u043e\u0434 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"bash\">cd \/var\/www\/openclawdocker compose run --rm --profile cli openclaw-cli pairing approve telegram &lt;\u041a\u041e\u0414&gt;<\/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>\u0413\u043e\u0442\u043e\u0432\u043e.<\/strong> \u041f\u0438\u0448\u0438\u0442\u0435 \u0431\u043e\u0442\u0443 \u0432 Telegram.<\/p>\n<hr\/>\n<h3>\u0420\u0430\u0437\u0431\u043e\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/h3>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432 <code>\/tools\/<\/code> (read-only) \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0430\u0433\u0435\u043d\u0442\u0443. \u041e\u043d \u0441\u0430\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 <code>SOUL.md<\/code>. \u0412\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u2014 \u0430\u0433\u0435\u043d\u0442 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u0430\u0436\u0434\u044b\u0439.<\/p>\n<h4>docker-status.sh \u2014 \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432<\/h4>\n<pre><code class=\"bash\">#!\/bin\/bashdocker ps --format \"table {{.Names}}\\t{{.Status}}\\t{{.Ports}}\" --no-trunc<\/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\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u2014 \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 <code>docker ps<\/code>. \u0410\u0433\u0435\u043d\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0435 \u00ab\u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e\u00bb, \u00ab\u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\u00bb, \u0438\u043b\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 heartbeat.<\/p>\n<h4>docker-logs.sh \u2014 \u043b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/h4>\n<pre><code class=\"bash\">#!\/bin\/bashCONTAINER=\"${1:?Usage: docker-logs.sh &lt;container_name&gt; [lines]}\"LINES=\"${2:-50}\"docker logs --tail \"$LINES\" \"$CONTAINER\" 2&gt;&amp;1<\/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>\u041e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 <code>docker logs<\/code> \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043e\u043c \u0432 50 \u0441\u0442\u0440\u043e\u043a. \u00ab\u041f\u043e\u043a\u0430\u0436\u0438 \u043b\u043e\u0433\u0438 auth-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00bb \u2192 \u0430\u0433\u0435\u043d\u0442 \u0437\u043d\u0430\u0435\u0442 \u0438\u0437 SOUL.md, \u0447\u0442\u043e auth-\u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 <code>auth-container<\/code>, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>docker-logs.sh auth-container<\/code>.<\/p>\n<h4>system-stats.sh \u2014 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h4>\n<pre><code class=\"bash\">#!\/bin\/bashecho \"=== RAM ===\"free -hecho \"\"echo \"=== DISK ===\"df -h \/ | tail -1echo \"\"echo \"=== CPU Load ===\"uptimeecho \"\"echo \"=== Top by RAM ===\"docker stats --no-stream --format \"table {{.Name}}\\t{{.CPUPerc}}\\t{{.MemUsage}}\\t{{.MemPerc}}\" | head -15<\/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>\u0427\u0435\u0442\u044b\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435: RAM, \u0434\u0438\u0441\u043a, \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u0438 top \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043f\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044e. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 heartbeat \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043f\u043e \u043f\u0440\u044f\u043c\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443.<\/p>\n<h4>db-discover.sh \u2014 \u0430\u0432\u0442\u043e-\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<pre><code class=\"bash\">#!\/bin\/bashfor c in $(docker ps --format '{{.Names}}' | grep -i postgres); do  echo \"=== $c ===\"  DB_USER=$(docker exec \"$c\" printenv POSTGRES_USER 2&gt;\/dev\/null)  DB_NAME=$(docker exec \"$c\" printenv POSTGRES_DB 2&gt;\/dev\/null)  [ -z \"$DB_USER\" ] &amp;&amp; DB_USER=\"postgres\"  [ -z \"$DB_NAME\" ] &amp;&amp; DB_NAME=\"postgres\"  echo \"User: $DB_USER | DB: $DB_NAME\"  docker exec \"$c\" psql -U \"$DB_USER\" -d \"$DB_NAME\" -c \"\\dt\" 2&gt;\/dev\/null || echo \"Connection failed\"  echo \"\"done<\/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>\u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0448\u0442\u0443\u043a \u0432 \u043d\u0430\u0431\u043e\u0440\u0435. \u041e\u043d \u043e\u0431\u0445\u043e\u0434\u0438\u0442 <strong>\u0432\u0441\u0435<\/strong> \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 PostgreSQL-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u043a\u0440\u0435\u0434\u044b \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f (<code>POSTGRES_USER<\/code>, <code>POSTGRES_DB<\/code>), \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446.<\/p>\n<p>\u0417\u0430\u0447\u0435\u043c: \u043a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 5 PostgreSQL-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438 \u0432\u044b \u043d\u0435 \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0432 \u043a\u0430\u043a\u043e\u043c \u0438\u0437 \u043d\u0438\u0445 \u043b\u0435\u0436\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 <code>orders<\/code> \u2014 \u0430\u0433\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>db-discover.sh<\/code> \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0441\u0430\u043c. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0435\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0443 \u0432\u0430\u0441 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0430 \u0432\u0435\u0441\u044c \u0441\u043c\u044b\u0441\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f.<\/p>\n<h4>db-query.sh \u2014 SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0430\u0432\u0442\u043e-\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u0440\u0435\u0434\u043e\u0432<\/h4>\n<pre><code class=\"bash\">#!\/bin\/bashCONTAINER=\"${1:?Usage: db-query.sh &lt;container&gt; &lt;query&gt; [db]}\"QUERY=\"${2:?}\"DB_OVERRIDE=\"${3:-}\"DB_USER=$(docker exec \"$CONTAINER\" printenv POSTGRES_USER 2&gt;\/dev\/null)DB_NAME=$(docker exec \"$CONTAINER\" printenv POSTGRES_DB 2&gt;\/dev\/null)[ -z \"$DB_USER\" ] &amp;&amp; DB_USER=\"postgres\"[ -z \"$DB_NAME\" ] &amp;&amp; DB_NAME=\"postgres\"[ -n \"$DB_OVERRIDE\" ] &amp;&amp; DB_NAME=\"$DB_OVERRIDE\"docker exec \"$CONTAINER\" psql -U \"$DB_USER\" -d \"$DB_NAME\" -c \"$QUERY\" 2&gt;&amp;1<\/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\u0438\u043d\u0446\u0438\u043f \u0442\u043e\u0442 \u0436\u0435: \u043a\u0440\u0435\u0434\u044b \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u0445 \u0430\u0433\u0435\u043d\u0442\u0430 \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0447\u0430\u0442\u0435.<\/p>\n<p>\u0410\u0433\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u044d\u0442\u043e \u0442\u0430\u043a: \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044e\u0437\u0435\u0440\u043e\u0432 \u0437\u0430\u0440\u0435\u0433\u0430\u043b\u043e\u0441\u044c \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e \u0432 \u0431\u0430\u0437\u0435 auth\u00bb, \u043e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 SQL, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 \u0438\u0437 SOUL.md \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<h4>health-check.sh \u2014 HTTP-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0430\u0432\u0442\u043e-\u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u043c<\/h4>\n<pre><code class=\"bash\">#!\/bin\/bashSITES=(  \"example.com|my-frontend|my-project\"  \"api.example.com|my-api|my-project\")ISSUES=\"\"for site_info in \"${SITES[@]}\"; do  IFS='|' read -r DOMAIN CONTAINER PROJECT &lt;&lt;&lt; \"$site_info\"  HTTP_CODE=$(curl -s -o \/dev\/null -w \"%{http_code}\" --max-time 10 \"https:\/\/$DOMAIN\")    if [ \"$HTTP_CODE\" -ge 500 ] || [ \"$HTTP_CODE\" -eq 000 ]; then    ISSUES+=\"CRITICAL: $DOMAIN returns $HTTP_CODE. Container: $CONTAINER. \"    docker restart \"$CONTAINER\" 2&gt;\/dev\/null    sleep 10    HTTP_CODE_AFTER=$(curl -s -o \/dev\/null -w \"%{http_code}\" --max-time 10 \"https:\/\/$DOMAIN\")    if [ \"$HTTP_CODE_AFTER\" -ge 500 ] || [ \"$HTTP_CODE_AFTER\" -eq 000 ]; then      ISSUES+=\"RESTART FAILED \u2014 still $HTTP_CODE_AFTER after restart. \"    else      ISSUES+=\"AUTO-FIXED \u2014 now $HTTP_CODE_AFTER after restart. \"    fi  fidone[ -n \"$ISSUES\" ] &amp;&amp; echo \"$ISSUES\" || echo \"ALL_SITES_OK\"<\/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>\u0421\u0430\u043c\u044b\u0439 \u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f heartbeat. \u041b\u043e\u0433\u0438\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>\u041e\u0431\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0441\u0430\u0439\u0442\u044b \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>SITES<\/code><\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043b\u0430\u0435\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c 10 \u0441\u0435\u043a\u0443\u043d\u0434<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 5xx \u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 (\u043a\u043e\u0434 000) \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440<\/p>\n<\/li>\n<li>\n<p>\u0416\u0434\u0451\u0442 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043d\u043e\u0432\u0430<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0447\u0438\u043d\u0438\u043b\u043e\u0441\u044c \u2014 <code>AUTO-FIXED<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 <code>RESTART FAILED<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u0410\u0433\u0435\u043d\u0442 \u0432 heartbeat \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: <code>ALL_SITES_OK<\/code> \u2192 \u043c\u043e\u043b\u0447\u0438\u0442, <code>AUTO-FIXED<\/code> \u2192 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0447\u0442\u043e \u043f\u043e\u0447\u0438\u043d\u0438\u043b, <code>RESTART FAILED<\/code> \u2192 \u043f\u0438\u0448\u0435\u0442 \u0441\u0440\u043e\u0447\u043d\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435.<\/p>\n<h4>security-check.sh \u2014 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438<\/h4>\n<pre><code class=\"bash\">#!\/bin\/bashecho \"=== FAIL2BAN ===\"fail2ban-client status sshd 2&gt;\/dev\/null || echo \"fail2ban not running\"echo \"=== BLOCKED IPS (last 24h) ===\"grep \"Ban \" \/var\/log\/fail2ban.log 2&gt;\/dev\/null | tail -10echo \"=== NGINX CONNECTIONS ===\"ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10echo \"=== NGINX 4xx\/5xx LAST HOUR ===\"awk -v d=\"$(date -d '1 hour ago' '+%d\/%b\/%Y:%H')\" '$4 ~ d &amp;&amp; ($9 &gt;= 400)' \\  \/var\/log\/nginx\/access.log 2&gt;\/dev\/null | awk '{print $9}' | sort | uniq -c | sort -rn | head -5echo \"=== SUSPICIOUS PROCESSES ===\"ps aux --sort=-%cpu | awk '$3 &gt; 50 {print}' | head -5<\/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\u044f\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435: fail2ban, \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 IP \u0437\u0430 \u0441\u0443\u0442\u043a\u0438, top-10 IP \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, 4xx\/5xx \u043e\u0448\u0438\u0431\u043a\u0438 Nginx \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0447\u0430\u0441, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441 CPU &gt; 50% (\u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0439\u043d\u0435\u0440\u044b).<\/p>\n<p>\u041e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 Telegram \u00ab\u043f\u0440\u043e\u0432\u0435\u0440\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u00bb \u0432\u043c\u0435\u0441\u0442\u043e \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u0432 SSH.<\/p>\n<h4>youtrack-api.sh \u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438<\/h4>\n<pre><code class=\"bash\">#!\/bin\/bashYT_URL=\"${YOUTRACK_URL:-http:\/\/127.0.0.1:8080}\"YT_TOKEN=\"${YOUTRACK_TOKEN:-}\"# ... \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 YouTrack REST API# projects, issues, create, assign, state, users, agiles<\/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>REST API \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u0434\u043b\u044f YouTrack. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 YouTrack \u0432 Docker \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u2014 \u043e\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0447\u0435\u0440\u0435\u0437 localhost. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442: \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0437\u0430\u0434\u0430\u0447\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0441\u043c\u0435\u043d\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430.<\/p>\n<p>\u00ab\u0421\u043e\u0437\u0434\u0430\u0439 \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 SA: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c rate limiting\u00bb \u2192 \u0430\u0433\u0435\u043d\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>youtrack-api.sh create ...<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<h4>n8n-workflows.sh \u2014 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0439<\/h4>\n<pre><code class=\"bash\">#!\/bin\/bashACTION=\"${1:-list}\"N8N_URL=\"${N8N_URL:-http:\/\/127.0.0.1:5678}\"case \"$ACTION\" in  list) curl -s \"$N8N_URL\/api\/v1\/workflows\" -H \"Accept: application\/json\" | head -200 ;;  trigger) curl -s -X POST \"$N8N_URL\/webhook\/${2:?}\" -H \"Content-Type: application\/json\" -d \"${3:-{}}\" ;;esac<\/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>\u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 n8n \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0439 \u2014 \u0430\u0433\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a workflows \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u0442\u044c \u0432\u0435\u0431\u0445\u0443\u043a\u0438.<\/p>\n<h4>firecrawl.sh \u0438 context7.sh \u2014 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435<\/h4>\n<p><strong>firecrawl.sh<\/strong> \u2014 \u0441\u043a\u0440\u0430\u043f\u0438\u043d\u0433 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0447\u0435\u0440\u0435\u0437 Firecrawl API. \u0410\u0433\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u00ab\u0437\u0430\u0439\u0442\u0438\u00bb \u043d\u0430 \u0441\u0430\u0439\u0442 \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0447\u0442\u043e \u0441\u0430\u0439\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442.<\/p>\n<p><strong>context7.sh<\/strong> \u2014 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u0430 \u0441\u0432\u0435\u0436\u0430\u044f \u0434\u043e\u043a\u0430 \u043f\u043e React, Next.js \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u2014 \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0435\u0451 \u0447\u0435\u0440\u0435\u0437 Context7, \u0430 \u043d\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0432\u043e\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u044f.<\/p>\n<hr\/>\n<h3>Docker Compose: \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/h3>\n<pre><code class=\"yaml\">services:  openclaw-gateway:    image: ghcr.io\/openclaw\/openclaw:latest    container_name: openclaw-gateway    restart: unless-stopped    ports:      - \"127.0.0.1:18789:18789\"    volumes:      - .\/config:\/home\/node\/.openclaw      - .\/workspace:\/home\/node\/.openclaw\/workspace      - \/var\/run\/docker.sock:\/var\/run\/docker.sock      - \/usr\/bin\/docker:\/usr\/bin\/docker:ro      - \/var\/www:\/projects      - .\/tools:\/tools:ro      - \/var\/log\/nginx:\/var\/log\/nginx:ro      - \/usr\/libexec\/docker\/cli-plugins:\/usr\/libexec\/docker\/cli-plugins:ro    env_file:      - .env    environment:      - NODE_OPTIONS=--max-old-space-size=2048    group_add:      - \"${DOCKER_GID:-999}\"    init: true    command: [\"node\", \"dist\/index.js\", \"gateway\", \"--bind\", \"lan\", \"--port\", \"18789\"]    healthcheck:      test: [\"CMD\", \"node\", \"-e\", \"fetch('http:\/\/127.0.0.1:18789\/healthz').then(r=&gt;{if(!r.ok)throw 1})\"]      interval: 30s      timeout: 10s      retries: 3      start_period: 30s    cap_drop: [NET_RAW, NET_ADMIN]    security_opt: [no-new-privileges:true]    mem_limit: 3g    memswap_limit: 3g<\/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>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p><code><strong>\/var\/run\/docker.sock<\/strong><\/code> \u2014 \u0434\u0430\u0451\u0442 \u0430\u0433\u0435\u043d\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e <code>docker ps<\/code>, <code>docker restart<\/code>, <code>docker logs<\/code> \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u042d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u00ab\u043e\u043f\u0430\u0441\u043d\u044b\u0439\u00bb \u043c\u0430\u0443\u043d\u0442 \u2014 \u043f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e root-\u0434\u043e\u0441\u0442\u0443\u043f \u043a Docker daemon. \u041d\u043e \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0430\u0433\u0435\u043d\u0442 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/p>\n<p><code><strong>\/var\/www:\/projects<\/strong><\/code> \u2014 \u0430\u0433\u0435\u043d\u0442 \u0432\u0438\u0434\u0438\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e read-write, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0433 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u2014 \u043f\u043e\u043c\u0435\u043d\u044f\u0439\u0442\u0435 \u043d\u0430 <code>\/var\/www:\/projects:ro<\/code>.<\/p>\n<p><code><strong>.\/tools:\/tools:ro<\/strong><\/code> \u2014 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435. \u0410\u0433\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0438\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c, \u043d\u043e \u043d\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p><code><strong>\/var\/log\/nginx:\/var\/log\/nginx:ro<\/strong><\/code> \u2014 \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 <code>nginx-errors.sh<\/code>.<\/p>\n<p><code><strong>\/usr\/libexec\/docker\/cli-plugins:\/usr\/libexec\/docker\/cli-plugins:ro<\/strong><\/code> \u2014 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e <code>docker compose<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. Docker Compose V2 \u2014 \u044d\u0442\u043e \u043f\u043b\u0430\u0433\u0438\u043d, \u0430 \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a.<\/p>\n<p><code><strong>group_add: \"${DOCKER_GID:-999}\"<\/strong><\/code> \u2014 GID \u0433\u0440\u0443\u043f\u043f\u044b docker \u043d\u0430 \u0445\u043e\u0441\u0442\u0435. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f <code>node<\/code> (\u043d\u0435 root), \u0438 \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u044b \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 docker.sock. Deploy-\u0441\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 GID \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 <code>.env<\/code>.<\/p>\n<p><code><strong>cap_drop<\/strong><\/code><strong> + <\/strong><code><strong>no-new-privileges<\/strong><\/code> \u2014 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. <code>NET_RAW<\/code> \u0438 <code>NET_ADMIN<\/code> \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, <code>no-new-privileges<\/code> \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p><code><strong>mem_limit: 3g<\/strong><\/code> \u2014 \u0447\u0442\u043e\u0431\u044b \u0430\u0433\u0435\u043d\u0442 \u0441\u0430\u043c \u043d\u0435 \u0441\u044a\u0435\u043b \u0432\u0441\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. OpenClaw \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Node.js, \u0438 \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f V8 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f.<\/p>\n<hr\/>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433 \u0430\u0433\u0435\u043d\u0442\u0430: openclaw.json<\/h3>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0437\u0434\u0435\u0441\u044c \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 \u0441 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<h4>\u041c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0444\u043e\u043b\u0431\u044d\u043a\u0438<\/h4>\n<pre><code class=\"json\">\"model\": {  \"primary\": \"openrouter\/openai\/gpt-4o\",  \"fallbacks\": [    \"openrouter\/deepseek\/deepseek-chat-v3-0324\",    \"openrouter\/google\/gemini-2.5-flash\"  ]}<\/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>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u2014 GPT-4o \u0447\u0435\u0440\u0435\u0437 OpenRouter. \u0415\u0441\u043b\u0438 rate limit \u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u2014 \u0430\u0433\u0435\u043d\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 DeepSeek, \u0437\u0430\u0442\u0435\u043c \u043d\u0430 Gemini Flash. \u0412\u044b \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435 \u2014 \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0434\u0451\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043d\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u0435\u043c \u0436\u0435 (\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f SOUL.md).<\/p>\n<h4>Heartbeat<\/h4>\n<pre><code class=\"json\">\"heartbeat\": {  \"every\": \"1h\",  \"model\": \"openrouter\/deepseek\/deepseek-chat-v3-0324\",  \"target\": \"last\",  \"directPolicy\": \"allow\",  \"lightContext\": true}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0447\u0430\u0441 \u0430\u0433\u0435\u043d\u0442 \u00ab\u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f\u00bb \u043d\u0430 \u0434\u0435\u0448\u0451\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 (DeepSeek \u2014 \u0446\u0435\u043d\u0442\u044b \u0437\u0430 \u0437\u0430\u043f\u0440\u043e\u0441) \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0447\u0435\u043a\u043b\u0438\u0441\u0442 \u0438\u0437 <code>HEARTBEAT.md<\/code>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u043e\u043a \u2014 \u043c\u043e\u043b\u0447\u0438\u0442 (<code>HEARTBEAT_OK<\/code>). \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u2014 \u043f\u0438\u0448\u0435\u0442 \u0432\u0430\u043c \u0432 Telegram.<\/p>\n<p><code>lightContext: true<\/code> \u2014 \u043f\u0440\u0438 heartbeat \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b. \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043f\u0440\u044f\u043c\u043e\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u0438.<\/p>\n<h4>\u0421\u0435\u0441\u0441\u0438\u0438<\/h4>\n<pre><code class=\"json\">\"session\": {  \"reset\": {    \"mode\": \"idle\",    \"idleMinutes\": 180  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430 \u0436\u0438\u0432\u0451\u0442 3 \u0447\u0430\u0441\u0430 \u0431\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u041c\u043e\u0436\u043d\u043e \u0443\u0442\u0440\u043e\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u00ab\u043f\u043e\u043c\u043e\u0433\u0438 \u0441 nginx-\u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c\u00bb, \u0447\u0435\u0440\u0435\u0437 \u0447\u0430\u0441 \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u00ab\u0430 \u0434\u043e\u0431\u0430\u0432\u044c \u0442\u0443\u0434\u0430 rate limiting\u00bb \u2014 \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u043c\u043d\u0438\u0442, \u043e \u043a\u0430\u043a\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0440\u0435\u0447\u044c. \u0427\u0435\u0440\u0435\u0437 3 \u0447\u0430\u0441\u0430 \u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044f \u2014 \u043d\u043e\u0432\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f.<\/p>\n<hr\/>\n<h3>HEARTBEAT.md \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/h3>\n<pre><code class=\"markdown\"># HEARTBEAT## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0439 \u0412\u0421\u0415 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443)1. `bash \/tools\/health-check.sh` \u2014 HTTP-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0441\u0435\u0445 \u0441\u0430\u0439\u0442\u043e\u0432   - AUTO-FIXED \u2192 \u0441\u043e\u043e\u0431\u0449\u0438 \u0447\u0442\u043e \u043f\u043e\u0447\u0438\u043d\u0438\u043b   - RESTART FAILED \u2192 \u0441\u043e\u043e\u0431\u0449\u0438 \u0421\u0420\u041e\u0427\u041d\u041e   - ALL_SITES_OK \u2192 \u043c\u043e\u043b\u0447\u04382. `bash \/tools\/docker-status.sh` \u2014 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b   - unhealthy\/exited \u2192 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438 \u0438 \u0441\u043e\u043e\u0431\u0449\u04383. `bash \/tools\/system-stats.sh` \u2014 \u0440\u0435\u0441\u0443\u0440\u0441\u044b   - RAM &lt; 500MB \u2192 \u0441\u043e\u043e\u0431\u0449\u0438   - \u0414\u0438\u0441\u043a &gt; 90% \u2192 \u0441\u043e\u043e\u0431\u0449\u04384. \u0412\u0441\u0451 \u043e\u043a \u2192 HEARTBEAT_OK## \u041f\u0440\u0430\u0432\u0438\u043b\u0430- \u041d\u043e\u0447\u044c\u044e (00:00\u201308:00) \u0431\u0435\u0437 \u0441\u0440\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u043f\u0438\u0448\u0438- CRITICAL \u0441\u0430\u0439\u0442\u043e\u0432 \u2014 \u043f\u0438\u0448\u0438 \u0412\u0421\u0415\u0413\u0414\u0410, \u0434\u0430\u0436\u0435 \u043d\u043e\u0447\u044c\u044e- \u041d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0439 \u0443\u0436\u0435 \u0441\u043e\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0435<\/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>\u042d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0447\u0435\u043a\u043b\u0438\u0441\u0442. \u0410\u0433\u0435\u043d\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0430\u043c \u0438\u043b\u0438 \u043c\u043e\u043b\u0447\u0430\u0442\u044c.<\/p>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c (Grafana, Prometheus): \u0442\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u00ab\u043f\u043b\u043e\u0445\u043e\u00bb, \u0430 \u0430\u0433\u0435\u043d\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u043f\u043b\u043e\u0445\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043e\u0442 \u044d\u0442\u043e, \u0438 \u044f \u0443\u0436\u0435 \u043f\u043e\u0447\u0438\u043d\u0438\u043b\u00bb. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0436\u0430\u0440\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u043f\u043e\u0436\u0430\u0440\u043d\u044b\u043c.<\/p>\n<hr\/>\n<h3>\u041a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c<\/h3>\n<h4>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442<\/h4>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u0440\u043e\u0441\u0442\u043e\u0439: bash-\u0441\u043a\u0440\u0438\u043f\u0442 + \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432 SOUL.md.<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b \u0432 <code>tools\/<\/code>:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\">#!\/bin\/bash# tools\/my-tool.sh \u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435echo \"result\"<\/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<ol start=\"2\">\n<li>\n<p><code>chmod +x tools\/my-tool.sh<\/code><\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432 <code>workspace\/SOUL.md<\/code>:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"markdown\">## \u041c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442- `bash \/tools\/my-tool.sh &lt;arg&gt;` \u2014 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442<\/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<ol start=\"4\">\n<li>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435: <code>docker compose restart openclaw-gateway<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u041b\u044e\u0431\u043e\u0435 API, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u0447\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 (\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, REST API, \u0434\u0430\u0436\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b), \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0432 bash-\u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u0434\u0430\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0443. YouTrack, n8n, Grafana API, Slack webhooks \u2014 \u0432\u0441\u0451 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<hr\/>\n<h3>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/h3>\n<p>\u042d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u0447\u0430\u0441\u0442\u044b\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0430\u043c.<\/p>\n<p><strong>Whitelist \u043f\u043e Telegram ID.<\/strong> \u0411\u043e\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 ID \u0438\u0437 <code>allowFrom<\/code>. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u042d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u2014 \u0431\u0435\u0437 \u0432\u0430\u0448\u0435\u0433\u043e Telegram ID \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0430\u0433\u0435\u043d\u0442\u0443.<\/p>\n<p><strong>Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.<\/strong> \u0410\u0433\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f <code>node<\/code>, \u043d\u0435 \u043e\u0442 root \u0445\u043e\u0441\u0442\u0430. \u0414\u0430, \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a docker.sock \u2014 \u044d\u0442\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 root \u043d\u0430 Docker, \u043d\u043e \u043d\u0435 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435.<\/p>\n<p><code><strong>.env<\/strong><\/code><strong> \u0441 chmod 600.<\/strong> API-\u043a\u043b\u044e\u0447\u0438 \u0438 \u0442\u043e\u043a\u0435\u043d\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/p>\n<p><strong>cap_drop + no-new-privileges.<\/strong> \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442 \u043d\u0430 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p><strong>\u0414\u0432\u0443\u0445\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/strong> \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 SOUL.md:<\/p>\n<ul>\n<li>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 (\u043b\u043e\u0433\u0438, \u0444\u0430\u0439\u043b\u044b, SELECT) \u2014 \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f (DELETE, UPDATE, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430) \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0432\u0430\u0448\u0438\u043c approve<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0440\u0438\u0441\u043a \u2014 \u043d\u0435 \u0432\u0437\u043b\u043e\u043c, \u0430 <strong>\u043e\u0448\u0438\u0431\u043a\u0430 \u0430\u0433\u0435\u043d\u0442\u0430<\/strong>. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c. \u042d\u0442\u043e \u043a\u0430\u043a code review, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 Telegram.<\/p>\n<hr\/>\n<h3>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/h3>\n<pre><code class=\"bash\">cd \/var\/www\/openclaw# \u041b\u043e\u0433\u0438 \u0430\u0433\u0435\u043d\u0442\u0430docker compose logs -f openclaw-gateway# \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043adocker compose restart openclaw-gateway# \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u0430docker compose pull &amp;&amp; docker compose up -d# \u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430docker compose run --rm --profile cli openclaw-cli doctor# \u0421\u0442\u0430\u0442\u0443\u0441 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438docker compose run --rm --profile cli openclaw-cli models status<\/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<hr\/>\n<h3>\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u043e\u0438\u0442<\/h3>\n<p>\u041f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 (10\u201330 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0434\u0435\u043d\u044c + heartbeat \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0430\u0441 \u043d\u0430 \u0434\u0435\u0448\u0451\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438) \u2014 <strong>$5\u201315 \u0432 \u043c\u0435\u0441\u044f\u0446<\/strong> \u0447\u0435\u0440\u0435\u0437 OpenRouter. Heartbeat \u043d\u0430 DeepSeek \u0441\u0442\u043e\u0438\u0442 \u043a\u043e\u043f\u0435\u0439\u043a\u0438. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u2014 GPT-4o \u0438\u043b\u0438 Claude \u043d\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 (\u0434\u0435\u0431\u0430\u0433, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0434\u043b\u0438\u043d\u043d\u044b\u0435 SQL).<\/p>\n<hr\/>\n<h3>\u0418\u0442\u043e\u0433\u043e<\/h3>\n<p><strong>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/strong> <a href=\"https:\/\/github.com\/ShyDamn\/openclaw-devops-kit\" rel=\"noopener noreferrer nofollow\">github.com\/ShyDamn\/openclaw-devops-kit<\/a><\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438: docker-compose, \u043a\u043e\u043d\u0444\u0438\u0433\u0438, 14 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, deploy-\u0441\u043a\u0440\u0438\u043f\u0442, \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. MIT \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f.<\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438: 10 \u043c\u0438\u043d\u0443\u0442. \u041d\u0443\u0436\u043d\u043e: VPS \u0441 Docker, API-\u043a\u043b\u044e\u0447 OpenRouter, Telegram-\u0431\u043e\u0442.<\/p>\n<p>\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434 \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435. \u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c \u0438\u043b\u0438 \u043d\u044e\u0430\u043d\u0441\u0430\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u2014 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0439\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1022304\/\">https:\/\/habr.com\/ru\/articles\/1022304\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0414\u0432\u0430 \u0434\u043d\u044f \u043d\u0430\u0437\u0430\u0434 \u044f \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u00ab\u042f \u043f\u043e\u0441\u0430\u0434\u0438\u043b AI-\u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0432\u043e\u0439 VPS \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c SSH\u00bb. \u0420\u0435\u0430\u043a\u0446\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0439: \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0431\u044b\u043b\u043e \u043d\u0435 \u043f\u0440\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u043f\u0440\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0443. \u00ab\u041f\u043e\u043a\u0430\u0436\u0438 docker-compose\u00bb, \u00ab\u0434\u0430\u0439 \u0441\u043a\u0440\u0438\u043f\u0442\u044b\u00bb, \u00ab\u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0443 \u0441\u0435\u0431\u044f\u00bb.\u041f\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0441\u044c\u0431\u0430\u043c \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u0432\u0441\u0451 \u0432 open-source: \u043a\u043e\u043d\u0444\u0438\u0433\u0438, \u0441\u043a\u0440\u0438\u043f\u0442\u044b, docker-compose, deploy-\u0441\u043a\u0440\u0438\u043f\u0442 \u2014 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0437\u0430 10 \u043c\u0438\u043d\u0443\u0442.\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439: github.com\/ShyDamn\/openclaw-devops-kit\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u2014 MIT. \u0411\u0435\u0440\u0438\u0442\u0435, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0439\u0442\u0435, \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u2014 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u00bb, \u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430: \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d, \u043a\u0430\u043a \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0441\u0435\u0431\u044f. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043d\u0435\u0448\u0442\u0430\u0442\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 \u0447\u0451\u0440\u043d\u043e\u0439 \u043a\u043e\u0440\u043e\u0431\u043a\u043e\u0439.\u0427\u0442\u043e \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0432 \u0438\u0442\u043e\u0433\u0435AI-\u0430\u0433\u0435\u043d\u0442 \u0432 Telegram, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0436\u0438\u0432\u0451\u0442 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c VPS \u0438 \u0443\u043c\u0435\u0435\u0442:\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043b\u043e\u0433\u0438, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 docker compose \u043f\u0440\u043e\u0435\u043a\u0442\u044b\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 PostgreSQL (\u0441\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043a\u0440\u0435\u0434\u044b \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430)\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u0430\u0439\u0442\u044b \u043f\u043e HTTP \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0443\u043f\u0430\u0432\u0448\u0438\u0435\u0421\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 Nginx, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c fail2ban, \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0432 YouTrack, \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u0442\u044c n8n-\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438\u041a\u0430\u0436\u0434\u044b\u0439 \u0447\u0430\u0441 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (heartbeat)\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438 \u043a\u043e\u0434 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u044b \u043e\u0431\u0449\u0430\u0435\u0442\u0435\u0441\u044c \u0441 \u043d\u0438\u043c \u043d\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435. \u041d\u0435 docker logs &#8212;tail 100 my-container-name, \u0430 \u00ab\u043f\u043e\u043a\u0430\u0436\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043b\u043e\u0433\u0438 auth-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00bb. \u041d\u0435 docker exec postgres psql -U user -d mydb -c &#171;SELECT COUNT(*) FROM users WHERE created_at &gt; NOW() &#8212; INTERVAL &#8216;7 days'&#187;, \u0430 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044e\u0437\u0435\u0440\u043e\u0432 \u0437\u0430\u0440\u0435\u0433\u0430\u043b\u043e\u0441\u044c \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e\u00bb.\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044fVPS \u0441 Ubuntu 20.04+ (\u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 Linux \u0441 Docker). \u041c\u0438\u043d\u0438\u043c\u0443\u043c 2 \u0413\u0411 RAM \u2014 \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 ~300\u2013500 \u041c\u0411.Docker + Docker Compose V2. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c: docker compose version. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 docs.docker.com\/engine\/install.API-\u043a\u043b\u044e\u0447 OpenRouter (openrouter.ai\/keys) \u2014 \u0435\u0434\u0438\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f GPT-4o, Claude, Gemini, DeepSeek. \u0425\u0432\u0430\u0442\u0438\u0442 $5\u201310 \u043d\u0430 \u043c\u0435\u0441\u044f\u0446 \u043f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438. \u041c\u043e\u0436\u043d\u043e \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 OpenAI \u0438\u043b\u0438 Anthropic, \u043d\u043e OpenRouter \u0443\u0434\u043e\u0431\u043d\u0435\u0435: \u0444\u043e\u043b\u0431\u044d\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438, \u0435\u0434\u0438\u043d\u044b\u0439 \u0431\u0438\u043b\u043b\u0438\u043d\u0433, \u0432\u0441\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435.Telegram-\u0431\u043e\u0442 \u043e\u0442 @BotFather.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: \u0447\u0442\u043e \u043c\u044b \u0441\u0442\u0440\u043e\u0438\u043c\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043b\u0435\u0437\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u2014 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0412\u043e\u0442 \u043e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430:\u0412\u044b (Telegram \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435\/\u0434\u0435\u0441\u043a\u0442\u043e\u043f\u0435)    \u2502    \u25bcTelegram Bot API    \u2502    \u25bcDocker: openclaw-gateway (ghcr.io\/openclaw\/openclaw)    \u2502    \u251c\u2500\u2500 \u0427\u0438\u0442\u0430\u0435\u0442 workspace\/SOUL.md \u2014 \u043a\u0442\u043e \u043e\u043d, \u043a\u0430\u043a \u0441\u0435\u0431\u044f \u0432\u0435\u0441\u0442\u0438    \u251c\u2500\u2500 \u0427\u0438\u0442\u0430\u0435\u0442 workspace\/USER.md \u2014 \u043a\u0442\u043e \u0432\u044b, \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b    \u251c\u2500\u2500 \u0427\u0438\u0442\u0430\u0435\u0442 workspace\/HEARTBEAT.md \u2014 \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0430\u0441    \u2502    \u251c\u2500\u2500 \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \/tools\/*.sh \u2014 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f    \u2502   \u251c\u2500\u2500 docker-status.sh, docker-logs.sh, docker-restart.sh    \u2502   \u251c\u2500\u2500 system-stats.sh, health-check.sh, security-check.sh    \u2502   \u251c\u2500\u2500 db-discover.sh, db-query.sh    \u2502   \u251c\u2500\u2500 nginx-errors.sh, project-restart.sh    \u2502   \u2514\u2500\u2500 youtrack-api.sh, n8n-workflows.sh, firecrawl.sh, context7.sh    \u2502    \u251c\u2500\u2500 \u0418\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a Docker \u0447\u0435\u0440\u0435\u0437 \/var\/run\/docker.sock    \u251c\u2500\u2500 \u0412\u0438\u0434\u0438\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \/var\/www:\/projects    \u2514\u2500\u2500 \u0427\u0438\u0442\u0430\u0435\u0442 \u043b\u043e\u0433\u0438 Nginx \u0447\u0435\u0440\u0435\u0437 \/var\/log\/nginx\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435: OpenClaw \u2014 \u044d\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0439 open-source Docker-\u043e\u0431\u0440\u0430\u0437 (ghcr.io\/openclaw\/openclaw). \u041c\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u2014 \u043d\u0435 \u0444\u043e\u0440\u043a, \u0430 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0433\u043e\u043b\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0432 DevOps-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430. \u0412\u044b \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u043f\u043e\u0434 \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435.\u0428\u0430\u0433 1: \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439ssh user@your-servergit clone https:\/\/github.com\/ShyDamn\/openclaw-devops-kit.git \/tmp\/openclaw-setupcd \/tmp\/openclaw-setup\u0415\u0441\u043b\u0438 git \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d:curl -L https:\/\/github.com\/ShyDamn\/openclaw-devops-kit\/archive\/main.tar.gz | tar xzcd openclaw-devops-kit-main\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438:openclaw-devops-kit\/\u251c\u2500\u2500 docker-compose.yml          # Docker-\u043a\u043e\u043d\u0444\u0438\u0433\u251c\u2500\u2500 .env.example                # \u0428\u0430\u0431\u043b\u043e\u043d \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u251c\u2500\u2500 deploy.sh                   # \u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u043f\u043b\u043e\u044f\u251c\u2500\u2500 LICENSE                     # MIT\u251c\u2500\u2500 config\/\u2502   \u2514\u2500\u2500 openclaw.json           # \u041a\u043e\u043d\u0444\u0438\u0433 \u0430\u0433\u0435\u043d\u0442\u0430 (\u043c\u043e\u0434\u0435\u043b\u0438, Telegram, heartbeat)\u251c\u2500\u2500 workspace\/\u2502   \u251c\u2500\u2500 SOUL.md                 # \u041b\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0430\u0433\u0435\u043d\u0442\u0430\u2502   \u251c\u2500\u2500 USER.md                 # \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u2502   \u251c\u2500\u2500 HEARTBEAT.md            # \u0427\u0435\u043a\u043b\u0438\u0441\u0442 \u0434\u043b\u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a\u2502   \u2514\u2500\u2500 TOOLS.md                # \u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u2514\u2500\u2500 tools\/                      # 14 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432    \u251c\u2500\u2500 docker-status.sh        # \u0421\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432    \u251c\u2500\u2500 docker-logs.sh          # \u041b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430    \u251c\u2500\u2500 docker-restart.sh       # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430    \u251c\u2500\u2500 project-restart.sh      # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a docker compose \u043f\u0440\u043e\u0435\u043a\u0442\u0430    \u251c\u2500\u2500 system-stats.sh         # RAM, CPU, \u0434\u0438\u0441\u043a    \u251c\u2500\u2500 db-discover.sh          # \u0410\u0432\u0442\u043e-\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 PostgreSQL \u0411\u0414    \u251c\u2500\u2500 db-query.sh             # SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0430\u0432\u0442\u043e-\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u0440\u0435\u0434\u043e\u0432    \u251c\u2500\u2500 health-check.sh         # HTTP-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0430\u0439\u0442\u043e\u0432 + \u0430\u0432\u0442\u043e-\u0440\u0435\u0441\u0442\u0430\u0440\u0442    \u251c\u2500\u2500 nginx-errors.sh         # \u041e\u0448\u0438\u0431\u043a\u0438 Nginx    \u251c\u2500\u2500 security-check.sh       # fail2ban, \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b    \u251c\u2500\u2500 youtrack-api.sh         # YouTrack REST API    \u251c\u2500\u2500 n8n-workflows.sh        # n8n \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438    \u251c\u2500\u2500 firecrawl.sh            # \u0421\u043a\u0440\u0430\u043f\u0438\u043d\u0433 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446    \u2514\u2500\u2500 context7.sh             # \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0428\u0430\u0433 2: \u0421\u043e\u0437\u0434\u0430\u0451\u043c Telegram-\u0431\u043e\u0442\u0430\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c @BotFather \u0432 Telegram\/newbot \u2192 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043c\u044f \u2192 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0432\u0438\u0434\u0430 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11\u0423\u0437\u043d\u0430\u0451\u043c \u0441\u0432\u043e\u0439 Telegram ID \u2014 \u043f\u0438\u0448\u0435\u043c @userinfobot, \u043e\u043d \u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u0447\u0438\u0441\u043b\u043e\u043c \u0432\u0440\u043e\u0434\u0435 778921250\u0417\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u043e\u0431\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.\u0428\u0430\u0433 3: \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c .envcp .env.example .envnano .env\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f:TELEGRAM_BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11OPENROUTER_API_KEY=sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxx\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 (\u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 YouTrack, Firecrawl):YOUTRACK_TOKEN=perm:your-token-hereFIRECRAWL_API_KEY=fc-your-key-here\u0428\u0430\u0433 4: \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c Telegram IDnano config\/openclaw.json\u041d\u0430\u0445\u043e\u0434\u0438\u043c &#171;allowFrom&#187; \u0438 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0439 ID:&#187;allowFrom&#187;: [  &#171;tg:778921250&#187;]\u042d\u0442\u043e whitelist. \u0411\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 ID. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u2014 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e ID \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e, \u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u043b\u043b\u0435\u0433\u0435.\u0428\u0430\u0433 5: \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u042d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u0448\u0430\u0433. \u0418\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u2014 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u00abGPT \u0432 Telegram\u00bb \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043e\u043c. \u0411\u0435\u0437 \u043d\u0438\u0445 \u0430\u0433\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c: \u00ab\u041a\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440? \u041a\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 \u0431\u0430\u0437\u044b? \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443\u00bb.SOUL.md \u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044fnano workspace\/SOUL.md\u0412 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0443\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0427\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c:1. \u0421\u043f\u0438\u0441\u043e\u043a PostgreSQL-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u0410\u0433\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445:## \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b PostgreSQL: db1, db2, db32. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u043f\u043a\u0435, \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043a:| \u041f\u0443\u0442\u044c | \u041f\u0440\u043e\u0435\u043a\u0442 | \u0421\u0442\u0435\u043a ||&#8212;&#8212;|&#8212;&#8212;&#8212;|&#8212;&#8212;|| \/projects\/my-app\/ | \u041c\u043e\u0439 SaaS | Next.js + PostgreSQL || \/projects\/api\/ | \u0411\u044d\u043a\u0435\u043d\u0434 | NestJS || \/projects\/landing\/ | \u041b\u0435\u043d\u0434\u0438\u043d\u0433 | HTML + Nginx |3. \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0412 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e: \u0447\u0442\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u2014 \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c. \u0410\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438.\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e: \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u00ab\u043f\u043e\u043a\u0430\u0436\u0438 \u043b\u043e\u0433\u0438 auth-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00bb, \u0430\u0433\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0430\u043c \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e auth-\u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 my-auth-container. \u041a\u043e\u0433\u0434\u0430 \u043f\u0438\u0448\u0435\u0442\u0435 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044e\u0437\u0435\u0440\u043e\u0432 \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e\u00bb \u2014 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0431\u0430\u0437\u0430 \u0438 \u043a\u0430\u043a \u043a \u043d\u0435\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f. \u0411\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c, \u0438 \u0432\u0435\u0441\u044c \u0441\u043c\u044b\u0441\u043b \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f.USER.md \u2014 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e \u0432\u0430\u0441nano workspace\/USER.md\u041a\u0442\u043e \u0432\u044b, \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043a, \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441. \u0410\u0433\u0435\u043d\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438.\u0428\u0430\u0433 6: \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u0430\u0439\u0442\u043e\u0432nano tools\/health-check.sh\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 SITES \u0438 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0438 \u0434\u043e\u043c\u0435\u043d\u044b:SITES=(  &#171;mysite.ru|mysite-frontend|mysite&#187;  &#171;api.mysite.ru|mysite-api|mysite&#187;  &#171;admin.mysite.ru|admin-panel|admin&#187;)\u0424\u043e\u0440\u043c\u0430\u0442: \u0434\u043e\u043c\u0435\u043d|\u0438\u043c\u044f_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430|\u043f\u0430\u043f\u043a\u0430_\u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0421\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 HTTP-\u043a\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. \u0415\u0441\u043b\u0438 5xx \u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043d\u043e\u0432\u0430. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u0435 \u043f\u043e\u0447\u0438\u043d\u0438\u043b\u043e\u0441\u044c \u2014 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 RESTART FAILED, \u0438 \u0430\u0433\u0435\u043d\u0442 \u043f\u0438\u0448\u0435\u0442 \u0432\u0430\u043c \u0441\u0440\u043e\u0447\u043d\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435.\u0428\u0430\u0433 7: \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043cbash deploy.sh\u0421\u043a\u0440\u0438\u043f\u0442 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438:\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442, \u0447\u0442\u043e Docker \u0438 Docker Compose V2 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b\u0421\u043e\u0437\u0434\u0430\u0441\u0442 \/var\/www\/openclaw\/ \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b\u044b\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442, \u0447\u0442\u043e .env \u0438 Telegram ID \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442 GID \u0433\u0440\u0443\u043f\u043f\u044b docker \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 \u0438 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u0442 \u0432 .env\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 chmod 600 \u043d\u0430 .env\u0421\u043a\u0430\u0447\u0430\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437 OpenClaw\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u2014 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c Telegram. \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u043e\u0442\u0443. \u041e\u043d \u043f\u0440\u0438\u0448\u043b\u0451\u0442 \u043a\u043e\u0434 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f:cd \/var\/www\/openclawdocker compose run &#8212;rm &#8212;profile cli openclaw-cli pairing approve telegram &lt;\u041a\u041e\u0414&gt;\u0413\u043e\u0442\u043e\u0432\u043e. \u041f\u0438\u0448\u0438\u0442\u0435 \u0431\u043e\u0442\u0443 \u0432 Telegram.\u0420\u0430\u0437\u0431\u043e\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\u0421\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432 \/tools\/ (read-only) \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0430\u0433\u0435\u043d\u0442\u0443. \u041e\u043d \u0441\u0430\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 SOUL.md. \u0412\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u2014 \u0430\u0433\u0435\u043d\u0442 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c.\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u0430\u0436\u0434\u044b\u0439.docker-status.sh \u2014 \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432#!\/bin\/bashdocker ps &#8212;format &#171;table {{.Names}}\\t{{.Status}}\\t{{.Ports}}&#187; &#8212;no-trunc\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u2014 \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 docker ps. \u0410\u0433\u0435\u043d\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0435 \u00ab\u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e\u00bb, \u00ab\u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\u00bb, \u0438\u043b\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 heartbeat.docker-logs.sh \u2014 \u043b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430#!\/bin\/bashCONTAINER=&#187;${1:?Usage: docker-logs.sh &lt;container_name&gt; [lines]}&#187;LINES=&#187;${2:-50}&#187;docker logs &#8212;tail &#171;$LINES&#187; &#171;$CONTAINER&#187; 2&gt;&amp;1\u041e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 docker logs \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043e\u043c \u0432 50 \u0441\u0442\u0440\u043e\u043a. \u00ab\u041f\u043e\u043a\u0430\u0436\u0438 \u043b\u043e\u0433\u0438 auth-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u00bb \u2192 \u0430\u0433\u0435\u043d\u0442 \u0437\u043d\u0430\u0435\u0442 \u0438\u0437 SOUL.md, \u0447\u0442\u043e auth-\u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 auth-container, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 docker-logs.sh auth-container.system-stats.sh \u2014 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430#!\/bin\/bashecho &#171;=== RAM ===&#187;free -hecho &#171;&#187;echo &#171;=== DISK ===&#187;df -h \/ | tail -1echo &#171;&#187;echo &#171;=== CPU Load ===&#187;uptimeecho &#171;&#187;echo &#171;=== Top by RAM ===&#187;docker stats &#8212;no-stream &#8212;format &#171;table {{.Name}}\\t{{.CPUPerc}}\\t{{.MemUsage}}\\t{{.MemPerc}}&#187; | head -15\u0427\u0435\u0442\u044b\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435: RAM, \u0434\u0438\u0441\u043a, \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CPU \u0438 top \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043f\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044e. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 heartbeat \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043f\u043e \u043f\u0440\u044f\u043c\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443.db-discover.sh \u2014 \u0430\u0432\u0442\u043e-\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445#!\/bin\/bashfor c in $(docker ps &#8212;format &#8216;{{.Names}}&#8217; | grep -i postgres); do  echo &#171;=== $c ===&#187;  DB_USER=$(docker exec &#171;$c&#187; printenv POSTGRES_USER 2&gt;\/dev\/null)  DB_NAME=$(docker exec &#171;$c&#187; printenv POSTGRES_DB 2&gt;\/dev\/null)  [ -z &#171;$DB_USER&#187; ] &amp;&amp; DB_USER=&#187;postgres&#187;  [ -z&#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-475540","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/475540","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=475540"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/475540\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=475540"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=475540"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=475540"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}