"Liitä koneesi" -nappi + join.sh + Docker native-node
UI: status-palkissa vihreä "+ Liitä koneesi" -nappi joka avaa dialogin: curl -sSL https://kipina.studio/join.sh | bash join.sh: - Tarkistaa Ollaman → tarjoaa asennusta jos puuttuu - Käynnistää Ollaman jos ei pyöri - Lataa kielimallin (qwen2.5-coder:3b) - Käynnistää native-noden → yhdistää wss://kipina.studio/ws Docker: Dockerfile.native + docker-compose.prod.yml päivitetty ollama + native-node -konteilla palvelinpuolelle. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
21
network-poc/Dockerfile.native
Normal file
21
network-poc/Dockerfile.native
Normal file
@@ -0,0 +1,21 @@
|
||||
# Native-node: Rust + Ollama-client (ei GPU-tunnistusta)
|
||||
FROM rust:slim AS builder
|
||||
RUN apt-get update && apt-get install -y pkg-config libssl-dev && rm -rf /var/lib/apt/lists/*
|
||||
WORKDIR /app
|
||||
COPY Cargo.toml Cargo.lock* ./
|
||||
COPY native-node/Cargo.toml native-node/Cargo.toml
|
||||
COPY native-node/src native-node/src
|
||||
# Dummy-cratet workspace-yhteensopivuuteen
|
||||
COPY hub/Cargo.toml hub/Cargo.toml
|
||||
COPY node/Cargo.toml node/Cargo.toml
|
||||
COPY cli/Cargo.toml cli/Cargo.toml
|
||||
RUN mkdir -p hub/src node/src cli/src && touch hub/src/main.rs node/src/lib.rs cli/src/main.rs
|
||||
RUN --mount=type=cache,target=/usr/local/cargo/registry \
|
||||
--mount=type=cache,target=/app/target \
|
||||
cargo build --release -p native-node --no-default-features \
|
||||
&& cp /app/target/release/native-node /usr/local/bin/native-node
|
||||
|
||||
FROM debian:bookworm-slim
|
||||
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
|
||||
COPY --from=builder /usr/local/bin/native-node /usr/local/bin/native-node
|
||||
CMD ["native-node"]
|
||||
@@ -24,10 +24,40 @@ services:
|
||||
- NODE_API_KEY=${NODE_API_KEY:-}
|
||||
volumes:
|
||||
- hub_data:/data
|
||||
# Frontend-tiedostot päivitetään ilman kontin rebuildia
|
||||
- ./frontend/dist:/app/frontend/dist:ro
|
||||
|
||||
ollama:
|
||||
image: ollama/ollama:latest
|
||||
container_name: kipina-ollama
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ollama_data:/root/.ollama
|
||||
# GPU-tuki (kommentoi pois jos ei GPU:ta):
|
||||
# deploy:
|
||||
# resources:
|
||||
# reservations:
|
||||
# devices:
|
||||
# - driver: nvidia
|
||||
# count: all
|
||||
# capabilities: [gpu]
|
||||
|
||||
native-node:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.native
|
||||
container_name: kipina-native-node
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- HUB_URL=ws://hub:3000/ws
|
||||
- OLLAMA_URL=http://ollama:11434
|
||||
- OLLAMA_MODEL=qwen2.5-coder:3b
|
||||
- NODE_API_KEY=${NODE_API_KEY:-}
|
||||
depends_on:
|
||||
- hub
|
||||
- ollama
|
||||
|
||||
volumes:
|
||||
caddy_data:
|
||||
caddy_config:
|
||||
hub_data:
|
||||
ollama_data:
|
||||
|
||||
73
network-poc/frontend/public/join.sh
Normal file
73
network-poc/frontend/public/join.sh
Normal file
@@ -0,0 +1,73 @@
|
||||
#!/bin/bash
|
||||
# Kipinä — liitä koneesi laskentaverkkoon
|
||||
set -e
|
||||
|
||||
HUB_URL="${KIPINA_HUB:-wss://kipina.studio/ws}"
|
||||
MODEL="${KIPINA_MODEL:-qwen2.5-coder:3b}"
|
||||
|
||||
echo ""
|
||||
echo " ╔══════════════════════════════════════╗"
|
||||
echo " ║ Kipinä Agentic Network — Node Join ║"
|
||||
echo " ╚══════════════════════════════════════╝"
|
||||
echo ""
|
||||
|
||||
# 1. Ollama
|
||||
if command -v ollama &>/dev/null; then
|
||||
echo " ✓ Ollama löytyi: $(ollama --version 2>/dev/null || echo 'asennettu')"
|
||||
else
|
||||
echo " Ollama ei ole asennettu."
|
||||
echo ""
|
||||
read -p " Asennetaanko Ollama? (k/e) " -n 1 -r; echo
|
||||
if [[ $REPLY =~ ^[Kk]$ ]]; then
|
||||
echo " Asennetaan Ollama..."
|
||||
curl -fsSL https://ollama.ai/install.sh | sh
|
||||
else
|
||||
echo " Ollama vaaditaan laskentaan. Asenna: https://ollama.ai"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 2. Varmistetaan että Ollama on käynnissä
|
||||
if ! curl -s http://localhost:11434/api/tags &>/dev/null; then
|
||||
echo " Käynnistetään Ollama..."
|
||||
ollama serve &>/dev/null &
|
||||
sleep 3
|
||||
if ! curl -s http://localhost:11434/api/tags &>/dev/null; then
|
||||
echo " ✗ Ollama ei käynnistynyt. Aja: ollama serve"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
echo " ✓ Ollama käynnissä"
|
||||
|
||||
# 3. Malli
|
||||
if ollama list 2>/dev/null | grep -q "$MODEL"; then
|
||||
echo " ✓ Malli $MODEL ladattu"
|
||||
else
|
||||
echo " Ladataan malli $MODEL..."
|
||||
ollama pull "$MODEL"
|
||||
fi
|
||||
|
||||
# 4. Native-node
|
||||
echo ""
|
||||
echo " Yhdistetään hubiin: $HUB_URL"
|
||||
echo " Malli: $MODEL"
|
||||
echo " Ctrl+C pysäyttää"
|
||||
echo ""
|
||||
|
||||
# Tarkistetaan onko native-node käännetty
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
NATIVE_BIN="$SCRIPT_DIR/target/release/native-node"
|
||||
|
||||
if [ -f "$NATIVE_BIN" ]; then
|
||||
HUB_URL="$HUB_URL" OLLAMA_MODEL="$MODEL" "$NATIVE_BIN"
|
||||
elif command -v cargo &>/dev/null && [ -f "$SCRIPT_DIR/native-node/Cargo.toml" ]; then
|
||||
echo " Käännetään native-node..."
|
||||
cd "$SCRIPT_DIR"
|
||||
cargo build --release -p native-node --no-default-features 2>&1 | tail -1
|
||||
HUB_URL="$HUB_URL" OLLAMA_MODEL="$MODEL" "$NATIVE_BIN"
|
||||
else
|
||||
echo " ✗ native-node binääriä ei löydy eikä Rust ole asennettu."
|
||||
echo " Asenna Rust: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh"
|
||||
echo " Tai lataa valmis binääri: https://kipina.studio/download"
|
||||
exit 1
|
||||
fi
|
||||
@@ -10,6 +10,24 @@
|
||||
<span id="compute-dot" class="status-dot" style="background:#30363d"></span>
|
||||
<span style="color:#8b949e">Laskenta:</span>
|
||||
<span id="compute-label" style="color:#8b949e">—</span>
|
||||
<button id="compute-btn" class="btn btn-accent" title="Käynnistä kielimalli">Alusta</button>
|
||||
<button id="compute-btn" class="btn btn-accent" title="Käynnistä kielimalli selaimessa">Alusta</button>
|
||||
</span>
|
||||
<span class="status-separator">│</span>
|
||||
<span class="status-group">
|
||||
<button id="join-btn" class="btn btn-green" onclick="showJoinDialog()" title="Liitä oma koneesi laskentaverkkoon (natiivi, nopea)">+ Liitä koneesi</button>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Join-dialogi -->
|
||||
<div id="join-dialog" style="display:none;margin-top:8px;padding:14px;background:var(--panel);border:1px solid var(--border);border-radius:6px;font-size:14px">
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:10px">
|
||||
<span style="color:#e6edf3;font-weight:600">Liitä koneesi laskentaverkkoon</span>
|
||||
<button onclick="document.getElementById('join-dialog').style.display='none'" style="background:none;border:none;color:#8b949e;cursor:pointer;font-size:16px">✕</button>
|
||||
</div>
|
||||
<p style="color:#8b949e;margin-bottom:12px">Aja tämä komento terminaalissa — koneesi alkaa laskea tehtäviä verkossa.</p>
|
||||
<div style="display:flex;gap:6px;align-items:center">
|
||||
<code id="join-cmd" style="flex:1;background:var(--bg);padding:10px 14px;border-radius:4px;font-size:14px;color:var(--green);font-family:'Courier New',monospace;user-select:all;cursor:text">curl -sSL https://kipina.studio/join.sh | bash</code>
|
||||
<button onclick="navigator.clipboard.writeText(document.getElementById('join-cmd').textContent);this.textContent='✓';setTimeout(()=>this.textContent='Kopioi',1500)" class="btn btn-accent" style="padding:8px 12px;white-space:nowrap">Kopioi</button>
|
||||
</div>
|
||||
<p style="color:#8b949e;font-size:12px;margin-top:8px">Vaatii: macOS/Linux. Asentaa Ollaman ja kielimallin (~2GB) jos puuttuu.</p>
|
||||
</div>
|
||||
|
||||
@@ -53,6 +53,11 @@ import Settings from "../components/Settings.astro";
|
||||
|
||||
<script is:inline>
|
||||
// === Helpers ===
|
||||
window.showJoinDialog = function() {
|
||||
const d = document.getElementById('join-dialog');
|
||||
d.style.display = d.style.display === 'none' ? 'block' : 'none';
|
||||
};
|
||||
|
||||
function esc(str) {
|
||||
if (!str) return '';
|
||||
return String(str).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
|
||||
|
||||
Reference in New Issue
Block a user