Compare commits
6 Commits
ddbd720841
...
501752871b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
501752871b | ||
|
|
2ba8c52cbe | ||
|
|
59186d9a0b | ||
|
|
42489c82cd | ||
|
|
f7078a5218 | ||
|
|
84a283deb5 |
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal 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
16
.obsidian/app.json
vendored
Normal 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
6
.obsidian/appearance.json
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"baseFontSize": 16,
|
||||
"theme": "obsidian",
|
||||
"translucency": false,
|
||||
"nativeMenus": true
|
||||
}
|
||||
5
.obsidian/community-plugins.json
vendored
Normal file
5
.obsidian/community-plugins.json
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
[
|
||||
"obsidian-git",
|
||||
"dataview",
|
||||
"templater-obsidian"
|
||||
]
|
||||
33
.obsidian/core-plugins.json
vendored
Normal file
33
.obsidian/core-plugins.json
vendored
Normal 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
6
.obsidian/daily-notes.json
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"folder": "daily",
|
||||
"format": "YYYY-MM-DD",
|
||||
"template": "templates/daily-note",
|
||||
"autorun": false
|
||||
}
|
||||
1
.obsidian/hotkeys.json
vendored
Normal file
1
.obsidian/hotkeys.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
20876
.obsidian/plugins/dataview/main.js
vendored
Normal file
20876
.obsidian/plugins/dataview/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/dataview/manifest.json
vendored
Normal file
11
.obsidian/plugins/dataview/manifest.json
vendored
Normal 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
141
.obsidian/plugins/dataview/styles.css
vendored
Normal 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
450
.obsidian/plugins/obsidian-git/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
.obsidian/plugins/obsidian-git/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-git/manifest.json
vendored
Normal 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"
|
||||
}
|
||||
710
.obsidian/plugins/obsidian-git/styles.css
vendored
Normal file
710
.obsidian/plugins/obsidian-git/styles.css
vendored
Normal 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;
|
||||
}
|
||||
43
.obsidian/plugins/templater-obsidian/main.js
vendored
Normal file
43
.obsidian/plugins/templater-obsidian/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/templater-obsidian/manifest.json
vendored
Normal file
11
.obsidian/plugins/templater-obsidian/manifest.json
vendored
Normal 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
|
||||
}
|
||||
226
.obsidian/plugins/templater-obsidian/styles.css
vendored
Normal file
226
.obsidian/plugins/templater-obsidian/styles.css
vendored
Normal 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
3
.obsidian/templates.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"folder": "templates"
|
||||
}
|
||||
BIN
.sync_3db9100e9b7e.db
Normal file
BIN
.sync_3db9100e9b7e.db
Normal file
Binary file not shown.
45
CLAUDE.md
45
CLAUDE.md
@@ -5,23 +5,62 @@
|
||||
|
||||
## Язык: русский
|
||||
|
||||
## Структура
|
||||
## Структура (Obsidian vault)
|
||||
- `projects/dttb/` — домашний сервер (Proxmox, сеть, все сервисы)
|
||||
- `network-topology.md` — полная карта сети 10.0.0.0/24
|
||||
- `proxmox-inventory.md` — все VM/LXC
|
||||
- `credentials.md` — пароли и ключи ⚠️
|
||||
- `credentials.md` — пароли и ключи
|
||||
- `npm-proxy-hosts.md` — домены *.dttb.ru
|
||||
- `projects/niikn/` — проект НИИКН
|
||||
- `projects/glavtorg/` — проект Главторг (Windows-сервер, 1С)
|
||||
- `decisions/` — принятые решения (формат: YYYY-MM-DD-тема.md)
|
||||
- `snippets/` — полезный код и конфиги
|
||||
- `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)
|
||||
- **Gitea:** git.dttb.ru (oleg/OL260380eg)
|
||||
- **Nextcloud:** dttb.ru (admin/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. Проверяй базу перед работой — решение может уже быть
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|------|------|----|-------|
|
||||
| 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 |
|
||||
| 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) |
|
||||
| 134 | clawdbot-2 | 10.0.0.238 | Знам — бот ЧОП видеоархив (@ZnamSecurityBot, haiku) |
|
||||
| 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)
|
||||
- 8 vCPU, 8GB RAM (критически мало — 99% использовано)
|
||||
|
||||
## 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)
|
||||
## LXC 129 — УДАЛЁН (2026-04-14)
|
||||
- Бывший Clawdbot (@maxim_dttb_bot), IP 10.0.0.206
|
||||
- Данные: code-server:/root/backup-lxc129/ (vpn-configs, SOUL.md, memory, siri-proxy, nextcloud-talk-bot)
|
||||
- CLIProxy (8317) удалён вместе с контейнером
|
||||
- Бот 134 (Znam) тоже выключен — зависел от CLIProxy на 129
|
||||
|
||||
## Nextcloud dttb.ru (VM 250) → см. nextcloud-dttb.md
|
||||
- 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 (198.18.x.x) — всегда прописывать nameserver 8.8.8.8 в Proxmox конфиге LXC
|
||||
|
||||
## CLIProxy на code-server → см. cliproxy_code_server.md
|
||||
- OAuth токен протухает ~8ч, нужен SSH-туннель + браузер для перелогина, fallback: прямой API (платный)
|
||||
|
||||
## Миграция на прямой API → см. project_direct_api_migration.md
|
||||
- 129 и 114 на прямом API, 133 и 134 ещё на CLIProxy — нужны свои ключи
|
||||
## Claude Code на code-server → см. cliproxy_code_server.md
|
||||
- Max подписка (OAuth), MCP omniroute для бесплатного ресёрча
|
||||
- CLIProxy убран, авто-синк токена с Mac (cron каждые 12ч)
|
||||
- Решение: decisions/2026-04-14-openclaw-claude-code-pipeline.md
|
||||
|
||||
## OmniRoute (LXC 132, 10.0.0.179) → см. omniroute.md
|
||||
- AI Gateway v3.6.5, порт 20128, API key: sk-225e902dc95ff192-6bdad7-3ec8cdc6
|
||||
|
||||
@@ -1,34 +1,29 @@
|
||||
---
|
||||
name: CLIProxy на code-server (10.0.0.179)
|
||||
description: Claude Code использует CLIProxy OAuth — процедура обновления токена при протухании
|
||||
name: Claude Code на code-server (10.0.0.179) — новая архитектура
|
||||
description: Claude Code через Max подписку + MCP omniroute для бесплатного ресёрча. CLIProxy больше не нужен.
|
||||
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`
|
||||
2. Запустить логин: `/usr/local/bin/cli-proxy-api -config /root/.cli-proxy-api/config.yaml -claude-login -no-browser`
|
||||
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`
|
||||
### Решение по decisions/
|
||||
Подробности: `decisions/2026-04-14-openclaw-claude-code-pipeline.md`
|
||||
|
||||
## Конфигурация
|
||||
- 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`
|
||||
## Старая архитектура (до 2026-04-14, архив)
|
||||
|
||||
## Альтернатива (fallback)
|
||||
Прямой API: ключ `ANTHROPIC_API_KEY=sk-ant-api03-vMW...` доступен в env. Для переключения: в settings.json поменять apiBaseUrl на `https://api.anthropic.com` и apiKey на прямой ключ. Но это платно.
|
||||
|
||||
## TODO
|
||||
- Выяснить, почему auto-refresh не срабатывает (проверить после следующего протухания)
|
||||
- Рассмотреть cron для принудительного рефреша до истечения токена
|
||||
CLIProxy (cliproxy.service, порт 8317) проксировал OAuth. Токен протухал каждые ~8ч.
|
||||
Убран из-за нестабильности. CLIProxy оставлен только для ботов 133/134.
|
||||
|
||||
@@ -1,22 +1,16 @@
|
||||
---
|
||||
name: Миграция ботов на прямой Anthropic API
|
||||
description: Боты переводятся с CLIProxy OAuth на прямые API-ключи для автономности
|
||||
name: Миграция ботов — итоговый статус
|
||||
description: Финальный статус миграции ботов с CLIProxy. LXC 129 удалён 2026-04-14.
|
||||
type: project
|
||||
---
|
||||
|
||||
Миграция ботов Clawdbot с CLIProxy (OAuth proxy) на прямые Anthropic API ключи для полной автономности каждого бота.
|
||||
|
||||
**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)
|
||||
## Статус (2026-04-14)
|
||||
|
||||
| Бот | 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... |
|
||||
| НИИКН (@maximka_assistant_bot) | 133 | CLIProxy (129:8317) | claude-sonnet-4-6 | Нужен свой ключ |
|
||||
| Знам (@ZnamSecurityBot) | 134 | CLIProxy (129:8317) | claude-sonnet-4-6 | Нужен свой ключ |
|
||||
| НИИКН (@maximka_assistant_bot) | 133 | OmniRoute | kr/claude-sonnet-4.5 | Бесплатно (Kiro/AWS) |
|
||||
| Знам (@ZnamSecurityBot) | 134 | **ВЫКЛЮЧЕН** | — | CLIProxy удалён с 129 |
|
||||
|
||||
CLIProxy на LXC 129 оставлен работать для 133/134 пока они не мигрируют.
|
||||
CLIProxy больше не существует. Бот 133 переведён на OmniRoute (бесплатно).
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
## Новый бот (clawdbot-3)
|
||||
- Telegram: @dttb_support_bot (зарегистрировать в BotFather)
|
||||
- Модель: cliproxy/claude-sonnet-4-6 (через CLIProxy на 129:8317)
|
||||
- Модель: нужно определить (CLIProxy на 129 удалён, OmniRoute или прямой API)
|
||||
- Персона: вежливый формальный саппорт, без доступа к инфраструктуре
|
||||
- Skill: helpdesk (работа с Freescout API)
|
||||
- Не знает паролей/IP, не выполняет команды — только общение + тикеты
|
||||
|
||||
21
daily/2026-04-17.md
Normal file
21
daily/2026-04-17.md
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
date: 2026-04-17
|
||||
type: daily
|
||||
---
|
||||
|
||||
# 2026-04-17
|
||||
|
||||
## Приоритеты дня
|
||||
- [ ]
|
||||
|
||||
## Инфраструктура
|
||||
<!-- Что менял, чинил, настраивал -->
|
||||
|
||||
## Заметки
|
||||
<!-- Идеи, находки, инсайты -->
|
||||
|
||||
## Проекты
|
||||
<!-- Прогресс по активным проектам -->
|
||||
|
||||
## Итог дня
|
||||
<!-- Что сделано, что осталось -->
|
||||
50
decisions/2026-04-14-openclaw-claude-code-pipeline.md
Normal file
50
decisions/2026-04-14-openclaw-claude-code-pipeline.md
Normal 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
|
||||
109
decisions/2026-04-17-code-server-upgrade.md
Normal file
109
decisions/2026-04-17-code-server-upgrade.md
Normal 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 на хосте.
|
||||
101
decisions/2026-04-17-nextcloud-sync-schema.md
Normal file
101
decisions/2026-04-17-nextcloud-sync-schema.md
Normal 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 и работает независимо
|
||||
@@ -1,24 +1,6 @@
|
||||
# Clawdbot-2 / Знам (LXC 134)
|
||||
# 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)
|
||||
|
||||
<!-- 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 -->
|
||||
- **Статус:** выключен, недоступен (с ~2026-04-14)
|
||||
- CLIProxy (129:8317) удалён — бот не может работать без него
|
||||
- Для восстановления: нужен новый провайдер модели (OmniRoute или прямой API)
|
||||
|
||||
@@ -1,24 +1,7 @@
|
||||
# Clawdbot (LXC 129) — основной бот
|
||||
# LXC 129 — УДАЛЁН (2026-04-14)
|
||||
|
||||
- Real config: ~/.clawdbot/clawdbot.json (NOT /opt/clawdbot/config.yaml)
|
||||
- ANTHROPIC_API_KEY=sk-clawdbot-proxy in /etc/systemd/system/clawdbot.service
|
||||
- Telegram bot: @maxim_dttb_bot
|
||||
- Model: anthropic/claude-opus-4-6 (через CLIProxy localhost:8317)
|
||||
- CLIProxy: порт 8317 (cliproxy.service), проксирует Anthropic API для всех ботов (129, 133, 134)
|
||||
- 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 -->
|
||||
> Бывший Clawdbot AI-ассистент (@maxim_dttb_bot). Удалён 2026-04-14.
|
||||
> Данные перенесены на code-server (LXC 132): `/root/backup-lxc129/`
|
||||
> IP 10.0.0.206 и NetBird 100.70.219.93 освобождены.
|
||||
> CLIProxy (порт 8317) больше не существует. Бот 134 (Znam) тоже выключен.
|
||||
> NPM домены bot.dttb.ru и siri.dttb.ru отключены.
|
||||
|
||||
@@ -42,6 +42,19 @@
|
||||
| Email | `it5870@yandex.ru` |
|
||||
| Пароль | `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)
|
||||
|
||||
| Параметр | Значение |
|
||||
@@ -74,13 +87,12 @@
|
||||
|
||||
| Хост | Порт | Метод |
|
||||
|------|------|-------|
|
||||
| 10.0.0.250 (Proxmox) | 22 | SSH-ключ clawdbot → root |
|
||||
| 10.0.0.206 (Clawdbot) | 22 | Локальный (LXC 129) |
|
||||
| 10.0.0.250 (Proxmox) | 22 | root / `1qaz!QAZ` |
|
||||
|
||||
---
|
||||
|
||||
## Заметки
|
||||
|
||||
- Пароль `1qaz!QAZ` используется на Proxmox и NPM
|
||||
- Пароль `1qaz!QAZ` используется на Proxmox, NPM, Nextcloud
|
||||
- Пароль `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
|
||||
|
||||
@@ -148,15 +148,8 @@
|
||||
| Роль | **Mailcow — почтовый сервер dttb.ru** |
|
||||
| Домен | mail.dttb.ru |
|
||||
|
||||
### 10.0.0.206 — Clawdbot (текущий)
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| 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.206 — УДАЛЁН (LXC 129, 2026-04-14)
|
||||
> Бывший Clawdbot. IP освобождён. Данные на code-server:/root/backup-lxc129/
|
||||
|
||||
### 10.0.0.217 — VaultWarden
|
||||
| Параметр | Значение |
|
||||
@@ -446,8 +439,8 @@
|
||||
| dttb.ru | 10.0.0.230:11001 | Nextcloud / Главный сайт |
|
||||
| pve.dttb.ru | 10.0.0.250:8006 | Proxmox VE WebUI |
|
||||
| npm.dttb.ru | 10.0.0.195:81 | NPM панель |
|
||||
| bot.dttb.ru | 10.0.0.206:18789 | Clawdbot Gateway |
|
||||
| siri.dttb.ru | 10.0.0.206:18790 | Clawdbot Siri endpoint |
|
||||
| bot.dttb.ru | — | УДАЛЁН (был Clawdbot LXC 129) |
|
||||
| siri.dttb.ru | — | УДАЛЁН (был Clawdbot LXC 129) |
|
||||
| ai.dttb.ru | 10.0.0.179:8080 | Code-server / AI |
|
||||
| bit.dttb.ru | 10.0.0.217:8080 | VaultWarden |
|
||||
| link.dttb.ru | 10.0.0.184:3000 | LinkWarden |
|
||||
|
||||
@@ -34,8 +34,7 @@
|
||||
| 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 |
|
||||
| 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** |
|
||||
| 20 | `siri.dttb.ru` | 10.0.0.206:18790 | ❌ | ❌ | ❌ | ❌ | Clawdbot Siri endpoint |
|
||||
| 28 | `bot.dttb.ru` | 10.0.0.239:18789 | ✅ Let's Encrypt | ✅ | ✅ | ✅ | **OpenClaw Gateway** (LXC 137) |
|
||||
| 21 | `rec.dttb.ru` | 10.0.0.227:8091 | ✅ Let's Encrypt | ✅ | ❌ | ❌ | Запись/NVR |
|
||||
| 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 |
|
||||
|
||||
380
projects/dttb/openclaw.md
Normal file
380
projects/dttb/openclaw.md
Normal 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).
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> **Нода:** pve (10.0.0.250)
|
||||
>
|
||||
> Последнее обновление: 2026-02-27
|
||||
> Последнее обновление: 2026-04-17 (обновлено из живого `pct list` / `qm list`)
|
||||
|
||||
---
|
||||
|
||||
@@ -10,155 +10,81 @@
|
||||
|
||||
| Тип | Всего | Запущено | Остановлено |
|
||||
|-----|-------|----------|-------------|
|
||||
| QEMU VM | 12 | 4 | 8 |
|
||||
| LXC | 20 | 13 | 7 |
|
||||
| **Итого** | **32** | **17** | **15** |
|
||||
| QEMU VM | 15 | 5 | 10 |
|
||||
| LXC | 21 | 11 | 10 |
|
||||
| **Итого** | **36** | **16** | **20** |
|
||||
|
||||
---
|
||||
|
||||
## 🟢 Запущенные VM (QEMU)
|
||||
|
||||
### VM 104 — Agent-DVR
|
||||
### VM 106 — pbs
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 104 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 8 vCPU (загрузка: 31.3%) |
|
||||
| RAM | 8 GB (использовано: 7.3 GB) |
|
||||
| CPU | 2 vCPU |
|
||||
| RAM | 10 GB |
|
||||
| Диск | 100 GB |
|
||||
| Назначение | Proxmox Backup Server |
|
||||
|
||||
### VM 107 — Mailcow
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 4 vCPU |
|
||||
| RAM | 8 GB |
|
||||
| Диск | 60 GB |
|
||||
| Сеть (in/out) | 283 GB / 135.9 GB |
|
||||
| Uptime | ~1.1 дня |
|
||||
| Назначение | NVR / видеонаблюдение |
|
||||
| IP | 10.0.0.107 |
|
||||
| NPM домен | mail.dttb.ru |
|
||||
| Назначение | Почтовый сервер dttb.ru |
|
||||
|
||||
### VM 111 — WinServer2025
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 111 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 8 vCPU (загрузка: 5.9%) |
|
||||
| RAM | 31.3 GB (использовано: 5.9 GB) |
|
||||
| CPU | 4 vCPU |
|
||||
| RAM | 32 GB |
|
||||
| Диск | 200 GB |
|
||||
| Сеть (in/out) | 3.9 GB / 15.3 GB |
|
||||
| Uptime | ~6.8 дней |
|
||||
| Назначение | Windows Server 2025 |
|
||||
| Назначение | Windows Server 2025 (1С и т.п.) |
|
||||
|
||||
### 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
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 250 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 8 vCPU (загрузка: 4.6%) |
|
||||
| RAM | 15.7 GB (использовано: 8.6 GB) |
|
||||
| CPU | 2 vCPU |
|
||||
| RAM | 10 GB |
|
||||
| Диск | 100 GB |
|
||||
| Сеть (in/out) | 1.4 GB / 178 MB |
|
||||
| Uptime | ~6.8 дней |
|
||||
| Назначение | Nextcloud All-in-One |
|
||||
| IP | 10.0.0.230:11001 |
|
||||
| Домен | dttb.ru |
|
||||
| Версия | Nextcloud 32.0.6 |
|
||||
| Назначение | **Nextcloud All-in-One** (основной) |
|
||||
|
||||
---
|
||||
|
||||
## 🔴 Остановленные VM (QEMU)
|
||||
|
||||
### VM 100 — NV
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 100 |
|
||||
| CPU | 4 vCPU |
|
||||
| RAM | 23.5 GB |
|
||||
| Диск | 100 GB |
|
||||
|
||||
### VM 105 — Nextcloud-AIO-dttb.ru
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 105 |
|
||||
| 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 |
|
||||
| VMID | Имя | CPU | RAM | Диск | Назначение |
|
||||
|------|-----|-----|-----|------|------------|
|
||||
| 100 | NV | 4 | 24 GB | 100 GB | — |
|
||||
| 104 | Agent-DVR | 8 | 8 GB | 60 GB | NVR (перенесено на MMFB?) |
|
||||
| 105 | Nextcloud-AIO-dttb.ru | 8 | 22 GB | 110 GB | Старый Nextcloud AIO (заменён VM 250) |
|
||||
| 109 | itilelegent | 8 | 8 GB | 60 GB | ITIL Elegant проект |
|
||||
| 110 | Cloud | 8 | 16 GB | 80 GB | Cloud-init шаблон |
|
||||
| 112 | cloud-dttb | 8 | 16 GB | 80 GB | — |
|
||||
| 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 | — |
|
||||
| 130 | Zima-OS | 4 | 12 GB | 32 GB | ZimaOS |
|
||||
|
||||
---
|
||||
|
||||
@@ -167,177 +93,121 @@
|
||||
### LXC 103 — NPM
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 103 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 6 vCPU (загрузка: <0.1%) |
|
||||
| RAM | 16.1 GB (использовано: 314 MB) |
|
||||
| Диск | 7.8 GB (использовано: 3.6 GB) |
|
||||
| Сеть (in/out) | 114.3 GB / 99.6 GB |
|
||||
| Uptime | ~4.5 дней |
|
||||
| IP (по NPM) | 10.0.0.195 |
|
||||
| IP | 10.0.0.195 (+ docker bridges) |
|
||||
| NPM домен | npm.dttb.ru |
|
||||
| Назначение | Nginx Proxy Manager |
|
||||
|
||||
### LXC 113 — VaultWarden
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 113 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 4 vCPU |
|
||||
| RAM | 8.3 GB (использовано: 109 MB) |
|
||||
| Диск | 37.3 GB (использовано: 1.8 GB) |
|
||||
| Сеть (in/out) | 728 MB / 51 MB |
|
||||
| Uptime | ~6.8 дней |
|
||||
| Назначение | Менеджер паролей (Bitwarden) |
|
||||
| IP | 10.0.0.217 (+ docker bridges) |
|
||||
| NPM домен | bit.dttb.ru |
|
||||
| Назначение | Менеджер паролей (Vaultwarden / Bitwarden) |
|
||||
|
||||
### LXC 114 — LinkWarden
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 114 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 2 vCPU |
|
||||
| RAM | 4.4 GB (использовано: 843 MB) |
|
||||
| Диск | 19.5 GB (использовано: 5.6 GB) |
|
||||
| Сеть (in/out) | 767 MB / 17 MB |
|
||||
| Uptime | ~6.8 дней |
|
||||
| NPM домен | link.dttb.ru → 10.0.0.184:3000 |
|
||||
| IP | 10.0.0.184 (+ docker bridges) |
|
||||
| NPM домен | link.dttb.ru |
|
||||
| Назначение | Менеджер закладок |
|
||||
|
||||
### LXC 115 — watchyourlan
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 115 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 1 vCPU |
|
||||
| RAM | 512 MB (использовано: 47 MB) |
|
||||
| Диск | 1.9 GB (использовано: 925 MB) |
|
||||
| IP | 10.0.0.113 |
|
||||
| Tags | community-script, network |
|
||||
| Uptime | ~6.8 дней |
|
||||
| Назначение | Мониторинг сетевых устройств |
|
||||
|
||||
### LXC 116 — rustdeskserver
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 116 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 1 vCPU |
|
||||
| RAM | 512 MB (использовано: 55 MB) |
|
||||
| Диск | 1.9 GB (использовано: 878 MB) |
|
||||
| Tags | community-script, remote-desktop |
|
||||
| Uptime | ~6.8 дней |
|
||||
| NPM домен | remot.dttb.ru → 10.0.0.43:21114 |
|
||||
| IP | 10.0.0.244 (LAN) / 100.70.191.161 (NetBird) |
|
||||
| NPM домен | remot.dttb.ru *(в NPM записан 10.0.0.43 — устарело, проверить)* |
|
||||
| Назначение | 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
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 132 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 2 vCPU |
|
||||
| RAM | 2 GB (использовано: 1.2 GB) |
|
||||
| Диск | 7.8 GB (использовано: 4.3 GB) |
|
||||
| Uptime | ~5.2 дней |
|
||||
| Назначение | VS Code Server (веб-IDE) |
|
||||
|
||||
### 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) |
|
||||
| CPU | 4 vCPU (увеличено 2→4 — 2026-04-17) |
|
||||
| RAM | 8 GB |
|
||||
| Диск | 50 GB |
|
||||
| IP | 10.0.0.179 (LAN) / 100.70.92.138 (NetBird) |
|
||||
| NPM домен | ai.dttb.ru → 10.0.0.179:8080 |
|
||||
| Назначение | VS Code Server + OmniRoute + CLIProxy |
|
||||
|
||||
### LXC 134 — ZnamSecurityBot
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 134 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 4 vCPU |
|
||||
| RAM | 4 GB (использовано: 477 MB) |
|
||||
| Диск | 15.6 GB (использовано: 5 GB) |
|
||||
| IP | 10.0.0.238 |
|
||||
| Tags | ai, assistant, community-script |
|
||||
| Uptime | ~1.3 дня |
|
||||
| Назначение | 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
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| VMID | 136 |
|
||||
| Статус | 🟢 running |
|
||||
| CPU | 2 vCPU |
|
||||
| RAM | 2 GB (использовано: 200 MB) |
|
||||
| Диск | 15.6 GB (использовано: 1.6 GB) |
|
||||
| Tags | git, knowledge-base |
|
||||
| Uptime | ~30 минут |
|
||||
| IP | 10.0.0.189 |
|
||||
| IP | 10.0.0.189 (+ docker bridges) |
|
||||
| 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
|
||||
|
||||
| VMID | Имя | CPU | RAM | Диск | Tags | Назначение |
|
||||
|------|-----|-----|-----|------|------|------------|
|
||||
| 101 | n8n | 6 | 21.5 GB | 6 GB | automation, community-script | Автоматизация (n8n) |
|
||||
| 102 | SMB | 6 | 22 GB | 1 TB | — | SMB файл-сервер |
|
||||
| 108 | zabbix | 2 | 4 GB | 6 GB | community-script, monitoring | Мониторинг Zabbix |
|
||||
| 117 | motioneye | 2 | 2 GB | 8 GB | community-script, nvr | MotionEye NVR |
|
||||
| 118 | plex | 2 | 2 GB | 8 GB | community-script, media | Plex Media Server |
|
||||
| 121 | docker-windows | 6 | 16 GB | 100 GB | — | Docker (Windows) |
|
||||
| 122 | qbittorrent | 2 | 2 GB | 8 GB | — | qBittorrent |
|
||||
| 126 | debian | 1 | 512 MB | 2 GB | community-script, os | Debian базовый |
|
||||
| VMID | Имя | Назначение |
|
||||
|------|-----|------------|
|
||||
| 101 | n8n | Автоматизация (n8n) |
|
||||
| 102 | SMB | SMB файл-сервер |
|
||||
| 108 | zabbix | Мониторинг Zabbix |
|
||||
| 117 | motioneye | MotionEye NVR |
|
||||
| 118 | plex | Plex Media Server |
|
||||
| 119 | myspeed | Speed test мониторинг |
|
||||
| 121 | docker-windows | Docker (Windows) |
|
||||
| 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
24
projects/dttb/server1c.md
Normal 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.
|
||||
43
projects/glavtorg/README.md
Normal file
43
projects/glavtorg/README.md
Normal 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С обновление)
|
||||
51
projects/glavtorg/instruction-diana-rdp.md
Normal file
51
projects/glavtorg/instruction-diana-rdp.md
Normal 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**
|
||||
- Не устанавливать стороннее ПО на сервер
|
||||
- Не изменять настройки системы
|
||||
- При проблемах с подключением — обращаться к администратору (Ярослав)
|
||||
45
projects/mmfb/proxmox-inventory.md
Normal file
45
projects/mmfb/proxmox-inventory.md
Normal 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
21
templates/daily-note.md
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
date: {{date}}
|
||||
type: daily
|
||||
---
|
||||
|
||||
# {{date:YYYY-MM-DD}}
|
||||
|
||||
## Приоритеты дня
|
||||
- [ ]
|
||||
|
||||
## Инфраструктура
|
||||
<!-- Что менял, чинил, настраивал -->
|
||||
|
||||
## Заметки
|
||||
<!-- Идеи, находки, инсайты -->
|
||||
|
||||
## Проекты
|
||||
<!-- Прогресс по активным проектам -->
|
||||
|
||||
## Итог дня
|
||||
<!-- Что сделано, что осталось -->
|
||||
20
templates/decision.md
Normal file
20
templates/decision.md
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
date: {{date}}
|
||||
type: decision
|
||||
tags: []
|
||||
---
|
||||
|
||||
# {{title}}
|
||||
|
||||
## Контекст
|
||||
<!-- Что привело к решению -->
|
||||
|
||||
## Варианты
|
||||
1.
|
||||
2.
|
||||
|
||||
## Решение
|
||||
<!-- Что выбрано и почему -->
|
||||
|
||||
## Последствия
|
||||
<!-- Что нужно обновить / учесть -->
|
||||
Reference in New Issue
Block a user