Перейти к содержимому

Развёртывание на Ubuntu/Linux

Руководство по установке и настройке MCP серверов на Ubuntu и других Linux дистрибутивах

Linux — рекомендуемая платформа для production развёртывания MCP серверов благодаря стабильности, безопасности и удобству автоматизации.

Terminal
sudo apt update && sudo apt upgrade -y
Terminal
# Базовые инструменты
sudo apt install -y curl git build-essential
# Node.js (через NodeSource)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# Python 3.12
sudo add-apt-repository -y ppa:deadsnakes/ppa
sudo apt install -y python3.12 python3.12-venv python3-pip
# uv (менеджер пакетов Python)
curl -LsSf https://astral.sh/uv/install.sh | sh
Terminal
# Одноразовый запуск
uvx mcp-server-fetch
# Или установка для постоянного использования
uv pip install mcp-server-fetch
Terminal
# Глобальная установка
npm install -g @modelcontextprotocol/server-filesystem
# Или через npx
npx -y @modelcontextprotocol/server-filesystem
Terminal
# Клонирование
git clone https://github.com/user/mcp-server.git
cd mcp-server
# Python
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Node.js
npm install
npm run build
Terminal
sudo nano /etc/systemd/system/mcp-server.service
/etc/systemd/system/mcp-server.service
[Unit]
Description=MCP Server
After=network.target
[Service]
Type=simple
User=mcp
Group=mcp
WorkingDirectory=/opt/mcp-server
Environment=PATH=/opt/mcp-server/.venv/bin:/usr/local/bin:/usr/bin
ExecStart=/opt/mcp-server/.venv/bin/python -m src.server
Restart=always
RestartSec=5
# Безопасность
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/opt/mcp-server/data
PrivateTmp=yes
[Install]
WantedBy=multi-user.target
Terminal
# Перезагрузка systemd
sudo systemctl daemon-reload
# Запуск
sudo systemctl start mcp-server
# Автозапуск при загрузке
sudo systemctl enable mcp-server
# Статус
sudo systemctl status mcp-server
# Логи
journalctl -u mcp-server -f
Terminal
# Создание системного пользователя
sudo useradd --system --home-dir /opt/mcp-server --shell /bin/false mcp
# Права на директорию
sudo mkdir -p /opt/mcp-server
sudo chown -R mcp:mcp /opt/mcp-server

Файл конфигурации:

~/.config/claude/claude_desktop_config.json
claude_desktop_config.json
{
"mcpServers": {
"my-server": {
"command": "/opt/mcp-server/.venv/bin/python",
"args": ["-m", "src.server"],
"cwd": "/opt/mcp-server",
"env": {
"DATABASE_URL": "postgresql://localhost/mydb"
}
}
}
}
claude_desktop_config.json
{
"mcpServers": {
"node-server": {
"command": "node",
"args": ["/opt/mcp-server/dist/index.js"]
}
}
}
claude_desktop_config.json
{
"mcpServers": {
"uvx-server": {
"command": "uvx",
"args": ["mcp-server-fetch"]
}
}
}
Terminal
# Для HTTP/SSE транспорта
sudo ufw allow 3000/tcp comment 'MCP Server'
# Проверка
sudo ufw status

Для HTTP/SSE транспорта:

/etc/nginx/sites-available/mcp-server
server {
listen 443 ssl http2;
server_name mcp.example.com;
ssl_certificate /etc/letsencrypt/live/mcp.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mcp.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# SSE настройки
proxy_buffering off;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
# Health check
location /health {
proxy_pass http://127.0.0.1:3000/health;
}
}
Terminal
# Активация
sudo ln -s /etc/nginx/sites-available/mcp-server /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Terminal
# Установка node_exporter
sudo apt install prometheus-node-exporter
Terminal
# Настройка rsyslog
sudo nano /etc/rsyslog.d/mcp-server.conf
if $programname == 'mcp-server' then /var/log/mcp-server.log
& stop
Terminal
sudo nano /etc/logrotate.d/mcp-server
/var/log/mcp-server.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 mcp mcp
postrotate
systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}
playbook.yml
---
- hosts: mcp_servers
become: yes
tasks:
- name: Create mcp user
user:
name: mcp
system: yes
home: /opt/mcp-server
shell: /bin/false
- name: Clone repository
git:
repo: https://github.com/user/mcp-server.git
dest: /opt/mcp-server
version: main
- name: Install Python dependencies
pip:
requirements: /opt/mcp-server/requirements.txt
virtualenv: /opt/mcp-server/.venv
virtualenv_python: python3.12
- name: Copy systemd service
template:
src: mcp-server.service.j2
dest: /etc/systemd/system/mcp-server.service
notify: restart mcp-server
- name: Enable and start service
systemd:
name: mcp-server
enabled: yes
state: started
handlers:
- name: restart mcp-server
systemd:
name: mcp-server
state: restarted
daemon_reload: yes

Применяйте несколько уровней защиты:

  1. Пользователь: Отдельный системный пользователь без shell
  2. Файловая система: Минимальные права, read-only где возможно
  3. Сеть: Firewall, только необходимые порты
  4. Процесс: systemd ограничения, AppArmor/SELinux
  5. Мониторинг: Fail2ban, логирование, алерты
mcp-server.service
# Расширенные ограничения systemd
[Service]
# Изоляция сети
PrivateNetwork=no
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
# Изоляция файловой системы
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
# Ограничение capabilities
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=
# Memory и процессы
MemoryDenyWriteExecute=yes
LockPersonality=yes
RestrictRealtime=yes
RestrictSUIDSGID=yes
Terminal
sudo nano /etc/apparmor.d/opt.mcp-server
#include <tunables/global>
/opt/mcp-server/.venv/bin/python {
#include <abstractions/base>
#include <abstractions/python>
/opt/mcp-server/** r,
/opt/mcp-server/data/** rw,
/tmp/** rw,
deny /etc/passwd r,
deny /etc/shadow r,
}
Terminal
sudo nano /etc/fail2ban/jail.d/mcp-server.conf
/etc/fail2ban/jail.d/mcp-server.conf
[mcp-server]
enabled = true
port = 3000
filter = mcp-server
logpath = /var/log/mcp-server.log
maxretry = 5
bantime = 3600