diff --git a/Dockerfile.code-server b/Dockerfile.code-server
index 937a394..6e7a673 100644
--- a/Dockerfile.code-server
+++ b/Dockerfile.code-server
@@ -9,6 +9,9 @@ RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
# Install Claude Code globally as root
RUN npm install -g @anthropic-ai/claude-code
+# Install Ollama
+RUN curl -fsSL https://ollama.com/install.sh | sh
+
# Install Python and dependencies
RUN apt-get update && apt-get install -y \
python3 \
diff --git a/mkdocs/docs/adv/vscode-ssh.md b/mkdocs/docs/adv/vscode-ssh.md
index 5bc962a..3a78e2d 100644
--- a/mkdocs/docs/adv/vscode-ssh.md
+++ b/mkdocs/docs/adv/vscode-ssh.md
@@ -2,7 +2,7 @@
## Overview
-This guide shows you how to set up Visual Studio Code for remote development on your servers using the Tailscale network. This allows you to develop directly on your remote ThinkCentre units as if they were local machines, with full access to files, terminals, and debugging capabilities.
+This guide describes how to set up Visual Studio Code for remote development on servers using the Tailscale network. This enables development directly on remote machines as if they were local, with full access to files, terminals, and debugging capabilities.
## What You'll Learn
@@ -14,21 +14,21 @@ This guide shows you how to set up Visual Studio Code for remote development on
## Prerequisites
-- **Completed the Ansible + Tailscale setup** from the previous guide
-- **VSCode installed** on your local machine (master node)
+- **Ansible + Tailscale setup completed** (see previous guide)
+- **VSCode installed** on the local machine (master node)
- **Working SSH access** to remote servers via Tailscale
- **Tailscale running** on both local and remote machines
## Verify Prerequisites
-Before starting, ensure your setup is working:
+Before starting, verify the setup:
```bash
# Check Tailscale connectivity
tailscale status
# Test SSH access
-ssh bunker-admin@100.125.148.60
+ssh Local Intelligence
+
+
+
Problem: "Host key verification failed"
Solutions:
# Remove old host key
-ssh-keygen -R 100.125.148.60
+ssh-keygen -R <tailscale-ip>
# Or disable host key checking (less secure)
# Add to SSH config:
@@ -2805,7 +2795,7 @@ VSCode automatically detects and forwards common development ports.
VSCode-Specific Issues¶
Problem: Extensions not working on remote
Solutions:
-1. Install extensions specifically for remote server
+1. Install extensions specifically for the remote server
2. Check extension compatibility with remote development
3. Reload VSCode window: Ctrl+Shift+P → "Developer: Reload Window"
Problem: Slow performance
@@ -2840,7 +2830,7 @@ Add to SSH config:
- Use .vscodeignore to exclude unnecessary files
- Compress large files before transfer
- Use rsync for large file operations:
-rsync -avz --progress localdir/ bunker-admin@100.125.148.60:remotedir/
+
Part 9: Best Practices¶
Security Best Practices¶
@@ -2890,11 +2880,11 @@ Add to SSH config:
Environment separation:
@@ -2904,7 +2894,7 @@ Add to SSH config:
git push origin main
# Or manual backup
-scp -r bunker-admin@100.125.148.60:/important/project ./backup/
+scp -r <username>@<tailscale-ip>:/important/project ./backup/
@@ -2913,15 +2903,15 @@ Add to SSH config:
SSH Config for Team:
# Shared development server
Host team-dev
- HostName 100.x.x.x
- User dev-user
+ HostName <tailscale-ip>
+ User <team-user>
IdentityFile ~/.ssh/team_dev_key
ForwardAgent yes
# Personal development
Host my-dev
- HostName 100.125.148.60
- User bunker-admin
+ HostName <tailscale-ip>
+ User <username>
IdentityFile ~/.ssh/id_rsa
Project Structure¶
@@ -2940,7 +2930,7 @@ Add to SSH config:
sudo chmod -R g+w /opt/projects
# Add users to developers group
-sudo usermod -a -G developers bunker-admin
+sudo usermod -a -G developers <username>
# Test connectivity
-ssh -T tc-node1
+ssh -T node1
# Connect with verbose output
-ssh -v bunker-admin@100.125.148.60
+ssh -v <username>@<tailscale-ip>
# Check SSH config
-ssh -F ~/.ssh/config tc-node1
+ssh -F ~/.ssh/config node1
# Manual port forwarding
-ssh -L 3000:localhost:3000 bunker-admin@100.125.148.60
+ssh -L 3000:localhost:3000 <username>@<tailscale-ip>
# Background tunnel
-ssh -f -N -L 8080:localhost:80 bunker-admin@100.125.148.60
+ssh -f -N -L 8080:localhost:80 <username>@<tailscale-ip>
This remote development setup provides:
@@ -2986,7 +2976,7 @@ Add to SSH config:The combination of VSCode Remote Development with Tailscale networking creates a powerful, flexible development environment that works from anywhere while maintaining security and performance.
-Whether you're developing Python applications, Node.js services, or managing Docker containers, this setup provides a professional remote development experience that rivals local development while leveraging the power and resources of your remote servers.
+Whether developing Python applications, Node.js services, or managing Docker containers, this setup provides a professional remote development experience that rivals local development while leveraging the power and resources of remote servers.
@@ -3109,7 +3099,7 @@ Add to SSH config: - + diff --git a/mkdocs/site/assets/images/social/config/coder.png b/mkdocs/site/assets/images/social/config/coder.png index 31c3c68..8c9d2bc 100644 Binary files a/mkdocs/site/assets/images/social/config/coder.png and b/mkdocs/site/assets/images/social/config/coder.png differ diff --git a/mkdocs/site/assets/images/social/config/mkdocs.png b/mkdocs/site/assets/images/social/config/mkdocs.png index 4345aff..8f102c1 100644 Binary files a/mkdocs/site/assets/images/social/config/mkdocs.png and b/mkdocs/site/assets/images/social/config/mkdocs.png differ diff --git a/mkdocs/site/assets/images/social/services/mkdocs.png b/mkdocs/site/assets/images/social/services/mkdocs.png index 0596860..c3f439f 100644 Binary files a/mkdocs/site/assets/images/social/services/mkdocs.png and b/mkdocs/site/assets/images/social/services/mkdocs.png differ diff --git a/mkdocs/site/assets/javascripts/bundle.13a4f30d.min.js b/mkdocs/site/assets/javascripts/bundle.13a4f30d.min.js deleted file mode 100644 index c31fa1a..0000000 --- a/mkdocs/site/assets/javascripts/bundle.13a4f30d.min.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict";(()=>{var Wi=Object.create;var gr=Object.defineProperty;var Vi=Object.getOwnPropertyDescriptor;var Di=Object.getOwnPropertyNames,Vt=Object.getOwnPropertySymbols,zi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,ao=Object.prototype.propertyIsEnumerable;var io=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&io(e,r,t[r]);if(Vt)for(var r of Vt(t))ao.call(t,r)&&io(e,r,t[r]);return e};var so=(e,t)=>{var r={};for(var o in e)yr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Vt)for(var o of Vt(e))t.indexOf(o)<0&&ao.call(e,o)&&(r[o]=e[o]);return r};var xr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ni=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Di(t))!yr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Vi(t,n))||o.enumerable});return e};var Lt=(e,t,r)=>(r=e!=null?Wi(zi(e)):{},Ni(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var co=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var lo=xr((Er,po)=>{(function(e,t){typeof Er=="object"&&typeof po!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function p(k){var ft=k.type,qe=k.tagName;return!!(qe==="INPUT"&&a[ft]&&!k.readOnly||qe==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function c(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(k){o=!1}function d(k){s(k.target)&&(o||p(k.target))&&c(k.target)}function y(k){s(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function L(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ee(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,ee())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",L,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",y,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var qr=xr((dy,On)=>{"use strict";/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * Copyright(c) 2015 Andreas Lubbe - * Copyright(c) 2015 Tiancheng "Timothy" Gu - * MIT Licensed - */var $a=/["'&<>]/;On.exports=Pa;function Pa(e){var t=""+e,r=$a.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i