Browse Source

initial commit

main
IronicBadger 7 months ago
commit
4c5eca4259
  1. BIN
      .DS_Store
  2. 22
      .drone.yml
  3. 5
      .obsidian/app.json
  4. 3
      .obsidian/appearance.json
  5. 8
      .obsidian/community-plugins.json
  6. 14
      .obsidian/core-plugins.json
  7. 1
      .obsidian/hotkeys.json
  8. 30272
      .obsidian/plugins/cm-editor-syntax-highlight-obsidian/main.js
  9. 10
      .obsidian/plugins/cm-editor-syntax-highlight-obsidian/manifest.json
  10. 177
      .obsidian/plugins/cm-editor-syntax-highlight-obsidian/styles.css
  11. 130
      .obsidian/plugins/code-block-copy/main.js
  12. 8
      .obsidian/plugins/code-block-copy/manifest.json
  13. 41
      .obsidian/plugins/code-block-copy/styles.css
  14. 6731
      .obsidian/plugins/note-refactor-obsidian/main.js
  15. 9
      .obsidian/plugins/note-refactor-obsidian/manifest.json
  16. 7
      .obsidian/plugins/note-refactor-obsidian/styles.css
  17. 336
      .obsidian/plugins/oz-image-plugin/main.js
  18. 10
      .obsidian/plugins/oz-image-plugin/manifest.json
  19. 192
      .obsidian/plugins/oz-image-plugin/styles.css
  20. 6
      .obsidian/plugins/table-editor-obsidian/data.json
  21. 23878
      .obsidian/plugins/table-editor-obsidian/main.js
  22. 11
      .obsidian/plugins/table-editor-obsidian/manifest.json
  23. 28
      .obsidian/plugins/table-editor-obsidian/styles.css
  24. 721
      .obsidian/plugins/url-into-selection/main.js
  25. 8
      .obsidian/plugins/url-into-selection/manifest.json
  26. 100
      .obsidian/workspace
  27. 20
      docs/Infrastructure/Hosting Overview.md
  28. 5
      docs/Infrastructure/Raspberry Pi.md
  29. 9
      docs/Infrastructure/VPS.md
  30. 6
      docs/Services/Gitea.md
  31. 7
      docs/Services/Traefik.md
  32. 19
      docs/Writing Tips.md
  33. BIN
      docs/assets/gitea-mkdocs-build-process.png
  34. BIN
      docs/assets/gitea-mkdocs-obsidian-build.png
  35. BIN
      docs/assets/gitea-ui.png
  36. BIN
      docs/assets/rpi4.png
  37. BIN
      docs/assets/traefik-overview.png
  38. 6
      docs/code/docker-compose.md
  39. 18
      docs/index.md
  40. 74
      mkdocs.yml
  41. 7
      requirements.txt

BIN
.DS_Store vendored

Binary file not shown.

22
.drone.yml

@ -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

5
.obsidian/app.json

@ -0,0 +1,5 @@
{
"attachmentFolderPath": "docs/assets",
"promptDelete": false,
"alwaysUpdateLinks": true
}

3
.obsidian/appearance.json

@ -0,0 +1,3 @@
{
"baseFontSize": 16
}

8
.obsidian/community-plugins.json

@ -0,0 +1,8 @@
[
"table-editor-obsidian",
"note-refactor-obsidian",
"oz-image-plugin",
"code-block-copy",
"cm-editor-syntax-highlight-obsidian",
"url-into-selection"
]

14
.obsidian/core-plugins.json

@ -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"
]

1
.obsidian/hotkeys.json

@ -0,0 +1 @@
{}

30272
.obsidian/plugins/cm-editor-syntax-highlight-obsidian/main.js

File diff suppressed because one or more lines are too long

10
.obsidian/plugins/cm-editor-syntax-highlight-obsidian/manifest.json

@ -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"
}

177
.obsidian/plugins/cm-editor-syntax-highlight-obsidian/styles.css

@ -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;
}

130
.obsidian/plugins/code-block-copy/main.js

File diff suppressed because one or more lines are too long

8
.obsidian/plugins/code-block-copy/manifest.json

@ -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"
}

41
.obsidian/plugins/code-block-copy/styles.css

@ -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;
}

6731
.obsidian/plugins/note-refactor-obsidian/main.js

File diff suppressed because one or more lines are too long

9
.obsidian/plugins/note-refactor-obsidian/manifest.json

@ -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"
}

7
.obsidian/plugins/note-refactor-obsidian/styles.css

@ -0,0 +1,7 @@
.note-refactor-filename .setting-item-info {
margin-right: 0;
}
.note-refactor-filename .setting-item-name {
padding-top: 10px;
}

336
.obsidian/plugins/oz-image-plugin/main.js

File diff suppressed because one or more lines are too long

10
.obsidian/plugins/oz-image-plugin/manifest.json

@ -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
}

192
.obsidian/plugins/oz-image-plugin/styles.css

@ -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;
}

6
.obsidian/plugins/table-editor-obsidian/data.json

@ -0,0 +1,6 @@
{
"formatType": "normal",
"showRibbonIcon": true,
"bindEnter": true,
"bindTab": true
}

23878
.obsidian/plugins/table-editor-obsidian/main.js

File diff suppressed because one or more lines are too long

11
.obsidian/plugins/table-editor-obsidian/manifest.json

@ -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"
}

28
.obsidian/plugins/table-editor-obsidian/styles.css

@ -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;
}

721
.obsidian/plugins/url-into-selection/main.js

File diff suppressed because one or more lines are too long

8
.obsidian/plugins/url-into-selection/manifest.json

@ -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"
}

100
.obsidian/workspace

@ -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"
]
}

20
docs/Infrastructure/Hosting Overview.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.

5
docs/Infrastructure/Raspberry Pi.md

@ -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]]

9
docs/Infrastructure/VPS.md

@ -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.

6
docs/Services/Gitea.md

@ -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

7
docs/Services/Traefik.md

@ -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

19
docs/Writing Tips.md

@ -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.

BIN
docs/assets/gitea-mkdocs-build-process.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
docs/assets/gitea-mkdocs-obsidian-build.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

BIN
docs/assets/gitea-ui.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
docs/assets/rpi4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 MiB

BIN
docs/assets/traefik-overview.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

6
docs/code/docker-compose.md

@ -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]]

18
docs/index.md

@ -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.

74
mkdocs.yml

@ -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

7
requirements.txt

@ -0,0 +1,7 @@
mkdocs
mkdocs-material
mkdocs-material-extensions
mkdocs-minify-plugin
mkdocs-git-revision-date-plugin
pymdown-extensions
mkdocs-roamlinks-plugin
Loading…
Cancel
Save