ARG ALPINE_VERSION=3.18
ARG NGINX_VERSION=1.23.1
ARG NGINX_RTMP_VERSION=1.2.2
ARG FFMPEG_VERSION=5.1
ARG BUILD_CORES
ARG MAKEFLAGS="-j${BUILD_CORES:-4}"
ARG BUILDTIME=unknown

##############################
# Build the NGINX-build image.
FROM alpine:${ALPINE_VERSION} AS build-nginx
ARG NGINX_VERSION
ARG NGINX_RTMP_VERSION
ARG MAKEFLAGS

# 合并 RUN 命令,优化层数
RUN apk add --no-cache \
    build-base \
    ca-certificates \
    curl \
    gcc \
    libc-dev \
    libgcc \
    linux-headers \
    make \
    musl-dev \
    openssl \
    openssl-dev \
    pcre \
    pcre-dev \
    pkgconf \
    pkgconfig \
    zlib-dev \
    && mkdir -p /tmp/nginx \
    && cd /tmp/nginx \
    # 获取并编译 nginx
    && wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz \
    && tar zxf nginx-${NGINX_VERSION}.tar.gz \
    && rm nginx-${NGINX_VERSION}.tar.gz \
    # 获取 nginx-rtmp 模块
    && wget https://github.com/arut/nginx-rtmp-module/archive/v${NGINX_RTMP_VERSION}.tar.gz \
    && tar zxf v${NGINX_RTMP_VERSION}.tar.gz \
    && rm v${NGINX_RTMP_VERSION}.tar.gz \
    #  nginx
    && cd /tmp/nginx/nginx-${NGINX_VERSION} \
    && ./configure \
        --prefix=/usr/local/nginx \
        --add-module=/tmp/nginx/nginx-rtmp-module-${NGINX_RTMP_VERSION} \
        --conf-path=/etc/nginx/nginx.conf \
        --with-threads \
        --with-file-aio \
        --with-http_ssl_module \
        --with-debug \
        --with-http_stub_status_module \
        --with-cc-opt="-Wimplicit-fallthrough=0" \
    && make \
    && make install \
    # 清理构建文件
    && rm -rf /var/cache/* /tmp/* /var/tmp/*

###############################
# Build the FFmpeg-build image.
FROM alpine:${ALPINE_VERSION} AS build-ffmpeg
ARG FFMPEG_VERSION
ARG PREFIX=/usr/local
ARG MAKEFLAGS

# 合并 FFmpeg 构建命令
RUN apk add --no-cache \
    build-base \
    coreutils \
    freetype-dev \
    lame-dev \
    libogg-dev \
    libass \
    libass-dev \
    libvpx-dev \
    libvorbis-dev \
    libwebp-dev \
    libtheora-dev \
    openssl-dev \
    opus-dev \
    pkgconf \
    pkgconfig \
    rtmpdump-dev \
    wget \
    x264-dev \
    x265-dev \
    yasm \
    # 添加 edge 仓库并安装 fdk-aac-dev
    && echo http://dl-cdn.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories \
    && apk add --no-cache fdk-aac-dev \
    # 编译 FFmpeg
    && cd /tmp \
    && wget http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz \
    && tar zxf ffmpeg-${FFMPEG_VERSION}.tar.gz \
    && rm ffmpeg-${FFMPEG_VERSION}.tar.gz \
    && cd /tmp/ffmpeg-${FFMPEG_VERSION} \
    && ./configure \
        --prefix=${PREFIX} \
        --enable-version3 \
        --enable-gpl \
        --enable-nonfree \
        --enable-small \
        --enable-libmp3lame \
        --enable-libx264 \
        --enable-libx265 \
        --enable-libvpx \
        --enable-libtheora \
        --enable-libvorbis \
        --enable-libopus \
        --enable-libfdk-aac \
        --enable-libass \
        --enable-libwebp \
        --enable-postproc \
        --enable-libfreetype \
        --enable-openssl \
        --disable-debug \
        --disable-doc \
        --disable-ffplay \
        --extra-libs="-lpthread -lm" \
    && make \
    && make install \
    && make distclean \
    # 清理
    && rm -rf /var/cache/* /tmp/*

##########################
# Build the release image.
FROM alpine:${ALPINE_VERSION}
LABEL version="1.0" \
      description="NGINX RTMP Server" \
      maintainer="zhensolidsl"

# 设置环境变量，添加 ffmpeg 路径
ENV HTTP_PORT=80 \
    HTTPS_PORT=443 \
    RTMP_PORT=1935 \
    PATH="/usr/local/bin:${PATH}:/usr/local/nginx/sbin"

# 基础包安装
RUN apk update && \
    apk add --no-cache \
    ca-certificates \
    openssl \
    pcre

# 媒体相关包装
RUN apk add --no-cache \
    gettext \
    lame \
    libogg \
    curl \
    libass \
    libvpx \
    libvorbis \
    libwebp \
    libtheora \
    opus

# 编码工具安装
RUN apk add --no-cache \
    rtmpdump \
    x264-dev \
    x265-dev \
    ffmpeg \
    fdk-aac \
    fdk-aac-dev

# 时区设置
RUN apk add --no-cache tzdata && \
    mkdir -p /opt/data /www && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    apk del tzdata

# 创建必要的目录
RUN mkdir -p /opt/data/hls /www /var/log/nginx

# 复制构建产物
COPY --from=build-nginx /usr/local/nginx /usr/local/nginx
COPY --from=build-nginx /etc/nginx /etc/nginx
COPY --from=build-ffmpeg /usr/local /usr/local
COPY --from=build-ffmpeg /usr/lib/libfdk-aac.so.2 /usr/lib/libfdk-aac.so.2

# 复制配置文件和静态文件
COPY nginx.conf /etc/nginx/nginx.conf.template
COPY static /www/static

# 创建nginx用户和设置权限
RUN addgroup -S nginx && \
    adduser -S -G nginx nginx && \
    # 设置目录权限
    chown -R nginx:nginx /opt/data /www /usr/local/nginx /etc/nginx /var/log/nginx && \
    chmod -R 755 /opt/data && \
    # 确保 ffmpeg 在正确的位置并有正确的权限
    ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \
    chown root:nginx /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \
    chmod 755 /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \
    # 设置库文件权限
    chown -R root:nginx /usr/local/lib && \
    chmod -R 755 /usr/local/lib && \
    # 直接添加 nginx 用户到已存在的 video 组
    adduser nginx video && \
    # 确保日志目录存在并有正确权限
    touch /dev/stdout && \
    chown nginx:nginx /dev/stdout

# 声明数据卷
VOLUME ["/opt/data/hls"]

EXPOSE 1935 80

# 添加健康检查
HEALTHCHECK --interval=30s --timeout=3s \
    CMD curl -f http://localhost:${HTTP_PORT}/healthcheck || exit 1

CMD ["sh", "-c", "envsubst \"$(env | sed -e 's/=.*//' -e 's/^/\\$/g')\" < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf && nginx -g 'daemon off;'"]
