Compare commits

...

6 Commits

Author SHA1 Message Date
dttb
501752871b inventory: актуализация по pct/qm list от 2026-04-17
- +138 vpn-proxy, +139 yaroslav-assistant (новые)
- -133 clawdbot-1, -135 whisper-bot (удалены, перенесены в историю)
- Обновлены статусы running/stopped для 119, 123, 104, 106, 124
- Добавлены реальные IP (LAN + NetBird) для 116, 132, 134, 137, 138, 139
- Нода ресурсы: итого 21 LXC (11 running) + 15 VM (5 running)
2026-04-17 22:43:11 +03:00
dttb
2ba8c52cbe decision + credentials: Nextcloud sync через rclone bisync
- Добавлен decision 2026-04-17-nextcloud-sync-schema с полной архитектурой
  (Gitea история + Nextcloud зеркало + rclone + Stop-hook)
- В credentials.md добавлен Nextcloud AIO (dttb.ru, admin, app password)
- Удалена ссылка на несуществующий LXC 129 Clawdbot
2026-04-17 22:43:11 +03:00
dttb
59186d9a0b obsidian auto-sync 2026-04-17 21:50:42 2026-04-17 22:43:11 +03:00
dttb
42489c82cd obsidian auto-sync 2026-04-17 21:38:50 2026-04-17 22:43:11 +03:00
dttb
f7078a5218 gitignore: worktrees агентов + credentials-input obsidian-git 2026-04-17 22:43:11 +03:00
dttb
84a283deb5 obsidian auto-sync 2026-04-17 01:36:37 2026-04-17 22:43:11 +03:00
40 changed files with 23652 additions and 366 deletions

13
.gitignore vendored Normal file
View File

@@ -0,0 +1,13 @@
# Obsidian
.obsidian/workspace.json
.obsidian/workspace-mobile.json
.obsidian/plugins/*/data.json
.obsidian/plugins/*/.git_credentials_input
.obsidian/cache
# Claude Code локальные worktree-ы агентов
.claude/worktrees/
# System
.DS_Store
.trash/

16
.obsidian/app.json vendored Normal file
View File

@@ -0,0 +1,16 @@
{
"strictLineBreaks": false,
"showLineNumber": true,
"spellcheck": false,
"defaultViewMode": "source",
"livePreview": true,
"readableLineLength": true,
"showFrontmatter": true,
"foldHeading": true,
"foldIndent": true,
"newLinkFormat": "relative",
"attachmentFolderPath": "attachments",
"trashOption": "local",
"alwaysUpdateLinks": true,
"promptDelete": false
}

6
.obsidian/appearance.json vendored Normal file
View File

@@ -0,0 +1,6 @@
{
"baseFontSize": 16,
"theme": "obsidian",
"translucency": false,
"nativeMenus": true
}

5
.obsidian/community-plugins.json vendored Normal file
View File

@@ -0,0 +1,5 @@
[
"obsidian-git",
"dataview",
"templater-obsidian"
]

33
.obsidian/core-plugins.json vendored Normal file
View File

@@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"outgoing-link": true,
"tag-pane": true,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": false,
"command-palette": true,
"slash-command": false,
"editor-status": false,
"markdown-importer": true,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": false,
"canvas": true,
"footnotes": false,
"properties": true,
"bookmarks": true,
"bases": true,
"webviewer": false
}

6
.obsidian/daily-notes.json vendored Normal file
View File

@@ -0,0 +1,6 @@
{
"folder": "daily",
"format": "YYYY-MM-DD",
"template": "templates/daily-note",
"autorun": false
}

1
.obsidian/hotkeys.json vendored Normal file
View File

@@ -0,0 +1 @@
{}

20876
.obsidian/plugins/dataview/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
{
"id": "dataview",
"name": "Dataview",
"version": "0.5.68",
"minAppVersion": "0.13.11",
"description": "Complex data views for the data-obsessed.",
"author": "Michael Brenan <blacksmithgu@gmail.com>",
"authorUrl": "https://github.com/blacksmithgu",
"helpUrl": "https://blacksmithgu.github.io/obsidian-dataview/",
"isDesktopOnly": false
}

141
.obsidian/plugins/dataview/styles.css vendored Normal file
View File

@@ -0,0 +1,141 @@
.block-language-dataview {
overflow-y: auto;
}
/*****************/
/** Table Views **/
/*****************/
/* List View Default Styling; rendered internally as a table. */
.table-view-table {
width: 100%;
}
.table-view-table > thead > tr, .table-view-table > tbody > tr {
margin-top: 1em;
margin-bottom: 1em;
text-align: left;
}
.table-view-table > tbody > tr:hover {
background-color: var(--table-row-background-hover);
}
.table-view-table > thead > tr > th {
font-weight: 700;
font-size: larger;
border-top: none;
border-left: none;
border-right: none;
border-bottom: solid;
max-width: 100%;
}
.table-view-table > tbody > tr > td {
text-align: left;
border: none;
font-weight: 400;
max-width: 100%;
}
.table-view-table ul, .table-view-table ol {
margin-block-start: 0.2em !important;
margin-block-end: 0.2em !important;
}
/** Rendered value styling for any view. */
.dataview-result-list-root-ul {
padding: 0em !important;
margin: 0em !important;
}
.dataview-result-list-ul {
margin-block-start: 0.2em !important;
margin-block-end: 0.2em !important;
}
/** Generic grouping styling. */
.dataview.result-group {
padding-left: 8px;
}
/*******************/
/** Inline Fields **/
/*******************/
.dataview.inline-field-key {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-primary-alt);
color: var(--nav-item-color-selected);
}
.dataview.inline-field-value {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-secondary-alt);
color: var(--nav-item-color-selected);
}
.dataview.inline-field-standalone-value {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-secondary-alt);
color: var(--nav-item-color-selected);
}
/***************/
/** Task View **/
/***************/
.dataview.task-list-item, .dataview.task-list-basic-item {
margin-top: 3px;
margin-bottom: 3px;
transition: 0.4s;
}
.dataview.task-list-item:hover, .dataview.task-list-basic-item:hover {
background-color: var(--text-selection);
box-shadow: -40px 0 0 var(--text-selection);
cursor: pointer;
}
/*****************/
/** Error Views **/
/*****************/
div.dataview-error-box {
width: 100%;
min-height: 150px;
display: flex;
align-items: center;
justify-content: center;
border: 4px dashed var(--background-secondary);
}
.dataview-error-message {
color: var(--text-muted);
text-align: center;
}
/*************************/
/** Additional Metadata **/
/*************************/
.dataview.small-text {
font-size: smaller;
color: var(--text-muted);
margin-left: 3px;
}
.dataview.small-text::before {
content: "(";
}
.dataview.small-text::after {
content: ")";
}

450
.obsidian/plugins/obsidian-git/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,10 @@
{
"author": "Vinzent",
"authorUrl": "https://github.com/Vinzent03",
"id": "obsidian-git",
"name": "Git",
"description": "Integrate Git version control with automatic backup and other advanced features.",
"isDesktopOnly": false,
"fundingUrl": "https://ko-fi.com/vinzent",
"version": "2.38.1"
}

View File

@@ -0,0 +1,710 @@
@keyframes loading {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.git-signs-gutter {
.cm-gutterElement {
/* Needed to align the sign properly for different line heigts. Such as
* when having a heading or list item.
*/
padding-top: 0 !important;
}
}
.workspace-leaf-content[data-type="git-view"] .button-border {
border: 2px solid var(--interactive-accent);
border-radius: var(--radius-s);
}
.workspace-leaf-content[data-type="git-view"] .view-content {
padding-left: 0;
padding-top: 0;
padding-right: 0;
}
.workspace-leaf-content[data-type="git-history-view"] .view-content {
padding-left: 0;
padding-top: 0;
padding-right: 0;
}
.loading {
overflow: hidden;
}
.loading > svg {
animation: 2s linear infinite loading;
transform-origin: 50% 50%;
display: inline-block;
}
.obsidian-git-center {
margin: auto;
text-align: center;
width: 50%;
}
.obsidian-git-textarea {
display: block;
margin-left: auto;
margin-right: auto;
}
.obsidian-git-disabled {
opacity: 0.5;
}
.obsidian-git-center-button {
display: block;
margin: 20px auto;
}
.tooltip.mod-left {
overflow-wrap: break-word;
}
.tooltip.mod-right {
overflow-wrap: break-word;
}
/* Limits the scrollbar to the view body */
.git-view {
display: flex;
flex-direction: column;
position: relative;
height: 100%;
}
/* Re-enable wrapping of nav buttns to prevent overflow on smaller screens #*/
.workspace-drawer .git-view .nav-buttons-container {
flex-wrap: wrap;
}
.git-tools {
display: flex;
margin-left: auto;
}
.git-tools .type {
padding-left: var(--size-2-1);
display: flex;
align-items: center;
justify-content: center;
width: 11px;
}
.git-tools .type[data-type="M"] {
color: orange;
}
.git-tools .type[data-type="D"] {
color: red;
}
.git-tools .buttons {
display: flex;
}
.git-tools .buttons > * {
padding: 0 0;
height: auto;
}
.workspace-leaf-content[data-type="git-view"] .tree-item-self,
.workspace-leaf-content[data-type="git-history-view"] .tree-item-self {
align-items: center;
}
.workspace-leaf-content[data-type="git-view"]
.tree-item-self:hover
.clickable-icon,
.workspace-leaf-content[data-type="git-history-view"]
.tree-item-self:hover
.clickable-icon {
color: var(--icon-color-hover);
}
/* Highlight an item as active if it's diff is currently opened */
.is-active .git-tools .buttons > * {
color: var(--nav-item-color-active);
}
.git-author {
color: var(--text-accent);
}
.git-date {
color: var(--text-accent);
}
.git-ref {
color: var(--text-accent);
}
/* ====== diff2html ======
The following styles are adapted from the obsidian-version-history plugin by
@kometenstaub https://github.com/kometenstaub/obsidian-version-history-diff/blob/main/src/styles.scss
which itself is adapted from the diff2html library with the following original license:
https://github.com/rtfpessoa/diff2html/blob/master/LICENSE.md
Copyright 2014-2016 Rodrigo Fernandes https://rtfpessoa.github.io/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
.theme-dark,
.theme-light {
--git-delete-bg: #ff475040;
--git-delete-hl: #96050a75;
--git-insert-bg: #68d36840;
--git-insert-hl: #23c02350;
--git-change-bg: #ffd55840;
--git-selected: #3572b0;
--git-delete: #c33;
--git-insert: #399839;
--git-change: #d0b44c;
--git-move: #3572b0;
}
.git-diff {
.d2h-d-none {
display: none;
}
.d2h-wrapper {
text-align: left;
border-radius: 0.25em;
overflow: auto;
}
.d2h-file-header.d2h-file-header {
background-color: var(--background-secondary);
border-bottom: 1px solid var(--background-modifier-border);
font-family:
Source Sans Pro,
Helvetica Neue,
Helvetica,
Arial,
sans-serif;
height: 35px;
padding: 5px 10px;
}
.d2h-file-header,
.d2h-file-stats {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.d2h-file-header {
display: none;
}
.d2h-file-stats {
font-size: 14px;
margin-left: auto;
}
.d2h-lines-added {
border: 1px solid var(--color-green);
border-radius: 5px 0 0 5px;
color: var(--color-green);
padding: 2px;
text-align: right;
vertical-align: middle;
}
.d2h-lines-deleted {
border: 1px solid var(--color-red);
border-radius: 0 5px 5px 0;
color: var(--color-red);
margin-left: 1px;
padding: 2px;
text-align: left;
vertical-align: middle;
}
.d2h-file-name-wrapper {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 15px;
width: 100%;
}
.d2h-file-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--text-normal);
font-size: var(--h5-size);
}
.d2h-file-wrapper {
border: 1px solid var(--background-secondary-alt);
border-radius: 3px;
margin-bottom: 1em;
max-height: 100%;
}
.d2h-file-collapse {
-webkit-box-pack: end;
-ms-flex-pack: end;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
border: 1px solid var(--background-secondary-alt);
border-radius: 3px;
cursor: pointer;
display: none;
font-size: 12px;
justify-content: flex-end;
padding: 4px 8px;
}
.d2h-file-collapse.d2h-selected {
background-color: var(--git-selected);
}
.d2h-file-collapse-input {
margin: 0 4px 0 0;
}
.d2h-diff-table {
border-collapse: collapse;
font-family: var(--font-monospace);
font-size: var(--code-size);
width: 100%;
}
.d2h-files-diff {
width: 100%;
}
.d2h-file-diff {
/*
overflow-y: scroll;
*/
border-radius: 5px;
font-size: var(--font-text-size);
line-height: var(--line-height-normal);
}
.d2h-file-side-diff {
display: inline-block;
margin-bottom: -8px;
margin-right: -4px;
overflow-x: scroll;
overflow-y: hidden;
width: 50%;
}
.d2h-code-line {
padding-left: 6em;
padding-right: 1.5em;
}
.d2h-code-line,
.d2h-code-side-line {
display: inline-block;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
white-space: nowrap;
width: 100%;
}
.d2h-code-side-line {
/* needed to be changed */
padding-left: 0.5em;
padding-right: 0.5em;
}
.d2h-code-line-ctn {
word-wrap: normal;
background: none;
display: inline-block;
padding: 0;
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
vertical-align: middle;
width: 100%;
/* only works for line-by-line */
white-space: pre-wrap;
}
.d2h-code-line del,
.d2h-code-side-line del {
background-color: var(--git-delete-hl);
color: var(--text-normal);
}
.d2h-code-line del,
.d2h-code-line ins,
.d2h-code-side-line del,
.d2h-code-side-line ins {
border-radius: 0.2em;
display: inline-block;
margin-top: -1px;
text-decoration: none;
vertical-align: middle;
}
.d2h-code-line ins,
.d2h-code-side-line ins {
background-color: var(--git-insert-hl);
text-align: left;
}
.d2h-code-line-prefix {
word-wrap: normal;
background: none;
display: inline;
padding: 0;
white-space: pre;
}
.line-num1 {
float: left;
}
.line-num1,
.line-num2 {
-webkit-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
/*
padding: 0 0.5em;
*/
text-overflow: ellipsis;
width: 2.5em;
padding-left: 0;
}
.line-num2 {
float: right;
}
.d2h-code-linenumber {
background-color: var(--background-primary);
border: solid var(--background-modifier-border);
border-width: 0 1px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: var(--text-faint);
cursor: pointer;
display: inline-block;
position: absolute;
text-align: right;
width: 5.5em;
}
.d2h-code-linenumber:after {
content: "\200b";
}
.d2h-code-side-linenumber {
background-color: var(--background-primary);
border: solid var(--background-modifier-border);
border-width: 0 1px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: var(--text-faint);
cursor: pointer;
overflow: hidden;
padding: 0 0.5em;
text-align: right;
text-overflow: ellipsis;
width: 4em;
/* needed to be changed */
display: table-cell;
position: relative;
}
.d2h-code-side-linenumber:after {
content: "\200b";
}
.d2h-code-side-emptyplaceholder,
.d2h-emptyplaceholder {
background-color: var(--background-primary);
border-color: var(--background-modifier-border);
}
.d2h-code-line-prefix,
.d2h-code-linenumber,
.d2h-code-side-linenumber,
.d2h-emptyplaceholder {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.d2h-code-linenumber,
.d2h-code-side-linenumber {
direction: rtl;
}
.d2h-del {
background-color: var(--git-delete-bg);
border-color: var(--git-delete-hl);
}
.d2h-ins {
background-color: var(--git-insert-bg);
border-color: var(--git-insert-hl);
}
.d2h-info {
background-color: var(--background-primary);
border-color: var(--background-modifier-border);
color: var(--text-faint);
}
.d2h-del,
.d2h-ins,
.d2h-file-diff .d2h-change {
color: var(--text-normal);
}
.d2h-file-diff .d2h-del.d2h-change {
background-color: var(--git-change-bg);
}
.d2h-file-diff .d2h-ins.d2h-change {
background-color: var(--git-insert-bg);
}
.d2h-file-list-wrapper {
a {
text-decoration: none;
cursor: default;
-webkit-user-drag: none;
}
svg {
display: none;
}
}
.d2h-file-list-header {
text-align: left;
}
.d2h-file-list-title {
display: none;
}
.d2h-file-list-line {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
text-align: left;
}
.d2h-file-list {
}
.d2h-file-list > li {
border-bottom: 1px solid var(--background-modifier-border);
margin: 0;
padding: 5px 10px;
}
.d2h-file-list > li:last-child {
border-bottom: none;
}
.d2h-file-switch {
cursor: pointer;
display: none;
font-size: 10px;
}
.d2h-icon {
fill: currentColor;
margin-right: 10px;
vertical-align: middle;
}
.d2h-deleted {
color: var(--git-delete);
}
.d2h-added {
color: var(--git-insert);
}
.d2h-changed {
color: var(--git-change);
}
.d2h-moved {
color: var(--git-move);
}
.d2h-tag {
background-color: var(--background-secondary);
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 10px;
margin-left: 5px;
padding: 0 2px;
}
.d2h-deleted-tag {
border: 1px solid var(--git-delete);
}
.d2h-added-tag {
border: 1px solid var(--git-insert);
}
.d2h-changed-tag {
border: 1px solid var(--git-change);
}
.d2h-moved-tag {
border: 1px solid var(--git-move);
}
/* needed for line-by-line*/
.d2h-diff-tbody {
position: relative;
}
}
/* ====================== Line Authoring Information ====================== */
.cm-gutterElement.obs-git-blame-gutter {
/* Add background color to spacing inbetween and around the gutter for better aesthetics */
border-width: 0px 2px 0.2px 2px;
border-style: solid;
border-color: var(--background-secondary);
background-color: var(--background-secondary);
}
.cm-gutterElement.obs-git-blame-gutter > div,
.line-author-settings-preview {
/* delegate text color to settings */
color: var(--obs-git-gutter-text);
font-family: monospace;
height: 100%; /* ensure, that age-based background color occupies entire parent */
text-align: right;
padding: 0px 6px 0px 6px;
white-space: pre; /* Keep spaces and do not collapse them. */
}
@media (max-width: 800px) {
/* hide git blame gutter not to superpose text */
.cm-gutterElement.obs-git-blame-gutter {
display: none;
}
}
.git-unified-diff-view,
.git-split-diff-view .cm-deletedLine .cm-changedText {
background-color: #ee443330;
}
.git-unified-diff-view,
.git-split-diff-view .cm-insertedLine .cm-changedText {
background-color: #22bb2230;
}
.git-obscure-prompt[git-is-obscured="true"] #git-show-password:after {
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"></path><circle cx="12" cy="12" r="3"></circle></svg>');
}
.git-obscure-prompt[git-is-obscured="false"] #git-show-password:after {
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye-off"><path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49"></path><path d="M14.084 14.158a3 3 0 0 1-4.242-4.242"></path><path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143"></path><path d="m2 2 20 20"></path></svg>');
}
/* Override styling of Codemirror merge view "collapsed lines" indicator */
.git-split-diff-view .ͼ2 .cm-collapsedLines {
background: var(--interactive-normal);
border-radius: var(--radius-m);
color: var(--text-accent);
font-size: var(--font-small);
padding: var(--size-4-1) var(--size-4-1);
}
.git-split-diff-view .ͼ2 .cm-collapsedLines:hover {
background: var(--interactive-hover);
color: var(--text-accent-hover);
}
.git-signs-gutter {
.cm-gutterElement {
display: grid;
}
}
.git-gutter-marker:hover {
border-radius: 2px;
}
.git-gutter-marker.git-add {
background-color: var(--color-green);
justify-self: center;
height: inherit;
width: 0.2rem;
}
.git-gutter-marker.git-change {
background-color: var(--color-yellow);
justify-self: center;
height: inherit;
width: 0.2rem;
}
.git-gutter-marker.git-changedelete {
color: var(--color-yellow);
font-weight: var(--font-bold);
font-size: 1rem;
justify-self: center;
height: inherit;
}
.git-gutter-marker.git-delete {
background-color: var(--color-red);
height: 0.2rem;
width: 0.8rem;
align-self: end;
}
.git-gutter-marker.git-topdelete {
background-color: var(--color-red);
height: 0.2rem;
width: 0.8rem;
align-self: start;
}
div:hover > .git-gutter-marker.git-change {
width: 0.6rem;
}
div:hover > .git-gutter-marker.git-add {
width: 0.6rem;
}
div:hover > .git-gutter-marker.git-delete {
height: 0.6rem;
}
div:hover > .git-gutter-marker.git-topdelete {
height: 0.6rem;
}
div:hover > .git-gutter-marker.git-changedelete {
font-weight: var(--font-bold);
}
.git-gutter-marker.staged {
opacity: 0.5;
}
.git-diff {
.cm-merge-revert {
width: 4em;
}
/* Ensure that merge revert markers are positioned correctly */
.cm-merge-revert > * {
position: absolute;
background-color: var(--background-secondary);
display: flex;
}
}
/* Prevent shifting of the editor when git signs gutter is the only gutter present */
.cm-gutters.cm-gutters-before:has(> .git-signs-gutter:only-child) {
margin-inline-end: 0;
.git-signs-gutter {
margin-inline-start: -1rem;
}
}
.git-changes-status-bar-colored {
.git-add {
color: var(--color-green);
}
.git-change {
color: var(--color-yellow);
}
.git-delete {
color: var(--color-red);
}
}
.git-changes-status-bar .git-add {
margin-right: 0.3em;
}
.git-changes-status-bar .git-change {
margin-right: 0.3em;
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
{
"id": "templater-obsidian",
"name": "Templater",
"version": "2.19.0",
"description": "Create and use templates",
"minAppVersion": "1.12.2",
"author": "SilentVoid",
"authorUrl": "https://github.com/SilentVoid13",
"helpUrl": "https://silentvoid13.github.io/Templater/",
"isDesktopOnly": false
}

View File

@@ -0,0 +1,226 @@
.templater_search {
width: calc(100% - 20px);
}
.templater_div {
border-top: 1px solid var(--background-modifier-border);
}
.templater_div > .setting-item {
border-top: none !important;
align-self: center;
}
.templater_div > .setting-item > .setting-item-control {
justify-content: space-around;
padding: 0;
width: 100%;
}
.templater_div
> .setting-item
> .setting-item-control
> .setting-editor-extra-setting-button {
align-self: center;
}
.templater_donating {
margin: 10px;
}
.templater_title {
margin: 0;
padding: 0;
margin-top: 5px;
text-align: center;
}
.templater_template {
align-self: center;
margin-left: 5px;
margin-right: 5px;
width: 70%;
}
.templater_cmd {
margin-left: 5px;
margin-right: 5px;
font-size: 14px;
width: 100%;
}
.templater_div2 > .setting-item {
align-content: center;
justify-content: center;
}
.templater-prompt-div,
.templater-multisuggester-div {
display: flex;
}
.templater-prompt-form {
display: flex;
flex-grow: 1;
}
.templater-prompt-input,
.templater-multisuggester-input {
flex-grow: 1;
}
.templater-button-div {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 1rem;
}
textarea.templater-prompt-input {
height: 10rem;
}
textarea.templater-prompt-input:focus {
border-color: var(--interactive-accent);
}
.templater-multisuggester-list {
margin: 1.5em 0;
}
.cm-s-obsidian .templater-command-bg {
left: 0px;
right: 0px;
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command {
font-size: 0.85em;
font-family: var(--font-monospace);
line-height: 1.3;
}
.cm-s-obsidian .templater-inline .cm-templater-command {
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag {
color: var(--code-property, #008bff);
}
.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag {
color: var(--code-function, #c0d700);
}
.cm-s-obsidian .cm-templater-command.cm-keyword {
color: var(--code-keyword, #00a7aa);
font-weight: normal;
}
.cm-s-obsidian .cm-templater-command.cm-atom {
color: var(--code-normal, #f39b35);
}
.cm-s-obsidian .cm-templater-command.cm-value,
.cm-s-obsidian .cm-templater-command.cm-number,
.cm-s-obsidian .cm-templater-command.cm-type {
color: var(--code-value, #a06fca);
}
.cm-s-obsidian .cm-templater-command.cm-def,
.cm-s-obsidian .cm-templater-command.cm-type.cm-def {
color: var(--code-normal, var(--text-normal));
}
.cm-s-obsidian .cm-templater-command.cm-property,
.cm-s-obsidian .cm-templater-command.cm-property.cm-def,
.cm-s-obsidian .cm-templater-command.cm-attribute {
color: var(--code-function, #98e342);
}
.cm-s-obsidian .cm-templater-command.cm-variable,
.cm-s-obsidian .cm-templater-command.cm-variable-2,
.cm-s-obsidian .cm-templater-command.cm-variable-3,
.cm-s-obsidian .cm-templater-command.cm-meta {
color: var(--code-property, #d4d4d4);
}
.cm-s-obsidian .cm-templater-command.cm-callee,
.cm-s-obsidian .cm-templater-command.cm-operator,
.cm-s-obsidian .cm-templater-command.cm-qualifier,
.cm-s-obsidian .cm-templater-command.cm-builtin {
color: var(--code-operator, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-tag {
color: var(--code-tag, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-comment,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute {
color: var(--code-comment, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-string,
.cm-s-obsidian .cm-templater-command.cm-string-2 {
color: var(--code-string, #e6db74);
}
.cm-s-obsidian .cm-templater-command.cm-header,
.cm-s-obsidian .cm-templater-command.cm-hr {
color: var(--code-keyword, #da7dae);
}
.cm-s-obsidian .cm-templater-command.cm-link {
color: var(--code-normal, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-error {
border-bottom: 1px solid #c42412;
}
.CodeMirror-hints {
position: absolute;
z-index: 10;
overflow: hidden;
list-style: none;
margin: 0;
padding: 2px;
-webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
border-radius: 3px;
border: 1px solid silver;
background: white;
font-size: 90%;
font-family: monospace;
max-height: 20em;
overflow-y: auto;
}
.CodeMirror-hint {
margin: 0;
padding: 0 4px;
border-radius: 2px;
white-space: pre;
color: black;
cursor: pointer;
}
li.CodeMirror-hint-active {
background: #08f;
color: white;
}

3
.obsidian/templates.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"folder": "templates"
}

BIN
.sync_3db9100e9b7e.db Normal file

Binary file not shown.

View File

@@ -5,23 +5,62 @@
## Язык: русский ## Язык: русский
## Структура ## Структура (Obsidian vault)
- `projects/dttb/` — домашний сервер (Proxmox, сеть, все сервисы) - `projects/dttb/` — домашний сервер (Proxmox, сеть, все сервисы)
- `network-topology.md` — полная карта сети 10.0.0.0/24 - `network-topology.md` — полная карта сети 10.0.0.0/24
- `proxmox-inventory.md` — все VM/LXC - `proxmox-inventory.md` — все VM/LXC
- `credentials.md` — пароли и ключи ⚠️ - `credentials.md` — пароли и ключи
- `npm-proxy-hosts.md` — домены *.dttb.ru - `npm-proxy-hosts.md` — домены *.dttb.ru
- `projects/niikn/` — проект НИИКН - `projects/niikn/` — проект НИИКН
- `projects/glavtorg/` — проект Главторг (Windows-сервер, 1С)
- `decisions/` — принятые решения (формат: YYYY-MM-DD-тема.md) - `decisions/` — принятые решения (формат: YYYY-MM-DD-тема.md)
- `snippets/` — полезный код и конфиги - `snippets/` — полезный код и конфиги
- `notes/` — заметки из чатов с ИИ - `notes/` — заметки из чатов с ИИ
- `daily/` — ежедневные заметки (YYYY-MM-DD.md)
- `templates/` — шаблоны (daily-note, decision)
## Obsidian-конвенции
- Используй `[[двойные скобки]]` для внутренних ссылок
- Теги `#topic` для фильтрации
- Daily notes в формате YYYY-MM-DD
- Разделяй факты (decisions/) от рабочих заметок (notes/)
## Инфраструктура ## Инфраструктура
- **Proxmox:** 10.0.0.250 (root/1qaz!QAZ) - **Proxmox:** 10.0.0.250 (root/1qaz!QAZ)
- **Gitea:** git.dttb.ru (oleg/OL260380eg) - **Gitea:** git.dttb.ru (oleg/OL260380eg)
- **Nextcloud:** dttb.ru (admin/1qaz!QAZ) - **Nextcloud:** dttb.ru (admin/1qaz!QAZ)
- **NPM:** 10.0.0.195:81 (it5870@yandex.ru/1qaz!QAZ) - **NPM:** 10.0.0.195:81 (it5870@yandex.ru/1qaz!QAZ)
- **Clawdbot (Максимка):** 10.0.0.206 (bot.dttb.ru) - **Clawdbot-1 (НИИКН):** 10.0.0.237 (LXC 133, OmniRoute)
## Частые команды
- Список VM: `sshpass -p '1qaz!QAZ' ssh -o StrictHostKeyChecking=no root@10.0.0.250 qm list`
- Список LXC: `sshpass -p '1qaz!QAZ' ssh -o StrictHostKeyChecking=no root@10.0.0.250 pct list`
- Проверить хост: `ping -c3 <ip>`
- Домены NPM: смотри `projects/dttb/npm-proxy-hosts.md`
- Карта сети: смотри `projects/dttb/network-topology.md`
## Как работать
- Перед правкой — читай текущее состояние файла
- Не предлагай решения, которые уже описаны в `decisions/`
- При изменениях в инфраструктуре — обнови `proxmox-inventory.md` и `network-topology.md`
- Отвечай кратко, без воды и повторений
## Ресёрч через OmniRoute (бесплатные модели)
При работе над задачами используй двухэтапный подход:
1. **Ресёрч** — вызывай MCP тул `research` для поиска решений через бесплатные модели (Sonnet 4.5, GPT-5.4, Gemini)
2. **Исполнение** — реализуй найденное решение сам (Opus 4.6 через Max подписку)
### MCP тулы omniroute
- `research(query, model?)` — запрос к бесплатной модели. По умолчанию kr/claude-sonnet-4.5
- `research_compare(query, models?)` — сравнить ответы нескольких моделей
- `models_list()` — список доступных бесплатных моделей
### Когда использовать research
- Поиск best practices и подходов к задаче
- Сравнение технологий/решений
- Генерация конфигов и шаблонов для проверки
- НЕ используй для простых задач где ответ очевиден
## Правила ## Правила
1. Проверяй базу перед работой — решение может уже быть 1. Проверяй базу перед работой — решение может уже быть

View File

@@ -20,7 +20,7 @@
|------|------|----|-------| |------|------|----|-------|
| 107 | Mailcow | 10.0.0.107 | Mailcow для dttb.ru, 4 cores, 8GB RAM | | 107 | Mailcow | 10.0.0.107 | Mailcow для dttb.ru, 4 cores, 8GB RAM |
| 131 | agentdvr | 10.0.0.232 | Agent DVR, 8 cores, 6GB RAM, port 8090 | | 131 | agentdvr | 10.0.0.232 | Agent DVR, 8 cores, 6GB RAM, port 8090 |
| 129 | clawdbot | 10.0.0.206 | Clawdbot AI bot (основной, прямой API claude-opus-4-6, @maxim_dttb_bot) | | 129 | — | — | УДАЛЁН 2026-04-14 (бывший Clawdbot, данные на code-server:/root/backup-lxc129/) |
| 133 | clawdbot-1 | 10.0.0.237 | Бот НИИКН (cliproxy/claude-sonnet-4-6, @maximka_assistant_bot) | | 133 | clawdbot-1 | 10.0.0.237 | Бот НИИКН (cliproxy/claude-sonnet-4-6, @maximka_assistant_bot) |
| 134 | clawdbot-2 | 10.0.0.238 | Знам — бот ЧОП видеоархив (@ZnamSecurityBot, haiku) | | 134 | clawdbot-2 | 10.0.0.238 | Знам — бот ЧОП видеоархив (@ZnamSecurityBot, haiku) |
| 111 | WinServer2025 | - | RTX 3060 LHR passed through | | 111 | WinServer2025 | - | RTX 3060 LHR passed through |
@@ -45,17 +45,11 @@
- HTTP file server: http://10.0.0.227:8091 (python3 http.server, nohup + @reboot cron) - HTTP file server: http://10.0.0.227:8091 (python3 http.server, nohup + @reboot cron)
- 8 vCPU, 8GB RAM (критически мало — 99% использовано) - 8 vCPU, 8GB RAM (критически мало — 99% использовано)
## Clawdbot (LXC 129)основной бот ## LXC 129 — УДАЛЁН (2026-04-14)
- Real config: ~/.clawdbot/clawdbot.json (NOT /opt/clawdbot/config.yaml) - Бывший Clawdbot (@maxim_dttb_bot), IP 10.0.0.206
- Telegram bot: @maxim_dttb_bot - Данные: code-server:/root/backup-lxc129/ (vpn-configs, SOUL.md, memory, siri-proxy, nextcloud-talk-bot)
- Model: anthropic/claude-opus-4-6 — **ПРЯМОЙ API** (api.anthropic.com), ключ sk-ant-api03-VLV... - CLIProxy (8317) удалён вместе с контейнером
- Переключён с CLIProxy на прямой API 2026-04-02 - Бот 134 (Znam) тоже выключен — зависел от CLIProxy на 129
- CLIProxy: порт 8317 (cliproxy.service) — ОСТАВЛЕН для ботов 133, 134
- CLIProxy auth: batlaew@gmail.com, auto-refresh токен
- DNS: nameserver 8.8.8.8 1.1.1.1 закреплён в Proxmox конфиге LXC (не сбросится)
- Gateway: порт 18789, token: changeme123
- SSH: ключ claude-code (id_ed25519 с LXC 132)
- NetBird: 100.70.219.93, exit node через Финляндию (группа Trance)
## Nextcloud dttb.ru (VM 250) → см. nextcloud-dttb.md ## Nextcloud dttb.ru (VM 250) → см. nextcloud-dttb.md
- URL: https://dttb.ru, admin / 1qaz!QAZ, NC 32.0.6, AIO v12.6.1 - URL: https://dttb.ru, admin / 1qaz!QAZ, NC 32.0.6, AIO v12.6.1
@@ -284,11 +278,10 @@
## DNS FakeIP → см. feedback_dns_fakeip.md ## DNS FakeIP → см. feedback_dns_fakeip.md
- Роутеры подменяют DNS (198.18.x.x) — всегда прописывать nameserver 8.8.8.8 в Proxmox конфиге LXC - Роутеры подменяют DNS (198.18.x.x) — всегда прописывать nameserver 8.8.8.8 в Proxmox конфиге LXC
## CLIProxy на code-server → см. cliproxy_code_server.md ## Claude Code на code-server → см. cliproxy_code_server.md
- OAuth токен протухает ~8ч, нужен SSH-туннель + браузер для перелогина, fallback: прямой API (платный) - Max подписка (OAuth), MCP omniroute для бесплатного ресёрча
- CLIProxy убран, авто-синк токена с Mac (cron каждые 12ч)
## Миграция на прямой API → см. project_direct_api_migration.md - Решение: decisions/2026-04-14-openclaw-claude-code-pipeline.md
- 129 и 114 на прямом API, 133 и 134 ещё на CLIProxy — нужны свои ключи
## OmniRoute (LXC 132, 10.0.0.179) → см. omniroute.md ## OmniRoute (LXC 132, 10.0.0.179) → см. omniroute.md
- AI Gateway v3.6.5, порт 20128, API key: sk-225e902dc95ff192-6bdad7-3ec8cdc6 - AI Gateway v3.6.5, порт 20128, API key: sk-225e902dc95ff192-6bdad7-3ec8cdc6

View File

@@ -1,34 +1,29 @@
--- ---
name: CLIProxy на code-server (10.0.0.179) name: Claude Code на code-server (10.0.0.179) — новая архитектура
description: Claude Code использует CLIProxy OAuth — процедура обновления токена при протухании description: Claude Code через Max подписку + MCP omniroute для бесплатного ресёрча. CLIProxy больше не нужен.
type: project type: project
--- ---
Claude Code на code-server (LXC 132, IP 10.0.0.179) работает через локальный CLIProxy (порт 8317, cliproxy.service). ## Текущая архитектура (с 2026-04-14)
**Проблема:** OAuth токен (batlaew@gmail.com) протухает каждые ~8 часов. CLIProxy может не обновить refresh_token автоматически → клиент переходит в suspended → Claude Code перестаёт работать. Claude Code на code-server (LXC 132, 10.0.0.179) работает **напрямую через Max подписку** (OAuth).
CLIProxy убран из конфига Claude Code. Оставлен только для Clawdbot-2/Znam (LXC 134).
**Why:** CLIProxy использует OAuth через claude.ai, а не прямой API. Это бесплатно (подписка Pro), но требует периодического обновления токена. ### Ресёрч через OmniRoute (бесплатно)
- MCP-сервер: `/root/mcp-omniroute/server.js`
- Тулы: `research`, `research_compare`, `models_list`
- Модели: kr/claude-sonnet-4.5, cx/gpt-5.4, gemini-cli/gemini-2.5-pro, gh/gpt-5.2-codex
- Скрипт: `/usr/local/bin/research "вопрос"` (парсер: `/usr/local/bin/parse_response.py`)
## Процедура обновления токена ### Конфигурация
- settings.json: MCP-сервер omniroute, без env-переменных CLIProxy
- .bashrc/.profile: очищены от ANTHROPIC_* переменных
- Авторизация: `claude auth login --claudeai` (OAuth Max)
1. Остановить сервис: `systemctl stop cliproxy.service` ### Решение по decisions/
2. Запустить логин: `/usr/local/bin/cli-proxy-api -config /root/.cli-proxy-api/config.yaml -claude-login -no-browser` Подробности: `decisions/2026-04-14-openclaw-claude-code-pipeline.md`
3. CLIProxy покажет URL для SSH-туннеля и ссылку авторизации
4. На локальной машине сделать SSH-туннель: `ssh -L 54545:127.0.0.1:54545 root@202.71.12.186`
5. Открыть ссылку авторизации в браузере, залогиниться batlaew@gmail.com
6. После callback — токен обновится в `/root/.cli-proxy-api/claude-batlaew@gmail.com.json`
7. Запустить сервис: `systemctl start cliproxy.service`
## Конфигурация ## Старая архитектура (до 2026-04-14, архив)
- settings.json: `apiBaseUrl: http://localhost:8317`, `apiKey: sk-cliproxyapi-local`
- Env: `ANTHROPIC_BASE_URL=http://localhost:8317`
- Токен файл: `/root/.cli-proxy-api/claude-batlaew@gmail.com.json`
- API keys в config.yaml: `sk-clawdbot-proxy`, `sk-f4ab6903a58a4cb4b2b453ae2bbf2c6e`
## Альтернатива (fallback) CLIProxy (cliproxy.service, порт 8317) проксировал OAuth. Токен протухал каждые ~8ч.
Прямой API: ключ `ANTHROPIC_API_KEY=sk-ant-api03-vMW...` доступен в env. Для переключения: в settings.json поменять apiBaseUrl на `https://api.anthropic.com` и apiKey на прямой ключ. Но это платно. Убран из-за нестабильности. CLIProxy оставлен только для ботов 133/134.
## TODO
- Выяснить, почему auto-refresh не срабатывает (проверить после следующего протухания)
- Рассмотреть cron для принудительного рефреша до истечения токена

View File

@@ -1,22 +1,16 @@
--- ---
name: Миграция ботов на прямой Anthropic API name: Миграция ботов — итоговый статус
description: Боты переводятся с CLIProxy OAuth на прямые API-ключи для автономности description: Финальный статус миграции ботов с CLIProxy. LXC 129 удалён 2026-04-14.
type: project type: project
--- ---
Миграция ботов Clawdbot с CLIProxy (OAuth proxy) на прямые Anthropic API ключи для полной автономности каждого бота. ## Статус (2026-04-14)
**Why:** CLIProxy зависит от OAuth refresh token одного аккаунта (batlaew@gmail.com). При проблемах с DNS/сетью/refresh все боты падают одновременно. Прямой API ключ = независимость.
**How to apply:** Каждый бот получает свой API ключ. В clawdbot.json: провайдер `anthropic` вместо `cliproxy`, baseUrl `https://api.anthropic.com`.
## Статус миграции (2026-04-02)
| Бот | LXC | Статус | Модель | API | | Бот | LXC | Статус | Модель | API |
|-----|-----|--------|--------|-----| |-----|-----|--------|--------|-----|
| Основной (@maxim_dttb_bot) | 129 | Прямой API | claude-opus-4-6 | sk-ant-api03-VLV... | | Основной (@maxim_dttb_bot) | ~~129~~ | **УДАЛЁН** | — | LXC 129 удалён |
| Boss-Assistant (@assistent_maximka_bot) | 114 | Прямой API | claude-sonnet-4-6 | sk-ant-api03-zaU... | | Boss-Assistant (@assistent_maximka_bot) | 114 | Прямой API | claude-sonnet-4-6 | sk-ant-api03-zaU... |
| НИИКН (@maximka_assistant_bot) | 133 | CLIProxy (129:8317) | claude-sonnet-4-6 | Нужен свой ключ | | НИИКН (@maximka_assistant_bot) | 133 | OmniRoute | kr/claude-sonnet-4.5 | Бесплатно (Kiro/AWS) |
| Знам (@ZnamSecurityBot) | 134 | CLIProxy (129:8317) | claude-sonnet-4-6 | Нужен свой ключ | | Знам (@ZnamSecurityBot) | 134 | **ВЫКЛЮЧЕН** | — | CLIProxy удалён с 129 |
CLIProxy на LXC 129 оставлен работать для 133/134 пока они не мигрируют. CLIProxy больше не существует. Бот 133 переведён на OmniRoute (бесплатно).

View File

@@ -42,7 +42,7 @@
## Новый бот (clawdbot-3) ## Новый бот (clawdbot-3)
- Telegram: @dttb_support_bot (зарегистрировать в BotFather) - Telegram: @dttb_support_bot (зарегистрировать в BotFather)
- Модель: cliproxy/claude-sonnet-4-6 (через CLIProxy на 129:8317) - Модель: нужно определить (CLIProxy на 129 удалён, OmniRoute или прямой API)
- Персона: вежливый формальный саппорт, без доступа к инфраструктуре - Персона: вежливый формальный саппорт, без доступа к инфраструктуре
- Skill: helpdesk (работа с Freescout API) - Skill: helpdesk (работа с Freescout API)
- Не знает паролей/IP, не выполняет команды — только общение + тикеты - Не знает паролей/IP, не выполняет команды — только общение + тикеты

21
daily/2026-04-17.md Normal file
View File

@@ -0,0 +1,21 @@
---
date: 2026-04-17
type: daily
---
# 2026-04-17
## Приоритеты дня
- [ ]
## Инфраструктура
<!-- Что менял, чинил, настраивал -->
## Заметки
<!-- Идеи, находки, инсайты -->
## Проекты
<!-- Прогресс по активным проектам -->
## Итог дня
<!-- Что сделано, что осталось -->

View File

@@ -0,0 +1,50 @@
# Связка OmniRoute + Claude Code на code-server
**Дата:** 2026-04-14
**Статус:** Реализовано
## Проблема
CLIProxy (cliproxy.service) на code-server постоянно протухал (~8ч), требовал ручного обновления OAuth через SSH-туннель. OpenClaw (Clawdbot) через CLIProxy работал нестабильно.
## Решение
Разделить ресёрч и исполнение:
- **Ресёрч** — бесплатные модели через OmniRoute (localhost:20128)
- **Исполнение** — Claude Code CLI через Max подписку (прямой OAuth, без CLIProxy)
## Что сделано
### 1. MCP-сервер omniroute-research
- **Путь:** `/root/mcp-omniroute/server.js`
- **Тулы:** `research`, `research_compare`, `models_list`
- **Подключение:** через `~/.claude/settings.json` → mcpServers
- Claude Code может вызывать бесплатные модели для ресёрча прямо из диалога
### 2. Скрипт research
- **Путь:** `/usr/local/bin/research`
- **Парсер:** `/usr/local/bin/parse_response.py`
- **Использование:** `research "вопрос"` или `research -m cx/gpt-5.4 "вопрос"`
- Модели: kr/claude-sonnet-4.5, cx/gpt-5.4, gemini-cli/gemini-2.5-pro, gh/gpt-5.2-codex
### 3. Очистка CLIProxy из Claude Code
- Удалены `ANTHROPIC_API_KEY` и `ANTHROPIC_BASE_URL` из `.bashrc`, `.profile`
- Удалены env-переменные из `~/.claude/settings.json`
- CLIProxy (cliproxy.service) оставлен для Clawdbot-2/Znam (LXC 134)
- Claude Code теперь авторизуется напрямую через Max подписку
### 4. settings.json обновлён
- Добавлен mcpServers.omniroute
- Добавлены permissions для MCP тулов и research скрипта
- Убраны env-переменные CLIProxy
## Архитектура
```
Claude Code (Opus 4.6, Max) ─── прямой OAuth ─── Anthropic
└── MCP: omniroute ─── localhost:20128 ─── Kiro/Codex/Gemini/GitHub (FREE)
```
## TODO
- [ ] Выполнить `claude auth login --claudeai` на code-server для прямой авторизации Max

View File

@@ -0,0 +1,109 @@
# Обновление и расширение ресурсов code-server (LXC 132)
**Дата:** 2026-04-17
**Статус:** Реализовано
## Симптомы (до работ)
- OpenClaw (Clawdbot AI через code-server) часто сбоит
- Load average на LXC 132: **4.3** при 2 vCPU (перегрузка 2×)
- RAM: 1 GB из 8 GB (проблема не в памяти)
- Claude Code extension: 2.1.111 (актуальная 2.1.112)
## Найденные проблемы
### 1. Нехватка CPU
- 2 vCPU, load avg 4.3 — процессор узкое место
- top показывает 44% busy (us+sy), но load 4.3 → много процессов ждут
### 2. Сбои OmniRoute (journalctl -u omniroute)
- `[HealthCheck] ✗ kiro/... refresh failed` — Kiro OAuth токен не рефрешится
- `[Claude Usage] OAuth endpoint returned 429` — rate-limit от Anthropic
- `[HealthCheck] Error: [ProxyDispatcher] Context proxy host is required` — сломан конфиг proxy
### 3. Устаревший Claude Code
- На code-server 2.1.111, локально обновили до 2.1.112
## План работ
1. [x] apt update + upgrade в LXC 132
2. [x] Обновить Claude Code CLI (npm global)
3. [x] Остановить LXC 132, увеличить CPU 2→4, запустить
4. [x] ~~Отключить SOCKS5~~ (было не причиной — оставил false, но баг был в другом)
5. [x] **Обновить OmniRoute 3.6.5 → 3.6.7** — починило `[ProxyDispatcher] Context proxy host is required`
6. [x] Обновить proxmox-inventory.md
7. [x] Проверить что OpenClaw стабилен — OmniRoute 3.6.7 работает без ошибок, токены рефрешатся
## Выполненные действия
### Обновления
- Claude Code CLI: 2.1.107 → 2.1.112 (`npm install -g @anthropic-ai/claude-code`)
- Локально (MacBook): 2.1.109 → 2.1.112
- apt upgrade: binutils, netplan.io, python3.12-dev, libpam-systemd, polkitd и др.
### Проблемы и их решения
**apt "висел" 14 минут** — debconf prompt на обновлении пакета. Убил процесс, запустил с `DEBIAN_FRONTEND=noninteractive` и `--force-confold/--force-confdef`.
**apt не качал пакеты** — IPv6 от archive.ubuntu.com недоступен (`No route to host` на всех IPv6 адресах). Решение: `-o Acquire::ForceIPv4=true`. Системная проблема LXC-сети — IPv6 не работает наружу.
**OmniRoute ошибка `[ProxyDispatcher] Context proxy host is required`****настоящая причина**: баг в версии 3.6.5. `resolveProxyForConnection` возвращал wrapper объект `{ proxy: null, level, levelId }`, который без `host` передавался в `proxyConfigToUrl` и падал с этой ошибкой. В 3.6.7 исправлено.
Сначала отключил SOCKS5 в `/root/OmniRoute/.env` (думал что это причина — не помогло, оставил `false` как и было в значении дефолта):
```
ENABLE_SOCKS5_PROXY=false
NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false
```
Настоящее решение — обновление пакета:
```bash
cd /root/.npm/_npx/cb5891f90ae65d14
systemctl stop omniroute
npm install omniroute@latest
systemctl start omniroute
```
После обновления `[ProxyDispatcher]` ошибки пропали, токены рефрешатся штатно (`✓ gemini-cli/...@...com refreshed`).
**Важно:** в `/root/.npm/_npx/cb5891f90ae65d14/package.json` стоит `"omniroute": "^3.6.5"` — автоматически не обновится. Для будущих апдейтов — тот же `npm install omniroute@latest`.
### Ресурсы LXC 132 — CPU 2 → 4 (но это было не нужно)
- CPU: 2 vCPU → 4 vCPU (`pct set 132 --cores 4`)
- RAM: 8 GB (не менял)
**Ошибочное допущение:** сначала думал что load avg 4.3 внутри LXC — нагрузка на LXC. На самом деле `/proc/loadavg` в LXC возвращает load хоста Proxmox. Проверено: на хосте load 4.7, 8 cores, грузят WinServer2025 (VM 111, 247% CPU) и Nextcloud-AIO (VM 250). Сам LXC 132 почти idle (все процессы в top имеют %CPU=0.0).
Увеличение до 4 cores оставил — не вредит, запас для пиков. Но настоящая причина сбоев OpenClaw — баг в OmniRoute 3.6.5, не CPU.
### Полезные команды для будущего
```bash
# Рестарт LXC со сменой cores
pct shutdown 132 --timeout 30
pct set 132 --cores 4
pct start 132
# apt в LXC с проблемной IPv6
DEBIAN_FRONTEND=noninteractive apt-get -o Acquire::ForceIPv4=true \
-o Dpkg::Options::=--force-confold -o Dpkg::Options::=--force-confdef upgrade -y
# Проверка сервисов code-server
pct exec 132 -- systemctl is-active omniroute cliproxy code-server@root netbird
```
## Что ещё стоит сделать потом
- **IPv6 в LXC 132** — не работает наружу (`No route to host`). Не критично пока IPv4 работает, но стоит разобраться.
- **Kiro OAuth токен** — после рестарта ждём интервал 60 минут (по логам). Если снова `✗ kiro/... refresh failed` — рефреш через UI OmniRoute (http://10.0.0.179:20128).
- **Claude Usage 429** — rate-limit от Anthropic. Нормально при частых запросах, не наша проблема.
- **Откатить CPU обратно 2 vCPU** — можно сделать позже, не срочно. Текущих 4 в запасе.
## Главный вывод (для будущего)
Когда OmniRoute сбоит на code-server — **первым делом проверить его версию**:
```bash
cat /root/.npm/_npx/cb5891f90ae65d14/node_modules/omniroute/package.json | grep version
npm view omniroute version
```
Если расходятся — обновить. `^3.6.5` в package.json не обновляется автоматически.
Load average внутри LXC **не отражает** нагрузку контейнера — это load хоста Proxmox. Для нагрузки LXC смотреть `top`/`ps` на самом процессе, или `pct cpusets`/метрики Proxmox на хосте.

View File

@@ -0,0 +1,101 @@
---
date: 2026-04-17
type: decision
tags: [nextcloud, sync, gitea, rclone, infrastructure]
---
# Синхронизация knowledge-base: Gitea + Nextcloud через rclone bisync
## Контекст
Vault `~/knowledge-base` хранился только в Gitea (`git.dttb.ru/oleg/knowledge-base.git`). Требования к надёжности и удобству:
- доступ с мобильного (iPhone Obsidian)
- мгновенная копия между устройствами без ручного `git pull/push`
- резервирование на случай проблем с git-историей
На dttb.ru развёрнут **Nextcloud AIO 32.0.6** (VM 250, 10.0.0.230:11001, NPM на `dttb.ru`). Ещё в феврале 2026 была создана папка `/Knowledge Base/` и односторонний скрипт `sync-kb-to-nextcloud.sh` на LXC 129 (Clawdbot) — но LXC 129 с тех пор удалён, скрипт не работает.
## Варианты
1. **Оставить только Gitea** — надёжно, но мобильный доступ через obsidian-git тормозной
2. **Перенести основу в Nextcloud** — хорошо для sync, но потеря git-истории
3. **Gitea основа + Nextcloud зеркало через GUI Nextcloud.app** — классика, real-time, но GUI wizard сложно автоматизировать
4. **Gitea основа + Nextcloud зеркало через rclone bisync + hook** — CLI-only, триггерится после Claude-сессий
5. **nextcloudcmd + launchd каждые 60 сек** — пробовал, **не работает**: Qt из launchd-контекста macOS получает `Host unreachable` хотя curl/ping в том же процессе работают. Специфика macOS 26 для background-агентов, обходить не смог.
## Решение
**Вариант 4 (CLI rclone bisync + Claude Code Stop-hook)** с опциональным добавлением GUI Nextcloud.app позже.
### Архитектура
```
~/knowledge-base/ ← один источник истины
├── .git/ → push в Gitea (git.dttb.ru) [история, review]
└── файлы → rclone bisync на Nextcloud [мгновенный sync]
через sync.sh, триггер Stop-hook
```
### Компоненты
- **`/Users/ai/.config/nextcloud-kb/rclone.conf`** — WebDAV ремоут `kbsync:` на `https://dttb.ru/remote.php/dav/files/admin`, app password в obscured виде
- **`/Users/ai/.config/nextcloud-kb/rclone-filter.lst`** — исключения: `.git/**`, `.claude/worktrees/**`, `.obsidian/workspace*.json`, `.obsidian/cache/**`, `.DS_Store`, sync-метаданные
- **`/Users/ai/.config/nextcloud-kb/sync.sh`** — обёртка с atomic lock (mkdir), вызывает `rclone bisync` с retry
- **`/Users/ai/.config/nextcloud-kb/app-password`** — app password (chmod 600), получен через `POST /ocs/v2.php/core/getapppassword`
- **Hook в `~/.claude/settings.json`** — Stop-event триггер, `async: true`, запускает sync.sh если cwd в ~/knowledge-base
### Почему rclone а не nextcloudcmd
- nextcloudcmd (Qt) падает с `Host unreachable` при запуске из launchd-агента
- rclone (Go) работает в CLI, двусторонний `bisync` с state-файлами
- Проще retry-логика, log-файл, exit-коды
### Почему не nextcloudcmd + launchd-агент
Внутри launchd-процесса macOS 26:
- curl/nc/ping успешно коннектятся к 10.0.0.195:443
- Go и Qt runtime получают `EHOSTUNREACH` на тот же IP
- Не DNS, не firewall, не IPv6 — глубокая специфика network-context для background-агентов
- Решение: не запускать из launchd, а триггерить из user-session (Stop-hook = user-session)
### Для real-time sync (будущее, опционально)
GUI Nextcloud.app запускается в Aqua-session (не launchd), работает без этих проблем. Настройка через wizard, 6 кликов. На данный момент отложено.
## Последствия
### Что обновить
- [x] `credentials.md` — добавить Nextcloud creds, убрать ссылки на LXC 129/10.0.0.206
- [x] `projects/dttb/proxmox-inventory.md` — актуализировать список LXC (129, 133 больше нет)
- [x] `CLAUDE.md` (vault) — убрать упоминание LXC 129 Clawdbot если есть
- [x] `claude-memory/MEMORY.md` — обновить reference_infra, убрать LXC 133
### Что надо помнить
- Изменения локально → Nextcloud автоматом **только** после завершения Claude-сессии в `~/knowledge-base`, или ручным запуском `~/.config/nextcloud-kb/sync.sh`
- Изменения с другого устройства → подтянутся следующим запуском sync.sh (не автоматом)
- Для real-time надо доделать GUI Nextcloud.app wizard
- `.git/` **не** в Nextcloud — git и nextcloud параллельные каналы, не вложенные
### Файлы экосистемы
```
~/.config/nextcloud-kb/
├── app-password chmod 600
├── rclone.conf chmod 600
├── rclone-filter.lst
├── sync.sh chmod 700
├── sync.log логи sync-обёртки
├── rclone.log подробные логи rclone
└── sync.lock.d/ mkdir-lock (временный)
```
### Credentials Nextcloud (dttb.ru)
- URL: `https://dttb.ru`
- User: `admin` / пароль `1qaz!QAZ`
- App password (для sync): хранится в `~/.config/nextcloud-kb/app-password`
- WebDAV: `https://dttb.ru/remote.php/dav/files/admin/Knowledge Base/`
- Сервер: Nextcloud AIO 32.0.6 на VM 250 (10.0.0.230:11001)
### Откат
- Остановить sync: удалить hook из `~/.claude/settings.json` + `rm -rf ~/.config/nextcloud-kb/`
- Удалить app password на сервере: User settings → Security → Devices/sessions
- Локальный vault не страдает — git remote и работает независимо

View File

@@ -1,24 +1,6 @@
# Clawdbot-2 / Знам (LXC 134) # Clawdbot-2 / Знам (LXC 134) — ВЫКЛЮЧЕН
- IP: 10.0.0.238, Telegram: @ZnamSecurityBot - IP: 10.0.0.238, Telegram: @ZnamSecurityBot
- Персона: Знам — бот видеоархива ЧОП - **Статус:** выключен, недоступен (с ~2026-04-14)
- Model: cliproxy/claude-sonnet-4-6 (через CLIProxy на 129:8317) - CLIProxy (129:8317) удалён — бот не может работать без него
- Skill: agentdvr (/usr/lib/node_modules/clawdbot/skills/agentdvr/) - Для восстановления: нужен новый провайдер модели (OmniRoute или прямой API)
- Script: /root/clawd/scripts/find_recordings.py (cameras/snapshot/find/clip/grab)
- Записи: HTTP from 10.0.0.227:8091, видео сжимается ffmpeg 480p crf35 перед отправкой
- groupPolicy: open, requireMention: false (отвечает в группе без @mention)
- Upload интернета ~3-30 KB/s — видео сжимаются до <200 KB для Telegram
- SSH: ключ claude-code (id_ed25519 с LXC 132)
<!-- AUTO-SYNC FROM MEMORY.MD - DO NOT EDIT BELOW -->
## Clawdbot-2 / Знам (LXC 134)
- IP: 10.0.0.238, Telegram: @ZnamSecurityBot
- Персона: Знам — бот видеоархива ЧОП
- Model: cliproxy/claude-sonnet-4-6 (через CLIProxy на 129:8317)
- Skill: agentdvr (/usr/lib/node_modules/clawdbot/skills/agentdvr/)
- Script: /root/clawd/scripts/find_recordings.py (cameras/snapshot/find/clip/grab)
- Записи: HTTP from 10.0.0.227:8091, видео сжимается ffmpeg 480p crf35 перед отправкой
- groupPolicy: open, requireMention: false (отвечает в группе без @mention)
- Upload интернета ~3-30 KB/s — видео сжимаются до <200 KB для Telegram
- SSH: ключ claude-code (id_ed25519 с LXC 132)
<!-- END AUTO-SYNC -->

View File

@@ -1,24 +1,7 @@
# Clawdbot (LXC 129)основной бот # LXC 129 — УДАЛЁН (2026-04-14)
- Real config: ~/.clawdbot/clawdbot.json (NOT /opt/clawdbot/config.yaml) > Бывший Clawdbot AI-ассистент (@maxim_dttb_bot). Удалён 2026-04-14.
- ANTHROPIC_API_KEY=sk-clawdbot-proxy in /etc/systemd/system/clawdbot.service > Данные перенесены на code-server (LXC 132): `/root/backup-lxc129/`
- Telegram bot: @maxim_dttb_bot > IP 10.0.0.206 и NetBird 100.70.219.93 освобождены.
- Model: anthropic/claude-opus-4-6 (через CLIProxy localhost:8317) > CLIProxy (порт 8317) больше не существует. Бот 134 (Znam) тоже выключен.
- CLIProxy: порт 8317 (cliproxy.service), проксирует Anthropic API для всех ботов (129, 133, 134) > NPM домены bot.dttb.ru и siri.dttb.ru отключены.
- CLIProxy auth: batlaew@gmail.com, auto-refresh токен (единственный инстанс с refresh)
- Gateway: порт 18789, token: changeme123
- SSH: ключ claude-code (id_ed25519 с LXC 132)
<!-- AUTO-SYNC FROM MEMORY.MD - DO NOT EDIT BELOW -->
## Clawdbot (LXC 129) — основной бот
- Real config: ~/.clawdbot/clawdbot.json (NOT /opt/clawdbot/config.yaml)
- Telegram bot: @maxim_dttb_bot
- Model: anthropic/claude-opus-4-6 — **ПРЯМОЙ API** (api.anthropic.com), ключ sk-ant-api03-VLV...
- Переключён с CLIProxy на прямой API 2026-04-02
- CLIProxy: порт 8317 (cliproxy.service) — ОСТАВЛЕН для ботов 133, 134
- CLIProxy auth: batlaew@gmail.com, auto-refresh токен
- DNS: nameserver 8.8.8.8 1.1.1.1 закреплён в Proxmox конфиге LXC (не сбросится)
- Gateway: порт 18789, token: changeme123
- SSH: ключ claude-code (id_ed25519 с LXC 132)
- NetBird: 100.70.219.93, exit node через Финляндию (группа Trance)
<!-- END AUTO-SYNC -->

View File

@@ -42,6 +42,19 @@
| Email | `it5870@yandex.ru` | | Email | `it5870@yandex.ru` |
| Пароль | `1qaz!QAZ` | | Пароль | `1qaz!QAZ` |
## Nextcloud AIO (VM 250 — 10.0.0.230:11001)
| Параметр | Значение |
|----------|----------|
| URL | https://dttb.ru |
| Версия | Nextcloud 32.0.6 (AIO) |
| Логин | `admin` |
| Пароль | `1qaz!QAZ` |
| WebDAV | `https://dttb.ru/remote.php/dav/files/admin/` |
| App password Mac sync | `~/.config/nextcloud-kb/app-password` (chmod 600) |
Подробности sync-схемы: [[../../decisions/2026-04-17-nextcloud-sync-schema|decision 2026-04-17]].
## Spaceweb (DNS-хостинг: niikn.com, dttb.ru, itilegent.ru) ## Spaceweb (DNS-хостинг: niikn.com, dttb.ru, itilegent.ru)
| Параметр | Значение | | Параметр | Значение |
@@ -74,13 +87,12 @@
| Хост | Порт | Метод | | Хост | Порт | Метод |
|------|------|-------| |------|------|-------|
| 10.0.0.250 (Proxmox) | 22 | SSH-ключ clawdbot → root | | 10.0.0.250 (Proxmox) | 22 | root / `1qaz!QAZ` |
| 10.0.0.206 (Clawdbot) | 22 | Локальный (LXC 129) |
--- ---
## Заметки ## Заметки
- Пароль `1qaz!QAZ` используется на Proxmox и NPM - Пароль `1qaz!QAZ` используется на Proxmox, NPM, Nextcloud
- Пароль `OL260380eg` используется на MikroTik и Gitea - Пароль `OL260380eg` используется на MikroTik и Gitea
- SSH-ключ clawdbot автоматически добавлен в authorized_keys Proxmox - LXC 129 (Clawdbot) удалён ~апрель 2026. Актуальные LXC по `pct list` на Proxmox: 132 code-server, 136 gitea, 137 openclaw, 138 vpn-proxy, 139 yaroslav-assistant, 103 NPM, 113 VaultWarden, 114 LinkWarden, 115 watchyourlan, 116 rustdeskserver, 134 ZnamSecurityBot

View File

@@ -148,15 +148,8 @@
| Роль | **Mailcow — почтовый сервер dttb.ru** | | Роль | **Mailcow — почтовый сервер dttb.ru** |
| Домен | mail.dttb.ru | | Домен | mail.dttb.ru |
### 10.0.0.206 — Clawdbot (текущий) ### 10.0.0.206 — УДАЛЁН (LXC 129, 2026-04-14)
| Параметр | Значение | > Бывший Clawdbot. IP освобождён. Данные на code-server:/root/backup-lxc129/
|----------|----------|
| Hostname | clawdbot.lan |
| Proxmox | LXC 129 |
| ОС | Debian 12.13 (kernel 6.17.9-1-pve) |
| Открытые порты | 22/ssh (OpenSSH 9.2p1) |
| Роль | **Clawdbot AI-ассистент** |
| Домен | bot.dttb.ru → :18789, siri.dttb.ru → :18790 |
### 10.0.0.217 — VaultWarden ### 10.0.0.217 — VaultWarden
| Параметр | Значение | | Параметр | Значение |
@@ -446,8 +439,8 @@
| dttb.ru | 10.0.0.230:11001 | Nextcloud / Главный сайт | | dttb.ru | 10.0.0.230:11001 | Nextcloud / Главный сайт |
| pve.dttb.ru | 10.0.0.250:8006 | Proxmox VE WebUI | | pve.dttb.ru | 10.0.0.250:8006 | Proxmox VE WebUI |
| npm.dttb.ru | 10.0.0.195:81 | NPM панель | | npm.dttb.ru | 10.0.0.195:81 | NPM панель |
| bot.dttb.ru | 10.0.0.206:18789 | Clawdbot Gateway | | bot.dttb.ru | — | УДАЛЁН (был Clawdbot LXC 129) |
| siri.dttb.ru | 10.0.0.206:18790 | Clawdbot Siri endpoint | | siri.dttb.ru | — | УДАЛЁН (был Clawdbot LXC 129) |
| ai.dttb.ru | 10.0.0.179:8080 | Code-server / AI | | ai.dttb.ru | 10.0.0.179:8080 | Code-server / AI |
| bit.dttb.ru | 10.0.0.217:8080 | VaultWarden | | bit.dttb.ru | 10.0.0.217:8080 | VaultWarden |
| link.dttb.ru | 10.0.0.184:3000 | LinkWarden | | link.dttb.ru | 10.0.0.184:3000 | LinkWarden |

View File

@@ -34,8 +34,7 @@
| 15 | `plex.dttb.ru` | 10.0.0.200:32400 | ✅ Let's Encrypt | ❌ | ✅ | ❌ | Plex Media Server | | 15 | `plex.dttb.ru` | 10.0.0.200:32400 | ✅ Let's Encrypt | ❌ | ✅ | ❌ | Plex Media Server |
| 16 | `home.dttb.ru` | 10.0.0.155:8123 | ✅ | ❌ | ✅ | ❌ | Home Assistant | | 16 | `home.dttb.ru` | 10.0.0.155:8123 | ✅ | ❌ | ✅ | ❌ | Home Assistant |
| 17 | `z.dttb.ru` | 10.0.0.220:80 | ✅ | ✅ | ❌ | ✅ | Z-сервис (Zabbix?) | | 17 | `z.dttb.ru` | 10.0.0.220:80 | ✅ | ✅ | ❌ | ✅ | Z-сервис (Zabbix?) |
| 18 | `bot.dttb.ru` | 10.0.0.206:18789 | ✅ Let's Encrypt | ✅ | ✅ | ✅ | **Clawdbot Gateway** | | 28 | `bot.dttb.ru` | 10.0.0.239:18789 | ✅ Let's Encrypt | ✅ | ✅ | ✅ | **OpenClaw Gateway** (LXC 137) |
| 20 | `siri.dttb.ru` | 10.0.0.206:18790 | ❌ | ❌ | ❌ | ❌ | Clawdbot Siri endpoint |
| 21 | `rec.dttb.ru` | 10.0.0.227:8091 | ✅ Let's Encrypt | ✅ | ❌ | ❌ | Запись/NVR | | 21 | `rec.dttb.ru` | 10.0.0.227:8091 | ✅ Let's Encrypt | ✅ | ❌ | ❌ | Запись/NVR |
| 22 | `git.dttb.ru` | 10.0.0.189:3000 | ❌ | ❌ | ✅ | ❌ | Gitea | | 22 | `git.dttb.ru` | 10.0.0.189:3000 | ❌ | ❌ | ✅ | ❌ | Gitea |
| 23 | `matrix.dttb.ru` | 10.0.0.224:8080 | ✅ Let's Encrypt | ✅ | ✅ | ✅ | Matrix/Element Web | | 23 | `matrix.dttb.ru` | 10.0.0.224:8080 | ✅ Let's Encrypt | ✅ | ✅ | ✅ | Matrix/Element Web |

380
projects/dttb/openclaw.md Normal file
View File

@@ -0,0 +1,380 @@
# OpenClaw — основной AI-бот (LXC 137)
Справочник по установке, настройке и починке OpenClaw. Обновлён 2026-04-17.
## Что это
**OpenClaw** (в Telegram/Nextcloud — "Максимка") — основной AI-бот Олега. Multi-channel AI gateway: принимает сообщения из Telegram и Nextcloud Talk, отвечает через OmniRoute (бесплатные модели) и умеет делегировать сложные задачи на code-server (Opus 4.7 через Max подписку).
- **NPM пакет:** [`openclaw`](https://www.npmjs.com/package/openclaw)
- **GitHub:** https://github.com/openclaw/openclaw
- **Автор конфига:** установлен и ведётся Олегом под персонажа "Максимка" 🤖
## Где живёт
| Параметр | Значение |
|----------|----------|
| Proxmox LXC | **137** (hostname `openclaw`) |
| IP | 10.0.0.239 (LAN) / 100.70.167.54 (NetBird) |
| CPU / RAM | 2 vCPU / 6 GB |
| Node.js | v24.x |
| Доступ | `sshpass -p '1qaz!QAZ' ssh root@10.0.0.250 "pct exec 137 -- bash"` |
## Установка (из чистого LXC)
```bash
# Ubuntu LXC с Node ≥ 20
apt update && apt install -y nodejs npm
npm install -g openclaw
openclaw setup # интерактивный онбординг
openclaw configure # настройка каналов, моделей, креденшалов
```
Бинарь попадает в `/usr/bin/openclaw` (shim), код в `/usr/lib/node_modules/openclaw/`.
## Структура на диске
```
/root/.openclaw/ ← state dir (OPENCLAW_STATE_DIR)
├── openclaw.json ← главный config
├── openclaw.json.bak ← автобэкап (последний)
├── openclaw.json.bak-YYYY-MM-DD-... ← ручные бэкапы (сам делай перед правками)
├── agents/
│ ├── main/
│ │ ├── sessions/
│ │ │ ├── sessions.json ← индекс сессий (key → id, model, tokens)
│ │ │ ├── <uuid>.jsonl ← полная переписка сессии (messages, tool calls)
│ │ │ └── <uuid>.jsonl.reset.* ← архив после /reset
│ │ └── agent/models.json ← модели доступные агенту (в кэше)
│ ├── codex/
│ └── claude-code/
├── nextcloud-talk/ ← state Nextcloud Talk канала
├── credentials/
├── memory/ ← векторная память (если включена)
├── canvas/ ← Canvas host контент
├── delivery-queue/
├── flows/
├── exec-approvals.json ← whitelist команд для exec tool
└── storage.sqlite? (нет в openclaw, только у omniroute)
/root/clawd/ ← рабочая папка бота (workspace)
├── IDENTITY.md ← личность бота (имя, язык, аватар)
├── INFRASTRUCTURE.md ← карта инфраструктуры для бота
├── TOOLS.md ← креды, порты, ссылки (важно держать актуальным)
├── DELEGATION.md ← инструкция как делегировать на Opus/code-server
├── MEMORY.md ← что помнить постоянно
├── SOUL.md ← характер, вайб
├── USER.md ← что знать про пользователя (Олега)
├── AGENTS.md ← про суб-агентов
├── HEARTBEAT.md ← статус-флаг для self-check
├── HAPP-VPN.md ← текущие VPN настройки пользователя
├── tasks.md ← TODO бота
├── scripts/ ← рабочие скрипты (wrapper, monitor, cron)
│ ├── claude-code-wrapper.sh ← **делегирование на Opus 4.7**
│ ├── email_monitor.py ← cron */10, Авито уведомления
│ ├── znam-pairing-check.sh ← cron */3
│ └── nextcloud-talk-bot.py ← legacy (старый бот, не используется)
├── knowledge-base/ ← база знаний бота
├── memory/ ← его заметки
├── projects/ ← проекты
├── prompts/ ← системные промпты
└── claude-code-sessions/ ← сессии claude CLI на этой машине (не на code-server)
/root/.config/systemd/user/
└── openclaw-gateway.service ← **systemd --user** service (не /etc/systemd/system!)
```
## Сервис (systemd user)
OpenClaw gateway — systemd **user**-level unit, не system. Все команды с `--user`.
```bash
systemctl --user status openclaw-gateway.service
systemctl --user restart openclaw-gateway.service
systemctl --user reset-failed openclaw-gateway.service # при restart loop
journalctl --user -u openclaw-gateway.service -n 50 --no-pager
```
Unit запускает:
```
ExecStart=/usr/bin/node /usr/lib/node_modules/openclaw/dist/index.js gateway --port 18789
```
Порты:
- **18789** — gateway (WebSocket + HTTP), в `.env` `OPENCLAW_GATEWAY_PORT`
- **18789/__openclaw__/canvas/** — Canvas host (UI)
- Если запущен в `--dev`: gateway 19001
## Конфигурация: `openclaw.json`
Единый JSON, валидируется zod-схемой с `additionalProperties: false` на большинстве секций. **Любой лишний ключ ломает старт** с `Config invalid`.
### Просмотр и правка
```bash
openclaw config file # путь к активному конфигу
openclaw config get gateway.port # значение по dot-path
openclaw config set gateway.port 18789 # изменить
openclaw config unset acp.agents # удалить ключ
openclaw config schema # полная JSON schema — узнать какие поля допустимы
openclaw config validate # проверить без рестарта
openclaw doctor # диагностика
openclaw doctor --fix # автофикс (не всесильный, делай бэкап)
```
### Секции конфига (по schema)
- `env` — переменные окружения gateway
- `update` — auto-update настройки, канал релизов
- `agents` — defaults (модель, workspace, concurrency) + **list** (массив агентов, не объект!)
- `acp` — Agent Control Protocol. Допустимые ключи: `enabled, dispatch, backend, defaultAgent, allowedAgents, maxConcurrentSessions, stream, runtime`. **`agents` запрещён!**
- `auth` — API ключи профилей
- `channels` — telegram, nextcloud-talk, discord и т.д.
- `messages` — маршрутизация сообщений
- `commands` — кастомные slash-команды
- `hooks` — webhook и event-хуки
- `skills` — skill-паки
- `tools` — browser, search, file, runtime и пр.
- `gateway` — настройки WS-сервера (порт, auth, binding)
- `wizard` — состояние setup wizard
- `meta` — версия/метаданные
- `logging` — уровни и вывод логов
- `browser` — headless browser настройки
- `ui` — UI preferences
- `models` — провайдеры + каталог моделей
- `bindings` — key bindings
- `broadcast` — broadcast/notification
- `audio` — входы/выходы аудио
- `session` — управление сессиями и persistence
- `cron` — scheduled tasks через gateway
- `web` — web server / API
- `discovery` — service discovery (Tailscale + CoreDNS)
- `canvasHost` — Canvas
- `talk` — голос/речь
- `plugins` — плагины
- `diagnostics` — OpenTelemetry, cache-trace
- `cli` — CLI баннер, startup
- `secrets` — secret providers
- `mcp` — MCP-сервера
### Провайдеры моделей (наш стек)
В `openclaw.json → models.providers` у Олега настроены:
- `openrouter`
- `anthropic`
- `zai` — OmniRoute через ZenAI адаптер
- `omniroute` — прямой OmniRoute (localhost:20128 на code-server)
- `zai-orig` — оригинальный zai endpoint
### Модели в сессиях — **НЕ ТРОГАЙ**
В `agents/main/sessions/sessions.json` и `agent/models.json` модели хранятся в формате:
- `kr/claude-sonnet-4.5` — Kiro провайдер
- `cx/gpt-5.4` — Codex (OpenAI)
- `gh/claude-sonnet-4.5` — GitHub Models
- `glm/glm-5.1` — Z.AI GLM
- `gemini-cli/gemini-2.5-pro` — Google Gemini CLI
**Не добавляй префикс `zai/`!** Это прямая адресация Kiro/Codex/GH/GLM провайдеров. Работает.
`openclaw models list` показывает только `zai/*` — это view того что openclaw регистрирует локально, но провайдеры резолвят и `kr/...` напрямую.
Лог вида:
```
[diagnostic] FailoverError: Unknown model: kr/claude-sonnet-4.5 ... next=zai/kr/claude-sonnet-4.5
```
**безвредный warning** с автофоллбеком. Игнорируй. Это НЕ причина того что бот не отвечает.
## Делегирование на code-server (Opus 4.7)
Для сложных задач (большой рефакторинг, генерация кода) бот делегирует на LXC 132 (code-server) где установлен Claude Code CLI с Max подпиской.
**Wrapper:** `/root/clawd/scripts/claude-code-wrapper.sh`
Текущая (рабочая, 2026-04-17) реализация — non-interactive print-режим:
```bash
#!/bin/bash
# Wrapper: делегирует задачу на code-server (LXC 132), Opus 4.7.
# Использование:
# claude-code-wrapper.sh "текст задачи"
# echo "задача" | claude-code-wrapper.sh
set -e
if [ -t 0 ] && [ $# -eq 0 ]; then
echo "ERROR: нужен prompt в аргументе или на stdin" >&2
exit 2
fi
PROMPT="${*:-$(cat)}"
PROMPT_B64=$(printf %s "$PROMPT" | base64 -w0)
ssh -o StrictHostKeyChecking=no root@10.0.0.250 \
"pct exec 132 -- bash -c \"cd /root && echo $PROMPT_B64 | base64 -d | claude -p --output-format text\""
```
Ключевое: **`claude -p`** (print-режим). Без `-p` запускается REPL и виснет.
Инструкция для самого бота — в `/root/clawd/DELEGATION.md`.
## Каналы
### Telegram
- Bot token хранится в `channels.telegram.token` (через `ref:env` или напрямую)
- `dmPolicy` и `groupPolicy` — доступ. **Open policy небезопасно** (security audit ругается), используй `allowlist` + `allowFrom`
- Bot username указан в openclaw status
### Nextcloud Talk
- URL `http://10.0.0.230:11001` (Nextcloud AIO)
- Пользователь `maximka` / `MaximkaBot2026`
- Основная беседа token: `aecax6yg`
- Админ: `admin` / `1qaz!QAZ`
## Частые проблемы и их решения
### Проблема: `Config invalid ... Unrecognized key`
Новая версия openclaw ужесточила schema. Старые поля больше не принимаются.
1. `cp /root/.openclaw/openclaw.json /root/.openclaw/openclaw.json.bak-$(date +%F-%H%M)`
2. `openclaw doctor --fix` — мигрирует что может
3. Если не помогло — получить expected schema: `openclaw config schema` (JSON), сравнить со своим config
4. Частые исправления:
- `acp.agents` → перенести содержимое в `agents.list` (**массив**!), удалить из acp
- `agents.list` как `{"name": {...}}` → переделать в `[{"id":"name", ...}]`
- Удалить неизвестные top-level ключи
### Проблема: Gateway падает с `Cannot find module 'dist/index.js'`
Временная ошибка во время `npm install` (файлы распаковываются). Подождать, сервис сам поднимется через Restart=always.
### Проблема: Bot "залип" — не отвечает в Telegram/Talk
Порядок проверки:
1. `pct status 137` — LXC запущен?
2. `pct exec 137 -- systemctl --user is-active openclaw-gateway.service` — gateway активен?
3. `pct exec 137 -- openclaw status` — каналы ON? сессии есть?
4. `journalctl --user -u openclaw-gateway.service --since "10 min ago" | grep -iE "error|fail"` — последние ошибки
5. Если gateway в restart-loop: `systemctl --user reset-failed openclaw-gateway.service` перед рестартом
### Проблема: Бот застревает при делегировании на Opus
Wrapper запускал `claude` без `-p` → интерактивный REPL → висел. Решение уже в wrapper (2026-04-17). Если опять: проверить что `/root/clawd/scripts/claude-code-wrapper.sh` использует `claude -p --output-format text`, а не голый `claude`.
### Проблема: периодические сбои `sendChatAction failed: Network request failed` и "Something went wrong" (причина — IPv6)
**Корень (обнаружено 2026-04-17):** в LXC 137 IPv6 настроен, но наружу не маршрутизируется. `curl -4 https://api.telegram.org/` → 302 OK; `curl -6 https://api.telegram.org/` → connection failed. Node.js по умолчанию может резолвить AAAA первым и застревать на IPv6. Это даёт случайные `Network request failed` в Telegram API → у бота не отправляется typing-индикатор и ответ, пользователь видит "Something went wrong".
**Починка:** форсировать IPv4 через `NODE_OPTIONS=--dns-result-order=ipv4first` в systemd unit.
```bash
UNIT=/root/.config/systemd/user/openclaw-gateway.service
cp $UNIT $UNIT.bak-$(date +%F-%H%M)
sed -i "/^Environment=OPENCLAW_GATEWAY_PORT=/a Environment=NODE_OPTIONS=--dns-result-order=ipv4first" $UNIT
systemctl --user daemon-reload
systemctl --user restart openclaw-gateway.service
```
Проверка: после рестарта в логах gateway не должно быть `sendChatAction failed: Network request failed` при нормальной работе.
### Проблема: `FailoverError: Unknown model: kr/...`
Ошибка пользователю "⚠️ Something went wrong while processing your request. Please try again, or use /new to start a fresh session." отправляется OpenClaw когда *external run* не вернул осмысленную ошибку (не OAuth, не API key, не session mismatch — см. `buildExternalRunFailureText` в `agent-runner.runtime-*.js`). То есть это fallback-сообщение для **неклассифицированных** ошибок.
**Корень на нашей инсталляции (2026-04-17):**
В `openclaw.json → models.providers` **дублированы** два провайдера, указывающие на один и тот же OmniRoute (`10.0.0.179:20128`):
- `zai` — модели `kr/claude-sonnet-4.5`, `gh/claude-sonnet-4.5`, `glm/glm-5.1`, `cx/gpt-5.4`
- `omniroute` — те же модели
В 2026.4.15 openclaw регистрирует модели **с префиксом провайдера** (`zai/kr/...`). Запрос без префикса (`kr/claude-sonnet-4.5`, как хранится в старых сессиях) не резолвится → FailoverError → fallback на `zai/kr/claude-sonnet-4.5` через `agents.defaults.model.fallbacks`. Fallback обычно успешен (+3-8 сек к ответу), но иногда падает → пользователь видит "Something went wrong".
**Как починить окончательно (рекомендуется):**
```bash
# Бэкап
cp /root/.openclaw/openclaw.json /root/.openclaw/openclaw.json.bak-dedup-$(date +%F)
# Вариант A: удалить дубликат-провайдер omniroute (оставить zai)
openclaw config unset models.providers.omniroute
# Вариант B: обновить model в индексе сессий (НЕ в .jsonl файлах!)
python3 <<'PY'
import json
p = '/root/.openclaw/agents/main/sessions/sessions.json'
d = json.load(open(p))
for k, v in d.items():
m = v.get('model')
if m and not m.startswith('zai/') and not m.startswith('openai/'):
v['model'] = 'zai/' + m
json.dump(d, open(p, 'w'), indent=2)
PY
# После любого варианта:
systemctl --user restart openclaw-gateway.service
```
**ВАЖНО — что НЕ делать (уроки 2026-04-17):**
- НЕ трогай `agent/models.json` — там `id` моделей из registry провайдеров; замена id на `zai/...` сломает Kiro провайдер (бот "перестаёт отвечать").
- НЕ трогай `.jsonl` файлы в `sessions/` — это неизменяемая история сообщений.
- **Даже точечное изменение поля `model` в sessions.json для одной сессии — ломает бота** (проверено: обновил только `agent:main:telegram:group:@heartbeat` с `kr/...` на `zai/kr/...`, бот перестал отвечать, откат из бэкапа вернул работу). Причина не совсем ясна, возможно конфликт между session.model и зарегистрированными в runtime моделями.
- НЕ удалять провайдер `zai` или `omniroute`оба пробовали, ломает.
**Реальная причина периодических "Something went wrong" — IPv6**, не провайдеры моделей. См. раздел выше про `NODE_OPTIONS=--dns-result-order=ipv4first`. FailoverError `kr/...``zai/kr/...` — это автофоллбек который работает, не трогай.
### Проблема: CPU/load высокий
В LXC 137 `/proc/loadavg` показывает **нагрузку хоста Proxmox**, не контейнера. Смотри реальную нагрузку через `top`/`ps aux --sort=-%cpu` внутри контейнера.
## Обновление
```bash
# Версия установленная vs актуальная
cat /usr/lib/node_modules/openclaw/package.json | grep version
npm view openclaw version
# Обновить
npm install -g openclaw@latest
# Перезапустить gateway
systemctl --user restart openclaw-gateway.service
systemctl --user status openclaw-gateway.service
# После обновления часто нужно:
openclaw doctor --fix
```
**Перед обновлением делай бэкап** `/root/.openclaw/openclaw.json` — схема меняется.
## Полезные команды
```bash
openclaw status # общий статус + сессии + каналы
openclaw status --all # расширенный
openclaw logs --follow # live tail gateway
openclaw gateway probe # диагностика reachability
openclaw models list # модели (только zai/*)
openclaw sessions list # все сессии
openclaw doctor # health-check
openclaw security audit # аудит безопасности (ACP/каналы)
openclaw security audit --deep # подробный
openclaw memory status --deep # состояние векторной памяти
openclaw --version # версия
openclaw config file # путь к config
openclaw config schema # JSON schema
```
## Что связано с OpenClaw (не путать)
- **LXC 129** — `clawdbot-1` (старый бот, @maxim_dttb_bot). **Удалён 2026-04-14**. Данные перенесены в `/root/clawd/` на LXC 137.
- **LXC 132** — `code-server` (VS Code IDE + OmniRoute + CLIProxy). Не бот, а dev-среда + backend для ресёрча.
- **LXC 134** — `ZnamSecurityBot`. Отдельный Telegram-бот безопасности, не OpenClaw.
## Бэкап и восстановление
```bash
openclaw backup create # архив state (/root/.openclaw/backups/)
openclaw backup verify <archive> # проверка
# Или ручной:
tar czf /root/openclaw-state-$(date +%F).tar.gz /root/.openclaw /root/clawd
```
Ключевые файлы для ручного бэкапа:
- `/root/.openclaw/openclaw.json` — конфиг
- `/root/.openclaw/agents/main/sessions/` — история сессий
- `/root/clawd/*.md` — personality и инструкции
- `/root/.config/systemd/user/openclaw-gateway.service` — systemd unit
## История изменений (релевантное)
- **2026-04-14** — LXC 129 (старый Clawdbot) удалён, данные в `/root/clawd/` на LXC 137. Решение: [decisions/2026-04-14-openclaw-claude-code-pipeline.md](../../decisions/2026-04-14-openclaw-claude-code-pipeline.md).
- **2026-04-17** — обновление 2026.4.10 → 2026.4.15, починка config (удалён `acp.agents`, `agents.list` object → удалён), починка wrapper (`claude``claude -p`), создан DELEGATION.md. Решение: [decisions/2026-04-17-code-server-upgrade.md](../../decisions/2026-04-17-code-server-upgrade.md).

View File

@@ -2,7 +2,7 @@
> **Нода:** pve (10.0.0.250) > **Нода:** pve (10.0.0.250)
> >
> Последнее обновление: 2026-02-27 > Последнее обновление: 2026-04-17 (обновлено из живого `pct list` / `qm list`)
--- ---
@@ -10,155 +10,81 @@
| Тип | Всего | Запущено | Остановлено | | Тип | Всего | Запущено | Остановлено |
|-----|-------|----------|-------------| |-----|-------|----------|-------------|
| QEMU VM | 12 | 4 | 8 | | QEMU VM | 15 | 5 | 10 |
| LXC | 20 | 13 | 7 | | LXC | 21 | 11 | 10 |
| **Итого** | **32** | **17** | **15** | | **Итого** | **36** | **16** | **20** |
--- ---
## 🟢 Запущенные VM (QEMU) ## 🟢 Запущенные VM (QEMU)
### VM 104Agent-DVR ### VM 106pbs
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 104 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 8 vCPU (загрузка: 31.3%) | | CPU | 2 vCPU |
| RAM | 8 GB (использовано: 7.3 GB) | | RAM | 10 GB |
| Диск | 100 GB |
| Назначение | Proxmox Backup Server |
### VM 107 — Mailcow
| Параметр | Значение |
|----------|----------|
| Статус | 🟢 running |
| CPU | 4 vCPU |
| RAM | 8 GB |
| Диск | 60 GB | | Диск | 60 GB |
| Сеть (in/out) | 283 GB / 135.9 GB | | IP | 10.0.0.107 |
| Uptime | ~1.1 дня | | NPM домен | mail.dttb.ru |
| Назначение | NVR / видеонаблюдение | | Назначение | Почтовый сервер dttb.ru |
### VM 111 — WinServer2025 ### VM 111 — WinServer2025
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 111 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 8 vCPU (загрузка: 5.9%) | | CPU | 4 vCPU |
| RAM | 31.3 GB (использовано: 5.9 GB) | | RAM | 32 GB |
| Диск | 200 GB | | Диск | 200 GB |
| Сеть (in/out) | 3.9 GB / 15.3 GB | | Назначение | Windows Server 2025 (1С и т.п.) |
| Uptime | ~6.8 дней |
| Назначение | Windows Server 2025 | ### VM 127 — haos-17.0
| Параметр | Значение |
|----------|----------|
| Статус | 🟢 running |
| CPU | 2 vCPU |
| RAM | 4 GB |
| Диск | 32 GB |
| NPM домен | home.dttb.ru |
| Назначение | Home Assistant OS |
### VM 250 — Nextcloud-AIO ### VM 250 — Nextcloud-AIO
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 250 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 8 vCPU (загрузка: 4.6%) | | CPU | 2 vCPU |
| RAM | 15.7 GB (использовано: 8.6 GB) | | RAM | 10 GB |
| Диск | 100 GB | | Диск | 100 GB |
| Сеть (in/out) | 1.4 GB / 178 MB | | IP | 10.0.0.230:11001 |
| Uptime | ~6.8 дней | | Домен | dttb.ru |
| Назначение | Nextcloud All-in-One | | Версия | Nextcloud 32.0.6 |
| Назначение | **Nextcloud All-in-One** (основной) |
--- ---
## 🔴 Остановленные VM (QEMU) ## 🔴 Остановленные VM (QEMU)
### VM 100 — NV | VMID | Имя | CPU | RAM | Диск | Назначение |
| Параметр | Значение | |------|-----|-----|-----|------|------------|
|----------|----------| | 100 | NV | 4 | 24 GB | 100 GB | — |
| VMID | 100 | | 104 | Agent-DVR | 8 | 8 GB | 60 GB | NVR (перенесено на MMFB?) |
| CPU | 4 vCPU | | 105 | Nextcloud-AIO-dttb.ru | 8 | 22 GB | 110 GB | Старый Nextcloud AIO (заменён VM 250) |
| RAM | 23.5 GB | | 109 | itilelegent | 8 | 8 GB | 60 GB | ITIL Elegant проект |
| Диск | 100 GB | | 110 | Cloud | 8 | 16 GB | 80 GB | Cloud-init шаблон |
| 112 | cloud-dttb | 8 | 16 GB | 80 GB | — |
### VM 105 — Nextcloud-AIO-dttb.ru | 120 | 7 | 4 | 8 GB | 60 GB | — |
| Параметр | Значение | | 124 | Matrix | 8 | 10 GB | 100 GB | Matrix/Synapse (matrix.dttb.ru) |
|----------|----------| | 125 | datacentr | 2 | 12 GB | 100 GB | — |
| VMID | 105 | | 130 | Zima-OS | 4 | 12 GB | 32 GB | ZimaOS |
| CPU | 8 vCPU |
| RAM | 21.5 GB |
| Диск | 110 GB |
| Назначение | Nextcloud AIO (альтернативный) |
### VM 106 — pbs
| Параметр | Значение |
|----------|----------|
| VMID | 106 |
| CPU | 4 vCPU |
| RAM | 21.5 GB |
| Диск | 100 GB |
| Назначение | Proxmox Backup Server |
### VM 109 — itilelegent
| Параметр | Значение |
|----------|----------|
| VMID | 109 |
| CPU | 8 vCPU |
| RAM | 7.9 GB |
| Диск | 60 GB |
### VM 110 — Cloud (template)
| Параметр | Значение |
|----------|----------|
| VMID | 110 |
| CPU | 8 vCPU |
| RAM | 15.7 GB |
| Диск | 80 GB |
| Template | ✅ Да |
| Назначение | Cloud-init шаблон |
### VM 112 — cloud-dttb
| Параметр | Значение |
|----------|----------|
| VMID | 112 |
| CPU | 8 vCPU |
| RAM | 15.7 GB |
| Диск | 80 GB |
### VM 107 — Mailcow
| Параметр | Значение |
|----------|----------|
| VMID | 107 |
| Статус | 🟢 running |
| CPU | 4 vCPU |
| RAM | 8 GB |
| Диск | 100 GB |
| IP | 10.0.0.107 |
| Назначение | **Mailcow — почтовый сервер dttb.ru** |
| Домен | mail.dttb.ru |
### VM 124 — Matrix
| Параметр | Значение |
|----------|----------|
| VMID | 124 |
| Статус | 🟢 running |
| CPU | 8 vCPU |
| RAM | 15.7 GB |
| Диск | 100 GB |
| IP | 10.0.0.224 |
| Назначение | Matrix / Synapse (matrix.dttb.ru) |
### VM 125 — datacentr
| Параметр | Значение |
|----------|----------|
| VMID | 125 |
| CPU | 2 vCPU |
| RAM | 11.8 GB |
| Диск | 100 GB |
### VM 127 — haos-17.0
| Параметр | Значение |
|----------|----------|
| VMID | 127 |
| CPU | 2 vCPU |
| RAM | 4 GB |
| Диск | 32 GB |
| Tags | community-script |
| Назначение | Home Assistant OS |
### VM 130 — Zima-OS
| Параметр | Значение |
|----------|----------|
| VMID | 130 |
| CPU | 4 vCPU |
| RAM | 11.8 GB |
| Диск | 32 GB |
| Назначение | ZimaOS |
--- ---
@@ -167,177 +93,121 @@
### LXC 103 — NPM ### LXC 103 — NPM
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 103 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 6 vCPU (загрузка: <0.1%) | | IP | 10.0.0.195 (+ docker bridges) |
| RAM | 16.1 GB (использовано: 314 MB) | | NPM домен | npm.dttb.ru |
| Диск | 7.8 GB (использовано: 3.6 GB) |
| Сеть (in/out) | 114.3 GB / 99.6 GB |
| Uptime | ~4.5 дней |
| IP (по NPM) | 10.0.0.195 |
| Назначение | Nginx Proxy Manager | | Назначение | Nginx Proxy Manager |
### LXC 113 — VaultWarden ### LXC 113 — VaultWarden
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 113 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 4 vCPU | | IP | 10.0.0.217 (+ docker bridges) |
| RAM | 8.3 GB (использовано: 109 MB) | | NPM домен | bit.dttb.ru |
| Диск | 37.3 GB (использовано: 1.8 GB) | | Назначение | Менеджер паролей (Vaultwarden / Bitwarden) |
| Сеть (in/out) | 728 MB / 51 MB |
| Uptime | ~6.8 дней |
| Назначение | Менеджер паролей (Bitwarden) |
### LXC 114 — LinkWarden ### LXC 114 — LinkWarden
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 114 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 2 vCPU | | IP | 10.0.0.184 (+ docker bridges) |
| RAM | 4.4 GB (использовано: 843 MB) | | NPM домен | link.dttb.ru |
| Диск | 19.5 GB (использовано: 5.6 GB) |
| Сеть (in/out) | 767 MB / 17 MB |
| Uptime | ~6.8 дней |
| NPM домен | link.dttb.ru → 10.0.0.184:3000 |
| Назначение | Менеджер закладок | | Назначение | Менеджер закладок |
### LXC 115 — watchyourlan ### LXC 115 — watchyourlan
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 115 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 1 vCPU | | IP | 10.0.0.113 |
| RAM | 512 MB (использовано: 47 MB) |
| Диск | 1.9 GB (использовано: 925 MB) |
| Tags | community-script, network | | Tags | community-script, network |
| Uptime | ~6.8 дней |
| Назначение | Мониторинг сетевых устройств | | Назначение | Мониторинг сетевых устройств |
### LXC 116 — rustdeskserver ### LXC 116 — rustdeskserver
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 116 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 1 vCPU | | IP | 10.0.0.244 (LAN) / 100.70.191.161 (NetBird) |
| RAM | 512 MB (использовано: 55 MB) | | NPM домен | remot.dttb.ru *(в NPM записан 10.0.0.43 — устарело, проверить)* |
| Диск | 1.9 GB (использовано: 878 MB) |
| Tags | community-script, remote-desktop |
| Uptime | ~6.8 дней |
| NPM домен | remot.dttb.ru → 10.0.0.43:21114 |
| Назначение | RustDesk Server | | Назначение | RustDesk Server |
### LXC 119 — myspeed
| Параметр | Значение |
|----------|----------|
| VMID | 119 |
| Статус | 🟢 running |
| CPU | 1 vCPU |
| RAM | 1 GB (использовано: 85 MB) |
| Диск | 3.9 GB (использовано: 1.5 GB) |
| Tags | community-script |
| Uptime | ~6.8 дней |
| Назначение | Speed test мониторинг |
### LXC 123 — proxmox-local
| Параметр | Значение |
|----------|----------|
| VMID | 123 |
| Статус | 🟢 running |
| CPU | 2 vCPU |
| RAM | 2 GB (использовано: 190 MB) |
| Диск | 7.8 GB (использовано: 3 GB) |
| Uptime | ~6.8 дней |
| Назначение | Локальный сервис Proxmox |
### LXC 129 — clawdbot
| Параметр | Значение |
|----------|----------|
| VMID | 129 |
| Статус | 🟢 running |
| CPU | 4 vCPU (загрузка: 0.9%) |
| RAM | 4 GB (использовано: 556 MB) |
| Диск | 15.6 GB (использовано: 4.5 GB) |
| Tags | ai, assistant, community-script |
| Uptime | ~7 часов |
| IP | 10.0.0.206 |
| NPM домен | bot.dttb.ru → 10.0.0.206:18789 |
| Назначение | **Clawdbot AI-ассистент (текущий)** |
### LXC 132 — code-server ### LXC 132 — code-server
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 132 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 2 vCPU | | CPU | 4 vCPU (увеличено 2→4 — 2026-04-17) |
| RAM | 2 GB (использовано: 1.2 GB) | | RAM | 8 GB |
| Диск | 7.8 GB (использовано: 4.3 GB) | | Диск | 50 GB |
| Uptime | ~5.2 дней | | IP | 10.0.0.179 (LAN) / 100.70.92.138 (NetBird) |
| Назначение | VS Code Server (веб-IDE) | | NPM домен | ai.dttb.ru → 10.0.0.179:8080 |
| Назначение | VS Code Server + OmniRoute + CLIProxy |
### LXC 133 — clawdbot-1
| Параметр | Значение |
|----------|----------|
| VMID | 133 |
| Статус | 🟢 running |
| CPU | 4 vCPU |
| RAM | 4 GB (использовано: 427 MB) |
| Диск | 15.6 GB (использовано: 4.3 GB) |
| Tags | ai, assistant, community-script |
| Uptime | ~3.3 дня |
| Назначение | Clawdbot (инстанс 2) |
### LXC 134 — ZnamSecurityBot ### LXC 134 — ZnamSecurityBot
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 134 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 4 vCPU | | IP | 10.0.0.238 |
| RAM | 4 GB (использовано: 477 MB) |
| Диск | 15.6 GB (использовано: 5 GB) |
| Tags | ai, assistant, community-script | | Tags | ai, assistant, community-script |
| Uptime | ~1.3 дня |
| Назначение | ZnamSecurity Telegram-бот | | Назначение | ZnamSecurity Telegram-бот |
### LXC 135 — whisper-bot
| Параметр | Значение |
|----------|----------|
| VMID | 135 |
| Статус | 🟢 running |
| CPU | 2 vCPU |
| RAM | 2 GB (использовано: 60 MB) |
| Диск | 7.8 GB (использовано: 1.9 GB) |
| Uptime | ~2.4 дня |
| Назначение | Whisper STT бот |
### LXC 136 — gitea ### LXC 136 — gitea
| Параметр | Значение | | Параметр | Значение |
|----------|----------| |----------|----------|
| VMID | 136 |
| Статус | 🟢 running | | Статус | 🟢 running |
| CPU | 2 vCPU | | IP | 10.0.0.189 (+ docker bridges) |
| RAM | 2 GB (использовано: 200 MB) |
| Диск | 15.6 GB (использовано: 1.6 GB) |
| Tags | git, knowledge-base |
| Uptime | ~30 минут |
| IP | 10.0.0.189 |
| NPM домен | git.dttb.ru → 10.0.0.189:3000 | | NPM домен | git.dttb.ru → 10.0.0.189:3000 |
| Назначение | Gitea — Git-сервер | | Tags | git, knowledge-base |
| Назначение | Gitea — Git-сервер (`knowledge-base.git`) |
### LXC 137 — openclaw
| Параметр | Значение |
|----------|----------|
| Статус | 🟢 running |
| IP | 10.0.0.239 (LAN) / 100.70.167.54 (NetBird) |
| NPM домен | bot.dttb.ru → 10.0.0.239:18789 |
| Ключевые пути | `/root/clawd/` (KB, sessions, memory, scripts) |
| Сервис | systemd --user → `openclaw-gateway.service` |
| Назначение | **Основной AI-бот Олега (OpenClaw)** — Nextcloud Talk + Telegram |
### LXC 138 — vpn-proxy
| Параметр | Значение |
|----------|----------|
| Статус | 🟢 running |
| IP | 10.0.0.141 (LAN) / 100.70.161.29 (NetBird) |
| Назначение | VPN-proxy (детали уточнить) |
### LXC 139 — yaroslav-assistant
| Параметр | Значение |
|----------|----------|
| Статус | 🟢 running |
| IP | 10.0.0.127 |
| Назначение | AI-ассистент для Ярослава (детали уточнить) |
--- ---
## 🔴 Остановленные LXC ## 🔴 Остановленные LXC
| VMID | Имя | CPU | RAM | Диск | Tags | Назначение | | VMID | Имя | Назначение |
|------|-----|-----|-----|------|------|------------| |------|-----|------------|
| 101 | n8n | 6 | 21.5 GB | 6 GB | automation, community-script | Автоматизация (n8n) | | 101 | n8n | Автоматизация (n8n) |
| 102 | SMB | 6 | 22 GB | 1 TB | — | SMB файл-сервер | | 102 | SMB | SMB файл-сервер |
| 108 | zabbix | 2 | 4 GB | 6 GB | community-script, monitoring | Мониторинг Zabbix | | 108 | zabbix | Мониторинг Zabbix |
| 117 | motioneye | 2 | 2 GB | 8 GB | community-script, nvr | MotionEye NVR | | 117 | motioneye | MotionEye NVR |
| 118 | plex | 2 | 2 GB | 8 GB | community-script, media | Plex Media Server | | 118 | plex | Plex Media Server |
| 121 | docker-windows | 6 | 16 GB | 100 GB | — | Docker (Windows) | | 119 | myspeed | Speed test мониторинг |
| 122 | qbittorrent | 2 | 2 GB | 8 GB | — | qBittorrent | | 121 | docker-windows | Docker (Windows) |
| 126 | debian | 1 | 512 MB | 2 GB | community-script, os | Debian базовый | | 122 | qbittorrent | qBittorrent |
| 123 | proxmox-local | Локальный сервис Proxmox |
| 126 | debian | Debian базовый |
---
## 🗑️ Удалённые (история)
| VMID | Имя | Когда | Куда делось |
|------|-----|-------|-------------|
| 129 | Clawdbot | ~апрель 2026 | Данные перенесены на code-server (132) в `/root/backup-lxc129/`, IP 10.0.0.206 освобождён |
| 133 | clawdbot-1 | ~апрель 2026 | Функционал мигрирован на openclaw (137) |
| 135 | whisper-bot | ~апрель 2026 | — |
--- ---

24
projects/dttb/server1c.md Normal file
View File

@@ -0,0 +1,24 @@
# Server1C — Сервер 1С в Бужарово
## Подключение
- **Публичный IP:** 185.13.47.2 (RDP:3389)
- **Netbird IP:** 100.70.75.103 (server1c.netbird.cloud)
- **WinRM:** порт 5985, basic auth
- **Учётка:** dttb / 1qaz!QAZ
- **OS:** Windows Server 2012 R2 (6.3.9600)
- **Hostname:** Server1C
- **Локация:** Бужарово
## 1С:Предприятие
Три службы агента:
1. `1C:Enterprise 8.3 Server Agent` — StartType: Automatic
2. `1C:Enterprise 8.3 Server Agent (x86-64)` — StartType: Automatic
3. `RagentServer_8327` — версия 8.3.27.1606, StartType: Automatic
### Решено: конфликт служб при загрузке (2026-04-16)
**Проблема:** 3 службы с Automatic стартовали одновременно, боролись за порты 1540/1541.
- Служба 8.3.18 (x86) — бинарник удалён, падала с ошибкой "файл не найден"
- RagentServer_8327 — дубликат без параметров, таймаут на портах
- Рабочая: `1C:Enterprise 8.3 Server Agent (x86-64)` (8.3.27.1606)
**Решение:** отключены лишние службы (Disabled), оставлена только x86-64.

View File

@@ -0,0 +1,43 @@
# Проект Glavtorg
## Сервер
- **Hostname:** GLAVTORG
- **OS:** Windows 8.1 / Server 2012 R2 (NT 6.3.9600)
- **Домен:** WORKGROUP
- **Netbird IP:** 100.70.195.47
- **Netbird setup-key:** `5D1E3507-6F1C-41FC-B86F-05C60364A146`
- **WinRM:** порт 5985 (открыт)
- **RDP:** порт 3389 (открыт)
## Подключение (WinRM)
```python
import winrm
s = winrm.Session('http://100.70.195.47:5985/wsman', auth=('glavtorg\\ярослав', '23947592'), transport='ntlm')
r = s.run_cmd('whoami')
```
Требуется venv: `source /tmp/winrm-env/bin/activate`
## 1С:Предприятие
- **Версии:** 8.3.27.2074, 8.3.27.1719
- **Путь платформы:** `C:\Program Files\1cv8\`
- **Базы данных:** `D:\1C_Bases_8_3\`
- **Лицензии:** `C:\ProgramData\1C\licenses\`
## Пользователи
| Пользователь | Админ | RDP | Назначение |
|---|---|---|---|
| Ярослав | ✅ | ✅ | Основной администратор |
| Администратор | ✅ | — | Встроенный |
| Diana_Grig | — | ✅ | Обновление 1С через Netbird |
| Инесса | — | — | Сотрудник |
| менеджер2 | — | — | Сотрудник |
| михаил.ш | — | — | Сотрудник |
| Олеся | — | — | Сотрудник |
| Роман | — | — | Сотрудник |
| Руслан | — | — | Сотрудник |
| Юля | — | — | Сотрудник |
| Гость | — | — | Отключён |
## История изменений
- **2026-04-15:** Создан пользователь Diana_Grig (RDP + 1С обновление)

View File

@@ -0,0 +1,51 @@
# Инструкция по подключению к серверу GLAVTORG
## Для: Diana_Grig
## Цель: Обновление 1С:Предприятие через удалённый рабочий стол
---
## Шаг 1. Установить и подключить Netbird
1. Скачать Netbird: https://netbird.io/download
2. Установить на свой компьютер
3. Открыть **PowerShell** (Win + R → `powershell` → Enter) и выполнить команду:
```
netbird up --setup-key 5D1E3507-6F1C-41FC-B86F-05C60364A146
```
4. Дождаться подключения к сети (значок Netbird в трее станет зелёным)
## Шаг 2. Подключиться по RDP
### Windows:
1. Нажать `Win + R`
2. Ввести `mstsc` и нажать Enter
3. В поле "Компьютер" ввести: `100.70.195.47`
4. Нажать "Подключить"
5. Ввести учётные данные:
- **Имя пользователя:** `Diana_Grig`
- **Пароль:** `Gr_Tyr&03`
6. Если появится предупреждение о сертификате — нажать "Да"
### macOS:
1. Установить Microsoft Remote Desktop из App Store
2. Нажать "+" → "Add PC"
3. PC name: `100.70.195.47`
4. User account → Add User Account:
- Username: `Diana_Grig`
- Password: `Gr_Tyr&03`
5. Сохранить и подключиться
## Шаг 3. Обновление 1С
1. После входа на рабочий стол сервера найти ярлык **1С:Предприятие**
2. Базы данных расположены в `D:\1C_Bases_8_3\`
3. Выполнить обновление конфигурации стандартным способом через конфигуратор
4. После завершения работы — **обязательно выйти** (Пуск → Выход), не просто закрывать окно RDP
## Важно
- Подключение возможно **только при активном Netbird**
- Не устанавливать стороннее ПО на сервер
- Не изменять настройки системы
- При проблемах с подключением — обращаться к администратору (Ярослав)

View File

@@ -0,0 +1,45 @@
# ММФБ — Proxmox инвентарь
## Доступ
- **Netbird IP:** 100.70.128.49
- **LAN IP (vmbr0):** 10.253.1.253/24
- **Пользователь:** root / `1qaz!QAZ`
- **Hostname:** pve
- **Версия:** pve-manager/8.4.14, kernel 6.8.12-15-pve
## Железо
- **CPU:** Intel Xeon E5-2630 v2 @ 2.60GHz, 24 ядра
- **RAM:** 125 GiB
- **Swap:** 8 GiB
- **Диски:**
- sdc 894 GB (Intel SSD) — системный LVM (`pve-root` 96G, `pve-data` 757G thin-pool: диски VM 100/101/102)
- sdd 3.6 TB (HGST) — `/mnt/pve/Work` (диск 1С 600G, rootfs LXC 105, dump, templates)
- **sda 1.8 TB (Toshiba) + sdb 2.7 TB (Toshiba)** — объединены в LVM `archive-vg/archive``/mnt/pve/Archive` (ext4, 4.55 TB для видеоархива AgentDVR)
## Сеть
- **vmbr0:** 10.253.1.253/24, шлюз 10.253.1.1 (MAC d4:ca:6d:18:f2:be)
- **wt0 (Netbird):** 100.70.128.49/16
## Виртуальные машины (VM)
| VMID | Name | OS | Cores | RAM | Disk | IP | MAC | Статус |
|------|---------------|-------|-------|--------|-------|-----------------|-------------------|---------|
| 100 | 1C | win11 | 4 | 65 GB | 150 GB + 54 GB | 10.253.1.240 | DE:D9:70:9B:A3:19 | running (agent=1) |
| 101 | WinServer2025 | win11 | 2 | 20 GB | 100 GB | 10.253.1.6 | BC:24:11:D4:AE:68 | running |
| 102 | OVPN | l26 | 6 | 4 GB | 100 GB | — | AA:54:D6:B9:FD:01 | running |
## Контейнеры (LXC)
| CTID | Hostname | OS | Cores | RAM | IP | Назначение |
|------|-----------|--------|-------|--------|---------------|-------------------------------------------|
| 103 | NPM | ubuntu | 2 | 8.5 GB | 10.253.1.25 | Docker: nginx-proxy-manager + portainer |
| 105 | agentdvr | ubuntu | 6 | 16 GB | 10.253.1.40 | AgentDVR (видеонаблюдение), archive **4.55 TB** (LVM на sda+sdb) |
## Сервисы
- **LXC 103 (NPM):** Docker контейнеры `npm-app-1` (jc21/nginx-proxy-manager, порты 80/81/443) и `portainer-ce` (8000/9443). Работают ~15 месяцев.
- **LXC 105 (agentdvr):** systemd `AgentDVR.service`. Архив — новый LVM `archive-vg/archive` (ext4, 4.55 TB) на отдельных sda+sdb. Скорость записи ~140 GB/день → глубина архива ~32 дня максимум. Retention в cron: 14 дней (`/AgentDVR/cleanup_old_recordings.sh`, 03:00 ежедневно). 11 камер, названия `10.253.1.{21,27,32,33,35,37,38,39,41,42,43}`. Камера 10.253.1.27 "Camera 2 mic" периодически не отвечает по ONVIF (в логах `Invalid Source`) — разобраться отдельно.
## История изменений
- **2026-04-17:** создан LVM `archive-vg` на sda+sdb (4.55 TB), ext4, `/mnt/pve/Archive`. mp1 LXC 105 переключен с loop-файла 500G на новый LVM. Удалён `/mnt/pve/Work/ct-105-archive500.img` (освободил 500G на sdd). Очищено 105G скрытых данных под mountpoint `/AgentDVR/Media/WebServerRoot/Media` в rootfs LXC 105 (rootfs был 100% → 2%). Retention поднят с 7 до 14 дней.
- **2026-04-17:** все 11 камер переведены с continuous (`recordmode=2`) на запись по движению (`detector.type=Simple`, `recordmode=0`, `recordondetect=True`). Ожидаемая экономия ~50-80%, глубина архива до ~30 дней.
- **2026-04-17:** в NPM (LXC 103, 10.253.1.25:81) создан proxy host `dvr-mmfb.dttb.ru``10.253.1.40:8090` (id=9, WebSockets=ON). Ждёт DNS A-записи.

21
templates/daily-note.md Normal file
View File

@@ -0,0 +1,21 @@
---
date: {{date}}
type: daily
---
# {{date:YYYY-MM-DD}}
## Приоритеты дня
- [ ]
## Инфраструктура
<!-- Что менял, чинил, настраивал -->
## Заметки
<!-- Идеи, находки, инсайты -->
## Проекты
<!-- Прогресс по активным проектам -->
## Итог дня
<!-- Что сделано, что осталось -->

20
templates/decision.md Normal file
View File

@@ -0,0 +1,20 @@
---
date: {{date}}
type: decision
tags: []
---
# {{title}}
## Контекст
<!-- Что привело к решению -->
## Варианты
1.
2.
## Решение
<!-- Что выбрано и почему -->
## Последствия
<!-- Что нужно обновить / учесть -->