Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
b5ed25d542
|
|||
|
448eada6e9
|
|||
|
bdbd9f9e57
|
|||
|
66df86f1aa
|
|||
|
24a5f988a3
|
|||
|
28f93bd9a6
|
|||
|
70847623e8
|
|||
|
68d051c36e
|
|||
|
1456237de2
|
|||
|
fbc5ea4428
|
|||
|
c49b6b979d
|
|||
|
10bf297543
|
|||
|
4d2cfe8030
|
|||
|
ea700fc0fe
|
|||
|
13de506761
|
@@ -1,4 +1,4 @@
|
||||
IPTV_ENV=prod
|
||||
IPTV_ENV=dev
|
||||
|
||||
KEYDB_UID=1000
|
||||
KEYDB_GID=1000
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,7 +1,10 @@
|
||||
/.idea/
|
||||
/.vscode/
|
||||
/docker/keydb/data/*
|
||||
/log/**/*
|
||||
/iptvc/
|
||||
/web/
|
||||
/docs/
|
||||
/playlists/
|
||||
/tools/
|
||||
/.profile/
|
||||
|
||||
28
README.md
28
README.md
@@ -1,13 +1,13 @@
|
||||
# Инфраструктурный слой проекта iptv.axenov.dev
|
||||
# Инфраструктурный слой проекта m3u.su
|
||||
|
||||
Docker-окружение для работы проекта iptv.axenov.dev.
|
||||
Docker-окружение для работы проекта m3u.su.
|
||||
|
||||
> **Веб-сайт:** [iptv.axenov.dev](https://iptv.axenov.dev)
|
||||
> **Зеркало:** [m3u.su](https://m3u.su)
|
||||
> **Веб-сайт:** [m3u.su](https://m3u.su)
|
||||
> **Документация:** [m3u.su/docs](https://m3u.su/docs)
|
||||
> Исходный код: [git.axenov.dev/IPTV](https://git.axenov.dev/IPTV)
|
||||
> Telegram-канал: [@iptv_aggregator](https://t.me/iptv_aggregator)
|
||||
> Обсуждение: [@iptv_aggregator_chat](https://t.me/iptv_aggregator_chat)
|
||||
> Дополнительные сведения: [git.axenov.dev/IPTV/.profile](https://git.axenov.dev/IPTV/.profile)
|
||||
> Бот: [@iptv_aggregator_bot](https://t.me/iptv_aggregator_bot)
|
||||
|
||||
## Использованный стек
|
||||
|
||||
@@ -38,15 +38,15 @@ wget -O - https://git.axenov.dev/IPTV/iptv-docker/raw/branch/master/iptv | bash
|
||||
|
||||
## Описание переменных окружения
|
||||
|
||||
* `IPTV_ENV` -- окружение для развёртывания: это имена директорий и/или префиксы имён конфигов, которые будут проброшены в контейнеры;
|
||||
* `KEYDB_UID`, `KEYDB_GID` -- ID пользователя/группы для разрешения владельца файлов и директорий keydb;
|
||||
* `KEYDB_PORT` -- порт keydb, который будет проброшен на хост.
|
||||
* `KEYDB_USERNAME`, `KEYDB_PASSWORD` -- реквизиты доступа к keydb;
|
||||
* `CHECKER_DB` -- БД keydb для хранения кеша проверенных плейлистов;
|
||||
* `CHECKER_TTL` -- время жизни кеша проверенных плейлистов;
|
||||
* `CHECKER_WAIT` -- кол-во секунд между запусками iptvc;
|
||||
* `CHECKER_INIFILE` -- путь к файлу списка плейлистов внутри контейнера;
|
||||
* `CHECKER_TAGFILE` -- путь к файлу списка тегов внутри контейнера.
|
||||
* `IPTV_ENV` — окружение для развёртывания: это имена директорий и/или префиксы имён конфигов, которые будут проброшены в контейнеры;
|
||||
* `KEYDB_UID`, `KEYDB_GID` — ID пользователя/группы для разрешения владельца файлов и директорий keydb;
|
||||
* `KEYDB_PORT` — порт keydb, который будет проброшен на хост.
|
||||
* `KEYDB_USERNAME`, `KEYDB_PASSWORD` — реквизиты доступа к keydb;
|
||||
* `CHECKER_DB` — БД keydb для хранения кеша проверенных плейлистов;
|
||||
* `CHECKER_TTL` — время жизни кеша проверенных плейлистов;
|
||||
* `CHECKER_WAIT` — кол-во секунд между запусками iptvc;
|
||||
* `CHECKER_INIFILE` — путь к файлу списка плейлистов внутри контейнера;
|
||||
* `CHECKER_TAGFILE` — путь к файлу списка тегов внутри контейнера.
|
||||
|
||||
## Reverse-proxy
|
||||
|
||||
|
||||
68
compose.yml
68
compose.yml
@@ -1,5 +1,7 @@
|
||||
name: iptv
|
||||
|
||||
networks:
|
||||
iptv:
|
||||
iptv-network:
|
||||
driver: bridge
|
||||
|
||||
x-common-attributes: &common-attributes
|
||||
@@ -12,19 +14,34 @@ x-common-attributes: &common-attributes
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
networks:
|
||||
- iptv
|
||||
- iptv-network
|
||||
|
||||
services:
|
||||
nginx:
|
||||
<<: *common-attributes
|
||||
container_name: iptv-nginx
|
||||
image: nginx:latest
|
||||
pull_policy: always
|
||||
volumes:
|
||||
- ./docker/nginx/vhost.conf:/etc/nginx/conf.d/default.conf:ro
|
||||
- ./log/nginx:/var/log/nginx:rw
|
||||
- ./web:/var/www:ro
|
||||
ports:
|
||||
- 3000:80
|
||||
depends_on:
|
||||
- web
|
||||
|
||||
keydb:
|
||||
<<: *common-attributes
|
||||
container_name: iptv-keydb
|
||||
image: eqalpha/keydb:latest
|
||||
pull_policy: always
|
||||
user: ${KEYDB_UID}:${KEYDB_GID}
|
||||
entrypoint: ["sh", "/entrypoint.sh"]
|
||||
volumes:
|
||||
- ./docker/keydb/entrypoint.sh:/entrypoint.sh
|
||||
- ./docker/keydb/keydb.conf:/etc/keydb/keydb.conf
|
||||
- ./docker/keydb/data/:/data:rw
|
||||
- ./log/keydb:/var/log/keydb/:rw
|
||||
ports:
|
||||
- ${KEYDB_PORT:-6379}:6379
|
||||
|
||||
@@ -32,12 +49,14 @@ services:
|
||||
<<: *common-attributes
|
||||
container_name: iptv-web
|
||||
build:
|
||||
dockerfile: dockerfile.web.${IPTV_ENV}
|
||||
context: ./web
|
||||
dockerfile: Dockerfile
|
||||
target: iptv-web-${IPTV_ENV}
|
||||
environment:
|
||||
- PHP_IDE_CONFIG=serverName=iptv.local
|
||||
volumes:
|
||||
- ./docker/php/${IPTV_ENV}/www.conf:/usr/local/etc/php-fpm.d/www.conf:ro
|
||||
- ./docker/php/${IPTV_ENV}/php.ini:/usr/local/etc/php/conf.d/php.ini:ro
|
||||
- ./web/docker/${IPTV_ENV}/www.conf:/usr/local/etc/php-fpm.d/www.conf:ro
|
||||
- ./web/docker/${IPTV_ENV}/php.ini:/usr/local/etc/php/conf.d/php.ini:ro
|
||||
- ./playlists/playlists.ini:/var/www/config/playlists.ini
|
||||
- ./log/php:/var/log/php:rw
|
||||
- ./web:/var/www:rw
|
||||
@@ -47,40 +66,29 @@ services:
|
||||
checker:
|
||||
<<: *common-attributes
|
||||
container_name: iptv-checker
|
||||
image: git.axenov.dev/iptv/iptvc:latest
|
||||
build:
|
||||
dockerfile: ./dockerfile.checker
|
||||
context: ./iptvc
|
||||
dockerfile: Dockerfile
|
||||
command: ["check", "--repeat", "0", "--every", "${CHECKER_WAIT:-60}"]
|
||||
environment:
|
||||
- CACHE_ENABLED=true
|
||||
# - CACHE_HOST=localhost
|
||||
- CACHE_HOST=iptv-keydb
|
||||
- CACHE_PORT=${KEYDB_PORT:-6379}
|
||||
- CACHE_USERNAME=${KEYDB_USERNAME}
|
||||
- CACHE_PASSWORD=${KEYDB_PASSWORD}
|
||||
- CACHE_DB=${CHECKER_DB:-0}
|
||||
- CACHE_TTL=${CHECKER_TTL:-1800}
|
||||
- CHECKER_WAIT=${CHECKER_WAIT:-60}
|
||||
- CHECKER_INIFILE=${CHECKER_INIFILE:-/app/playlists.ini}
|
||||
- CHECKER_TAGFILE=${CHECKER_TAGFILE:-/app/channels.json}
|
||||
volumes:
|
||||
- ./docker/checker/entrypoint.sh:/entrypoint.sh
|
||||
- ./iptvc/:/app/
|
||||
- ./playlists/playlists.ini:${CHECKER_INIFILE:-/app/playlists.ini}
|
||||
- ./playlists/channels.json:${CHECKER_TAGFILE:-/app/channels.json}
|
||||
depends_on:
|
||||
- keydb
|
||||
- ./playlists/playlists.ini:/app/playlists.ini
|
||||
- ./playlists/channels.json:/app/channels.json
|
||||
|
||||
nginx:
|
||||
docs:
|
||||
<<: *common-attributes
|
||||
container_name: iptv-nginx
|
||||
image: nginx:latest
|
||||
volumes:
|
||||
- ./docker/nginx/vhost.conf:/etc/nginx/conf.d/default.conf:ro
|
||||
- ./log/nginx:/var/log/nginx:rw
|
||||
- ./web:/var/www:ro
|
||||
- ./docs/site:/usr/share/nginx/html/doc-files:ro
|
||||
container_name: iptv-docs
|
||||
image: git.axenov.dev/iptv/iptv-docs:latest
|
||||
build:
|
||||
context: ./docs
|
||||
dockerfile: Dockerfile
|
||||
ports:
|
||||
- 8080:80
|
||||
links:
|
||||
- web
|
||||
depends_on:
|
||||
- web
|
||||
- 3001:80
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "CHECKER_WAIT=$CHECKER_WAIT"
|
||||
echo "CHECKER_INIFILE=$CHECKER_INIFILE"
|
||||
echo "CHECKER_TAGFILE=$CHECKER_TAGFILE"
|
||||
binary="$PWD/bin/iptvc"
|
||||
|
||||
if [ ! -f "$binary" ]; then
|
||||
echo "Downloading latest iptvc..."
|
||||
wget https://git.axenov.dev/IPTV/iptvc/releases/download/latest/linux_amd64.zip
|
||||
[ ! -d "$PWD/bin" ] && mkdir "$PWD/bin"
|
||||
unzip -o linux_amd64.zip -d "$PWD/bin"
|
||||
rm -rf linux_amd64.zip
|
||||
fi
|
||||
|
||||
if [ ! -f "$binary" ]; then
|
||||
echo "Not found: $binary"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
$binary version
|
||||
|
||||
args="check -i $CHECKER_INIFILE -t $CHECKER_TAGFILE"
|
||||
while true; do
|
||||
echo
|
||||
echo "Running: $binary $args"
|
||||
$binary $args
|
||||
echo "Waiting $CHECKER_WAIT seconds"
|
||||
sleep $CHECKER_WAIT
|
||||
done
|
||||
4
docker/keydb/entrypoint.sh
Normal file
4
docker/keydb/entrypoint.sh
Normal file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
trap 'echo "Received SIGTERM, saving KeyDB data..."; keydb-cli SAVE; echo "Data saved. Exiting."; exit 0' TERM
|
||||
echo "[entrypoint] Starting KeyDB..."
|
||||
exec keydb-server /etc/keydb/keydb.conf "$@"
|
||||
File diff suppressed because it is too large
Load Diff
@@ -22,14 +22,14 @@ server {
|
||||
}
|
||||
|
||||
location ^~ /docs/ {
|
||||
alias /usr/share/nginx/html/doc-files/;
|
||||
index index.html;
|
||||
# access_log /var/log/nginx/docs_access.log;
|
||||
error_log /var/log/nginx/docs_error.log warn;
|
||||
location ~* \.(?:js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public";
|
||||
}
|
||||
proxy_pass http://docs:80/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 300;
|
||||
proxy_connect_timeout 300;
|
||||
proxy_send_timeout 300;
|
||||
}
|
||||
|
||||
location / {
|
||||
@@ -48,6 +48,8 @@ server {
|
||||
fastcgi_hide_header X-Powered-By;
|
||||
fastcgi_read_timeout 300;
|
||||
proxy_read_timeout 300;
|
||||
proxy_connect_timeout 300;
|
||||
proxy_send_timeout 300;
|
||||
include fastcgi_params;
|
||||
location ~* \.(jpg|jpeg|gif|css|png|ttf|woff|svg|js|ico)$ {
|
||||
access_log off;
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
[PHP]
|
||||
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
|
||||
expose_php = Off
|
||||
file_uploads = Off
|
||||
max_execution_time=-1
|
||||
memory_limit = 512M
|
||||
|
||||
[opcache]
|
||||
opcache.enable = 1
|
||||
opcache.enable_cli = 1
|
||||
opcache.memory_consumption = 128
|
||||
opcache.max_accelerated_files = 30000
|
||||
opcache.revalidate_freq = 0
|
||||
opcache.jit_buffer_size = 64M
|
||||
opcache.jit = tracing
|
||||
|
||||
[xdebug]
|
||||
; https://xdebug.org/docs/all_settings
|
||||
zend_extension = xdebug.so
|
||||
xdebug.mode = debug
|
||||
xdebug.start_with_request = yes
|
||||
xdebug.trigger_value = go
|
||||
xdebug.client_host = host.docker.internal
|
||||
xdebug.REQUEST = *
|
||||
xdebug.SESSION = *
|
||||
xdebug.SERVER = *
|
||||
@@ -1,22 +0,0 @@
|
||||
[www]
|
||||
user = www-data
|
||||
group = www-data
|
||||
listen = 127.0.0.1:9000
|
||||
pm = dynamic
|
||||
pm.max_children = 5
|
||||
pm.start_servers = 2
|
||||
pm.min_spare_servers = 1
|
||||
pm.max_spare_servers = 3
|
||||
pm.max_requests = 50
|
||||
pm.status_path = /status
|
||||
ping.path = /ping
|
||||
ping.response = pong
|
||||
access.log = /var/log/php/$pool.access.log
|
||||
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}d %{kilo}M %C%%"
|
||||
; chroot = /var/www
|
||||
; chdir = /var/www
|
||||
php_flag[display_errors] = on
|
||||
php_admin_value[error_log] = /var/log/php/$pool.error.log
|
||||
php_admin_flag[log_errors] = on
|
||||
php_admin_value[memory_limit] = 512M
|
||||
php_admin_value[error_reporting] = E_ALL & ~E_NOTICE & ~E_DEPRECATED
|
||||
@@ -1,16 +0,0 @@
|
||||
[PHP]
|
||||
error_reporting = E_ALL
|
||||
expose_php = Off
|
||||
file_uploads = Off
|
||||
memory_limit = 512M
|
||||
; upload_max_filesize=10M
|
||||
; post_max_size=10M
|
||||
|
||||
[opcache]
|
||||
opcache.enable = 1
|
||||
opcache.enable_cli = 1
|
||||
opcache.memory_consumption = 128
|
||||
opcache.max_accelerated_files = 30000
|
||||
opcache.revalidate_freq = 0
|
||||
opcache.jit_buffer_size = 64M
|
||||
opcache.jit = tracing
|
||||
@@ -1,22 +0,0 @@
|
||||
[www]
|
||||
user = www-data
|
||||
group = www-data
|
||||
listen = 127.0.0.1:9000
|
||||
pm = dynamic
|
||||
pm.max_children = 5
|
||||
pm.start_servers = 2
|
||||
pm.min_spare_servers = 1
|
||||
pm.max_spare_servers = 3
|
||||
pm.max_requests = 50
|
||||
pm.status_path = /status
|
||||
ping.path = /ping
|
||||
ping.response = pong
|
||||
access.log = /var/log/php/$pool.access.log
|
||||
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}d %{kilo}M %C%%"
|
||||
; chroot = /var/www
|
||||
; chdir = /var/www
|
||||
php_flag[display_errors] = on
|
||||
php_admin_value[error_log] = /var/log/php/$pool.error.log
|
||||
php_admin_flag[log_errors] = on
|
||||
php_admin_value[memory_limit] = 512M
|
||||
php_admin_value[error_reporting] = E_ALL & ~E_NOTICE & ~E_DEPRECATED
|
||||
@@ -1,15 +0,0 @@
|
||||
FROM alpine:3.21 AS iptvc-compiler
|
||||
|
||||
RUN apk --no-cache add \
|
||||
bash \
|
||||
tzdata \
|
||||
go \
|
||||
make \
|
||||
libc6-compat
|
||||
|
||||
RUN mkdir /app && \
|
||||
chmod 777 /app
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
@@ -1,37 +0,0 @@
|
||||
FROM php:8.4-fpm AS iptv-php-dev
|
||||
|
||||
RUN apt update && \
|
||||
apt upgrade -y && \
|
||||
apt install -y \
|
||||
git \
|
||||
unzip \
|
||||
7zip \
|
||||
cron \
|
||||
zlib1g-dev \
|
||||
imagemagick \
|
||||
libpng-dev \
|
||||
libjpeg-dev
|
||||
|
||||
# https://pecl.php.net/package/xdebug
|
||||
# https://pecl.php.net/package/redis
|
||||
RUN pecl channel-update pecl.php.net && \
|
||||
pecl install \
|
||||
xdebug-3.4.1 \
|
||||
redis-6.1.0
|
||||
|
||||
RUN docker-php-ext-enable redis && \
|
||||
docker-php-ext-configure gd --with-jpeg && \
|
||||
docker-php-ext-install gd
|
||||
|
||||
RUN mkdir -p /var/run/php && \
|
||||
mkdir -p /var/log/php && \
|
||||
chmod -R 777 /var/log/php
|
||||
|
||||
COPY --from=composer /usr/bin/composer /usr/local/bin/composer
|
||||
|
||||
RUN git config --global --add safe.directory /var/www
|
||||
|
||||
EXPOSE 9000
|
||||
WORKDIR /var/www
|
||||
CMD composer install && \
|
||||
php-fpm --nodaemonize
|
||||
@@ -1,34 +0,0 @@
|
||||
FROM php:8.4-fpm AS iptv-php-prod
|
||||
|
||||
RUN apt update && \
|
||||
apt upgrade -y && \
|
||||
apt install -y \
|
||||
git \
|
||||
unzip \
|
||||
7zip \
|
||||
cron \
|
||||
zlib1g-dev \
|
||||
imagemagick \
|
||||
libpng-dev \
|
||||
libjpeg-dev
|
||||
|
||||
# https://pecl.php.net/package/redis
|
||||
RUN pecl channel-update pecl.php.net && \
|
||||
pecl install redis-6.1.0
|
||||
|
||||
RUN docker-php-ext-enable xdebug redis && \
|
||||
docker-php-ext-configure gd --with-jpeg && \
|
||||
docker-php-ext-install gd
|
||||
|
||||
RUN mkdir -p /var/run/php && \
|
||||
mkdir -p /var/log/php && \
|
||||
chmod -R 777 /var/log/php
|
||||
|
||||
COPY --from=composer /usr/bin/composer /usr/local/bin/composer
|
||||
|
||||
RUN git config --global --add safe.directory /var/www
|
||||
|
||||
EXPOSE 9000
|
||||
WORKDIR /var/www/
|
||||
CMD composer install && \
|
||||
php-fpm --nodaemonize
|
||||
1
docs
1
docs
Submodule docs deleted from 3a2eca9e15
42
iptv
42
iptv
@@ -21,7 +21,7 @@ else
|
||||
ROOT_PATH="$(pwd)"
|
||||
fi
|
||||
|
||||
IPTV_PROJECTS=("iptvc" "docs" "web" "playlists")
|
||||
IPTV_PROJECTS=("web" "playlists")
|
||||
IPTV_GITEA_URL_SSH="git@git.axenov.dev:IPTV"
|
||||
IPTV_GITEA_URL_HTTPS="https://git.axenov.dev/IPTV"
|
||||
IPTV_DOCKER_URL_SSH="$IPTV_GITEA_URL_SSH/iptv-docker.git"
|
||||
@@ -338,6 +338,7 @@ docker.build_base_images() {
|
||||
# done
|
||||
subtitle "Построение образов"
|
||||
docker.compose build
|
||||
[ ! -d web/cache/views ] && mkdir -p web/cache/views
|
||||
|
||||
success "Базовые образы построены"
|
||||
}
|
||||
@@ -432,7 +433,7 @@ find_services_compose() {
|
||||
|
||||
[ "$*" ] && for svc in "$@"; do
|
||||
grep_match "$svc" "^--?.*" && continue
|
||||
svc="$(find_service_compose "$svc")"
|
||||
svc="$(find_service_compose "${svc/iptv-/}")"
|
||||
services="$services $svc"
|
||||
done
|
||||
|
||||
@@ -468,7 +469,7 @@ init() {
|
||||
local project_repo_path="$docker_repo_path/$repo_name"
|
||||
subtitle "[$counter/$repo_count] Подготовка репозитория ${FBOLD}$repo_name${FRESET}..."
|
||||
|
||||
local project_repo_url=$(project_url_ssh "$repo_name")
|
||||
local project_repo_url=$(project_url_https "$repo_name")
|
||||
debug "Известная ссылка на репозиторий: $project_repo_url"
|
||||
|
||||
project_clone "$project_repo_url" "$project_repo_path"
|
||||
@@ -494,12 +495,11 @@ up() {
|
||||
process_help_arg
|
||||
subtitle "Создание и запуск контейнеров"
|
||||
|
||||
argl profiles 0 profiles
|
||||
|
||||
local services=''
|
||||
[ "$*" ] && services="$(find_services_compose "$@")"
|
||||
|
||||
COMPOSE_PROFILES="$profiles" docker.compose up "$services" --build --detach --remove-orphans && \
|
||||
[ ! -d web/cache/views ] && mkdir -p web/cache/views
|
||||
docker.compose up "$services" --build --detach --remove-orphans && \
|
||||
success 'Среда запущена успешно'
|
||||
}
|
||||
|
||||
@@ -522,13 +522,10 @@ down() {
|
||||
process_help_arg
|
||||
subtitle "Остановка и удаление контейнеров"
|
||||
|
||||
argl profiles 0 profiles
|
||||
[[ -z "$profiles" ]] && profiles="full"
|
||||
|
||||
local services=''
|
||||
[ "$*" ] && services="$(find_services_compose "$@")"
|
||||
|
||||
COMPOSE_PROFILES="$profiles" docker.compose down "$services" --remove-orphans && \
|
||||
docker.compose down "$services" --remove-orphans && \
|
||||
success 'Среда остановлена успешно'
|
||||
}
|
||||
|
||||
@@ -554,7 +551,7 @@ rebuild() {
|
||||
is_full=$(arg full 1)
|
||||
[ "$is_full" = 0 ] && is_full=$(argl full 1)
|
||||
|
||||
[ -n "$*" ] && down "$@"
|
||||
[ -n "$*" ] && down "$@" || down
|
||||
[ "$is_full" = 1 ] && docker.build_base_images
|
||||
|
||||
up "$@"
|
||||
@@ -579,6 +576,27 @@ purge() {
|
||||
success 'Образы удалены успешно'
|
||||
}
|
||||
|
||||
# Выполняет команду в контейнере
|
||||
exec() {
|
||||
process_help_arg
|
||||
as_root=0
|
||||
svc="$1"
|
||||
regex_match "$svc" "--?r(oot)?" && { as_root=1; shift; svc="$1"; }
|
||||
|
||||
svc_correct="iptv-$(find_service_compose "$svc")"
|
||||
command=("${@:2}")
|
||||
regex_match "${command[0]}" "--?r(oot)?" && { as_root=1; unset "command[0]"; }
|
||||
|
||||
[[ -z "${command[*]}" ]] && die "не указана команда для выполнения в контейнере"
|
||||
|
||||
#TODO многострочные команды прокидываются корректно, но выполняется только первая строка?
|
||||
if [[ "$as_root" == 1 ]]; then
|
||||
docker.exec "$svc_correct" "${command[*]}"
|
||||
else
|
||||
docker.exec_www "$svc_correct" "${command[*]}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Выводит логи сервиса
|
||||
logs() {
|
||||
process_help_arg
|
||||
@@ -602,7 +620,6 @@ stats() {
|
||||
docker.compose stats "$@"
|
||||
}
|
||||
|
||||
|
||||
########################################################
|
||||
# Команды справки
|
||||
########################################################
|
||||
@@ -827,6 +844,7 @@ case "$COMMAND" in
|
||||
stop ) stop "$@" ;;
|
||||
r|rebuild ) rebuild "$@" ;;
|
||||
restart ) restart "$@" ;;
|
||||
exec ) exec "$@" ;;
|
||||
purge ) purge ;;
|
||||
logs ) logs "$@" ;;
|
||||
stats ) stats "$@" ;;
|
||||
|
||||
Reference in New Issue
Block a user