Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Установка OpenCode Server на удалённый сервер: systemd и защита

Linux и DevOps

OpenCode — открытый AI-агент для терминала с доступом к оболочке. Режим сервера открывает удалённый HTTP-доступ к агенту, превращая VPS в постоянно доступную среду для агентной разработки.

Ключевой риск развёртывания — агент выполняет произвольные команды в shell. Конфигурация ниже закрывает периметр четырьмя уровнями: аутентификация, файрвол, Fail2ban, systemd-автозапуск.

OpenCode Server открывает порт с агентом, способным выполнять любые команды с правами root. Единственный барьер между интернетом и оболочкой — пароль базовой аутентификации. Все шаги ниже обязательны.

Как установить OpenCode?

Установочный скрипт разворачивает бинарный файл и добавляет его в PATH.

curl -fsSL https://opencode.ai/install | bash

Переоткройте SSH-сессию для обновления окружения, затем проверьте установку:

which opencode
opencode --version

Настройка провайдера моделей

Авторизация в провайдере LLM выполняется интерактивно. Команда сохраняет учётные данные в локальную конфигурацию.

opencode auth login

Конфигурация сервера

Файл opencode.json задаёт параметры прослушивания. Значение hostname: 0.0.0.0 открывает сервер на всех интерфейсах — обязательное условие для удалённого доступа.

mkdir -p ~/.config/opencode
cat > ~/.config/opencode/opencode.json << 'EOF'
{
  "$schema": "https://opencode.ai/config.json",
  "server": {
    "port": 4096,
    "hostname": "0.0.0.0"
  }
}
EOF

Как сгенерировать пароль для сервера?

Пароль базовой аутентификации — единственный слой контроля доступа к агенту. Требуется криптографически стойкий случайный вариант.

openssl rand -base64 32

Учётные данные хранятся в отдельном env-файле с ограниченными правами доступа.

cat > ~/.config/opencode/opencode.env << 'EOF'
OPENCODE_SERVER_USERNAME=example
OPENCODE_SERVER_PASSWORD=ВСТАВИТЬ_ПАРОЛЬ_ИЗ_ПРЕДЫДУЩЕЙ_КОМАНДЫ
EOF
chmod 600 ~/.config/opencode/opencode.env

Предсказуемые или короткие пароли недопустимы. Порт 4096 доступен из интернета, а за ним — оболочка сервера с правами root.

Служба systemd

Автозапуск через systemd обеспечивает работу сервера после перезагрузки и рестарт при сбоях. Сначала определяется абсолютный путь к бинарному файлу.

OPENCODE_BIN=$(which opencode)
echo $OPENCODE_BIN

Юнит подставляет путь к бинарнику и каталог для переменной PATH на этапе создания файла.

cat > /etc/systemd/system/opencode.service << EOF
[Unit]
Description=OpenCode Server
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root
ExecStart=${OPENCODE_BIN} serve --port 4096 --hostname 0.0.0.0
EnvironmentFile=/root/.config/opencode/opencode.env
Restart=on-failure
RestartSec=5
Environment=PATH=$(dirname ${OPENCODE_BIN}):/usr/local/bin:/usr/bin:/bin
[Install]
WantedBy=multi-user.target
EOF

Проверьте корректность подстановки переменных:

cat /etc/systemd/system/opencode.service

Активируйте службу и проверьте статус:

systemctl daemon-reload
systemctl enable --now opencode
systemctl status opencode

Настройка файрвола UFW

UFW ограничивает доступ до двух портов: SSH и OpenCode. Остальной трафик блокируется по умолчанию.

ufw allow 22/tcp
ufw allow 4096/tcp
ufw enable
ufw status

Как защитить SSH через Fail2ban?

Fail2ban анализирует журналы аутентификации и банит IP после серии неудачных попыток входа. Конфигурация использует systemd-бэкенд для чтения логов.

apt install -y fail2ban
cat > /etc/fail2ban/jail.d/custom.conf << 'EOF'
[sshd]
enabled = true
port = 22
filter = sshd
backend = systemd
maxretry = 5
findtime = 300
bantime = 86400
EOF
systemctl enable --now fail2ban
fail2ban-client status

Параметры задают порог в 5 попыток за 300 секунд с баном на 86400 секунд (24 часа).

Проверка развёртывания

Финальная валидация подтверждает прослушивание порта и работу аутентификации. Запрос без пароля возвращает 401, с корректными данными — 200.

# Порт слушается
ss -tlnp | grep 4096

# Без пароля — 401
curl -v http://<IP>:4096/global/health

# С паролем — 200
curl -v -u example:ВАШ_ПАРОЛЬ http://<IP>:4096/global/health

Ответ 401 без учётных данных подтверждает, что аутентификация активна и анонимный доступ к серверу закрыт.

Итоговая архитектура защиты

Развёртывание закрывает периметр четырьмя независимыми механизмами.

Уровень Механизм
Аутентификация Базовая аутентификация OpenCode
Защита SSH Fail2ban — бан на 24 часа после 5 неудач
Автозапуск Systemd с рестартом при сбое

Заключение

Развёртывание OpenCode Server через systemd с многоуровневой защитой превращает VPS в production-ready среду для агентной разработки с постоянным удалённым доступом, надёжно закрывая периметр от несанкционированного доступа к оболочке — критичный момент, поскольку скомпрометированный агент означает полный контроль над сервером с правами root.

Оцените статью
ctrllife.ru
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x