nginx-rtmp с разрешениями gcsfuse ffmpeg

avatar
fitzmode
8 августа 2021 в 19:26
169
0
1

Я использую nginx-rtmp-module в Docker для записи потоков rtmp в Google Cloud Storage, смонтированный с gcsfuse.

Хотя я могу записать поток в .flv, использование exec_record_done для преобразования файлов в .mp4 приводит к .mp4 с размером 0 байт. Присоединение оболочки к контейнеру Docker и выполнение команды ffmpeg создает файл .mp4, который работает должным образом. Я подозреваю, что это может быть проблема с несоответствием между разрешениями пользователя nginx и разрешениями пользователя ffmpeg.

.
user nginx;

worker_processes auto;
rtmp_auto_push on;

events {
    # use epoll;
}

rtmp {
    log_format stream '$remote_addr $app $name $command $bytes_received $session_time';
     access_log on;
    server {
        listen 1935;
        listen [::]:1935 ipv6only=on; 
        application live {

            live on;
            record all;
            record_path /opt/static/videos;
            record_max_size 100000K;
            record_suffix %Y%m%d%H%M%S.flv; #Colon permitted in Linux Filesystem.
                            
            
            exec_record_done ffmpeg -i $path -codec copy /opt/static/videos/$basename.mp4; 
           
        }

    }
}

Вот мой Dockerfile

# Production image, copy all the files and run next
FROM ubuntu:18.04
ENV NGINX_USER nginx
RUN useradd -r -u 1001 ${NGINX_USER}
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
# USER root
# Versions of Nginx and nginx-rtmp-module to use
ENV NGINX_VERSION=nginx-1.18.0
ENV NGINX_RTMP_MODULE_VERSION=1.2.1
ENV DEBIAN_FRONTEND=noninteractive
# ENV VOD_MODULE_VERSION=399e1a0ecb5b0007df3a627fa8b03628fc922d5e
ENV VOD_MODULE_VERSION=master



# Install dependencies
RUN apt-get update && apt-get install -y software-properties-common && add-apt-repository ppa:jonathonf/ffmpeg-4 && \
    apt-get install -y gcc mono-mcs zlib1g-dev libpcre3-dev ca-certificates openssl libssl-dev  gnupg lsb-release wget ffmpeg && \
    rm -rf /var/lib/apt/lists/*

# Download and decompress Nginx
RUN mkdir -p /tmp/build/nginx && \
    cd /tmp/build/nginx && \
    wget -O ${NGINX_VERSION}.tar.gz https://nginx.org/download/${NGINX_VERSION}.tar.gz && \
    tar -zxf ${NGINX_VERSION}.tar.gz

# Download and decompress VOD module
# RUN mkdir -p /tmp/build/nginx-vod-module && \
#     cd /tmp/build/nginx-vod-module && \
#     wget -O nginx-vod-module-${VOD_MODULE_VERSION}.tar.gz https://github.com/kaltura/nginx-vod-module/archive/${VOD_MODULE_VERSION}.tar.gz && \
#     tar -zxf nginx-vod-module-${VOD_MODULE_VERSION}.tar.gz && \
#     cd nginx-vod-module-${VOD_MODULE_VERSION}

# Download and decompress RTMP module
RUN mkdir -p /tmp/build/nginx-rtmp-module && \
    cd /tmp/build/nginx-rtmp-module && \
    wget -O nginx-rtmp-module-${NGINX_RTMP_MODULE_VERSION}.tar.gz https://github.com/arut/nginx-rtmp-module/archive/v${NGINX_RTMP_MODULE_VERSION}.tar.gz && \
    tar -zxf nginx-rtmp-module-${NGINX_RTMP_MODULE_VERSION}.tar.gz && \
    cd nginx-rtmp-module-${NGINX_RTMP_MODULE_VERSION}




# Build and install Nginx
# The default puts everything under /usr/local/nginx, so it's needed to change
# it explicitly. Not just for order but to have it in the PATH
RUN cd /tmp/build/nginx/${NGINX_VERSION} && \
    ./configure \
        --sbin-path=/usr/local/sbin/nginx \
        --conf-path=/etc/nginx/nginx.conf \
        --error-log-path=/var/log/nginx/error.log \
        --pid-path=/var/run/nginx/nginx.pid \
        --lock-path=/var/lock/nginx/nginx.lock \
        --http-log-path=/var/log/nginx/access.log \
        --http-client-body-temp-path=/tmp/nginx-client-body \
        --with-http_ssl_module \
        --with-threads \
        --add-module=/tmp/build/nginx-rtmp-module/nginx-rtmp-module-${NGINX_RTMP_MODULE_VERSION} &&  \
    make -j $(getconf _NPROCESSORS_ONLN) && \
    make install && \
    mkdir /var/lock/nginx && \
    rm -rf /tmp/build

#install server
# Forward logs to Docker
RUN ln -sf /dev/stdout /var/log/nginx/access.log && \
    ln -sf /dev/stderr /var/log/nginx/error.log


RUN lsb_release -c -s > /tmp/lsb_release
RUN GCSFUSE_REPO=$(cat /tmp/lsb_release); echo "deb http://packages.cloud.google.com/apt gcsfuse-$GCSFUSE_REPO main" | tee /etc/apt/sources.list.d/gcsfuse.list
RUN wget -O - https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

RUN apt-get update
RUN apt-get install -y gcsfuse



# COPY  ./nginx.conf  /etc/nginx/nginx.conf
# COPY ./mime.types /etc/nginx/mime.types

# Set up user


RUN mkdir -p /opt/static/videos
RUN chmod 777 -R /opt/static/videos
RUN chown -R ${NGINX_USER}:${NGINX_USER} /opt/static/videos
# RUN 

EXPOSE 1935 80


# USER nginx

CMD nginx && gcsfuse -o allow_other --uid=1001 --debug_gcs --foreground xxxxx.appspot.com /opt/static/videos 

Как убедиться, что ffmpeg имеет правильные права пользователя на чтение и запись в смонтированную папку?

Источник

Ответы (0)