From 1027f5ccb22f8330e2f49fc85bbce44f57b55b84 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Thu, 8 Jan 2026 01:51:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=20=D0=BD=D0=B0=20?= =?UTF-8?q?Samba.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/snippet/Файловый сервер на Samba.md | 153 ++++++++++++++++++++++++ 1 file changed, 153 insertions(+) diff --git a/dev/snippet/Файловый сервер на Samba.md b/dev/snippet/Файловый сервер на Samba.md index 9670985e..e17d8e63 100644 --- a/dev/snippet/Файловый сервер на Samba.md +++ b/dev/snippet/Файловый сервер на Samba.md @@ -126,6 +126,9 @@ services: | `GROUPID` | GID для группы smb | | `INCLUDE` | Путь к дополнительному конфиг-файлу | | `TZ` | Часовой пояс (например, `Europe/Moscow`) | +| `RECYCLE_AGE` | Автоочистка файлов старше N дней из корзины | +| `RECYCLE_CRON_HOUR` | Час запуска очистки (0-23, по умолчанию: 3) | +| `RECYCLE_CRON_MINUTE` | Минута запуска очистки (0-59, по умолчанию: 0) | ### Пример с переменными окружения ```yaml @@ -183,6 +186,156 @@ docker run -d -p 445:445 docker.struchkov.dev/samba:latest -E -p \ **Примечание**: некоторые старые клиенты могут не поддерживать эти функции. +## Корзина (Recycle Bin) +По умолчанию в образе включена корзина. При удалении файлы перемещаются в папку `.deleted` в корне каждой шары вместо окончательного удаления. + +### Как работает +```ini +vfs objects = catia recycle +recycle:keeptree = yes # Сохранять структуру папок +recycle:maxsize = 0 # Без лимита размера (0 = любой файл) +recycle:repository = .deleted # Папка для удалённых файлов +recycle:versions = yes # Сохранять версии при повторном удалении +``` + +1. При удалении файл перемещается в `.deleted` в корне шары +2. Структура директорий сохраняется: `/share/docs/file.txt` → `/share/.deleted/docs/file.txt` +3. При повторном удалении файла с тем же именем создаются версии: `file.txt`, `Copy #1 of file.txt` и т.д. + +### Автоматическая очистка +**Важно**: без очистки удалённые файлы накапливаются бесконечно и занимают место на диске. + +Включите автоматическую очистку через переменную `RECYCLE_AGE`: +```yaml +services: + samba: + image: docker.struchkov.dev/samba:latest + environment: + RECYCLE_AGE: "30" # Удалять файлы старше 30 дней + RECYCLE_CRON_HOUR: "4" # Запуск в 4:00 (опционально, по умолчанию: 3) + RECYCLE_CRON_MINUTE: "30" # Запуск в XX:30 (опционально, по умолчанию: 0) + # ... остальная конфигурация +``` + +Задача очистки: +- Запускается ежедневно в указанное время (по умолчанию 3:00) +- Активируется только если корзина включена (нет флага `-r`) +- Логи пишутся в `/var/log/recycle-cleanup.log` + +### Отключение корзины +Используйте флаг `-r` или `RECYCLE=true` для полного отключения корзины: +```bash +docker run -d docker.struchkov.dev/samba:latest -r -p -s "share;/data" +``` + +Рекомендуется отключать для: +- Хранения больших медиа-файлов (видео, музыка) +- Ограниченного места на диске +- Временных или кэш-директорий + +## Полезные глобальные опции +Через флаг `-g` можно настроить дополнительные параметры smb.conf: + +| Опция | Описание | +|-------|----------| +| `workgroup = WORKGROUP` | Рабочая группа Windows | +| `server string = Samba Server` | Описание сервера в сети | +| `netbios name = SAMBA` | Имя сервера в сети NetBIOS | +| `map to guest = Bad User` | Автоматически подключать как гостя при неверном логине | +| `guest account = nobody` | Системный пользователь для гостевых подключений | +| `local master = yes` | Участвовать в выборах мастер-браузера | +| `preferred master = yes` | Предпочтительный мастер-браузер | +| `os level = 20` | Приоритет в выборах мастер-браузера (выше = приоритетнее) | +| `wins support = yes` | Включить WINS-сервер для разрешения имен | +| `name resolve order = bcast host` | Порядок разрешения имен | + +## Гостевые шары с принудительным пользователем +Для публичных папок без авторизации используйте комбинацию параметров шары и опций `-G`: +```bash +-s "public;/cloud/share;yes;no;yes" \ +-G "public;force user = nobody" \ +-G "public;force group = nobody" \ +-G "public;guest only = yes" +``` + +Это гарантирует, что все операции выполняются от имени `nobody`, независимо от того, кто подключился. + +## Комплексный пример +Сервер с гостевыми и приватными шарами, обнаружением в сети и ограничением ресурсов: +```yaml +services: + samba: + image: docker.struchkov.dev/samba:latest + restart: always + container_name: samba + hostname: samba + network_mode: host + volumes: + - ./storage/samba/:/cloud:z + command: > + -r -n -p + -g "workgroup = WORKGROUP" + -g "server string = Samba Server" + -g "netbios name = SAMBA" + -g "map to guest = Bad User" + -g "guest account = nobody" + -g "local master = yes" + -g "preferred master = yes" + -g "os level = 20" + -g "wins support = yes" + -g "name resolve order = bcast host" + -u "user1;${SMB_USER1}" + -u "user2;${SMB_USER2}" + -s "shared;/cloud/share;yes;no;yes" + -G "shared;force user = nobody" + -G "shared;force group = nobody" + -G "shared;guest only = yes" + -s "media;/cloud/media;yes;no;yes" + -G "media;force user = nobody" + -G "media;force group = nobody" + -G "media;guest only = yes" + -s "user1;/cloud/user1;yes;no;no;user1" + -s "user2;/cloud/user2;yes;no;no;user1,user2" + healthcheck: + test: ["CMD-SHELL", "smbclient -L localhost -N || exit 1"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + mem_limit: 256m + mem_reservation: 64m + cpus: 0.5 +``` + +**Особенности конфигурации:** +- `network_mode: host` — необходим для корректной работы NetBIOS и обнаружения в локальной сети +- `-r` — отключена корзина (для экономии места) +- Гостевые шары (`shared`, `media`) доступны без авторизации +- Приватные шары (`user1`, `user2`) доступны только указанным пользователям +- Пароли вынесены в переменные окружения через `.env` файл +- Ограничение памяти и CPU для предсказуемого потребления ресурсов + +## Healthcheck +Для мониторинга состояния контейнера: +```yaml +healthcheck: + test: ["CMD-SHELL", "smbclient -L localhost -N || exit 1"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s +``` + +Проверяет доступность SMB-сервера через анонимное подключение. + +## Ограничение ресурсов +Samba может потреблять много памяти при большом количестве подключений. Рекомендуется ограничить: +```yaml +mem_limit: 256m # Жесткий лимит памяти +mem_reservation: 64m # Гарантированный минимум +cpus: 0.5 # Лимит CPU (0.5 = половина ядра) +``` + ## Решение проблем ### Ошибка "Access is denied" Если в логах `change_to_user_internal: chdir_current_service() failed!`: