1111ACTION=$1 # start|stop|logs|restart
1212ENV_FILE=$2 # /path/to/*.env
1313CHANNELS_JSON=$3 # /path/to/*.json
14- MODE=$4 # -d (detach) или пусто
14+ MODE=$4 # -d или пусто
1515
1616# Проверка аргументов
1717if [[ -z " $ACTION " || -z " $ENV_FILE " ]]; then
2222
2323# Если start, то требуем JSON-файл
2424if [[ " $ACTION " == " start" && -z " $CHANNELS_JSON " ]]; then
25- echo " ❌ Ошибка: для команды start необходимо указать JSON-файл!"
25+ echo " ❌ Ошибка: для команды start нужно указать JSON-файл!"
2626 exit 1
2727fi
2828
3535# Загружаем переменные из .env (убирая строки с #)
3636export $( grep -v ' ^#' " $ENV_FILE " | xargs)
3737
38- # -------------------------------------------
39- # Подготавливаем нужные переменные окружения
40- # -------------------------------------------
41-
42- # DOCKER_NETWORK (если не задана в env, используем default)
38+ # --------------------------------------------------------------------
39+ # Готовим основные переменные (если чего-то нет, можно задать дефолт)
40+ # --------------------------------------------------------------------
4341if [[ -z " $DOCKER_NETWORK " ]]; then
4442 DOCKER_NETWORK=" proxy_net"
4543fi
4644
47- # DOCKER_IMAGE (если не задана, пусть будет youtube-monitoring-app)
4845if [[ -z " $DOCKER_IMAGE " ]]; then
4946 DOCKER_IMAGE=" youtube-monitoring-app"
5047fi
5148
52- # CONTAINER_NAME формируем на основе JSON-файла (youtube-имя_файла)
53- # Пример: channels_list.json -> youtube-channels_list
49+ # Генерируем имя контейнера на основе JSON-файла (без .json)
5450if [[ " $ACTION " == " start" ]]; then
5551 CONTAINER_NAME=" youtube-$( basename " $CHANNELS_JSON " .json) "
5652else
57- # Если мы делаем stop|logs|restart, контейнер нужно как-то определить
58- # Либо также генерируем имя, либо (более надёжно) попросим указывать явно.
59- # Для простоты используем ту же логику:
53+ # Для stop/logs/restart — аналогично
6054 CONTAINER_NAME=" youtube-$( basename " $CHANNELS_JSON " .json) "
6155fi
6256
63- # Проверяем, существует ли сеть
57+ # Проверяем, существует ли указанная сеть, если нет, создаём
6458if ! docker network ls --format ' {{.Name}}' | grep -q " ^$DOCKER_NETWORK $" ; then
6559 echo " 🌐 Сеть $DOCKER_NETWORK не найдена. Создаю..."
6660 docker network create " $DOCKER_NETWORK "
@@ -70,40 +64,49 @@ if ! docker network ls --format '{{.Name}}' | grep -q "^$DOCKER_NETWORK$"; then
7064 fi
7165fi
7266
73- # Логи: LOGS_PATH (внутри контейнера будет /app/logs)
74- if [[ -z " $LOGS_PATH " ]]; then
75- echo " ⚠️ LOGS_PATH не задан в .env! Логи не будут проброшены."
76- MOUNT_LOGS=" "
67+ # Сборка монтирований (если HOST_* и *PATH заданы)
68+ # 1) ЛОГИ
69+ if [[ -n " $HOST_LOGS_PATH " && -n " $LOGS_PATH " ]]; then
70+ mkdir -p " $HOST_LOGS_PATH "
71+ MOUNT_LOGS=" -v \" $( realpath " $HOST_LOGS_PATH " ) :$LOGS_PATH \" "
7772else
78- mkdir -p " $LOGS_PATH "
79- MOUNT_LOGS=" -v \" $( realpath " $LOGS_PATH " ) :/app/logs\" "
73+ MOUNT_LOGS=" "
8074fi
8175
82- # Хранилище: STORAGE_PATH (внутри контейнера /app/storage — или как вам нужно)
83- if [[ -z " $STORAGE_PATH " ]]; then
84- echo " ⚠️ STORAGE_PATH не задан в .env! Не будет папки для скачанных файлов. "
85- MOUNT_STORAGE=" "
76+ # 2) ХРАНИЛИЩЕ
77+ if [[ -n " $HOST_STORAGE_PATH " && -n " $STORAGE_PATH " ]]; then
78+ mkdir -p " $HOST_STORAGE_PATH "
79+ MOUNT_STORAGE=" -v \" $( realpath " $HOST_STORAGE_PATH " ) : $STORAGE_PATH \" "
8680else
87- mkdir -p " $STORAGE_PATH "
88- MOUNT_STORAGE=" -v \" $( realpath " $STORAGE_PATH " ) :/app/storage\" "
81+ MOUNT_STORAGE=" "
8982fi
9083
91- # Шаблоны
92- if [[ -n " $TG_NEW_VIDEO_TEMPLATE " && -f " $TG_NEW_VIDEO_TEMPLATE " ]]; then
93- MOUNT_NEW_VIDEO=" -v \" $( realpath " $TG_NEW_VIDEO_TEMPLATE " ) :/app/templates/new_video.md \" "
84+ # 3) Шаблоны: new_video.md
85+ if [[ -n " $HOST_TG_NEW_VIDEO_TEMPLATE " && -n " $ TG_NEW_VIDEO_TEMPLATE" && -f " $HOST_TG_NEW_VIDEO_TEMPLATE " ]]; then
86+ MOUNT_NEW_VIDEO=" -v \" $( realpath " $HOST_TG_NEW_VIDEO_TEMPLATE " ) :$TG_NEW_VIDEO_TEMPLATE \" "
9487else
9588 MOUNT_NEW_VIDEO=" "
9689fi
9790
98- if [[ -n " $TG_SHORTS_TEMPLATE " && -f " $TG_SHORTS_TEMPLATE " ]]; then
99- MOUNT_SHORTS=" -v \" $( realpath " $TG_SHORTS_TEMPLATE " ) :/app/templates/shorts.md\" "
91+ # 4) Шаблоны: shorts.md
92+ if [[ -n " $HOST_TG_SHORTS_TEMPLATE " && -n " $TG_SHORTS_TEMPLATE " && -f " $HOST_TG_SHORTS_TEMPLATE " ]]; then
93+ MOUNT_SHORTS=" -v \" $( realpath " $HOST_TG_SHORTS_TEMPLATE " ) :$TG_SHORTS_TEMPLATE \" "
10094else
10195 MOUNT_SHORTS=" "
10296fi
10397
104- # Собираем аргументы для docker run
105- # Каналы будут внутри контейнера как /app/channels_list.json
106- RUN_DOCKER_CMD="
98+ # Список каналов монтируем в /app/channels_list.json (внутри контейнера)
99+ # (Программа должна читать именно /app/channels_list.json, либо берёт путь из env)
100+ if [[ " $ACTION " == " start" ]]; then
101+ if [[ ! -f " $CHANNELS_JSON " ]]; then
102+ echo " ❌ Ошибка: файл JSON '$CHANNELS_JSON ' не найден!"
103+ exit 1
104+ fi
105+ MOUNT_CHANNELS=" -v \" $( realpath " $CHANNELS_JSON " ) :/app/channels_list.json\" "
106+ fi
107+
108+ # Собираем docker run команду
109+ RUN_CMD="
107110docker run \
108111--name \" $CONTAINER_NAME \" \
109112--network \" $DOCKER_NETWORK \" \
@@ -112,39 +115,38 @@ $MOUNT_LOGS \
112115$MOUNT_STORAGE \
113116$MOUNT_NEW_VIDEO \
114117$MOUNT_SHORTS \
115- -v \" $( realpath " $CHANNELS_JSON " ) :/app/channels_list.json \" \
118+ $MOUNT_CHANNELS \
116119"
117120
118- # Если фоновый режим
121+ # Если просили фоновый режим
119122if [[ " $MODE " == " -d" ]]; then
120- RUN_DOCKER_CMD =" $RUN_DOCKER_CMD -d"
123+ RUN_CMD =" $RUN_CMD -d"
121124else
122- # интерактивный + автоматическое удаление после остановки
123- RUN_DOCKER_CMD =" $RUN_DOCKER_CMD --rm"
125+ # Интерактивно + удалять контейнер после остановки
126+ RUN_CMD =" $RUN_CMD --rm"
124127fi
125128
126- # Дополняем командой об образе
127- RUN_DOCKER_CMD =" $RUN_DOCKER_CMD $DOCKER_IMAGE
129+ # Дополняем указанием образа
130+ RUN_CMD =" $RUN_CMD $DOCKER_IMAGE
128131"
129132
130- # -------------------------------------------
131- # Ветки действий
132- # -------------------------------------------
133+ # -------------------------------------------------------------------
134+ # Запускаем в зависимости от ACTION
135+ # -------------------------------------------------------------------
133136case " $ACTION " in
134137 start)
135- # Проверяем, есть ли такой контейнер (в любом статусе)
138+ # Если контейнер уже есть (в любом статусе), стоп/удаление
136139 if docker ps -a --format ' {{.Names}}' | grep -q " ^$CONTAINER_NAME $" ; then
137140 echo " ⚠️ Контейнер $CONTAINER_NAME уже существует. Останавливаю и удаляю..."
138141 docker stop " $CONTAINER_NAME "
139142 docker rm " $CONTAINER_NAME "
140143 fi
141-
144+
142145 echo " 🚀 Запускаем контейнер: $CONTAINER_NAME "
143- echo " Образ: $DOCKER_IMAGE "
144- echo " Сеть: $DOCKER_NETWORK "
145- echo " JSON: $CHANNELS_JSON "
146- # Выполняем команду
147- eval " $RUN_DOCKER_CMD "
146+ echo " Образ: $DOCKER_IMAGE "
147+ echo " Сеть: $DOCKER_NETWORK "
148+ echo " JSON: $CHANNELS_JSON "
149+ eval " $RUN_CMD "
148150 ;;
149151
150152 stop)
@@ -167,11 +169,11 @@ case "$ACTION" in
167169 * )
168170 echo " Usage: $0 {start|stop|logs|restart} /path/to/envfile /path/to/json [-d]"
169171 echo " Примеры:"
170- echo " $0 start /home/user/my.env /home/user/list.json # Запуск в интерактивном режиме "
171- echo " $0 start /home/user/my.env /home/user/list.json -d # Запуск в фоновом режиме "
172- echo " $0 stop /home/user/my.env /home/user/list.json # Остановка контейнера "
173- echo " $0 logs /home/user/my.env /home/user/list.json # Просмотр логов "
174- echo " $0 restart /home/user/my.env /home/user/list.json # Перезапуск контейнера "
172+ echo " $0 start /home/user/my.env /home/user/list.json # интерактив "
173+ echo " $0 start /home/user/my.env /home/user/list.json -d # в фоне "
174+ echo " $0 stop /home/user/my.env /home/user/list.json # остановка "
175+ echo " $0 logs /home/user/my.env /home/user/list.json # логи "
176+ echo " $0 restart /home/user/my.env /home/user/list.json # перезапуск "
175177 exit 1
176178 ;;
177179esac
0 commit comments