在Ubuntu 24.04上手动部署Ollama虽然可行,但每次在新机器上重复安装配置会浪费大量时间。想象一下,如果你需要为团队里的10台开发机都部署Ollama,手动操作不仅效率低下,还容易出错。这就是为什么我们需要自动化部署方案。
我最近在一个AI项目里就遇到了这个问题。团队需要为每个开发者配置相同的Ollama环境,手动操作花了整整一天时间。后来改用自动化脚本后,同样的工作只需要15分钟。自动化部署不仅能保证环境一致性,还能把部署过程文档化,方便后续维护。
自动化部署的核心价值在于:
在开始部署Ollama前,我们需要确保系统处于最新状态。Ubuntu 24.04虽然是最新LTS版本,但刚安装后仍然需要更新:
bash复制sudo apt update && sudo apt upgrade -y
接下来安装必要的依赖项。Ollama运行需要一些基础库支持:
bash复制sudo apt install -y curl tar python3-pip git build-essential
我建议创建一个专门的部署用户,而不是直接使用root账户。这样可以提高安全性:
bash复制sudo useradd -m -s /bin/bash ollama_deploy
sudo usermod -aG sudo ollama_deploy
如果你计划从远程仓库拉取部署脚本,配置SSH密钥会很方便:
bash复制ssh-keygen -t ed25519 -C "ollama_deploy@ubuntu"
cat ~/.ssh/id_ed25519.pub
把公钥内容添加到你的Git托管平台(如GitHub、GitLab等)。这样后续拉取私有仓库时就不需要反复输入密码了。
我整理了一个完整的安装脚本,包含了下载、解压、服务配置等所有步骤:
bash复制#!/bin/bash
# 定义变量
OLLAMA_VERSION="latest"
INSTALL_DIR="/usr/local/bin"
CONFIG_DIR="/etc/ollama"
SERVICE_FILE="/etc/systemd/system/ollama.service"
# 下载Ollama
echo "正在下载Ollama..."
curl -L "https://ollama.com/download/ollama-linux-amd64.tgz" -o /tmp/ollama.tgz
# 解压安装
echo "正在安装到${INSTALL_DIR}..."
sudo tar -C ${INSTALL_DIR} -xzf /tmp/ollama.tgz
# 创建配置目录
sudo mkdir -p ${CONFIG_DIR}
sudo chown -R ollama_deploy:ollama_deploy ${CONFIG_DIR}
# 创建systemd服务
echo "正在配置系统服务..."
cat <<EOF | sudo tee ${SERVICE_FILE} > /dev/null
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=${INSTALL_DIR}/ollama serve
User=ollama_deploy
Group=ollama_deploy
Restart=always
RestartSec=3
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_MODELS=${CONFIG_DIR}/models"
[Install]
WantedBy=multi-user.target
EOF
# 启用服务
sudo systemctl daemon-reload
sudo systemctl enable ollama
sudo systemctl start ollama
echo "Ollama安装完成!服务已启动。"
把这个脚本保存为install_ollama.sh,然后赋予执行权限:
bash复制chmod +x install_ollama.sh
./install_ollama.sh
如果你需要管理多台机器,Ansible是更好的选择。下面是一个简单的playbook示例:
yaml复制---
- name: 部署Ollama到多台主机
hosts: all
become: yes
tasks:
- name: 安装依赖
apt:
name: ["curl", "tar"]
state: present
- name: 下载Ollama
get_url:
url: "https://ollama.com/download/ollama-linux-amd64.tgz"
dest: "/tmp/ollama.tgz"
- name: 解压安装
unarchive:
src: "/tmp/ollama.tgz"
dest: "/usr/local/bin"
remote_src: yes
- name: 创建系统服务
template:
src: "ollama.service.j2"
dest: "/etc/systemd/system/ollama.service"
- name: 启动服务
systemd:
name: ollama
enabled: yes
state: started
对应的服务模板文件ollama.service.j2内容与之前shell脚本中的服务配置相同。使用这个playbook,你可以同时在多台机器上部署Ollama。
手动一个个拉取模型效率太低。我们可以创建一个模型列表文件,然后批量拉取:
bash复制# models.txt
llama2
mistral
gemma
bge-m3
然后使用这个脚本批量拉取:
bash复制#!/bin/bash
while read -r model; do
echo "正在拉取模型: $model"
ollama pull $model || echo "拉取 $model 失败"
done < models.txt
我在实际使用中发现,有时网络问题会导致拉取失败。可以添加重试逻辑:
bash复制#!/bin/bash
max_retries=3
while read -r model; do
retry_count=0
until ollama pull $model; do
retry_count=$((retry_count+1))
if [ $retry_count -ge $max_retries ]; then
echo "拉取 $model 失败,已达最大重试次数"
break
fi
echo "重试拉取 $model (第 $retry_count 次)..."
sleep 5
done
done < models.txt
Ollama支持指定模型版本,这对于生产环境很重要。你可以这样拉取特定版本:
bash复制ollama pull llama2:13b-chat
要查看本地模型的版本信息:
bash复制ollama show llama2 --modelfile
我建议为生产环境固定模型版本,避免自动更新带来的意外变化。可以创建一个版本锁定文件:
bash复制# model_versions.lock
llama2=13b-chat
mistral=7b-instruct-v0.1
然后使用脚本根据锁定文件拉取模型:
bash复制#!/bin/bash
while IFS='=' read -r model version; do
ollama pull "${model}:${version}"
done < model_versions.lock
默认配置可能不适合生产环境。你可以调整服务配置提高性能:
systemd复制[Service]
...
Environment="OLLAMA_NUM_PARALLEL=4" # 根据CPU核心数调整
Environment="OLLAMA_MAX_LOADED_MODELS=2" # 限制内存使用
LimitNOFILE=65535 # 提高文件描述符限制
对于GPU加速,确保安装了正确的驱动和CUDA工具包。然后设置:
systemd复制Environment="OLLAMA_GPU_LAYERS=20" # 根据GPU显存调整
生产环境必须考虑安全性。建议做以下配置:
systemd复制Environment="OLLAMA_HOST=0.0.0.0:8345" # 使用非标准端口
bash复制openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
然后在服务配置中添加:
systemd复制Environment="OLLAMA_TLS_CERT=/path/to/cert.pem"
Environment="OLLAMA_TLS_KEY=/path/to/key.pem"
bash复制sudo ufw allow 8345/tcp
sudo ufw enable
良好的监控是生产环境必备的。你可以配置日志轮转:
bash复制sudo tee /etc/logrotate.d/ollama <<EOF
/var/log/ollama.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
systemctl restart ollama >/dev/null 2>&1 || true
endscript
}
EOF
对于系统资源监控,可以使用Prometheus和Grafana。Ollama提供了Prometheus格式的metrics端点:
bash复制curl http://localhost:11434/api/status
如果Ollama服务无法启动,首先检查日志:
bash复制journalctl -u ollama -f
常见问题包括:
当模型无法加载时,尝试:
bash复制rm -rf ~/.ollama/models
如果响应速度慢,可以:
bash复制top
nvidia-smi # 如果有GPU
我在实际项目中遇到过内存泄漏问题,通过定期重启服务解决了:
bash复制# 在crontab中添加
0 */6 * * * systemctl restart ollama