diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..ff1f9ee4e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,213 @@ +# From https://github.com/sdr-enthusiasts/docker-baseimage/blob/bace2830cbb6d6de4bfe05a3116bc74cf5fea658/Dockerfile.base +FROM debian:bookworm-20230814-slim AS sdr-enthusiasts-baseimage + +ENV S6_BEHAVIOUR_IF_STAGE2_FAILS=2 \ + S6OVERLAY_VERSION="v3.1.5.0" \ + # Fix for any issues with the S6 overlay. We have quite a few legacy services + # that worked fine under v2, but v3 is more strict and will kill a startup process + # if it takes more than 5 seconds. tar1090 and rtlsdrairband are the hardest hit + # but we may have others. + S6_CMD_WAIT_FOR_SERVICES_MAXTIME="0" + +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# hadolint ignore=DL3008,SC2086 +RUN set -x && \ + TEMP_PACKAGES=() && \ + KEPT_PACKAGES=() && \ + # packages needed to install + TEMP_PACKAGES+=(git) && \ + # logging + KEPT_PACKAGES+=(gawk) && \ + KEPT_PACKAGES+=(pv) && \ + # required for S6 overlay + # curl kept for healthcheck + TEMP_PACKAGES+=(file) && \ + KEPT_PACKAGES+=(curl) && \ + TEMP_PACKAGES+=(xz-utils) && \ + KEPT_PACKAGES+=(ca-certificates) && \ + # bc for scripts and healthchecks + KEPT_PACKAGES+=(bc) && \ + # packages for network stuff + KEPT_PACKAGES+=(socat) && \ + KEPT_PACKAGES+=(ncat) && \ + KEPT_PACKAGES+=(net-tools) && \ + KEPT_PACKAGES+=(wget) && \ + # process management + KEPT_PACKAGES+=(procps) && \ + # needed to compile s6wrap: + TEMP_PACKAGES+=(gcc) && \ + TEMP_PACKAGES+=(build-essential) && \ + # install packages + ## Builder fixes... + mkdir -p /usr/sbin/ && \ + ln -s /usr/bin/dpkg-split /usr/sbin/dpkg-split && \ + ln -s /usr/bin/dpkg-deb /usr/sbin/dpkg-deb && \ + ln -s /bin/tar /usr/sbin/tar && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + "${KEPT_PACKAGES[@]}" \ + "${TEMP_PACKAGES[@]}" \ + && \ + # install S6 Overlay + curl --location --output /tmp/deploy-s6-overlay.sh https://raw.githubusercontent.com/mikenye/deploy-s6-overlay/master/deploy-s6-overlay-v3.sh && \ + sh /tmp/deploy-s6-overlay.sh && \ + rm -f /tmp/deploy-s6-overlay.sh && \ + # deploy healthchecks framework + git clone \ + --depth=1 \ + https://github.com/mikenye/docker-healthchecks-framework.git \ + /opt/healthchecks-framework \ + && \ + rm -rf \ + /opt/healthchecks-framework/.git* \ + /opt/healthchecks-framework/*.md \ + /opt/healthchecks-framework/tests \ + && \ + # fix healthchecks framework pathing + sed -i 's/S6_SERVICE_PATH="\/run\/s6\/services"/S6_SERVICE_PATH="\/run\/s6\/legacy-services"/g' /opt/healthchecks-framework/checks/check_s6_service_abnormal_death_tally.sh && \ + # Add s6wrap + pushd /tmp && \ + git clone --depth=1 https://github.com/wiedehopf/s6wrap.git && \ + cd s6wrap && \ + make && \ + mv s6wrap /usr/local/bin && \ + popd && \ + # Add additional stuff + mkdir -p /scripts /etc/cont-init.d && \ + curl -sSL https://raw.githubusercontent.com/sdr-enthusiasts/Buster-Docker-Fixes/main/install_libseccomp2.sh | bash && \ + chmod +x /etc/s6-overlay/s6-rc.d/libseccomp2/up && \ + chmod +x /etc/s6-overlay/scripts/libseccomp2_check.sh && \ + curl -sSL https://raw.githubusercontent.com/sdr-enthusiasts/docker-baseimage/main/scripts/common -o /scripts/common && \ + # Clean up + apt-get remove -y "${TEMP_PACKAGES[@]}" && \ + apt-get autoremove -y && \ + rm -rf /src/* /tmp/* /var/lib/apt/lists/* + +ENTRYPOINT [ "/init" ] + + +FROM node:slim AS acarshub-typescript-builder +# pushd/popd +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +ENV DOCKER_BUILD="true" + +#hadolint ignore=DL3008 +RUN set -xe && \ + apt-get update && \ + apt-get install -y --no-install-recommends make python3 g++ && \ + rm -rf /src/* /tmp/* /var/lib/apt/lists/* + +COPY acarshub-typescript/package.json /acarshub-typescript/package.json +COPY acarshub-typescript/package-lock.json /acarshub-typescript/package-lock.json + +RUN set -xe && \ + pushd /acarshub-typescript && \ + npm install + +COPY acarshub-typescript/ /acarshub-typescript/ + +RUN set -xe && \ + pushd /acarshub-typescript && \ + mkdir -p /webapp/static/images && \ + mkdir -p /webapp/static/js && \ + mkdir -p /webapp/static/sounds && \ + mkdir -p /webapp/templates && \ + npm run build && \ + cp -r ./dist/static/images /webapp/static/ && \ + cp -r ./dist/static/sounds /webapp/static/ && \ + cp -r ./dist/static/js /webapp/static/ && \ + mv ./dist/static/index.html /webapp/templates/ + +FROM sdr-enthusiasts-baseimage +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +COPY rootfs/webapp/requirements.txt /src/requirements.txt + +# hadolint ignore=DL3008,SC2086,DL3042,DL3013,SC1091 +RUN set -x && \ + TEMP_PACKAGES=() && \ + KEPT_PACKAGES=() && \ + # Required for building multiple packages. + TEMP_PACKAGES+=(build-essential) && \ + TEMP_PACKAGES+=(pkg-config) && \ + TEMP_PACKAGES+=(cmake) && \ + TEMP_PACKAGES+=(automake) && \ + TEMP_PACKAGES+=(autoconf) && \ + TEMP_PACKAGES+=(git) && \ + # Packages for nginx+python + KEPT_PACKAGES+=(nginx-light) && \ + TEMP_PACKAGES+=(python3-dev) && \ + KEPT_PACKAGES+=(python3-cryptography) && \ + KEPT_PACKAGES+=(python3) && \ + KEPT_PACKAGES+=(python3-pip) && \ + KEPT_PACKAGES+=(python3-setuptools) && \ + KEPT_PACKAGES+=(python3-wheel) && \ + # stats + KEPT_PACKAGES+=(rrdtool) && \ + TEMP_PACKAGES+=(librrd-dev) && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + "${KEPT_PACKAGES[@]}" \ + "${TEMP_PACKAGES[@]}"\ + && \ + pushd /src/ && \ + python3 -m pip install --no-cache-dir --break-system-packages \ + -r /src/requirements.txt \ + && \ + # Fix for Eventlet issues + apt-get \ + -o Dpkg::Options::='--force-confmiss' \ + install --reinstall --no-install-recommends -y \ + netbase \ + && \ + popd && \ + # Clean up + apt-get remove -y "${TEMP_PACKAGES[@]}" && \ + apt-get autoremove -y && \ + rm -rf /src/* /tmp/* /var/lib/apt/lists/* && \ + rm -rf /root/.cargo + +COPY --from=acarshub-typescript-builder /webapp/static/ /webapp/static/ +COPY --from=acarshub-typescript-builder /webapp/templates/ /webapp/templates/ + +RUN set -x && \ + mkdir -p /run/acars && \ + # grab the ground stations and other data from airframes + mkdir -p /webapp/data/ && \ + # Download the airframes Ground Station and ACARS Label data + pushd /webapp/data/ && \ + curl -O https://raw.githubusercontent.com/airframesio/data/master/json/vdl/ground-stations.json&& \ + curl -O https://raw.githubusercontent.com/airframesio/data/master/json/acars/metadata.json && \ + # Clean up + rm -rf /src/* /tmp/* /var/lib/apt/lists/* + +COPY rootfs/ / +COPY version-nextgen /acarshub-version + +EXPOSE 80 +EXPOSE 5550 +EXPOSE 5555 +EXPOSE 15550 +EXPOSE 15555 + +ENV FEED="" \ + ENABLE_ACARS="false" \ + ENABLE_VDLM="false" \ + ENABLE_ADSB="false" \ + ENABLE_WEB="true" \ + MIN_LOG_LEVEL=3 \ + QUIET_MESSAGES="true" \ + DB_SAVEALL="true" \ + ENABLE_RANGE_RINGS="true" \ + ADSB_URL="http://tar1090/data/aircraft.json" + + +# Add healthcheck +HEALTHCHECK --start-period=3600s --interval=600s CMD /scripts/healthcheck.sh + +ARG BUILD_EXTRA="Build git" +# append BUILD_EXTRA to the only line in /acarshub-version +RUN set -x && \ + echo "$(cat /acarshub-version) ${BUILD_EXTRA}" > /acarshub-version diff --git a/Dockerfile.acarshub b/Dockerfile.acarshub deleted file mode 100644 index e32aa68a3..000000000 --- a/Dockerfile.acarshub +++ /dev/null @@ -1,40 +0,0 @@ -# hadolint ignore=DL3007 -FROM ghcr.io/sdr-enthusiasts/docker-acarshub:nextgen - -ENV FEED="" \ - ENABLE_ACARS="false" \ - ENABLE_VDLM="false" \ - ENABLE_ADSB="false" \ - ENABLE_WEB="true" \ - MIN_LOG_LEVEL=3 \ - QUIET_MESSAGES="true" \ - DB_SAVEALL="true" \ - ENABLE_RANGE_RINGS="true" \ - ADSB_URL="http://tar1090/data/aircraft.json" - -SHELL ["/bin/bash", "-o", "pipefail", "-c"] - -# Copy needs to be prior to any curl/wget so SSL certs from GitHub runner are loaded -# Using the ADD commands makes it so we don't have to untar the archive in the RUN step -COPY rootfs/ / -ADD webapp.tar.gz / - -RUN set -x && \ - mkdir -p /run/acars && \ - # grab the ground stations and other data from airframes - mkdir -p /webapp/data/ && \ - # Download the airframes Ground Station and ACARS Label data - pushd /webapp/data/ && \ - curl -O https://raw.githubusercontent.com/airframesio/data/master/json/vdl/ground-stations.json&& \ - curl -O https://raw.githubusercontent.com/airframesio/data/master/json/acars/metadata.json && \ - # Clean up - rm -rf /src/* /tmp/* /var/lib/apt/lists/* - -EXPOSE 80 -EXPOSE 5550 -EXPOSE 5555 -EXPOSE 15550 -EXPOSE 15555 - -# Add healthcheck -HEALTHCHECK --start-period=3600s --interval=600s CMD /scripts/healthcheck.sh diff --git a/Dockerfile.acarshub-typescript b/Dockerfile.acarshub-typescript deleted file mode 100644 index 19f786eed..000000000 --- a/Dockerfile.acarshub-typescript +++ /dev/null @@ -1,26 +0,0 @@ -FROM node:20.5.1-slim AS acarshub-typescript-builder - -ENV DOCKER_BUILD="true" - -SHELL ["/bin/bash", "-o", "pipefail", "-c"] - -#hadolint ignore=DL3008 -RUN set -xe && \ - apt-get update && \ - apt-get install -y --no-install-recommends make python3 g++ && \ - rm -rf /src/* /tmp/* /var/lib/apt/lists/* - -COPY acarshub-typescript/package.json /acarshub-typescript/package.json -COPY acarshub-typescript/package-lock.json /acarshub-typescript/package-lock.json - -RUN set -xe && \ - pushd /acarshub-typescript && \ - npm install - -COPY acarshub-typescript/ /acarshub-typescript/ - -RUN set -xe && \ - pushd /acarshub-typescript && \ - mkdir -p ../rootfs/webapp/static/js/ && \ - npm run build && \ - npm run installer diff --git a/Dockerfile.nextgen b/Dockerfile.nextgen deleted file mode 100644 index a1300db1b..000000000 --- a/Dockerfile.nextgen +++ /dev/null @@ -1,44 +0,0 @@ -FROM ghcr.io/sdr-enthusiasts/docker-baseimage:python -SHELL ["/bin/bash", "-o", "pipefail", "-c"] - -COPY rootfs/webapp/requirements.txt /src/requirements.txt - -# hadolint ignore=DL3008,SC2086,DL3042,DL3013,SC1091 -RUN set -x && \ - TEMP_PACKAGES=() && \ - KEPT_PACKAGES=() && \ - # Required for building multiple packages. - TEMP_PACKAGES+=(build-essential) && \ - TEMP_PACKAGES+=(pkg-config) && \ - TEMP_PACKAGES+=(cmake) && \ - TEMP_PACKAGES+=(automake) && \ - TEMP_PACKAGES+=(autoconf) && \ - TEMP_PACKAGES+=(git) && \ - # Packages for nginx - KEPT_PACKAGES+=(nginx-light) && \ - TEMP_PACKAGES+=(python3-dev) && \ - KEPT_PACKAGES+=(python3-cryptography) && \ - # stats - KEPT_PACKAGES+=(rrdtool) && \ - TEMP_PACKAGES+=(librrd-dev) && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ - "${KEPT_PACKAGES[@]}" \ - "${TEMP_PACKAGES[@]}"\ - && \ - pushd /src/ && \ - python3 -m pip install --no-cache-dir --break-system-packages \ - -r /src/requirements.txt \ - && \ - # Fix for Eventlet issues - apt-get \ - -o Dpkg::Options::='--force-confmiss' \ - install --reinstall --no-install-recommends -y \ - netbase \ - && \ - popd && \ - # Clean up - apt-get remove -y "${TEMP_PACKAGES[@]}" && \ - apt-get autoremove -y && \ - rm -rf /src/* /tmp/* /var/lib/apt/lists/* && \ - rm -rf /root/.cargo diff --git a/rootfs/webapp/acarshub.py b/rootfs/webapp/acarshub.py index 9edbb79a6..ce27eff3e 100755 --- a/rootfs/webapp/acarshub.py +++ b/rootfs/webapp/acarshub.py @@ -447,7 +447,9 @@ def init_listeners(special_message=""): ) thread_scheduler = Thread(target=scheduled_tasks) thread_scheduler.start() - if not thread_html_generator.is_alive(): + + # check if 'g' is not in thread_html_generator + if not hasattr(thread_html_generator, "g"): acarshub_logging.log( f"{special_message}Starting htmlListener", "init", @@ -736,7 +738,7 @@ def main_connect(): acarshub_logging.acars_traceback(e, "webapp") # Start the htmlGenerator thread only if the thread has not been started before. - if not thread_html_generator.is_alive(): + if not hasattr(thread_html_generator, "g"): sys.stdout.flush() thread_html_generator_event.clear() thread_html_generator = socketio.start_background_task(htmlListener) diff --git a/rootfs/webapp/requirements.txt b/rootfs/webapp/requirements.txt index e7d6c6f85..380284c15 100644 --- a/rootfs/webapp/requirements.txt +++ b/rootfs/webapp/requirements.txt @@ -1,7 +1,7 @@ eventlet==0.33.3 Flask==2.3.3 Flask-SocketIO==5.3.5 -gunicorn[eventlet] @ git+https://github.com/benoitc/gunicorn.git@48eda22a4b3399b0a65677619b4938503cc207cb +gunicorn[eventlet]==21.2.0 pyrtlsdr==0.3.0 requests==2.31.0 rrdtool==0.1.16