obsidian auto-sync 2026-04-17 01:36:37

This commit is contained in:
dttb
2026-04-17 01:36:37 +03:00
parent ddbd720841
commit 84a283deb5
36 changed files with 22930 additions and 129 deletions

Submodule .claude/worktrees/pedantic-jackson added at 2bb350b18d

9
.gitignore vendored Normal file
View File

@@ -0,0 +1,9 @@
# Obsidian
.obsidian/workspace.json
.obsidian/workspace-mobile.json
.obsidian/plugins/*/data.json
.obsidian/cache
# System
.DS_Store
.trash/

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

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

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

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

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

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

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

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

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

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

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

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

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

File diff suppressed because one or more lines are too long

View File

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

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

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

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

File diff suppressed because one or more lines are too long

View File

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

View File

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

File diff suppressed because one or more lines are too long

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -250,19 +250,9 @@
| Uptime | ~6.8 дней | | Uptime | ~6.8 дней |
| Назначение | Локальный сервис Proxmox | | Назначение | Локальный сервис Proxmox |
### LXC 129 — clawdbot ### LXC 129 — УДАЛЁН (2026-04-14)
| Параметр | Значение | > Бывший Clawdbot AI-ассистент. Данные перенесены на code-server (132) в /root/backup-lxc129/.
|----------|----------| > IP 10.0.0.206 освобождён.
| VMID | 129 |
| Статус | 🟢 running |
| CPU | 4 vCPU (загрузка: 0.9%) |
| RAM | 4 GB (использовано: 556 MB) |
| Диск | 15.6 GB (использовано: 4.5 GB) |
| Tags | ai, assistant, community-script |
| Uptime | ~7 часов |
| IP | 10.0.0.206 |
| NPM домен | bot.dttb.ru → 10.0.0.206:18789 |
| Назначение | **Clawdbot AI-ассистент (текущий)** |
### LXC 132 — code-server ### LXC 132 — code-server
| Параметр | Значение | | Параметр | Значение |

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

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

View File

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

View File

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

View File

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

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

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

20
templates/decision.md Normal file
View File

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