commit
4c5eca4259
41 changed files with 62899 additions and 0 deletions
Binary file not shown.
@ -0,0 +1,22 @@
|
||||
--- |
||||
kind: pipeline |
||||
type: docker |
||||
name: buildsite |
||||
steps: |
||||
- name: build |
||||
image: ghcr.io/ironicbadger/mkdocs-material-insiders |
||||
pull: if-not-exists |
||||
volumes: |
||||
- name: site |
||||
path: /site |
||||
commands: |
||||
- pip install -U -r ./requirements.txt |
||||
- mkdocs build |
||||
- cp -r site/ /site |
||||
- chmod -R 777 /site |
||||
volumes: |
||||
- name: site |
||||
host: |
||||
path: /mnt/nvme2tb/appdata/foundation |
||||
image_pull_secrets: |
||||
- dockerconfig |
@ -0,0 +1,5 @@
|
||||
{ |
||||
"attachmentFolderPath": "docs/assets", |
||||
"promptDelete": false, |
||||
"alwaysUpdateLinks": true |
||||
} |
@ -0,0 +1,8 @@
|
||||
[ |
||||
"table-editor-obsidian", |
||||
"note-refactor-obsidian", |
||||
"oz-image-plugin", |
||||
"code-block-copy", |
||||
"cm-editor-syntax-highlight-obsidian", |
||||
"url-into-selection" |
||||
] |
@ -0,0 +1,14 @@
|
||||
[ |
||||
"file-explorer", |
||||
"global-search", |
||||
"switcher", |
||||
"graph", |
||||
"backlink", |
||||
"page-preview", |
||||
"note-composer", |
||||
"command-palette", |
||||
"markdown-importer", |
||||
"word-count", |
||||
"open-with-default-app", |
||||
"file-recovery" |
||||
] |
File diff suppressed because one or more lines are too long
@ -0,0 +1,10 @@
|
||||
{ |
||||
"id": "cm-editor-syntax-highlight-obsidian", |
||||
"name": "Editor Syntax Highlight", |
||||
"author": "death_au", |
||||
"authorUrl": "https://github.com/deathau", |
||||
"description": "Show syntax highlighing in code blocks the editor", |
||||
"isDesktopOnly": false, |
||||
"version": "0.1.2", |
||||
"minAppVersion": "0.10.0" |
||||
} |
@ -0,0 +1,177 @@
|
||||
@charset "UTF-8"; |
||||
.cm-s-obsidian pre.HyperMD-codeblock span.cm-formatting-code-block { |
||||
color: var(--text-muted); |
||||
} |
||||
|
||||
.cm-s-obsidian pre.HyperMD-codeblock .cm-keyword { |
||||
font-weight: normal; |
||||
} |
||||
|
||||
.theme-dark .cm-s-obsidian { |
||||
/* |
||||
|
||||
Name: yoncé |
||||
Author: Thomas MacLean (http://github.com/thomasmaclean) |
||||
|
||||
Original yoncé color scheme by Mina Markham (https://github.com/minamarkham) |
||||
|
||||
*/ |
||||
/**/ |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock { |
||||
color: #d4d4d4; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-keyword, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-keyword, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-keyword { |
||||
color: #00A7AA; |
||||
font-weight: normal; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-atom, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-atom, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-atom { |
||||
color: #F39B35; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-number, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-number, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-number { |
||||
color: #A06FCA; |
||||
} |
||||
.theme-dark .cm-s-obsidian span.cm-hmd-frontmatter.cm-type, |
||||
.theme-dark .cm-s-obsidian span.cm-math.cm-type, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock span.cm-type { |
||||
color: #A06FCA; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-def, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-def, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-def { |
||||
color: #98E342; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-property, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-property, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-property { |
||||
color: #D4D4D4; |
||||
} |
||||
.theme-dark .cm-s-obsidian span.cm-hmd-frontmatter.cm-variable, |
||||
.theme-dark .cm-s-obsidian span.cm-math.cm-variable, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock span.cm-variable { |
||||
color: #D4D4D4; |
||||
} |
||||
.theme-dark .cm-s-obsidian span.cm-hmd-frontmatter.cm-variable-2, |
||||
.theme-dark .cm-s-obsidian span.cm-math.cm-variable-2, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock span.cm-variable-2 { |
||||
color: #da7dae; |
||||
} |
||||
.theme-dark .cm-s-obsidian span.cm-hmd-frontmatter.cm-variable-3, |
||||
.theme-dark .cm-s-obsidian span.cm-math.cm-variable-3, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock span.cm-variable-3 { |
||||
color: #A06FCA; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-type.cm-def, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-type.cm-def, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-type.cm-def { |
||||
color: #FC4384; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-property.cm-def, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-property.cm-def, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-property.cm-def { |
||||
color: #FC4384; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-callee, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-callee, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-callee { |
||||
color: #FC4384; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-operator, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-operator, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-operator { |
||||
color: #FC4384; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-qualifier, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-qualifier, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-qualifier { |
||||
color: #FC4384; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-tag, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-tag, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-tag { |
||||
color: #FC4384; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-tag.cm-bracket, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-tag.cm-bracket, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-tag.cm-bracket { |
||||
color: #D4D4D4; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-attribute, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-attribute, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-attribute { |
||||
color: #A06FCA; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-comment, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-comment, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-comment { |
||||
color: #696d70; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-comment.cm-tag, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-comment.cm-tag, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-comment.cm-tag { |
||||
color: #FC4384; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-comment.cm-attribute, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-comment.cm-attribute, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-comment.cm-attribute { |
||||
color: #D4D4D4; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-string, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-string, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-string { |
||||
color: #E6DB74; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-string-2, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-string-2, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-string-2 { |
||||
color: #F39B35; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-meta, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-meta, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-meta { |
||||
color: #D4D4D4; |
||||
background: inherit; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-builtin, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-builtin, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-builtin { |
||||
color: #FC4384; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-header, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-header, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-header { |
||||
color: #da7dae; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-hr, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-hr, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-hr { |
||||
color: #98E342; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-link, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-link, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-link { |
||||
color: #696d70; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.cm-error, |
||||
.theme-dark .cm-s-obsidian .cm-math.cm-error, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .cm-error { |
||||
border-bottom: 1px solid #C42412; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.CodeMirror-activeline-background, |
||||
.theme-dark .cm-s-obsidian .cm-math.CodeMirror-activeline-background, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .CodeMirror-activeline-background { |
||||
background: #272727; |
||||
} |
||||
.theme-dark .cm-s-obsidian .cm-hmd-frontmatter.CodeMirror-matchingbracket, |
||||
.theme-dark .cm-s-obsidian .cm-math.CodeMirror-matchingbracket, |
||||
.theme-dark .cm-s-obsidian pre.HyperMD-codeblock .CodeMirror-matchingbracket { |
||||
outline: 1px solid grey; |
||||
color: #D4D4D4 !important; |
||||
} |
File diff suppressed because one or more lines are too long
@ -0,0 +1,8 @@
|
||||
{ |
||||
"id": "code-block-copy", |
||||
"name": "Copy button for code blocks", |
||||
"author": "Daniel Brandenburg", |
||||
"description": "Copy button for code blocks", |
||||
"isDesktopOnly": false, |
||||
"version": "0.1.0" |
||||
} |
@ -0,0 +1,41 @@
|
||||
.copy-code-button { |
||||
color: var(--background-primary); |
||||
background-color: var(--text-faint); |
||||
border-radius: 1px 1px 0px 0px; |
||||
/* right-align */ |
||||
display: block; |
||||
margin-left: auto; |
||||
margin-right: 0; |
||||
margin-bottom: -2px; |
||||
padding: 3px 8px; |
||||
font-size: 0.8em; |
||||
position: absolute; |
||||
top: 0px; |
||||
right: 0px; |
||||
} |
||||
|
||||
.copy-code-button:hover { |
||||
cursor: pointer; |
||||
background-color: var(--text-normal); |
||||
} |
||||
|
||||
.copy-code-button:focus { |
||||
/* Avoid an ugly focus outline on click in Chrome, |
||||
but darken the button for accessibility. |
||||
See https://stackoverflow.com/a/25298082/1481479 */ |
||||
background-color: var(--text-normal); |
||||
outline: 0; |
||||
} |
||||
|
||||
.copy-code-button:active { |
||||
background-color: var(--text-normal); |
||||
} |
||||
|
||||
.highlight pre { |
||||
/* Avoid pushing up the copy buttons. */ |
||||
margin: 0; |
||||
} |
||||
|
||||
.has-copy-button { |
||||
position: relative; |
||||
} |
File diff suppressed because one or more lines are too long
@ -0,0 +1,9 @@
|
||||
{ |
||||
"id": "note-refactor-obsidian", |
||||
"name": "Note Refactor", |
||||
"version": "1.7.1", |
||||
"description": "Extract note content into new notes and split notes", |
||||
"isDesktopOnly": false, |
||||
"js": "main.js", |
||||
"css": "style.css" |
||||
} |
@ -0,0 +1,7 @@
|
||||
.note-refactor-filename .setting-item-info { |
||||
margin-right: 0; |
||||
} |
||||
|
||||
.note-refactor-filename .setting-item-name { |
||||
padding-top: 10px; |
||||
} |
File diff suppressed because one or more lines are too long
@ -0,0 +1,10 @@
|
||||
{ |
||||
"id": "oz-image-plugin", |
||||
"name": "Ozan's Image in Editor Plugin", |
||||
"version": "1.6.9", |
||||
"minAppVersion": "0.12.16", |
||||
"description": "View Images, Transclusions, iFrames and PDF Files within the Editor without a necessity to switch to Preview.", |
||||
"author": "Ozan Tellioglu", |
||||
"authorUrl": "https://ozan.pl/aboutme/", |
||||
"isDesktopOnly": true |
||||
} |
@ -0,0 +1,192 @@
|
||||
div.oz-image-widget img { |
||||
max-width: 100%; |
||||
cursor: zoom-in; |
||||
} |
||||
|
||||
div.oz-image-widget > img[alt$='#small'] { |
||||
max-width: 75% !important; |
||||
min-width: 200pt !important; |
||||
} |
||||
|
||||
div.oz-image-widget > img[alt$='#x-small'] { |
||||
max-width: 50% !important; |
||||
min-width: 100pt !important; |
||||
} |
||||
|
||||
div.oz-image-widget > img[alt$='#xx-small'] { |
||||
max-width: 25% !important; |
||||
min-width: 50pt !important; |
||||
} |
||||
|
||||
.CodeMirror-linewidget img { |
||||
margin-top: 5px; |
||||
margin-bottom: 5px; |
||||
} |
||||
|
||||
.theme-dark img[alt$='#invert'], |
||||
.theme-dark div.oz-image-widget > img[alt$='#invert'] { |
||||
filter: invert(1) hue-rotate(180deg); |
||||
} |
||||
|
||||
.oz-transclusion-widget { |
||||
padding: 3px 3px 3px 19px; |
||||
border-left: 2px solid var(--text-muted); |
||||
} |
||||
|
||||
.oz-coffee-div { |
||||
text-align: center; |
||||
margin-top: 20px; |
||||
} |
||||
|
||||
/* Image Zoom */ |
||||
div.oz-image-widget img:active { |
||||
width: auto; |
||||
max-height: 95vh; |
||||
cursor: zoom-out; |
||||
} |
||||
|
||||
/* Line Numbers In Editor CodeBlock Renders */ |
||||
pre[class*='language-'].line-numbers { |
||||
position: relative; |
||||
padding-left: 3.8em; |
||||
counter-reset: linenumber; |
||||
} |
||||
pre[class*='language-'].line-numbers > code { |
||||
position: relative; |
||||
white-space: inherit; |
||||
} |
||||
.line-numbers .line-numbers-rows { |
||||
position: absolute; |
||||
pointer-events: none; |
||||
top: 0; |
||||
font-size: 100%; |
||||
left: -3.8em; |
||||
width: 3em; /* works for line-numbers below 1000 lines */ |
||||
letter-spacing: -1px; |
||||
border-right: 1px solid #999; |
||||
|
||||
-webkit-user-select: none; |
||||
-moz-user-select: none; |
||||
-ms-user-select: none; |
||||
user-select: none; |
||||
} |
||||
.line-numbers-rows > span { |
||||
display: block; |
||||
counter-increment: linenumber; |
||||
} |
||||
.line-numbers-rows > span:before { |
||||
content: counter(linenumber); |
||||
color: #999; |
||||
display: block; |
||||
padding-right: 0.8em; |
||||
text-align: right; |
||||
} |
||||
|
||||
/* Admonition */ |
||||
#oz-admonition-title { |
||||
text-transform: capitalize; |
||||
} |
||||
|
||||
.mermaid-error-information { |
||||
color: red; |
||||
font-size: 14px; |
||||
margin-bottom: 3px; |
||||
} |
||||
|
||||
.oz-modal-center { |
||||
text-align: center; |
||||
margin: 20px 10px 20px 10px; |
||||
} |
||||
|
||||
.oz-modal-title { |
||||
text-align: center; |
||||
} |
||||
|
||||
.inline-mathjax-block { |
||||
margin-left: 5px; |
||||
} |
||||
|
||||
.oz-image-widget > img { |
||||
-webkit-user-drag: none; |
||||
user-select: none; |
||||
-moz-user-select: none; |
||||
-webkit-user-select: none; |
||||
-ms-user-select: none; |
||||
} |
||||
|
||||
div.oz-transclusion-widget pre { |
||||
overflow-x: auto; |
||||
} |
||||
|
||||
.oz-transclusion-widget > * { |
||||
user-select: text !important; |
||||
} |
||||
|
||||
/* Rich Link Cards */ |
||||
/* Credit: https://github.com/dhamaniasad/obsidian-rich-links */ |
||||
.oz-rich-link-card { |
||||
border: 1px solid var(--background-modifier-border); |
||||
border-radius: 3px; |
||||
width: 100%; |
||||
display: flex; |
||||
text-decoration: none; |
||||
background-color: var(--background-primary); |
||||
} |
||||
|
||||
.oz-rich-link-card-container { |
||||
position: relative; |
||||
} |
||||
|
||||
.oz-rich-link-image-container { |
||||
height: 100px; |
||||
width: 35%; |
||||
min-width: 120px; |
||||
overflow: hidden; |
||||
border-right: 1px solid var(--background-modifier-border); |
||||
} |
||||
|
||||
.oz-rich-link-image { |
||||
background-position: center center; |
||||
background-size: cover; |
||||
background-repeat: no-repeat; |
||||
padding-bottom: 100px; |
||||
background-color: var(--background-secondary); |
||||
} |
||||
|
||||
.oz-rich-link-card-text { |
||||
padding: 4px; |
||||
width: 75%; |
||||
} |
||||
|
||||
.oz-rich-link-card-title { |
||||
font-family: sans-serif; |
||||
font-size: 16px; |
||||
margin: 0 0 4px 0; |
||||
display: -webkit-box; |
||||
-webkit-line-clamp: 1; |
||||
-webkit-box-orient: vertical; |
||||
overflow: hidden; |
||||
color: var(--text-normal); |
||||
} |
||||
|
||||
.oz-rich-link-card-description { |
||||
font-family: sans-serif; |
||||
font-size: 14px; |
||||
margin: 0; |
||||
color: var(--text-muted); |
||||
display: -webkit-box; |
||||
-webkit-line-clamp: 2; |
||||
-webkit-box-orient: vertical; |
||||
overflow: hidden; |
||||
} |
||||
|
||||
.oz-rich-link-href { |
||||
font-family: sans-serif; |
||||
font-size: 14px; |
||||
margin: 0; |
||||
color: var(--text-faint); |
||||
display: -webkit-box; |
||||
-webkit-line-clamp: 1; |
||||
-webkit-box-orient: vertical; |
||||
overflow: hidden; |
||||
} |
@ -0,0 +1,6 @@
|
||||
{ |
||||
"formatType": "normal", |
||||
"showRibbonIcon": true, |
||||
"bindEnter": true, |
||||
"bindTab": true |
||||
} |
File diff suppressed because one or more lines are too long
@ -0,0 +1,11 @@
|
||||
{ |
||||
"id": "table-editor-obsidian", |
||||
"name": "Advanced Tables", |
||||
"author": "Tony Grosinger", |
||||
"authorUrl": "https://grosinger.net", |
||||
"description": "Improved table navigation, formatting, manipulation, and formulas", |
||||
"isDesktopOnly": false, |
||||
"minAppVersion": "0.11.12", |
||||
"version": "0.13.0", |
||||
"js": "main.js" |
||||
} |
@ -0,0 +1,28 @@
|
||||
.HyperMD-table-row span.cm-inline-code { |
||||
font-size: 100%; |
||||
} |
||||
|
||||
.widget-icon { |
||||
width: 20px; |
||||
height: 20px; |
||||
fill: var(--text-muted); |
||||
} |
||||
|
||||
.widget-icon:hover { |
||||
fill: var(--text-normal); |
||||
} |
||||
|
||||
.advanced-tables-csv-export textarea { |
||||
height: 200px; |
||||
width: 100%; |
||||
} |
||||
|
||||
.advanced-tables-donation { |
||||
width: 70%; |
||||
margin: 0 auto; |
||||
text-align: center; |
||||
} |
||||
|
||||
.advanced-tables-donate-button { |
||||
margin: 10px; |
||||
} |
File diff suppressed because one or more lines are too long
@ -0,0 +1,8 @@
|
||||
{ |
||||
"id": "url-into-selection", |
||||
"name": "Paste URL into selection", |
||||
"description": "Paste URL \"into\" selected text.", |
||||
"isDesktopOnly": false, |
||||
"js": "main.js", |
||||
"version": "1.6.0" |
||||
} |
@ -0,0 +1,100 @@
|
||||
{ |
||||
"main": { |
||||
"id": "34c9809ead4532de", |
||||
"type": "split", |
||||
"children": [ |
||||
{ |
||||
"id": "46e85ae4d1e9c549", |
||||
"type": "leaf", |
||||
"state": { |
||||
"type": "markdown", |
||||
"state": { |
||||
"file": "docs/Writing Tips.md", |
||||
"mode": "source" |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"direction": "vertical" |
||||
}, |
||||
"left": { |
||||
"id": "52a45107847f3c97", |
||||
"type": "split", |
||||
"children": [ |
||||
{ |
||||
"id": "923ba15348980c37", |
||||
"type": "tabs", |
||||
"children": [ |
||||
{ |
||||
"id": "8190f1a22984e6d5", |
||||
"type": "leaf", |
||||
"state": { |
||||
"type": "file-explorer", |
||||
"state": {} |
||||
} |
||||
}, |
||||
{ |
||||
"id": "ad38da749afa6116", |
||||
"type": "leaf", |
||||
"state": { |
||||
"type": "search", |
||||
"state": { |
||||
"query": "", |
||||
"matchingCase": false, |
||||
"explainSearch": false, |
||||
"collapseAll": false, |
||||
"extraContext": false, |
||||
"sortOrder": "alphabetical" |
||||
} |
||||
} |
||||
} |
||||
] |
||||
} |
||||
], |
||||
"direction": "horizontal", |
||||
"width": 300 |
||||
}, |
||||
"right": { |
||||
"id": "e80064515116eae9", |
||||
"type": "split", |
||||
"children": [ |
||||
{ |
||||
"id": "be3f3ab55d311eed", |
||||
"type": "tabs", |
||||
"children": [ |
||||
{ |
||||
"id": "b85ece88de8eb60e", |
||||
"type": "leaf", |
||||
"state": { |
||||
"type": "backlink", |
||||
"state": { |
||||
"file": "docs/Writing Tips.md", |
||||
"collapseAll": false, |
||||
"extraContext": false, |
||||
"sortOrder": "alphabetical", |
||||
"showSearch": false, |
||||
"searchQuery": "", |
||||
"backlinkCollapsed": false, |
||||
"unlinkedCollapsed": true |
||||
} |
||||
} |
||||
} |
||||
] |
||||
} |
||||
], |
||||
"direction": "horizontal", |
||||
"width": 300 |
||||
}, |
||||
"active": "46e85ae4d1e9c549", |
||||
"lastOpenFiles": [ |
||||
"docs/Writing Tips.md", |
||||
"docs/Infrastructure/Hosting Overview.md", |
||||
"docs/Services/Traefik.md", |
||||
"docs/code/docker-compose.md", |
||||
"docs/Services/Gitea.md", |
||||
"docs/index.md", |
||||
"Linux server.md", |
||||
"docs/Infrastructure/Raspberry Pi.md", |
||||
"docs/Infrastructure/VPS.md" |
||||
] |
||||
} |
@ -0,0 +1,20 @@
|
||||
# Hosting |
||||
|
||||
If this is your first time self-hosting a service, welcome. This might seem a little intimidating but it's not *so* bad. |
||||
|
||||
## Where to host? |
||||
|
||||
You have a few options to self-host these services. You could use a [[VPS]], a [[Raspberry Pi]] or any other [[Linux server]] (note I've deliberately left this link incomplete so you can see how this is handled by mkdocs) of your choosing. |
||||
|
||||
## DNS |
||||
|
||||
This guide assumes: |
||||
|
||||
- You own your own domain such as "perfectmediaserver.com", purchasing a .com domain costs as little as $10 per year |
||||
- You have a Cloudflare account to use as your DNS provider (this is free) |
||||
|
||||
I've written previously about how to configure DNS for [perfectmediaserver.com](https://perfectmediaserver.com/remote-access/traefik101.html#domain-setup-namecheap). |
||||
|
||||
--- |
||||
|
||||
Head back to the [[index|overview]] to continue. |
@ -0,0 +1,5 @@
|
||||
Hopefully you are familiar with the Raspberry Pi. |
||||
|
||||
The Pi 4 has plenty of horsepower to run these services and has a distinct advantage over a [[VPS]] solution - nothing ever need leave your LAN. A crucial difference for those who are more privacy and security focused. |
||||
|
||||
![[rpi4.png]] |
@ -0,0 +1,9 @@
|
||||
A VPS (Virtual Private Server) is a VM (virtual machine) which is typically hosted in a cloud datacentre somewhere. Popular providers include [Linode](https://www.linode.com/lp/podcasts/?ifso=ssh), DigitalOcean, AWS, and so on. |
||||
|
||||
We are looking to create only a handful of services and most of these providers minimal VPS configurations will suffice for our requirements. |
||||
|
||||
For example the $5 per month offerings from both Linode and DigitalOcean will be adequate. |
||||
|
||||
## A dilemma |
||||
|
||||
Is it really self-hosting running your services on someones elses cloud computer? I say yes, because I have root to the VM but if you're a little more security or privacy focused then maybe an on-premise solution like a [[Raspberry Pi]] might suit you a little better. |
@ -0,0 +1,6 @@
|
||||
![[gitea-ui.png]] |
||||
|
||||
Gitea is a self-hosted Git service. It looks a lot like Github doesn't it? That's no bad thing but it forms the backbone of our fully self-hosted zettelkasten wiki here. |
||||
|
||||
## [[docker-compose]] snippet |
||||
|
@ -0,0 +1,7 @@
|
||||
[Traefik](https://traefik.io/) is a reverse proxy. I've written a fairly extension Traefik 101 guide previously at [perfectmediaserver.com](https://perfectmediaserver.com/remote-access/traefik101.html). |
||||
|
||||
In short, a reverse proxy is the thing that sits between your published notes and the internet. |
||||
|
||||
![[traefik-overview.png]] |
||||
|
||||
## docker-compose snippet |
@ -0,0 +1,19 @@
|
||||
Backlinking is a crucial part of why this solution work so well. mkdocs uses a plugin called `roamlinks` to take care of turning `[[backlinks]]` into real links. |
||||
|
||||
## Customising the text of a link |
||||
|
||||
Let's say the name of your note does not make sense in the context of sentence into which the backlink has been placed, what then? We can customise the text of a link like so: |
||||
|
||||
Before: [[Writing Tips]] |
||||
After: [[Writing Tips|Custom Text]] |
||||
|
||||
That would create a link to this note with the text "Custom Text" in the mkdocs rendered output and Obsidian preview pane. |
||||
|
||||
## Backlinking to sub-headers |
||||
|
||||
We can take this even further by customising the text of a link to a specific sub-heading within a back-linked page as well. Like so: |
||||
|
||||
Before: [[Writing Tips#Backlinking to sub-headers]] |
||||
After: [[Writing Tips#Backlinking to sub-headers|Custom Text]] |
||||
|
||||
This would create a link to a sub-heading within this note and display the text "Custom Text" in the mkdocs rendered output and Obsidian preview pane. |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 207 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 11 MiB |
After Width: | Height: | Size: 144 KiB |
@ -0,0 +1,6 @@
|
||||
This page contains links to the relevant docker-compose snippets for each service in one place. |
||||
|
||||
|
||||
* [[Traefik#docker-compose snippet|Traefik]] |
||||
* [[Gitea#docker-compose snippet|Gitea]] |
||||
* [[Nginx]] |
@ -0,0 +1,18 @@
|
||||
# Self-hosted Zettelkasten Wiki |
||||
|
||||
Link to blog post - link. |
||||
|
||||
## Overview |
||||
|
||||
A big claim, I know. But using [Obsidian.md](https://obsidian.md/), [mkdocs](https://www.mkdocs.org/) (with the [material theme](https://squidfunk.github.io/mkdocs-material/)), [Gitea](https://gitea.io/en-us/) and [drone.io](https://www.drone.io/) we can get pretty close to what [Notion.so](https://www.notion.so/) offers. With this stack though, you own 100% of the data *and* it's 100% self-hosted! |
||||
|
||||
This is not a turn-key solution like Notion, some assembly is required. You will need a Raspberry Pi, [VPS](https://www.linode.com/lp/podcasts/?ifso=ssh), or some other always on system to host these services. We'll be using containers to host everything as usual around here but this is a complex project with a lot of moving parts - set your expectations accordingly. |
||||
|
||||
## Build process |
||||
|
||||
![[gitea-mkdocs-obsidian-build.png]] |
||||
|
||||
## Guide steps in order |
||||
|
||||
1. Create / choose a place to [[Hosting Overview|host]] the services. |
||||
2. |
@ -0,0 +1,74 @@
|
||||
site_name: Foundation |
||||
repo_url: https://git.ktz.me/alexktz/foundation |
||||
repo_name: alexktz/foundation |
||||
edit_uri: _edit/master/docs |
||||
|
||||
theme: |
||||
name: material |
||||
language: en |
||||
#logo: images/site/logo.png |
||||
favicon: images/assets/favicon.png |
||||
icon: |
||||
repo: fontawesome/brands/github |
||||
logo: fontawesome/regular/folder-open |
||||
palette: |
||||
|
||||
palette: |
||||
- scheme: default |
||||
primary: blue grey |
||||
accent: orange |
||||
toggle: |
||||
icon: material/weather-night |
||||
name: Switch to dark mode |
||||
- scheme: slate |
||||
toggle: |
||||
icon: material/weather-sunny |
||||
name: Switch to light mode |
||||
font: |
||||
code: Jet Brains Mono |
||||
features: |
||||
- navigation.instant |
||||
- navigation.tabs |
||||
- navigation.tabs.sticky |
||||
- toc.integrate |
||||
#insiders only |
||||
# - search.suggest |
||||
# - search.highlight |
||||
# - navigation.tracking # updates address bar with anchors |
||||
|
||||
|
||||
plugins: |
||||
- git-revision-date |
||||
- search |
||||
- roamlinks |
||||
markdown_extensions: |
||||
- abbr |
||||
- admonition # enables coloured blocks mid article |
||||
- attr_list # improves image handling |
||||
- pymdownx.details # enables collapsible admonitions |
||||
- footnotes |
||||
- meta # adds support for front matter |
||||
- toc: |
||||
permalink: true |
||||
- pymdownx.highlight: # code highlighting |
||||
linenums: false |
||||
- pymdownx.tabbed # enables tabs for embedded blocks |
||||
- pymdownx.snippets |
||||
- pymdownx.superfences # allows for the nesting of code blocks inside other blocks |
||||
- pymdownx.keys |
||||
|
||||
|
||||
copyright: 2021 © Alex Kretzschmar |
||||
extra: |
||||
social: |
||||
- icon: 'fontawesome/brands/github' |
||||
link: 'https://github.com/ironicbadger' |
||||
name: IronicBadger on GitHub |
||||
- icon: 'fontawesome/brands/twitter' |
||||
link: 'https://twitter.com/ironicbadger' |
||||
name: IronicBadger on Twitter |
||||
- icon: 'fontawesome/brands/linkedin' |
||||
link: 'https://www.linkedin.com/in/alex-kretzschmar/' |
||||
- icon: 'fontawesome/solid/microphone' |
||||
link: 'https://selfhosted.show/' |
||||
name: IronicBadger's Podcast - selfhosted.show |
Loading…
Reference in new issue