123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
FROM php:8.3-fpm-alpine3.22
LABEL maintainer="5q12"
LABEL description="5q12's Indexer - Secure file browser with s6-overlay (No Supervisor)"
LABEL version="2.0.0-r0"
LABEL alpine.version="3.22.1"
LABEL process.manager="s6-overlay-v3"
LABEL security.status="hardened"
ARG S6_OVERLAY_VERSION=3.1.6.2
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-x86_64.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz && \
tar -C / -Jxpf /tmp/s6-overlay-x86_64.tar.xz && \
rm -f /tmp/s6-overlay-*.tar.xz
RUN apk update && apk upgrade
RUN apk add --no-cache \
nginx \
sqlite \
sqlite-dev \
p7zip \
curl \
ca-certificates \
libzip-dev \
bash \
file \
tzdata \
cronie \
&& rm -rf /var/cache/apk/*
RUN docker-php-ext-install \
pdo_sqlite \
zip \
&& docker-php-ext-enable \
pdo_sqlite \
zip
RUN addgroup -g 1001 indexer && \
adduser -u 1001 -G indexer -s /bin/sh -D indexer
RUN if ! getent group www-data >/dev/null; then addgroup -g 82 -S www-data; fi && \
if ! getent passwd www-data >/dev/null; then adduser -u 82 -D -S -G www-data www-data; fi
RUN mkdir -p /www/indexer \
&& mkdir -p /var/log/nginx \
&& mkdir -p /run/nginx \
&& mkdir -p /run/php \
&& mkdir -p /config \
&& mkdir -p /app \
&& mkdir -p /files \
&& mkdir -p /container-app \
&& mkdir -p /tmp/sessions \
&& mkdir -p /var/log/cron \
&& chmod 1777 /tmp/sessions \
&& chmod 755 /var/log/cron
ENV PATH="/command:${PATH}"
RUN mkdir -p /etc/s6-overlay/s6-rc.d/nginx/{dependencies.d} \
/etc/s6-overlay/s6-rc.d/php-fpm/{dependencies.d} \
/etc/s6-overlay/s6-rc.d/crond/{dependencies.d} \
/etc/s6-overlay/s6-rc.d/init-indexer \
/etc/s6-overlay/s6-rc.d/user/contents.d \
/etc/s6-overlay/s6-rc.d/user2/contents.d
COPY docker/s6-services/ /etc/s6-overlay/s6-rc.d/
COPY docker/crontab/indexer-cron /etc/crontabs/www-data
RUN chmod +x /etc/s6-overlay/s6-rc.d/*/run 2>/dev/null || true \
&& chmod 644 /etc/s6-overlay/s6-rc.d/*/type \
&& chmod 644 /etc/s6-overlay/s6-rc.d/*/up 2>/dev/null || true \
&& chmod 600 /etc/crontabs/www-data \
&& chown www-data:www-data /etc/crontabs/www-data
ENV S6_BEHAVIOUR_IF_STAGE2_FAILS=2
ENV S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0
ENV S6_LOGGING=1
COPY docker/nginx.conf /etc/nginx/nginx.conf
COPY docker/5q12-indexer.conf /etc/nginx/http.d/default.conf
COPY docker/php-fpm.conf /usr/local/etc/php-fpm.d/www.conf
COPY source/ /container-app/source/
COPY source/index.php /www/indexer/
COPY source/config/config.json /container-app/default-config/
COPY source/config/config-reference.txt /container-app/default-config/
COPY source/config/ /container-app/default-app/
COPY docker/s6-services/ /etc/s6-overlay/s6-rc.d/
COPY docker/scripts/ /docker/scripts/
RUN chmod +x /docker/scripts/*.sh
RUN rm -rf /www/indexer/.indexer_files /www/indexer/files \
&& ln -sf /app /www/indexer/.indexer_files \
&& ln -sf /files /www/indexer/files
RUN chown -R www-data:www-data /www/indexer \
&& chown -R www-data:www-data /config \
&& chown -R www-data:www-data /app \
&& chown -R www-data:www-data /files \
&& chown -R www-data:www-data /container-app \
&& chown -R www-data:www-data /tmp/sessions \
&& chmod +x /etc/s6-overlay/s6-rc.d/*/run 2>/dev/null || true \
&& chmod 644 /www/indexer/index.php \
&& chmod -R 755 /www/indexer \
&& chmod -R 750 /config \
&& chmod -R 750 /app \
&& chmod -R 755 /files
RUN rm -rf /var/cache/apk/* /tmp/* && \
find / -type f -perm /u+s -exec chmod u-s {} \; 2>/dev/null || true && \
find / -type f -perm /g+s -exec chmod g-s {} \; 2>/dev/null || true
ENV DOCKER_ENV=true
ENV S6_BEHAVIOUR_IF_STAGE2_FAILS=2
ENV S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0
ENV S6_LOGGING=1
VOLUME ["/config", "/app", "/files"]
EXPOSE 5012
WORKDIR /www/indexer
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f --max-time 5 http://localhost:5012/ || exit 1
ENTRYPOINT ["/init"]
CMD []