1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
#!/bin/bash
set -e
# OpenCode + Codex + Ollama Installation Script
# Usage: ./install.sh [user@host] [opencode_version]
# Example: ./install.sh ubuntu@38.128.233.181 v1.1.32
HOST="${1:-ubuntu@38.128.233.181}"
OPENCODE_VERSION="${2:-v1.1.32}"
CODEX_VERSION="${3:-latest}"
echo "Installing OpenCode, Codex, and Ollama on $HOST"
echo "OpenCode version: $OPENCODE_VERSION"
echo "Codex version: $CODEX_VERSION"
# Function to run remote commands
run_remote() {
ssh "$HOST" "$1"
}
# 1. Install Ollama
echo "Step 1: Installing Ollama..."
run_remote "curl -fsSL https://ollama.ai/install.sh | sh" || echo "Ollama may already be installed"
# 2. Start Ollama service
echo "Step 2: Starting Ollama service..."
run_remote "sudo systemctl start ollama && sudo systemctl status ollama" || echo "Starting Ollama..."
# 2.5. Configure Ollama to use /ephemeral for models (if available)
echo "Step 2.5: Configuring Ollama models directory..."
run_remote "if [ -d /ephemeral ]; then
sudo mkdir -p /ephemeral/ollama/models
sudo chown ollama:ollama /ephemeral/ollama /ephemeral/ollama/models
sudo mkdir -p /etc/systemd/system/ollama.service.d
sudo tee /etc/systemd/system/ollama.service.d/override.conf > /dev/null << 'EOF'
[Service]
Environment=\"OLLAMA_MODELS=/ephemeral/ollama/models\"
Environment=\"OLLAMA_GPU_OVERHEAD=2000\"
Environment=\"OLLAMA_NUM_PARALLEL=4\"
EOF
sudo systemctl daemon-reload
sudo systemctl restart ollama
sleep 3
echo 'Ollama configured to use /ephemeral'
else
echo 'No /ephemeral directory found, using default'
fi"
# 3. Kill unattended upgrade lock if it exists
echo "Step 3: Clearing package manager lock..."
run_remote "sudo pkill -f unattended-upgrade || true"
sleep 2
# 4. Install Node.js 20 (required for Codex), npm, and Python
echo "Step 4: Installing Node.js 20, npm, and Python..."
run_remote "curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt install -y nodejs python3 python3-pip"
# 5. Download and install OpenCode CLI
echo "Step 5: Installing OpenCode CLI ($OPENCODE_VERSION)..."
run_remote "cd /tmp && wget -q https://github.com/anomalyco/opencode/releases/download/$OPENCODE_VERSION/opencode-linux-x64.tar.gz && tar -xzf opencode-linux-x64.tar.gz && sudo mv opencode /usr/local/bin/ && opencode --version"
# 6. Create OpenCode config directory
echo "Step 6: Creating OpenCode config directory..."
run_remote "mkdir -p ~/.config/opencode"
# 7. Create OpenCode configuration (qwen3-coder models)
echo "Step 7: Creating OpenCode configuration..."
run_remote "cat > ~/.config/opencode/opencode.json << 'EOF'
{
\"provider\": {
\"ollama\": {
\"npm\": \"@ai-sdk/openai-compatible\",
\"name\": \"Ollama\",
\"api\": \"http://localhost:11434/v1\",
\"models\": {
\"qwen3-coder:latest\": {
\"name\": \"Qwen3 Coder Latest (Higher Quality)\"
},
\"qwen3-coder:30b-a3b-q4_K_M\": {
\"name\": \"Qwen3 Coder 30B A3B Q4_K_M (Quantized)\"
}
}
}
}
}
EOF"
# 8. Pull qwen3-coder models
echo "Step 8: Pulling qwen3-coder models (this may take a while)..."
run_remote "ollama pull qwen3-coder:latest"
run_remote "ollama pull qwen3-coder:30b-a3b-q4_K_M"
# 9. Install Codex CLI
echo "Step 9: Installing Codex CLI..."
run_remote "sudo npm install -g @openai/codex || npm install -g @openai/codex"
# 10. Create Codex config to use Ollama
echo "Step 10: Configuring Codex to use Ollama..."
run_remote "mkdir -p ~/.codex && cat > ~/.codex/config.json << 'EOF'
{
\"provider\": \"ollama\",
\"model\": \"qwen3-coder:30b-a3b-q4_K_M\",
\"endpoint\": \"http://localhost:11434/v1\"
}
EOF"
# 11. Install Aider (LLM-powered code editing)
echo "Step 11: Installing Aider..."
run_remote "pip3 install --user aider-chat && echo 'export PATH=~/.local/bin:\$PATH' >> ~/.bashrc"
# 12. Configure Aider to use Ollama
echo "Step 12: Configuring Aider for Ollama..."
run_remote "mkdir -p ~/.aider && cat > ~/.aider/.aider.conf.yml << 'EOF'
model: ollama/qwen2.5-coder:14b-instruct
openai-api-base: http://localhost:11434/v1
EOF"
# 13. Verify installation
echo "Step 13: Verifying installation..."
run_remote "opencode --version && ollama list && codex --version && ~/.local/bin/aider --version"
echo ""
echo "✓ Installation complete!"
echo ""
echo "To use OpenCode:"
echo " ssh $HOST"
echo " cd ~/your/project"
echo " opencode"
echo ""
echo "To use Codex:"
echo " ssh $HOST"
echo " codex --oss --local-provider ollama"
echo ""
echo "To use Aider (LLM-powered code editing):"
echo " ssh $HOST"
echo " cd ~/your/project"
echo " aider"
echo " aider <filename>"
echo ""
echo "Available models for all tools:"
echo " - qwen2.5-coder:14b-instruct (fast, ~9GB) - default"
echo " - qwen3-coder:30b-a3b-q4_K_M (slower, ~18GB)"
|