# Valkey на Linux/VPS: практический перенос

Этот документ описывает настройку собственного сервера. Подготовленные runtime-проверки выполнялись локально в Linux-контейнерах; внешний VPS и его firewall здесь не проверялись.

## Выбрать форму запуска

Для повторения лаборатории используйте Compose с тем же образом `valkey/valkey:9.0.7-alpine`. Для системной службы используйте поддерживаемый пакет вашей ОС. Имя службы и пути проверьте в установленном пакете: нельзя считать, что каждая версия Ubuntu предоставляет одинаковый Valkey. Избегайте смешения файлов из пакета и ручной сборки.

```bash
apt-cache policy valkey
systemctl list-unit-files 'valkey*'
systemctl cat valkey
```

Если подходящий пакет найден, установка производится штатным пакетным менеджером по инструкции дистрибутива. Если нет — используйте проверенный контейнерный вариант. Перед обновлением зафиксируйте версию, конфигурацию и способ отката.

## Сеть

В нашем Compose порт опубликован как `127.0.0.1:8540:6379`. Он предназначен для приложений того же хоста. Внутри Compose клиент использует `valkey:6379`. Браузер пользователя обращается к HTTP API приложения, а не к Valkey напрямую.

```bash
ss -ltnp | grep -E ':(6379|8540)\b'
docker compose ps
docker compose logs --tail 60 valkey
```

Для доступа другого сервера используйте приватную сеть и TLS при необходимости защиты канала. ACL не шифрует трафик. Учитывайте правила firewall и опубликованные Docker-порты; одной записи в UFW недостаточно считать экспозицию проверенной. Проверьте доступ с другой машины, которая должна быть запрещена.

## ACL приложения

Пользователь lab в этом архиве может CONFIG и INFO для управляемых экспериментов. Такую роль не выдавайте обычному PHP/Node API. Создайте отдельного пользователя с минимальными командами и префиксом. Концептуальная ACL-строка:

```text
user default off resetpass -@all
user app on #SHA256_OF_YOUR_RANDOM_PASSWORD ~myapp:prod:v1:* +ping +get +set +del +unlink +pttl +ttl
```

Подставьте SHA-256 собственного криптографически случайного пароля; placeholder не является рабочей настройкой. ACL-файл должен принадлежать служебному пользователю и не быть доступен через web-root. Для схемы с Lua нужны отдельно оценённые права EVAL и команд сценария, но простому cache-aside они не требуются. PHP/Node получают пароль через закрытый файл или менеджер секретов, не из исходников публичного сайта. Не выводите URL с паролем в логи.

## Память и данные

Для восстанавливаемого кеша можно начать с явно выделенного бюджета и allkeys-lru. Размер выбирается по нагрузке и общему RAM-бюджету хоста: рядом живут PHP, Node, БД, ОС и буферы. maxmemory не обещает, что RSS процесса никогда не превысит это число.

```text
bind 127.0.0.1
protected-mode yes
port 6379
maxmemory 256mb
maxmemory-policy allkeys-lru
save ""
appendonly no
aclfile /etc/valkey/users.acl
```

Это пример отдельного восстанавливаемого кеша. Не применяйте отключение persistence к серверу, где хранятся очереди, сессии или единственные копии данных. Такие нагрузки могут требовать отдельного экземпляра, другой политики памяти и RDB/AOF. После рестарта кеш будет холодным: основной источник должен выдержать повторное заполнение.

## Служба и эксплуатация

Если пакет использует службу valkey, после проверки конфигурации и окна обслуживания:

```bash
sudo systemctl restart valkey
sudo systemctl status valkey --no-pager
sudo journalctl -u valkey -n 80 --no-pager
```

Имя службы сверяется перед выполнением. Для Compose используйте `docker compose up -d --wait valkey` и его healthcheck. Обычное приложение не должно перезапускать Valkey ради любого cache miss. Не включайте policy/config изменения из учебного capture в cron production-сервера.

Наблюдайте hits/misses, evicted_keys, used_memory, used_memory_rss, rejected_connections, latency и число обращений к источнику. Полезна доля попаданий на уровне приложения по типу данных: общий INFO-счётчик может скрыть один постоянно промахивающийся endpoint. При ошибке кеша нужен счётчик fallback и ограничение нагрузки на базу. При ошибке базы верните честную ошибку или предусмотренный stale-ответ с явной политикой свежести.

Начните с одного cache-aside чтения и операции редактирования. Проверьте hit, истечение, инвалидацию, отказ сети и рестарт кеша на собственном тестовом окружении. Только после этого выбирайте кластеры, реплики и сложные механизмы заполнения.
