diff --git a/.env.scripts b/.env.scripts index a4e0495..bce7fc9 100644 --- a/.env.scripts +++ b/.env.scripts @@ -1,10 +1,10 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202604221922-git +##@Version : 202605311110-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : MIT # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Wed Apr 22 07:22:44 PM EDT 2026 +# @@Created : Sun May 31 11:10:17 AM EDT 2026 # @@File : .env.scripts # @@Description : Variables for gen-dockerfile and buildx scripts # @@Changelog : newScript @@ -25,24 +25,25 @@ DOCKER_ENTYPOINT_HEALTH_ENDPOINTS="$DOCKER_ENTYPOINT_HEALTH_ENDPOINTS" # - - - - - - - - - - - - - - - - - - - - - - - - - # Dockerfile info ENV_DOCKERFILE="Dockerfile" -ENV_IMAGE_NAME="rust" +# ENV_REGISTRY_REPO: Registry repository/image name +ENV_REGISTRY_REPO="rust" ENV_USE_TEMPLATE="alpine" # - - - - - - - - - - - - - - - - - - - - - - - - - # Maintainer info -ENV_ORG_NAME="casjaysdevdocker" +ENV_REGISTRY_ORG="dockersrc" ENV_VENDOR="CasjaysDev" ENV_AUTHOR="CasjaysDev" ENV_MAINTAINER="CasjaysDev " # - - - - - - - - - - - - - - - - - - - - - - - - - # Repository URLs (Full URLs) # ENV_GIT_REPO_URL: Complete Git repository URL for source code -ENV_GIT_REPO_URL="https://github.com/casjaysdevdocker/rust" -# ENV_REGISTRY_URL: Complete registry URL for reference (NOT used for pushing) -ENV_REGISTRY_URL="https://hub.docker.com/casjaysdevdocker/rust" +ENV_GIT_REPO_URL="https://github.com/dockersrc/rust" +# ENV_REGISTRY_URL: Registry provider base URL (for example https://docker.io) +ENV_REGISTRY_URL="https://docker.io" # - - - - - - - - - - - - - - - - - - - - - - - - - # Push Configuration -# ENV_IMAGE_PUSH: Complete push destination (this IS used for pushing) -ENV_IMAGE_PUSH="casjaysdevdocker/rust" +# ENV_REGISTRY_PUSH: Complete push destination derived from registry/org/repo +ENV_REGISTRY_PUSH="casjaysdev/rust" # ENV_IMAGE_TAG: Default tag for the image ENV_IMAGE_TAG="latest" # ENV_ADD_TAGS: Additional tags, comma-separated (USE_DATE = auto date tag) @@ -62,7 +63,7 @@ SERVICE_PORT="" EXPOSE_PORTS="" # - - - - - - - - - - - - - - - - - - - - - - - - - # IF using a lanuage such as go, php, rust, ruby, etc set the version here. -LANG_VERSION="rust" +LANG_VERSION="" # - - - - - - - - - - - - - - - - - - - - - - - - - # Versions PHP_VERSION="system" @@ -76,7 +77,8 @@ DEFAULT_DATA_DIR="/usr/local/share/template-files/data" DEFAULT_CONF_DIR="/usr/local/share/template-files/config" DEFAULT_TEMPLATE_DIR="/usr/local/share/template-files/defaults" # - - - - - - - - - - - - - - - - - - - - - - - - - -ENV_PACKAGES="git make bash tini ca-certificates openssh-client curl wget tar tzdata jq build-base gcc clang lld musl-dev pkgconf cmake perl openssl-dev libffi-dev zlib-dev linux-headers protobuf protobuf-dev mingw-w64-gcc binaryen wabt zig" +ENV_PACKAGES="bash tini bash-completion git curl wget sudo unzip iproute2 openrc ssmtp openssl jq tzdata mailcap ncurses util-linux pciutils usbutils coreutils binutils findutils grep rsync zip py3-pip procps net-tools sed gawk attr readline lsof less shadow ca-certificates" # - - - - - - - - - - - - - - - - - - - - - - - - - # ex: ts=2 sw=2 et filetype=sh # - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/.gitattributes b/.gitattributes index 07f3b95..b6611c7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ -# Template generated on Sat Nov 29 11:57:12 AM EST 2025 from https://github.com/alexkaratarakis/gitattributes" +# Template generated on Sun May 17 10:58:44 PM EDT 2026 from https://github.com/alexkaratarakis/gitattributes" # Common settings that generally should always be used with your language specific settings # Auto detect text files and perform LF normalization * text=auto diff --git a/.gitea/workflows/docker.yaml b/.gitea/workflows/docker.yaml index e350cd7..fde34ed 100644 --- a/.gitea/workflows/docker.yaml +++ b/.gitea/workflows/docker.yaml @@ -19,13 +19,20 @@ jobs: - name: Get Meta id: meta run: | - echo DATE_TAG=$(date +'%y%m') >> $GITHUB_OUTPUT - echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT - echo DOCKER_ORG=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $1}') >> $GITHUB_OUTPUT - echo DOCKER_TAG=$([ -n "$DOCKER_TAG" ] && echo ${DOCKER_TAG} || echo "latest") >> $GITHUB_OUTPUT - echo DOCKER_HUB=$([ -n "$DOCKER_HUB" ] && echo ${DOCKER_HUB} || echo "docker.io") >> $GITHUB_OUTPUT - echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}' | sed 's|^docker-||g') >> $GITHUB_OUTPUT - echo "$DOCKER_HUB/$DOCKER_ORG/$REPO_NAME:$DOCKER_TAG" + repo_version="$(git describe --tags --always)" + repo_version="${repo_version#v}" + docker_org="${GITHUB_REPOSITORY%%/*}" + repo_name="${GITHUB_REPOSITORY#*/}" + repo_name="${repo_name#docker-}" + docker_tag="${DOCKER_TAG:-latest}" + docker_hub="${DOCKER_HUB:-docker.io}" + printf 'DATE_TAG=%s\n' "$(date +'%y%m')" >> "$GITHUB_OUTPUT" + printf 'REPO_VERSION=%s\n' "$repo_version" >> "$GITHUB_OUTPUT" + printf 'DOCKER_ORG=%s\n' "$docker_org" >> "$GITHUB_OUTPUT" + printf 'DOCKER_TAG=%s\n' "$docker_tag" >> "$GITHUB_OUTPUT" + printf 'DOCKER_HUB=%s\n' "$docker_hub" >> "$GITHUB_OUTPUT" + printf 'REPO_NAME=%s\n' "$repo_name" >> "$GITHUB_OUTPUT" + printf '%s\n' "$docker_hub/$docker_org/$repo_name:$docker_tag" - name: Set up Docker BuildX uses: docker/setup-buildx-action@v2 @@ -58,3 +65,4 @@ jobs: tags: | ${{ steps.meta.outputs.DOCKER_HUB }}/${{ steps.meta.outputs.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.DATE_TAG }} ${{ steps.meta.outputs.DOCKER_HUB }}/${{ steps.meta.outputs.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.DOCKER_TAG }} + diff --git a/.gitignore b/.gitignore index 0058ea8..3958960 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,177 @@ $RECYCLE.BIN/ **/*.rewrite.sh **/*.refactor.sh + +# Backup files left by editors + +# Temporary files left when a process holds an open handle to a deleted file + + + +# NFS stale file handles + +.DS_Store + + + + + + +# Crash dump files + +# Core dumps (Linux/macOS) +core +core.* +vgcore.* + + + + + +### Editors ### +# Visual Studio Code +.vscode/ +!.vscode/extensions.json + +# JetBrains IDEs (IntelliJ, GoLand, RustRover, PyCharm, etc.) +.idea/ +*.iml +*.iws +*.ipr + +# Vim / Neovim +*.swp +*.swo +.netrwhist +Session.vim +.vim/ + +# Sublime Text +*.sublime-workspace +*.sublime-project + +# Eclipse / generic Java IDEs +.project +.classpath +.factorypath +.settings/ + +### AI tool local configs (personal settings, never commit) ### +# Claude Code +.claude/settings.local.json +.claude/*.lock + +# Cursor +.cursor/ +.cursorignore +.cursorindexingignore + +# GitHub Copilot +.copilot/ + +# Codeium +.codeium/ + +# Tabnine +.tabnine/ + +# Aider +.aider/ +.aider.conf.yml +.aider.model.settings.yml +.aiderignore + +# General AI assistant local state +.ai/ +.ai.local/ + +### Environment and secrets ### +# Local env overrides — never commit credentials +.env +.env.local +.env.*.local + +# Private keys and certificates +*.pem +*.key +*.p12 +*.pfx + +### Build artifacts ### +build/ +dist/ +out/ + +# Rust +target/ + +# C / C++ / compiled objects +*.o +*.a +*.so +*.dylib +*.dll +*.exe + +### Dependency directories ### +# Node +node_modules/ + +# Go (vendored deps are sometimes committed intentionally, so gitignore only the cache) +# vendor/ + +# Python +__pycache__/ +*.pyc +*.pyo +*.pyd +.Python +*.egg-info/ +.eggs/ +.venv/ +venv/ +env/ + +### Logs ### +*.log +logs/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +### Temporary and cache ### +tmp/ +.tmp/ +*.tmp +*.cache +.cache/ + +### Test and coverage ### +coverage/ +.coverage +*.cover +*.coverprofile +htmlcov/ +.nyc_output/ +.pytest_cache/ +.tox/ + +### Misc — always allow ### + +### Project-specific patterns ### +# ignore commit message files + +# ignore backup files + + + +# ignore .installed marker files + +# ignore work-in-progress rewrite/refactor scripts + +# ignore local override scripts and configs +**/*.local.sh +**/*.local.conf +**/*.local.yaml +**/*.local.yml + diff --git a/Dockerfile b/Dockerfile index 164893f..c072f48 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # Docker image for rust using the alpine template ARG IMAGE_NAME="rust" ARG PHP_SERVER="rust" -ARG BUILD_DATE="202604221922" +ARG BUILD_DATE="202605311109" ARG LANGUAGE="en_US.UTF-8" ARG TIMEZONE="America/New_York" ARG WWW_ROOT_DIR="/usr/local/share/httpd/default" @@ -20,7 +20,7 @@ ARG PHP_VERSION="system" ARG NODE_VERSION="system" ARG NODE_MANAGER="system" -ARG IMAGE_REPO="casjaysdevdocker/rust" +ARG IMAGE_REPO="casjaysdev/rust" ARG IMAGE_VERSION="latest" ARG CONTAINER_VERSION="" @@ -54,19 +54,16 @@ ARG PHP_SERVER ARG SHELL_OPTS ARG PATH -ARG PACK_LIST="git make bash tini ca-certificates openssh-client curl wget tar tzdata jq build-base gcc clang lld musl-dev pkgconf cmake perl openssl-dev libffi-dev zlib-dev linux-headers protobuf protobuf-dev mingw-w64-gcc binaryen wabt zig" +ARG PACK_LIST="bash tini bash-completion git curl wget sudo unzip iproute2 openrc ssmtp openssl jq tzdata mailcap ncurses util-linux pciutils usbutils coreutils binutils findutils grep rsync zip py3-pip procps net-tools sed gawk attr readline lsof less shadow ca-certificates " ENV ENV=~/.profile ENV SHELL="/bin/sh" -ENV PATH="/usr/local/share/cargo/bin:${PATH}" +ENV PATH="${PATH}" ENV TZ="${TIMEZONE}" ENV TIMEZONE="${TZ}" ENV LANG="${LANGUAGE}" ENV TERM="xterm-256color" ENV HOSTNAME="casjaysdevdocker-rust" -ENV CARGO_HOME="/usr/local/share/cargo" -ENV RUSTUP_HOME="/usr/local/share/rustup" -ENV RUSTUP_TOOLCHAIN="stable" USER ${USER} WORKDIR /root @@ -121,7 +118,7 @@ RUN echo "Updating system files "; \ echo 'hosts: files dns' >"/etc/nsswitch.conf"; \ [ "$PHP_VERSION" = "system" ] && PHP_VERSION="php" || true; \ PHP_BIN="$(command -v ${PHP_VERSION} 2>/dev/null || true)"; \ - PHP_FPM="$(ls /usr/*bin/php*fpm* 2>/dev/null || true)"; \ + set -- /usr/*bin/php*fpm*; [ -e "$1" ] && PHP_FPM="$1" || PHP_FPM=""; \ pip_bin="$(command -v python3 2>/dev/null || command -v python2 2>/dev/null || command -v python 2>/dev/null || true)"; \ py_version="$(command $pip_bin --version | sed 's|[pP]ython ||g' | awk -F '.' '{print $1$2}' | grep '[0-9]' || true)"; \ [ "$py_version" -gt "310" ] && pip_opts="--break-system-packages " || pip_opts=""; \ @@ -178,7 +175,7 @@ RUN echo "Deleting unneeded files"; \ rm -rf /lib/systemd/system/sockets.target.wants/*udev* || true; \ rm -rf /lib/systemd/system/sockets.target.wants/*initctl* || true; \ rm -Rf /usr/share/doc/* /var/tmp/* /var/cache/*/* /root/.cache/* /usr/share/info/* /tmp/* || true; \ - if [ -d "/lib/systemd/system/sysinit.target.wants" ];then cd "/lib/systemd/system/sysinit.target.wants" && rm -f $(ls | grep -v systemd-tmpfiles-setup);fi; \ + if [ -d "/lib/systemd/system/sysinit.target.wants" ];then cd "/lib/systemd/system/sysinit.target.wants" && for want_file in *; do [ "$want_file" = "systemd-tmpfiles-setup" ] || rm -f "$want_file"; done; fi; \ if [ -f "/root/docker/setup/07-cleanup.sh" ];then echo "Running the cleanup script";/root/docker/setup/07-cleanup.sh||{ echo "Failed to execute /root/docker/setup/07-cleanup.sh" >&2 && exit 10; };echo "Done running the cleanup script";fi; \ echo "" @@ -210,7 +207,7 @@ ARG LICENSE="WTFPL" ARG ENV_PORTS="${EXPOSE_PORTS}" USER ${USER} -WORKDIR /app +WORKDIR /root LABEL maintainer="CasjaysDev " LABEL org.opencontainers.image.vendor="CasjaysDev" @@ -222,17 +219,17 @@ LABEL org.opencontainers.image.authors="${LICENSE}" LABEL org.opencontainers.image.created="${BUILD_DATE}" LABEL org.opencontainers.image.version="${BUILD_VERSION}" LABEL org.opencontainers.image.schema-version="${BUILD_VERSION}" -LABEL org.opencontainers.image.url="https://hub.docker.com/casjaysdevdocker/rust" -LABEL org.opencontainers.image.source="https://hub.docker.com/casjaysdevdocker/rust" +LABEL org.opencontainers.image.url="https://docker.io/casjaysdev/rust" +LABEL org.opencontainers.image.source="https://docker.io/casjaysdev/rust" LABEL org.opencontainers.image.vcs-type="Git" LABEL org.opencontainers.image.revision="${GIT_COMMIT}" -LABEL org.opencontainers.image.source="https://github.com/casjaysdevdocker/rust" -LABEL org.opencontainers.image.documentation="https://github.com/casjaysdevdocker/rust" +LABEL org.opencontainers.image.source="https://github.com/dockersrc/rust" +LABEL org.opencontainers.image.documentation="https://github.com/dockersrc/rust" LABEL com.github.containers.toolbox="false" ENV ENV=~/.bashrc ENV USER="${USER}" -ENV PATH="/usr/local/share/cargo/bin:${PATH}" +ENV PATH="${PATH}" ENV TZ="${TIMEZONE}" ENV SHELL="/bin/bash" ENV TIMEZONE="${TZ}" @@ -248,13 +245,10 @@ ENV NODE_MANAGER="${NODE_MANAGER}" ENV PHP_VERSION="${PHP_VERSION}" ENV DISTRO_VERSION="${IMAGE_VERSION}" ENV WWW_ROOT_DIR="${WWW_ROOT_DIR}" -ENV CARGO_HOME="/usr/local/share/cargo" -ENV RUSTUP_HOME="/usr/local/share/rustup" -ENV RUSTUP_TOOLCHAIN="stable" COPY --from=build /. / -VOLUME [ "/config","/data","/usr/local/share/cargo","/usr/local/share/rustup" ] +VOLUME [ "/config","/data" ] EXPOSE ${SERVICE_PORT} ${ENV_PORTS} @@ -262,3 +256,4 @@ STOPSIGNAL SIGRTMIN+3 ENTRYPOINT [ "tini", "-p", "SIGTERM","--", "/usr/local/bin/entrypoint.sh" ] HEALTHCHECK --start-period=10m --interval=5m --timeout=15s CMD [ "/usr/local/bin/entrypoint.sh", "healthcheck" ] + diff --git a/rootfs/etc/profile.d/rust.sh b/rootfs/etc/profile.d/rust.sh deleted file mode 100644 index 7887ae2..0000000 --- a/rootfs/etc/profile.d/rust.sh +++ /dev/null @@ -1,17 +0,0 @@ -# Rust environment - sourced by /etc/profile for interactive login shells. -# -# All Rust state lives under /usr/local/share/cargo (registry, target -# cache, user-installed cargo binaries) and /usr/local/share/rustup -# (toolchains and components), both declared as Docker VOLUMEs. The -# paths /root/.cargo, /root/.rustup, /data/cargo, /data/rustup are -# symlinks to these locations so any of them can be used interchangeably -# and the data persists across container rebuilds with named volumes. - -export CARGO_HOME="${CARGO_HOME:-/usr/local/share/cargo}" -export RUSTUP_HOME="${RUSTUP_HOME:-/usr/local/share/rustup}" -export RUSTUP_TOOLCHAIN="${RUSTUP_TOOLCHAIN:-stable}" - -case ":${PATH}:" in - *":${CARGO_HOME}/bin:"*) ;; - *) export PATH="${CARGO_HOME}/bin:${PATH}" ;; -esac diff --git a/rootfs/root/docker/setup/00-init.sh b/rootfs/root/docker/setup/00-init.sh index bbbbdcf..4d5bbdc 100755 --- a/rootfs/root/docker/setup/00-init.sh +++ b/rootfs/root/docker/setup/00-init.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605242100-git +##@Version : 202605311104-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : MIT # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Sun May 24 09:00:28 PM EDT 2026 +# @@Created : Sun May 31 11:04:48 AM EDT 2026 # @@File : 00-init.sh # @@Description : script to run init # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/01-system.sh b/rootfs/root/docker/setup/01-system.sh index 9ff5168..ea08c06 100755 --- a/rootfs/root/docker/setup/01-system.sh +++ b/rootfs/root/docker/setup/01-system.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605242100-git +##@Version : 202605311104-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : MIT # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Sun May 24 09:00:28 PM EDT 2026 +# @@Created : Sun May 31 11:04:49 AM EDT 2026 # @@File : 01-system.sh # @@Description : script to run system # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/02-packages.sh b/rootfs/root/docker/setup/02-packages.sh index da760ba..d3f8b7e 100755 --- a/rootfs/root/docker/setup/02-packages.sh +++ b/rootfs/root/docker/setup/02-packages.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605242139-git +##@Version : 202605311104-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : MIT # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Sun May 24 09:00:29 PM EDT 2026 +# @@Created : Sun May 31 11:04:49 AM EDT 2026 # @@File : 02-packages.sh # @@Description : script to run packages # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/03-files.sh b/rootfs/root/docker/setup/03-files.sh index 2493bab..7dde952 100755 --- a/rootfs/root/docker/setup/03-files.sh +++ b/rootfs/root/docker/setup/03-files.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605242100-git +##@Version : 202605311104-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : MIT # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Sun May 24 09:00:30 PM EDT 2026 +# @@Created : Sun May 31 11:04:49 AM EDT 2026 # @@File : 03-files.sh # @@Description : script to run files # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/04-users.sh b/rootfs/root/docker/setup/04-users.sh index 1308ca2..4868589 100755 --- a/rootfs/root/docker/setup/04-users.sh +++ b/rootfs/root/docker/setup/04-users.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605242100-git +##@Version : 202605311104-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : MIT # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Sun May 24 09:00:31 PM EDT 2026 +# @@Created : Sun May 31 11:04:49 AM EDT 2026 # @@File : 04-users.sh # @@Description : script to run users # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/05-custom.sh b/rootfs/root/docker/setup/05-custom.sh index 4870bb6..042a104 100755 --- a/rootfs/root/docker/setup/05-custom.sh +++ b/rootfs/root/docker/setup/05-custom.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605242100-git +##@Version : 202605311104-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : MIT # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Sun May 24 09:00:31 PM EDT 2026 +# @@Created : Sun May 31 11:04:50 AM EDT 2026 # @@File : 05-custom.sh # @@Description : script to run custom # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/06-post.sh b/rootfs/root/docker/setup/06-post.sh index 2005b29..007addf 100755 --- a/rootfs/root/docker/setup/06-post.sh +++ b/rootfs/root/docker/setup/06-post.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605242100-git +##@Version : 202605311104-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : MIT # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Sun May 24 09:00:32 PM EDT 2026 +# @@Created : Sun May 31 11:04:51 AM EDT 2026 # @@File : 06-post.sh # @@Description : script to run post # @@Changelog : newScript diff --git a/rootfs/root/docker/setup/07-cleanup.sh b/rootfs/root/docker/setup/07-cleanup.sh index 350c27c..d503843 100755 --- a/rootfs/root/docker/setup/07-cleanup.sh +++ b/rootfs/root/docker/setup/07-cleanup.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605242100-git +##@Version : 202605311104-git # @@Author : CasjaysDev # @@Contact : CasjaysDev # @@License : MIT # @@Copyright : Copyright 2026 CasjaysDev -# @@Created : Sun May 24 09:00:33 PM EDT 2026 +# @@Created : Sun May 31 11:04:52 AM EDT 2026 # @@File : 07-cleanup.sh # @@Description : script to run cleanup # @@Changelog : newScript diff --git a/rootfs/usr/local/bin/copy b/rootfs/usr/local/bin/copy deleted file mode 100755 index e9878d8..0000000 --- a/rootfs/usr/local/bin/copy +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env sh -# shellcheck shell=sh -# - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605051306-git -# @@Author : Jason Hempstead -# @@Contact : jason@casjaysdev.pro -# @@License : WTFPL -# @@ReadME : copy --help -# @@Copyright : Copyright: (c) 2026 Jason Hempstead, Casjays Developments -# @@Created : Tuesday, May 05, 2026 13:06 EDT -# @@File : copy -# @@Description : copies a file and shows progress -# @@Changelog : Refactored for self-contained operation -# @@TODO : Better documentation -# @@Other : -# @@Resource : -# @@Terminal App : no -# @@sudo/root : no -# @@Template : shell/sh -# - - - - - - - - - - - - - - - - - - - - - - - - - -# shellcheck disable=SC1001,SC1003,SC2001,SC2003,SC2016,SC2031,SC2090,SC2115,SC2120,SC2155,SC2199,SC2229,SC2317,SC2329 -# - - - - - - - - - - - - - - - - - - - - - - - - - -APPNAME="$(basename -- "$0" 2>/dev/null)" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# colorization -if [ -n "$NO_COLOR" ]; then - __printf_color() { printf '%b' "$1\n" | tr -d '\t' | sed '/^%b$/d;s,\x1B\[ 0-9;]*[a-zA-Z],,g'; } -else - __printf_color() { { [ -z "$2" ] || DEFAULT_COLOR=$2; } && printf "%b" "$(tput setaf "$DEFAULT_COLOR" 2>/dev/null)" "$1\n" "$(tput sgr0 2>/dev/null)"; } -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -__unlink() { [ -L "$1" ] && rm -f -- "$1" >/dev/null; } -# - - - - - - - - - - - - - - - - - - - - - - - - - -# custom functions -__copy() { - exitCode=0 - if [ -d "$1" ]; then - __printf_color "Copying $1/* to $2/" - __unlink "$2" - mkdir -p "$2" - for f in "$1"/* "$1"/.[!.]* "$1"/..?*; do - [ -e "$f" ] || [ -L "$f" ] || continue - base=$(basename -- "$f") - __copy "$f" "$2/$base" || exitCode=$? - done - elif [ -f "$1" ] || [ -L "$1" ]; then - __printf_color "Copying $1 to $2" - __unlink "$2" - cp -Rf "$1" "$2" - exitCode=$? - fi - return $exitCode -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Define variables -DEFAULT_COLOR="254" -COPY_EXIT_STATUS=0 -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Main application -if [ $# -ne 2 ]; then - __printf_color "USAGE: $APPNAME to from" "1" >&2 - COPY_EXIT_STATUS=1 -elif [ ! -e "$1" ]; then - __printf_color "$1 does not exist" >&2 - COPY_EXIT_STATUS=2 -else - __printf_color "Copying $1 to $2" "4" - __copy "$1" "$2" >/dev/null - COPY_EXIT_STATUS=$? -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# End application -# - - - - - - - - - - - - - - - - - - - - - - - - - -# lets exit with code -# - - - - - - - - - - - - - - - - - - - - - - - - - -exit $COPY_EXIT_STATUS -# - - - - - - - - - - - - - - - - - - - - - - - - - -# ex: ts=2 sw=2 et filetype=sh diff --git a/rootfs/usr/local/bin/entrypoint.sh b/rootfs/usr/local/bin/entrypoint.sh index 140e9ec..55da5fb 100755 --- a/rootfs/usr/local/bin/entrypoint.sh +++ b/rootfs/usr/local/bin/entrypoint.sh @@ -1,15 +1,15 @@ #!/usr/bin/env bash # shellcheck shell=bash # - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605241245-git +##@Version : 202605260122-git # @@Author : Jason Hempstead # @@Contact : jason@casjaysdev.pro -# @@License : WTFPL +# @@License : LICENSE.md # @@ReadME : entrypoint.sh --help # @@Copyright : Copyright: (c) 2026 Jason Hempstead, Casjays Developments -# @@Created : Sunday, May 24, 2026 21:00 EDT +# @@Created : Sunday, May 31, 2026 11:04 EDT # @@File : entrypoint.sh -# @@Description : Entrypoint file for alpine +# @@Description : Entrypoint file for rust # @@Changelog : New script # @@TODO : Better documentation # @@Other : @@ -39,7 +39,7 @@ PATH="/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin" # - - - - - - - - - - - - - - - - - - - - - - - - - # Set bash options SCRIPT_FILE="$0" -CONTAINER_NAME="alpine" +CONTAINER_NAME="rust" SCRIPT_NAME="${SCRIPT_FILE##*/}" CONTAINER_NAME="${ENV_CONTAINER_NAME:-$CONTAINER_NAME}" # - - - - - - - - - - - - - - - - - - - - - - - - - @@ -61,7 +61,7 @@ case "$1" in # Help message -h | --help) shift 1 - echo 'Docker container for '$CONTAINER_NAME'' + echo "Docker container for $CONTAINER_NAME" echo "Usage: $CONTAINER_NAME [help tail cron exec start init shell procs ports healthcheck backup command]" echo "" exit 0 @@ -95,8 +95,8 @@ SERVICE_UID="${SERVICE_UID:-0}" SERVICE_GID="${SERVICE_GID:-0}" # - - - - - - - - - - - - - - - - - - - - - - - - - # User and group in which the service switches to - IE: nginx,apache,mysql,postgres -#SERVICE_USER="${SERVICE_USER:-alpine}" # execute command as another user -#SERVICE_GROUP="${SERVICE_GROUP:-alpine}" # Set the service group +#SERVICE_USER="${SERVICE_USER:-rust}" # execute command as another user +#SERVICE_GROUP="${SERVICE_GROUP:-rust}" # Set the service group # - - - - - - - - - - - - - - - - - - - - - - - - - # Secondary ports # specifiy other ports @@ -294,7 +294,7 @@ fi if [ "$ENTRYPOINT_FIRST_RUN" != "no" ]; then if [ "$CONFIG_DIR_INITIALIZED" = "no" ] || [ "$DATA_DIR_INITIALIZED" = "no" ]; then if [ "$ENTRYPOINT_MESSAGE" = "yes" ]; then - echo "Executing entrypoint script for alpine" + echo "Executing entrypoint script for rust" fi fi # - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rootfs/usr/local/bin/healthcheck b/rootfs/usr/local/bin/healthcheck deleted file mode 100755 index 8dab380..0000000 --- a/rootfs/usr/local/bin/healthcheck +++ /dev/null @@ -1,249 +0,0 @@ -#!/usr/bin/env sh -# shellcheck shell=sh -# - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605051654-git -# @@Author : Jason Hempstead -# @@Contact : jason@casjaysdev.pro -# @@License : WTFPL -# @@ReadME : healthcheck --help -# @@Copyright : Copyright: (c) 2026 Jason Hempstead, Casjays Developments -# @@Created : Tuesday, May 05, 2026 16:54 EDT -# @@File : healthcheck -# @@Description : Docker container healthcheck — HTTP/TCP/process/file checks -# @@Changelog : Rewrote as a real Docker HEALTHCHECK probe -# @@TODO : Better documentation -# @@Other : -# @@Resource : -# @@Terminal App : no -# @@sudo/root : no -# @@Template : shell/sh -# - - - - - - - - - - - - - - - - - - - - - - - - - -# shellcheck disable=SC1001,SC1003,SC2001,SC2003,SC2016,SC2031,SC2090,SC2115,SC2120,SC2155,SC2199,SC2229,SC2317,SC2329 -# - - - - - - - - - - - - - - - - - - - - - - - - - -APPNAME="$(basename -- "$0" 2>/dev/null)" -VERSION="202605051654-git" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Defaults (env vars override built-ins, CLI flags override env vars) -HEALTHCHECK_URL="${HEALTHCHECK_URL:-}" -HEALTHCHECK_HTTP_STATUS="${HEALTHCHECK_HTTP_STATUS:-2,3}" -HEALTHCHECK_HOST="${HEALTHCHECK_HOST:-127.0.0.1}" -HEALTHCHECK_PORT="${HEALTHCHECK_PORT:-}" -HEALTHCHECK_PROCESS="${HEALTHCHECK_PROCESS:-}" -HEALTHCHECK_FILE="${HEALTHCHECK_FILE:-}" -HEALTHCHECK_FILE_MAX_AGE="${HEALTHCHECK_FILE_MAX_AGE:-}" -HEALTHCHECK_TIMEOUT="${HEALTHCHECK_TIMEOUT:-5}" -HEALTHCHECK_VERBOSE="${HEALTHCHECK_VERBOSE:-}" -# - - - - - - - - - - - - - - - - - - - - - - - - - -__cmd_exists() { command -v "$1" >/dev/null 2>&1; } -__log() { [ -n "$HEALTHCHECK_VERBOSE" ] && printf '%s\n' "$*" >&2; return 0; } -__fail() { printf 'UNHEALTHY: %s\n' "$*" >&2; exit 1; } -# - - - - - - - - - - - - - - - - - - - - - - - - - -__usage() { - cat <&2; __usage >&2; exit 1 ;; - *) printf 'Unexpected argument: %s\n' "$1" >&2; exit 1 ;; - esac -done -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Individual checks — each prints why it failed and exits 1 on failure -__trim() { printf '%s' "$1" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'; } - -__check_one_http() { - url="$1"; accepted="$2"; timeout="$3" - if __cmd_exists curl; then - code="$(curl -ksSL -o /dev/null -w '%{http_code}' --max-time "$timeout" "$url" 2>/dev/null)" \ - || __fail "HTTP request to $url failed (curl error)" - elif __cmd_exists wget; then - code="$(wget -q -S --spider --timeout="$timeout" --tries=1 "$url" 2>&1 \ - | awk '/^ HTTP\// {c=$2} END {print c+0}')" - [ "$code" -gt 0 ] 2>/dev/null || __fail "HTTP request to $url failed (wget error)" - else - __fail "HTTP check requires curl or wget" - fi - IFS=',' - for prefix in $accepted; do - case "$code" in - "$prefix"*) unset IFS; __log "HTTP ok: $url -> $code"; return 0 ;; - esac - done - unset IFS - __fail "HTTP $url returned $code (expected prefix in: $accepted)" -} - -__check_http() { - urls="$1"; accepted="$2"; timeout="$3" - __log "HTTP: urls=$urls (timeout=${timeout}s, accept=${accepted})" - IFS=',' - for u in $urls; do - unset IFS - u="$(__trim "$u")" - [ -n "$u" ] || { IFS=','; continue; } - __check_one_http "$u" "$accepted" "$timeout" - IFS=',' - done - unset IFS - return 0 -} - -__check_one_tcp() { - host="$1"; port="$2"; timeout="$3" - if __cmd_exists nc; then - nc -z -w "$timeout" "$host" "$port" >/dev/null 2>&1 && { __log "TCP ok: $host:$port"; return 0; } - fi - if __cmd_exists ncat; then - ncat -z -w "${timeout}s" "$host" "$port" >/dev/null 2>&1 && { __log "TCP ok (ncat): $host:$port"; return 0; } - fi - # Last resort: bash /dev/tcp (only if bash is available; sh-only systems skip) - if __cmd_exists bash; then - bash -c "exec 3<>/dev/tcp/$host/$port" >/dev/null 2>&1 && { __log "TCP ok (bash): $host:$port"; return 0; } - fi - return 1 -} - -__check_tcp() { - host="$1"; ports="$2"; timeout="$3" - __log "TCP: host=$host ports=$ports (timeout=${timeout}s)" - IFS=',' - for p in $ports; do - unset IFS - p="$(__trim "$p")" - [ -n "$p" ] || { IFS=','; continue; } - __check_one_tcp "$host" "$p" "$timeout" || __fail "TCP $host:$p not reachable" - IFS=',' - done - unset IFS - return 0 -} - -__check_one_process() { - pattern="$1" - if __cmd_exists pgrep; then - # Match against process name (not full cmdline) so our own argv doesn't self-match - pgrep -- "$pattern" >/dev/null 2>&1 && return 0 - else - # Portable fallback: ps -o comm= prints just the command name - ps -e -o comm= 2>/dev/null | grep -v -e "^grep$" -e "^$APPNAME$" | grep -q -- "$pattern" && return 0 - fi - return 1 -} - -__check_process() { - patterns="$1" - __log "Process: patterns=$patterns" - IFS=',' - for p in $patterns; do - unset IFS - p="$(__trim "$p")" - [ -n "$p" ] || { IFS=','; continue; } - __check_one_process "$p" || __fail "Process not running: $p" - __log "Process ok: $p" - IFS=',' - done - unset IFS - return 0 -} - -__check_one_file() { - path="$1"; max_age="$2" - [ -e "$path" ] || __fail "File not found: $path" - if [ -n "$max_age" ]; then - now="$(date +%s)" - mtime="$(stat -c %Y "$path" 2>/dev/null || stat -f %m "$path" 2>/dev/null \ - || perl -e 'print((stat(shift))[9])' "$path" 2>/dev/null)" - [ -n "$mtime" ] || __fail "Cannot determine mtime of $path" - age=$(( now - mtime )) - [ "$age" -le "$max_age" ] || __fail "File $path is stale (age=${age}s, max=${max_age}s)" - fi - __log "File ok: $path" - return 0 -} - -__check_file() { - paths="$1"; max_age="$2" - __log "File: paths=$paths max_age=${max_age:-none}" - IFS=',' - for f in $paths; do - unset IFS - f="$(__trim "$f")" - [ -n "$f" ] || { IFS=','; continue; } - __check_one_file "$f" "$max_age" - IFS=',' - done - unset IFS - return 0 -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Run checks -ran_any=0 -[ -n "$HEALTHCHECK_URL" ] && { __check_http "$HEALTHCHECK_URL" "$HEALTHCHECK_HTTP_STATUS" "$HEALTHCHECK_TIMEOUT"; ran_any=1; } -[ -n "$HEALTHCHECK_PORT" ] && { __check_tcp "$HEALTHCHECK_HOST" "$HEALTHCHECK_PORT" "$HEALTHCHECK_TIMEOUT"; ran_any=1; } -[ -n "$HEALTHCHECK_PROCESS" ] && { __check_process "$HEALTHCHECK_PROCESS"; ran_any=1; } -[ -n "$HEALTHCHECK_FILE" ] && { __check_file "$HEALTHCHECK_FILE" "$HEALTHCHECK_FILE_MAX_AGE"; ran_any=1; } - -[ "$ran_any" -eq 1 ] || __fail "no checks configured (set HEALTHCHECK_URL/PORT/PROCESS/FILE or pass --url/--port/--process/--file)" - -__log "All checks passed" -exit 0 -# - - - - - - - - - - - - - - - - - - - - - - - - - -# ex: ts=2 sw=2 et filetype=sh diff --git a/rootfs/usr/local/bin/symlink b/rootfs/usr/local/bin/symlink deleted file mode 100755 index ac2db15..0000000 --- a/rootfs/usr/local/bin/symlink +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env sh -# shellcheck shell=sh -# - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202605051306-git -# @@Author : Jason Hempstead -# @@Contact : jason@casjaysdev.pro -# @@License : WTFPL -# @@ReadME : symlink --help -# @@Copyright : Copyright: (c) 2026 Jason Hempstead, Casjays Developments -# @@Created : Tuesday, May 05, 2026 13:06 EDT -# @@File : symlink -# @@Description : -# @@Changelog : New script -# @@TODO : Better documentation -# @@Other : -# @@Resource : -# @@Terminal App : no -# @@sudo/root : no -# @@Template : shell/sh -# - - - - - - - - - - - - - - - - - - - - - - - - - -# shellcheck disable=SC1001,SC1003,SC2001,SC2003,SC2016,SC2031,SC2090,SC2115,SC2120,SC2155,SC2199,SC2229,SC2317,SC2329 -# - - - - - - - - - - - - - - - - - - - - - - - - - -APPNAME="$(basename -- "$0" 2>/dev/null)" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# colorization -if [ -n "$NO_COLOR" ]; then - __printf_color() { printf '%b' "$1\n" | tr -d '\t' | sed '/^%b$/d;s,\x1B\[ 0-9;]*[a-zA-Z],,g'; } -else - __printf_color() { { [ -z "$2" ] || DEFAULT_COLOR=$2; } && printf "%b" "$(tput setaf "$DEFAULT_COLOR" 2>/dev/null)" "$1\n" "$(tput sgr0 2>/dev/null)"; } -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -__unlink() { [ -L "$1" ] && rm -f -- "$1" >/dev/null; } -# - - - - - - - - - - - - - - - - - - - - - - - - - -# custom functions -__ln_sf() { - exitCode=0 - if [ -d "$1" ] && [ ! -L "$1" ]; then - __printf_color "symlinking contents of $1 into $2/" "4" - __unlink "$2" - mkdir -p "$2" - for f in "$1"/* "$1"/.[!.]* "$1"/..?*; do - [ -e "$f" ] || [ -L "$f" ] || continue - base=$(basename -- "$f") - __ln_sf "$f" "$2/$base" || exitCode=$? - done - else - __printf_color "symlinking $2 to $1" "4" - __unlink "$2" - ln -sf "$1" "$2" - exitCode=$? - fi - return $exitCode -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Define variables -DEFAULT_COLOR="254" -SYMLINK_EXIT_STATUS=0 -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Main application -if [ $# -ne 2 ]; then - __printf_color "USAGE: $APPNAME from to" "2" >&2 - SYMLINK_EXIT_STATUS=1 -elif [ ! -e "$1" ]; then - __printf_color "$1 does not exist" >&2 - SYMLINK_EXIT_STATUS=2 -else - __ln_sf "$1" "$2" >/dev/null - SYMLINK_EXIT_STATUS=$? -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# End application -# - - - - - - - - - - - - - - - - - - - - - - - - - -# lets exit with code -# - - - - - - - - - - - - - - - - - - - - - - - - - -exit $SYMLINK_EXIT_STATUS -# - - - - - - - - - - - - - - - - - - - - - - - - - -# ex: ts=2 sw=2 et filetype=sh diff --git a/rootfs/usr/local/etc/docker/init.d/00-rust.sh b/rootfs/usr/local/etc/docker/init.d/00-rust.sh deleted file mode 100755 index 9d534ae..0000000 --- a/rootfs/usr/local/etc/docker/init.d/00-rust.sh +++ /dev/null @@ -1,958 +0,0 @@ -#!/usr/bin/env bash -# shellcheck shell=bash -# - - - - - - - - - - - - - - - - - - - - - - - - - -##@Version : 202602061352-git -# @@Author : Jason Hempstead -# @@Contact : jason@casjaysdev.pro -# @@License : WTFPL -# @@ReadME : 00-go.sh --help -# @@Copyright : Copyright: (c) 2026 Jason Hempstead, Casjays Developments -# @@Created : Wednesday, Apr 22, 2026 19:24 EDT -# @@File : 00-go.sh -# @@Description : -# @@Changelog : New script -# @@TODO : Better documentation -# @@Other : -# @@Resource : -# @@Terminal App : no -# @@sudo/root : no -# @@Template : other/start-service -# - - - - - - - - - - - - - - - - - - - - - - - - - -# shellcheck disable=SC1001,SC1003,SC2001,SC2003,SC2016,SC2031,SC2090,SC2115,SC2120,SC2155,SC2199,SC2229,SC2317,SC2329 -# - - - - - - - - - - - - - - - - - - - - - - - - - -set -e -# - - - - - - - - - - - - - - - - - - - - - - - - - -# run trap command on exit -trap '__trap_err_handler' ERR -trap 'retVal=$?;if [ "$SERVICE_IS_RUNNING" != "yes" ] && [ -f "$SERVICE_PID_FILE" ]; then rm -Rf "$SERVICE_PID_FILE"; fi;exit $retVal' SIGINT SIGTERM SIGPWR -# - - - - - - - - - - - - - - - - - - - - - - - - - -# ERR trap handler - smart about critical vs non-critical errors -__trap_err_handler() { - local retVal=$? - local command="$BASH_COMMAND" - # Ignore SIGPIPE and user interrupts - [ $retVal -eq 130 ] || [ $retVal -eq 141 ] && return $retVal - # Non-critical: file operations, text processing, user/group operations - if [[ "$command" =~ (mkdir|touch|chmod|chown|chgrp|ln|cp|mv|rm|echo|printf|cat|tee|sed|awk|grep|find|sort|uniq|adduser|addgroup|usermod|groupmod|id|getent) ]]; then - return 0 - fi - # Non-critical: conditional checks that might fail - if [[ "$command" =~ (test|\[|\[\[|kill -0|pgrep|pidof|ps) ]]; then - return 0 - fi - # Critical error - but only fail if service hasn't started yet - if [ "$SERVICE_IS_RUNNING" != "yes" ]; then - echo "❌ Critical error (exit $retVal): $command" >&2 - kill -TERM 1 2>/dev/null || exit $retVal - fi - return 0 -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -SCRIPT_FILE="$0" -SERVICE_NAME="rust" -SCRIPT_NAME="${SCRIPT_FILE##*/}" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Function to exit appropriately based on context -__script_exit() { - local exit_code="${1:-0}" - if [ "${BASH_SOURCE[0]}" != "${0}" ]; then - # Script is being sourced - use return - return "$exit_code" - else - # Script is being executed - use exit - exit "$exit_code" - fi -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Exit if service is disabled -if [ -n "$RUST_APPNAME_ENABLED" ]; then - if [ "$RUST_APPNAME_ENABLED" != "yes" ]; then - export SERVICE_DISABLED="$SERVICE_NAME" - __script_exit 0 - fi -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# setup debugging - https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html -[ -f "/config/.debug" ] && [ -z "$DEBUGGER_OPTIONS" ] && export DEBUGGER_OPTIONS="$(<"/config/.debug")" || DEBUGGER_OPTIONS="${DEBUGGER_OPTIONS:-}" -{ [ "$DEBUGGER" = "on" ] || [ -f "/config/.debug" ]; } && echo "Enabling debugging" && set -xo pipefail -x$DEBUGGER_OPTIONS && export DEBUGGER="on" || set -o pipefail -# - - - - - - - - - - - - - - - - - - - - - - - - - -export PATH="/usr/local/share/cargo/bin:/usr/local/etc/docker/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# import the functions file -if [ -f "/usr/local/etc/docker/functions/entrypoint.sh" ]; then - . "/usr/local/etc/docker/functions/entrypoint.sh" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# import variables -for set_env in "/root/env.sh" "/usr/local/etc/docker/env"/*.sh "/config/env"/*.sh; do - if [ -f "$set_env" ]; then - . "$set_env" - fi -done -# - - - - - - - - - - - - - - - - - - - - - - - - - -# exit if __start_init_scripts function hasn't been Initialized -if [ ! -f "/run/.start_init_scripts.pid" ]; then - echo "__start_init_scripts function hasn't been Initialized" >&2 - SERVICE_IS_RUNNING="no" - __script_exit 1 -fi -# Clean up any stale PID file for this service on startup -if [ -n "$SERVICE_NAME" ] && [ -f "/run/init.d/$SERVICE_NAME.pid" ]; then - old_pid=$(cat "/run/init.d/$SERVICE_NAME.pid" 2>/dev/null) - if [ -n "$old_pid" ] && ! kill -0 "$old_pid" 2>/dev/null; then - echo "🧹 Removing stale PID file for $SERVICE_NAME" - rm -f "/run/init.d/$SERVICE_NAME.pid" - fi -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Custom functions - -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Script to execute -START_SCRIPT="/usr/local/etc/docker/exec/$SERVICE_NAME" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Reset environment before executing service -RESET_ENV="no" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Set webroot -WWW_ROOT_DIR="/usr/local/share/httpd/default" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Default predefined variables -# set data directory -# Empty to avoid clobbering the /data/go -> /usr/local/share/go symlink -# created in __run_precopy. This image is a build env, not a service -# with a per-instance data dir. -DATA_DIR="" -# set config directory -CONF_DIR="/config/rust" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# set the containers etc directory -ETC_DIR="/etc/rust" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# set the var dir -VAR_DIR="" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# set the temp dir -TMP_DIR="/tmp/rust" -# set scripts pid dir -RUN_DIR="/run/rust" -# set log directory -LOG_DIR="/data/logs/rust" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Set the working dir -WORK_DIR="" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# port which service is listening on -SERVICE_PORT="" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# User to use to launch service - IE: postgres -# normally root -RUNAS_USER="root" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# User and group in which the service switches to - IE: nginx,apache,mysql,postgres -# execute command as another user -#SERVICE_USER="go" -# Set the service group -#SERVICE_GROUP="go" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Set password length -RANDOM_PASS_USER="" -RANDOM_PASS_ROOT="" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Set user and group ID -# set the user id -SERVICE_UID="0" -# set the group id -SERVICE_GID="0" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# execute command variables - keep single quotes variables will be expanded later -# command to execute -# This is a build environment, not a daemon. Leave EXEC_CMD_BIN empty so -# the init pipeline finishes after __post_execute and the container idles -# via tini+entrypoint. -EXEC_CMD_BIN='' -# command arguments -EXEC_CMD_ARGS='' -# execute script before -EXEC_PRE_SCRIPT='' -# Set to 'no' for configuration services (no daemon process), leave blank for actual services -SERVICE_USES_PID='' -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Is this service a web server -IS_WEB_SERVER="no" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Is this service a database server -IS_DATABASE_SERVICE="no" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Does this service use a database server -USES_DATABASE_SERVICE="no" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Set defualt type - [custom,sqlite,redis,postgres,mariadb,mysql,couchdb,mongodb,supabase] -DATABASE_SERVICE_TYPE="sqlite" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Show message before execute -PRE_EXEC_MESSAGE="" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Set the wait time to execute __post_execute function - minutes -# 0 because this is a build environment, not a service - the container -# idles after init and there's no daemon to wait for. -POST_EXECUTE_WAIT_TIME="0" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Update path var -PATH="$PATH:." -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Lets get containers ip address -IP4_ADDRESS="$(__get_ip4)" -IP6_ADDRESS="$(__get_ip6)" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Where to save passwords to -# directory to save username/password for root user -ROOT_FILE_PREFIX="/config/secure/auth/root" -# directory to save username/password for normal user -USER_FILE_PREFIX="/config/secure/auth/user" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# root/admin user info password/random] -# root user name -root_user_name="${RUST_ROOT_USER_NAME:-}" -# root user password -root_user_pass="${RUST_ROOT_PASS_WORD:-}" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Normal user info [password/random] -# normal user name -user_name="${RUST_USER_NAME:-}" -# normal user password -user_pass="${RUST_USER_PASS_WORD:-}" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Load variables from config -# Generated by my dockermgr script -if [ -f "/config/env/rust.script.sh" ]; then - . "/config/env/rust.script.sh" -fi -# Overwrite the variables -if [ -f "/config/env/rust.sh" ]; then - . "/config/env/rust.sh" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Additional predefined variables - -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Additional variables - -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Specifiy custom directories to be created -ADD_APPLICATION_FILES="" -ADD_APPLICATION_DIRS="/data/build /app /work /root/app /root/project /usr/local/share/cargo /usr/local/share/cargo/bin /usr/local/share/cargo/registry /usr/local/share/cargo/git /usr/local/share/cargo/target /usr/local/share/rustup" -# - - - - - - - - - - - - - - - - - - - - - - - - - -APPLICATION_FILES="$LOG_DIR/$SERVICE_NAME.log" -APPLICATION_DIRS="$ETC_DIR $CONF_DIR $DATA_DIR $LOG_DIR $TMP_DIR $RUN_DIR $VAR_DIR" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Additional config dirs - will be Copied to /etc/$name -ADDITIONAL_CONFIG_DIRS="" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# define variables that need to be loaded into the service - escape quotes - var=\"value\",other=\"test\" -CMD_ENV="" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Overwrite based on file/directory - -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Per Application Variables or imports - -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Custom commands to run before copying to /config -__run_precopy() { - # Define environment - local hostname=${HOSTNAME} - if [ ! -d "/run/healthcheck" ]; then - mkdir -p "/run/healthcheck" - fi - # Point /data/cargo and /data/rustup at the canonical persistent Rust - # state dirs. Done at runtime because /data is a volume mount and only - # exists once the container starts. Skip if either path is already a - # real, populated dir (legacy upgrade path - leave user data alone). - mkdir -p /usr/local/share/cargo /usr/local/share/rustup /data - if [ ! -e /data/cargo ] || [ -L /data/cargo ]; then - ln -sfn /usr/local/share/cargo /data/cargo - fi - if [ ! -e /data/rustup ] || [ -L /data/rustup ]; then - ln -sfn /usr/local/share/rustup /data/rustup - fi - # Define actions/commands - - # allow custom functions - if builtin type -t __run_precopy_local | grep -q 'function'; then - __run_precopy_local - fi -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Custom prerun functions - IE setup WWW_ROOT_DIR -__execute_prerun() { - # Define environment - local hostname=${HOSTNAME} - # Define actions/commands - - # allow custom functions - if builtin type -t __execute_prerun_local | grep -q 'function'; then - __execute_prerun_local - fi -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Run any pre-execution checks -__run_pre_execute_checks() { - # Set variables - local exitStatus=0 - # message to show at start - local pre_execute_checks_MessageST="Running preexecute check for $SERVICE_NAME" - # message to show at completion - local pre_execute_checks_MessageEnd="Finished preexecute check for $SERVICE_NAME" - __banner "$pre_execute_checks_MessageST" - # Put command to execute in parentheses - { - true - } - exitStatus=$? - __banner "$pre_execute_checks_MessageEnd: Status $exitStatus" - - # show exit message - if [ $exitStatus -ne 0 ]; then - echo "The pre-execution check has failed" >&2 - if [ -f "$SERVICE_PID_FILE" ]; then - rm -Rf "$SERVICE_PID_FILE" - fi - __script_exit 1 - fi - # allow custom functions - if builtin type -t __run_pre_execute_checks_local | grep -q 'function'; then - __run_pre_execute_checks_local - fi - # exit function - return $exitStatus -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# use this function to update config files - IE: change port -__update_conf_files() { - # default exit code - local exitCode=0 - # set hostname - local sysname="${SERVER_NAME:-${FULL_DOMAIN_NAME:-$HOSTNAME}}" - # - - - - - - - - - - - - - - - - - - - - - - - - - - # delete files - #__rm "" - - # - - - - - - - - - - - - - - - - - - - - - - - - - - # custom commands - - # - - - - - - - - - - - - - - - - - - - - - - - - - - # replace variables - # __replace "" "" "$CONF_DIR/go.conf" - # replace variables recursively - # __find_replace "" "" "$CONF_DIR" - - # - - - - - - - - - - - - - - - - - - - - - - - - - - # define actions - - # allow custom functions - if builtin type -t __update_conf_files_local | grep -q 'function'; then - __update_conf_files_local - fi - # exit function - return $exitCode -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# function to run before executing -__pre_execute() { - # default exit code - local exitCode=0 - # set hostname - local sysname="${SERVER_NAME:-${FULL_DOMAIN_NAME:-$HOSTNAME}}" - # execute if directories is empty - # __is_dir_empty "$CONF_DIR" && true - # - - - - - - - - - - - - - - - - - - - - - - - - - - # define actions to run after copying to /config - - # - - - - - - - - - - - - - - - - - - - - - - - - - - # unset unneeded variables - unset sysname - # Lets wait a few seconds before continuing - sleep 2 - # allow custom functions - if builtin type -t __pre_execute_local | grep -q 'function'; then - __pre_execute_local - fi - # exit function - return $exitCode -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# function to run after executing -__post_execute() { - # init pid var - local pid="" - # set default exit code - local retVal=0 - # how long to wait before executing - local ctime=${POST_EXECUTE_WAIT_TIME:-1} - # convert minutes to seconds - local waitTime=$((ctime * 60)) - # message to show at start - local postMessageST="Running post commands for $SERVICE_NAME" - # message to show at completion - local postMessageEnd="Finished post commands for $SERVICE_NAME" - # wait - sleep $waitTime - # execute commands after waiting - ( - # show message - __banner "$postMessageST" - # commands to execute - sleep 5 - # show exit message - __banner "$postMessageEnd: Status $retVal" - ) 2>"/dev/stderr" | tee -p -a "/data/logs/init.txt" & - pid=$! - if ps ax | awk '{print $1}' | grep -v grep | grep -q "$execPid$"; then - retVal=0 - else - retVal=10 - fi - # allow custom functions - if builtin type -t __post_execute_local | grep -q 'function'; then - __post_execute_local - fi - # exit function - return $retVal -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# use this function to update config files - IE: change port -__pre_message() { - local exitCode=0 - if [ -n "$PRE_EXEC_MESSAGE" ]; then - eval echo "$PRE_EXEC_MESSAGE" - fi - # execute commands - - # allow custom functions - if builtin type -t __pre_message_local | grep -q 'function'; then - __pre_message_local - fi - # exit function - return $exitCode -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# use this function to setup ssl support -__update_ssl_conf() { - local exitCode=0 - local sysname="${SERVER_NAME:-${FULL_DOMAIN_NAME:-$HOSTNAME}}" - # execute commands - - # allow custom functions - if builtin type -t __update_ssl_conf_local | grep -q 'function'; then - __update_ssl_conf_local - fi - # set exitCode - return $exitCode -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -__create_service_env() { - local exitCode=0 - if [ ! -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ]; then - cat </dev/null -# - - - - - - - - - - - - - - - - - - - - - - - - - -# root/admin user info [password/random] -#ENV_ROOT_USER_NAME="${ENV_ROOT_USER_NAME:-$RUST_ROOT_USER_NAME}" # root user name -#ENV_ROOT_USER_PASS="${ENV_ROOT_USER_NAME:-$RUST_ROOT_PASS_WORD}" # root user password -#root_user_name="${ENV_ROOT_USER_NAME:-$root_user_name}" # -#root_user_pass="${ENV_ROOT_USER_PASS:-$root_user_pass}" # -# - - - - - - - - - - - - - - - - - - - - - - - - - -#Normal user info [password/random] -#ENV_USER_NAME="${ENV_USER_NAME:-$RUST_USER_NAME}" # -#ENV_USER_PASS="${ENV_USER_PASS:-$RUST_USER_PASS_WORD}" # -#user_name="${ENV_USER_NAME:-$user_name}" # normal user name -#user_pass="${ENV_USER_PASS:-$user_pass}" # normal user password - -EOF - fi - if [ ! -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.local.sh" ]; then - # - - - - - - - - - - - - - - - - - - - - - - - - - - __run_precopy_local() { true; } - # - - - - - - - - - - - - - - - - - - - - - - - - - - __execute_prerun_local() { true; } - # - - - - - - - - - - - - - - - - - - - - - - - - - - __run_pre_execute_checks_local() { true; } - # - - - - - - - - - - - - - - - - - - - - - - - - - - __update_conf_files_local() { true; } - # - - - - - - - - - - - - - - - - - - - - - - - - - - __pre_execute_local() { true; } - # - - - - - - - - - - - - - - - - - - - - - - - - - - __post_execute_local() { true; } - # - - - - - - - - - - - - - - - - - - - - - - - - - - __pre_message_local() { true; } - # - - - - - - - - - - - - - - - - - - - - - - - - - - __update_ssl_conf_local() { true; } - # - - - - - - - - - - - - - - - - - - - - - - - - - - fi - if ! __file_exists_with_content "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"; then - exitCode=$((exitCode + 1)) - fi - if ! __file_exists_with_content "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.local.sh"; then - exitCode=$((exitCode + 1)) - fi - return $exitCode -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# script to start server -__run_start_script() { - local runExitCode=0 - # expand variables - local workdir="$(eval echo "${WORK_DIR:-}")" - # expand variables - local cmd="$(eval echo "${EXEC_CMD_BIN:-}")" - # expand variables - local args="$(eval echo "${EXEC_CMD_ARGS:-}")" - # expand variables - local name="$(eval echo "${EXEC_CMD_NAME:-}")" - # expand variables - local pre="$(eval echo "${EXEC_PRE_SCRIPT:-}")" - # expand variables - local extra_env="$(eval echo "${CMD_ENV//,/ }")" - # expand variables - local lc_type="$(eval echo "${LANG:-${LC_ALL:-$LC_CTYPE}}")" - # expand variables - local home="$(eval echo "${workdir//\/root/\/tmp\/docker}")" - # expand variables - local path="$(eval echo "$PATH")" - # expand variables - local message="$(eval echo "")" - local sysname="${SERVER_NAME:-${FULL_DOMAIN_NAME:-$HOSTNAME}}" - if [ -f "$CONF_DIR/$SERVICE_NAME.exec_cmd.sh" ]; then - . "$CONF_DIR/$SERVICE_NAME.exec_cmd.sh" - fi - # - if [ -z "$cmd" ]; then - __post_execute 2>"/dev/stderr" | tee -p -a "/data/logs/init.txt" - retVal=$? - __log_info "Initialization of $SCRIPT_NAME has completed" - __script_exit $retVal - else - # ensure the command exists - if [ ! -x "$cmd" ]; then - __log_error "$name is not a valid executable" - return 2 - fi - # check and exit if already running (respects SERVICE_USES_PID in __proc_check) - if __proc_check "$name" || __proc_check "$cmd"; then - __log_debug "Service $name is already running" - return 0 - else - # - - - - - - - - - - - - - - - - - - - - - - - - - - # show message if env exists - if [ -n "$cmd" ]; then - if [ -n "$SERVICE_USER" ]; then - __log_info "Setting up $cmd to run as $SERVICE_USER" - else - SERVICE_USER="root" - fi - if [ -n "$SERVICE_PORT" ]; then - __log_info "$name will be running on port $SERVICE_PORT" - else - SERVICE_PORT="" - fi - fi - if [ -n "$pre" ] && [ -n "$(command -v "$pre" 2>/dev/null)" ]; then - export cmd_exec="$pre $cmd $args" - message="Starting service: $name $args through $pre" - else - export cmd_exec="$cmd $args" - message="Starting service: $name $args" - fi - if [ -n "$su_exec" ]; then - __log_debug "Using $su_exec" | tee -a -p "/data/logs/init.txt" - fi - __log_info "$message" | tee -a -p "/data/logs/init.txt" - su_cmd touch "$SERVICE_PID_FILE" - if [ "$RESET_ENV" = "yes" ]; then - env_command="$(echo "env -i HOME=\"$home\" LC_CTYPE=\"$lc_type\" PATH=\"$path\" HOSTNAME=\"$sysname\" USER=\"${SERVICE_USER:-$RUNAS_USER}\" $extra_env")" - execute_command="$(__trim "$su_exec $env_command $cmd_exec")" - if [ ! -f "$START_SCRIPT" ]; then - cat <"$START_SCRIPT" -#!/usr/bin/env bash -trap 'exitCode=\$?;[ \$exitCode -ne 0 ] && [ -f "\$SERVICE_PID_FILE" ] && rm -Rf "\$SERVICE_PID_FILE";exit \$exitCode' EXIT -# -set -Eeo pipefail -# Setting up $cmd to run as ${SERVICE_USER:-root} with env -retVal=10 -cmd="$cmd" -args="$args" -SERVICE_NAME="$SERVICE_NAME" -SERVICE_PID_FILE="$SERVICE_PID_FILE" -LOG_DIR="$LOG_DIR" -execute_command="$execute_command" -\$execute_command 2>"/dev/stderr" >>"\$LOG_DIR/\$SERVICE_NAME.log" & -execPid=\$! -sleep 1 -checkPID="\$(ps ax | awk '{print \$1}' | grep -v grep | grep "\$execPid$" || false)" -[ -n "\$execPid" ] && [ -n "\$checkPID" ] && echo "\$execPid" >"\$SERVICE_PID_FILE" && retVal=0 || retVal=10 -[ "\$retVal" = 0 ] && printf '%s\n' "\$SERVICE_NAME: \$execPid" >"/run/healthcheck/\$SERVICE_NAME" || echo "Failed to start $execute_command" >&2 -exit \$retVal - -EOF - fi - else - if [ ! -f "$START_SCRIPT" ]; then - execute_command="$(__trim "$su_exec $cmd_exec")" - cat <"$START_SCRIPT" -#!/usr/bin/env bash -trap 'exitCode=\$?;[ \$exitCode -ne 0 ] && [ -f "\$SERVICE_PID_FILE" ] && rm -Rf "\$SERVICE_PID_FILE";exit \$exitCode' EXIT -# -set -Eeo pipefail -# Setting up $cmd to run as ${SERVICE_USER:-root} -retVal=10 -cmd="$cmd" -args="$args" -SERVICE_NAME="$SERVICE_NAME" -SERVICE_PID_FILE="$SERVICE_PID_FILE" -LOG_DIR="$LOG_DIR" -execute_command="$execute_command" -\$execute_command 2>>"/dev/stderr" >>"\$LOG_DIR/\$SERVICE_NAME.log" & -execPid=\$! -sleep 1 -checkPID="\$(ps ax | awk '{print \$1}' | grep -v grep | grep "\$execPid$" || false)" -[ -n "\$execPid" ] && [ -n "\$checkPID" ] && echo "\$execPid" >"\$SERVICE_PID_FILE" && retVal=0 || retVal=10 -[ "\$retVal" = 0 ] || echo "Failed to start $execute_command" >&2 -exit \$retVal - -EOF - fi - fi - fi - if [ ! -x "$START_SCRIPT" ]; then - chmod 755 -Rf "$START_SCRIPT" - fi - if [ "$CONTAINER_INIT" != "yes" ]; then - eval sh -c "$START_SCRIPT" - runExitCode=$? - fi - fi - return $runExitCode -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# username and password actions -__run_secure_function() { - local filesperms - if [ -n "$user_name" ] || [ -n "$user_pass" ]; then - for filesperms in "${USER_FILE_PREFIX}"/*; do - if [ -e "$filesperms" ]; then - chmod -Rf 600 "$filesperms" - chown -Rf $SERVICE_USER:$SERVICE_USER "$filesperms" 2>/dev/null - fi - done 2>/dev/null | tee -p -a "/data/logs/init.txt" - fi - if [ -n "$root_user_name" ] || [ -n "$root_user_pass" ]; then - for filesperms in "${ROOT_FILE_PREFIX}"/*; do - if [ -e "$filesperms" ]; then - chmod -Rf 600 "$filesperms" - chown -Rf $SERVICE_USER:$SERVICE_USER "$filesperms" 2>/dev/null - fi - done 2>/dev/null | tee -p -a "/data/logs/init.txt" - fi - unset filesperms -} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Allow ENV_ variable - Import env file -if __file_exists_with_content "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh"; then - . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" -fi -if __file_exists_with_content "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.local.sh"; then - . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.local.sh" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# default exit code -SERVICE_EXIT_CODE=0 -# application specific -EXEC_CMD_NAME="${EXEC_CMD_BIN##*/}" -SERVICE_PID_FILE="/run/init.d/$EXEC_CMD_NAME.pid" -SERVICE_PID_NUMBER="$(__pgrep "$EXEC_CMD_NAME" 2>/dev/null || echo '')" -if type -P "$EXEC_CMD_BIN" &>/dev/null; then - EXEC_CMD_BIN="$(type -P "$EXEC_CMD_BIN")" -fi -if type -P "$EXEC_PRE_SCRIPT" &>/dev/null; then - EXEC_PRE_SCRIPT="$(type -P "$EXEC_PRE_SCRIPT")" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Only run check -if __check_service "$1"; then - SERVICE_IS_RUNNING=yes -else - SERVICE_IS_RUNNING="no" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# ensure needed directories exists -if [ ! -d "$LOG_DIR" ]; then - mkdir -p "$LOG_DIR" -fi -if [ ! -d "$RUN_DIR" ]; then - mkdir -p "$RUN_DIR" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# create auth directories -if [ -n "$USER_FILE_PREFIX" ]; then - if [ ! -d "$USER_FILE_PREFIX" ]; then - mkdir -p "$USER_FILE_PREFIX" - fi -fi -if [ -n "$ROOT_FILE_PREFIX" ]; then - if [ ! -d "$ROOT_FILE_PREFIX" ]; then - mkdir -p "$ROOT_FILE_PREFIX" - fi -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -if [ -z "$RUNAS_USER" ]; then - RUNAS_USER="root" -fi -if [ -z "$SERVICE_USER" ]; then - SERVICE_USER="$RUNAS_USER" -fi -if [ -z "$SERVICE_GROUP" ]; then - SERVICE_GROUP="${SERVICE_USER:-$RUNAS_USER}" -fi -if [ "$IS_WEB_SERVER" = "yes" ]; then - RESET_ENV="yes" - __is_htdocs_mounted -fi -if [ "$IS_WEB_SERVER" = "yes" ] && [ -z "$SERVICE_PORT" ]; then - SERVICE_PORT="80" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Database env -if [ "$IS_DATABASE_SERVICE" = "yes" ] || [ "$USES_DATABASE_SERVICE" = "yes" ]; then - RESET_ENV="no" - DATABASE_CREATE="${ENV_DATABASE_CREATE:-$DATABASE_CREATE}" - DATABASE_USER_NORMAL="${ENV_DATABASE_USER:-${DATABASE_USER_NORMAL:-$user_name}}" - DATABASE_PASS_NORMAL="${ENV_DATABASE_PASSWORD:-${DATABASE_PASS_NORMAL:-$user_pass}}" - DATABASE_USER_ROOT="${ENV_DATABASE_ROOT_USER:-${DATABASE_USER_ROOT:-$root_user_name}}" - DATABASE_PASS_ROOT="${ENV_DATABASE_ROOT_PASSWORD:-${DATABASE_PASS_ROOT:-$root_user_pass}}" - if [ -n "$DATABASE_PASS_NORMAL" ]; then - if [ ! -f "${USER_FILE_PREFIX}/db_pass_user" ]; then - echo "$DATABASE_PASS_NORMAL" >"${USER_FILE_PREFIX}/db_pass_user" - fi - fi - if [ -n "$DATABASE_PASS_ROOT" ]; then - if [ ! -f "${ROOT_FILE_PREFIX}/db_pass_root" ]; then - echo "$DATABASE_PASS_ROOT" >"${ROOT_FILE_PREFIX}/db_pass_root" - fi - fi -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# [DATABASE_DIR_[SQLITE,REDIS,POSTGRES,MARIADB,COUCHDB,MONGODB,SUPABASE]] -if [ "$DATABASE_SERVICE_TYPE" = "custom" ]; then - DATABASE_DIR="${DATABASE_DIR_CUSTOM:-/data/db/custom}" - DATABASE_BASE_DIR="${DATABASE_DIR_CUSTOM:-/data/db/custom}" - DATABASE_ADMIN_WWW_ROOT="${DATABASE_ADMIN_WWW_ROOT_CUSTOM:-/usr/local/share/httpd/admin/databases}" - if [ -d "$DATABASE_ADMIN_WWW_ROOT" ]; then - SERVER_ADMIN_URL="${SERVER_ADMIN_URL_CUSTOM:-/admin/dbadmin}" - fi -elif [ "$SERVICE_NAME" = "redis" ] || [ "$DATABASE_SERVICE_TYPE" = "redis" ]; then - DATABASE_DIR="${DATABASE_DIR_REDIS:-/data/db/redis}" - DATABASE_BASE_DIR="${DATABASE_DIR_REDIS:-/data/db/redis}" - DATABASE_ADMIN_WWW_ROOT="${DATABASE_ADMIN_WWW_ROOT_REDIS:-/usr/local/share/httpd/admin/redis}" - if [ -d "$DATABASE_ADMIN_WWW_ROOT" ]; then - SERVER_ADMIN_URL="${SERVER_ADMIN_URL_REDIS:-/admin/redis}" - fi -elif [ "$SERVICE_NAME" = "postgres" ] || [ "$DATABASE_SERVICE_TYPE" = "postgres" ]; then - DATABASE_DIR="${DATABASE_DIR_POSTGRES:-/data/db/postgres}" - DATABASE_BASE_DIR="${DATABASE_DIR_POSTGRES:-/data/db/postgres}" - DATABASE_ADMIN_WWW_ROOT="${DATABASE_ADMIN_WWW_ROOT_POSTGRES:-/usr/local/share/httpd/admin/postgres}" - if [ -d "$DATABASE_ADMIN_WWW_ROOT" ]; then - SERVER_ADMIN_URL="${SERVER_ADMIN_URL_POSTGRES:-/admin/postgres}" - fi -elif [ "$SERVICE_NAME" = "mariadb" ] || [ "$DATABASE_SERVICE_TYPE" = "mariadb" ]; then - DATABASE_DIR="${DATABASE_DIR_MARIADB:-/data/db/mariadb}" - DATABASE_BASE_DIR="${DATABASE_DIR_MARIADB:-/data/db/mariadb}" - DATABASE_ADMIN_WWW_ROOT="${DATABASE_ADMIN_WWW_ROOT_MARIADB:-/usr/local/share/httpd/admin/mysql}" - if [ -d "$DATABASE_ADMIN_WWW_ROOT" ]; then - SERVER_ADMIN_URL="${SERVER_ADMIN_URL_MARIADB:-/admin/mysql}" - fi -elif [ "$SERVICE_NAME" = "mysql" ] || [ "$DATABASE_SERVICE_TYPE" = "mysql" ]; then - DATABASE_DIR="${DATABASE_DIR_MYSQL:-/data/db/mysql}" - DATABASE_BASE_DIR="${DATABASE_DIR_MYSQL:-/data/db/mysql}" - DATABASE_ADMIN_WWW_ROOT="${DATABASE_ADMIN_WWW_ROOT_MYSQL:-/usr/local/share/httpd/admin/mysql}" - if [ -d "$DATABASE_ADMIN_WWW_ROOT" ]; then - SERVER_ADMIN_URL="${SERVER_ADMIN_URL_MYSQL:-/admin/mysql}" - fi -elif [ "$SERVICE_NAME" = "couchdb" ] || [ "$DATABASE_SERVICE_TYPE" = "couchdb" ]; then - DATABASE_DIR="${DATABASE_DIR_COUCHDB:-/data/db/couchdb}" - DATABASE_BASE_DIR="${DATABASE_DIR_COUCHDB:-/data/db/couchdb}" - DATABASE_ADMIN_WWW_ROOT="${DATABASE_ADMIN_WWW_ROOT_COUCHDB:-/usr/local/share/httpd/admin/couchdb}" - if [ -d "$DATABASE_ADMIN_WWW_ROOT" ]; then - SERVER_ADMIN_URL="${SERVER_ADMIN_URL_COUCHDB:-/admin/couchdb}" - fi -elif [ "$SERVICE_NAME" = "mongodb" ] || [ "$DATABASE_SERVICE_TYPE" = "mongodb" ]; then - DATABASE_DIR="${DATABASE_DIR_MONGODB:-/data/db/mongodb}" - DATABASE_BASE_DIR="${DATABASE_DIR_MONGODB:-/data/db/mongodb}" - DATABASE_ADMIN_WWW_ROOT="${DATABASE_ADMIN_WWW_ROOT_MONGODB:-/usr/local/share/httpd/admin/mongodb}" - if [ -d "$DATABASE_ADMIN_WWW_ROOT" ]; then - SERVER_ADMIN_URL="${SERVER_ADMIN_URL_MONGODB:-/admin/mongodb}" - fi -elif [ "$SERVICE_NAME" = "supabase" ] || [ "$DATABASE_SERVICE_TYPE" = "supabase" ]; then - DATABASE_DIR="${DATABASE_DIR_SUPABASE:-/data/db/supabase}" - DATABASE_BASE_DIR="${DATABASE_DIR_SUPABASE:-/data/db/supabase}" - DATABASE_ADMIN_WWW_ROOT="${DATABASE_ADMIN_WWW_ROOT_SUPABASE:-/usr/local/share/httpd/admin/supabase}" - if [ -d "$DATABASE_ADMIN_WWW_ROOT" ]; then - SERVER_ADMIN_URL="${SERVER_ADMIN_URL_SUPBASE:-/admin/supabase}" - fi -elif [ "$SERVICE_NAME" = "sqlite" ] || [ "$DATABASE_SERVICE_TYPE" = "sqlite" ]; then - DATABASE_DIR="${DATABASE_DIR_SQLITE:-/data/db/sqlite}/$SERVER_NAME" - DATABASE_BASE_DIR="${DATABASE_DIR_SQLITE:-/data/db/sqlite}/$SERVER_NAME" - DATABASE_ADMIN_WWW_ROOT="${DATABASE_ADMIN_WWW_ROOT_SQLITE:-/usr/local/share/httpd/admin/sqlite}" - if [ -d "$DATABASE_ADMIN_WWW_ROOT" ]; then - SERVER_ADMIN_URL="${SERVER_ADMIN_URL_SQLITE:-/admin/sqlite}" - fi - if [ ! -d "$DATABASE_DIR" ]; then - mkdir -p "$DATABASE_DIR" - fi - chmod 777 "$DATABASE_DIR" -fi -if [ -n "$DATABASE_ADMIN_WWW_ROOT" ]; then - if [ ! -d "$DATABASE_ADMIN_WWW_ROOT" ]; then - mkdir -p "${DATABASE_ADMIN_WWW_ROOT}" - fi -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Allow variables via imports - Overwrite existing -if [ -f "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" ]; then - . "/config/env/${SERVICE_NAME:-$SCRIPT_NAME}.sh" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# set password to random if variable is random -if [ "$user_pass" = "random" ]; then - user_pass="$(__random_password ${RANDOM_PASS_USER:-16})" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -if [ "$root_user_pass" = "random" ]; then - root_user_pass="$(__random_password ${RANDOM_PASS_ROOT:-16})" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Allow setting initial users and passwords via environment and save to file -if [ -n "$user_name" ]; then - echo "$user_name" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_name" -fi -if [ -n "$user_pass" ]; then - echo "$user_pass" >"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass" -fi -if [ -n "$root_user_name" ]; then - echo "$root_user_name" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name" -fi -if [ -n "$root_user_pass" ]; then - echo "$root_user_pass" >"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# create needed dirs -if [ ! -d "$LOG_DIR" ]; then - mkdir -p "$LOG_DIR" -fi -if [ ! -d "$RUN_DIR" ]; then - mkdir -p "$RUN_DIR" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Allow per init script usernames and passwords -if __file_exists_with_content "${USER_FILE_PREFIX}/${SERVICE_NAME}_name"; then - user_name="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_name")" -fi -if __file_exists_with_content "${USER_FILE_PREFIX}/${SERVICE_NAME}_pass"; then - user_pass="$(<"${USER_FILE_PREFIX}/${SERVICE_NAME}_pass")" -fi -if __file_exists_with_content "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name"; then - root_user_name="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_name")" -fi -if __file_exists_with_content "${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass"; then - root_user_pass="$(<"${ROOT_FILE_PREFIX}/${SERVICE_NAME}_pass")" -fi -if __file_exists_with_content "${USER_FILE_PREFIX}/db_pass_user"; then - DATABASE_PASS_NORMAL="$(<"${USER_FILE_PREFIX}/db_pass_user")" -fi -if __file_exists_with_content "${ROOT_FILE_PREFIX}/db_pass_root"; then - DATABASE_PASS_ROOT="$(<"${ROOT_FILE_PREFIX}/db_pass_root")" -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# set hostname for script -sysname="${SERVER_NAME:-${FULL_DOMAIN_NAME:-$HOSTNAME}}" -# - - - - - - - - - - - - - - - - - - - - - - - - - -__create_service_env -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Setup /config directories -__init_config_etc -# - - - - - - - - - - - - - - - - - - - - - - - - - -# pre-run function -__execute_prerun -# - - - - - - - - - - - - - - - - - - - - - - - - - -# create user if needed -__create_service_user "$SERVICE_USER" "$SERVICE_GROUP" "${WORK_DIR:-/home/$SERVICE_USER}" "${SERVICE_UID:-}" "${SERVICE_GID:-}" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Modify user if needed -__set_user_group_id $SERVICE_USER ${SERVICE_UID:-} ${SERVICE_GID:-} -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Create base directories -__setup_directories -# - - - - - - - - - - - - - - - - - - - - - - - - - -# set switch user command -__switch_to_user -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Initialize the home/working dir -__init_working_dir -# - - - - - - - - - - - - - - - - - - - - - - - - - -# show init message -__pre_message -# - - - - - - - - - - - - - - - - - - - - - - - - - -# -__initialize_db_users -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Initialize ssl -__update_ssl_conf -__update_ssl_certs -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Set permissions in ${USER_FILE_PREFIX} and ${ROOT_FILE_PREFIX} -__run_secure_function -# - - - - - - - - - - - - - - - - - - - - - - - - - -__run_precopy -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Copy /config to /etc -for config_2_etc in $CONF_DIR $ADDITIONAL_CONFIG_DIRS; do - __initialize_system_etc "$config_2_etc" 2>/dev/stderr | tee -p -a "/data/logs/init.txt" -done -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Replace variables -__initialize_replace_variables "$ETC_DIR" "$CONF_DIR" "$ADDITIONAL_CONFIG_DIRS" "$WWW_ROOT_DIR" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# -__initialize_database -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Updating config files -__update_conf_files -# - - - - - - - - - - - - - - - - - - - - - - - - - -# run the pre execute commands -__pre_execute -# - - - - - - - - - - - - - - - - - - - - - - - - - -# Set permissions -__fix_permissions "$SERVICE_USER" "$SERVICE_GROUP" -# - - - - - - - - - - - - - - - - - - - - - - - - - -# -__run_pre_execute_checks 2>/dev/stderr | tee -a -p "/data/logs/entrypoint.log" "/data/logs/init.txt" || return 20 -# - - - - - - - - - - - - - - - - - - - - - - - - - -__run_start_script 2>>/dev/stderr | tee -p -a "/data/logs/entrypoint.log" -errorCode=$? -if [ -n "$EXEC_CMD_BIN" ]; then - if [ "$errorCode" -eq 0 ]; then - SERVICE_EXIT_CODE=0 - SERVICE_IS_RUNNING="yes" - else - SERVICE_EXIT_CODE=$errorCode - SERVICE_IS_RUNNING="${SERVICE_IS_RUNNING:-no}" - if [ ! -s "$SERVICE_PID_FILE" ]; then - rm -Rf "$SERVICE_PID_FILE" - fi - fi - SERVICE_EXIT_CODE=0 -fi -# - - - - - - - - - - - - - - - - - - - - - - - - - -# start the post execute function in background -__post_execute 2>"/dev/stderr" | tee -p -a "/data/logs/init.txt" & -# - - - - - - - - - - - - - - - - - - - - - - - - - -__script_exit $SERVICE_EXIT_CODE diff --git a/rootfs/usr/local/share/cargo/config.toml b/rootfs/usr/local/share/cargo/config.toml deleted file mode 100644 index 7cd4f01..0000000 --- a/rootfs/usr/local/share/cargo/config.toml +++ /dev/null @@ -1,70 +0,0 @@ -# Cargo system config - lives at $CARGO_HOME/config.toml. -# -# Default linker overrides for cross-compile targets so plain -# `cargo build --target=...` works for pure-Rust crates without the -# user having to set up a separate cross C toolchain. The image already -# ships: -# -# - rust-lld (via the llvm-tools-preview rustup component, symlinked -# to /usr/local/bin/rust-lld in 02-packages.sh) -# - mingw-w64 (apk: mingw-w64-gcc, for native Windows GNU linking) -# - zig (apk + cargo-zigbuild bundled copy, for full C cross -# toolchains incl. macOS/glibc/RISC-V) -# -# For crates that pull in C deps (*-sys, openssl-sys, ring, etc.) prefer -# `cargo zigbuild --target=...` instead - it handles both the linker AND -# the C compile. - -# --- Linux musl / glibc (pure-Rust via rust-lld) --- -[target.aarch64-unknown-linux-musl] -linker = "rust-lld" - -[target.aarch64-unknown-linux-gnu] -linker = "rust-lld" - -[target.armv7-unknown-linux-musleabihf] -linker = "rust-lld" - -[target.armv7-unknown-linux-gnueabihf] -linker = "rust-lld" - -[target.arm-unknown-linux-gnueabihf] -linker = "rust-lld" - -[target.i686-unknown-linux-musl] -linker = "rust-lld" - -[target.i686-unknown-linux-gnu] -linker = "rust-lld" - -# Note: riscv64gc-unknown-linux-{musl,gnu}, powerpc64le-unknown-linux-gnu, -# and s390x-unknown-linux-gnu need libgcc_s + libc for the target arch -# which aren't shipped with rust-lld's bundled musl. Use -# `cargo zigbuild --target=...` for these. - -# --- Windows GNU (mingw) --- -[target.x86_64-pc-windows-gnu] -linker = "x86_64-w64-mingw32-gcc" - -[target.i686-pc-windows-gnu] -linker = "i686-w64-mingw32-gcc" - -# --- Embedded ARM Cortex-M (no_std) --- -# These produce no_std bare-metal binaries. Source code must be `no_std` -# with a `#[panic_handler]` and `#[entry]` macro - see the cortex-m-rt -# crate. A `std` hello-world will not compile for these targets. -[target.thumbv6m-none-eabi] -linker = "rust-lld" - -[target.thumbv7em-none-eabihf] -linker = "rust-lld" - -[target."thumbv8m.main-none-eabihf"] -linker = "rust-lld" - -# --- Embedded RISC-V (no_std) --- -[target.riscv32imc-unknown-none-elf] -linker = "rust-lld" - -[target.riscv32imac-unknown-none-elf] -linker = "rust-lld" diff --git a/rootfs/usr/local/share/template-files/config/env/default.sample b/rootfs/usr/local/share/template-files/config/env/default.sample index a5f0acb..2d4a7ef 100644 --- a/rootfs/usr/local/share/template-files/config/env/default.sample +++ b/rootfs/usr/local/share/template-files/config/env/default.sample @@ -116,7 +116,7 @@ DATABASE_DIR_SUPABASE="${DATABASE_DIR_SUPABASE:-$DATABASE_BASE_DIR/supabase}" DOCKER_HOST="unix://var/run/docker.sock" # - - - - - - - - - - - - - - - - - - - - - - - - - # File locations -ENTRYPOINT_PID_FILE="${ENTRYPOINT_PID_FILE:-/run/.entrypoint.pid}" +ENTRYPOINT_PID_FILE="${ENTRYPOINT_PID_FILE:-/run/init.d/entrypoint.pid}" ENTRYPOINT_INIT_FILE="${ENTRYPOINT_INIT_FILE:-/config/.entrypoint.done}" ENTRYPOINT_DATA_INIT_FILE="${ENTRYPOINT_DATA_INIT_FILE:-/data/.docker_has_run}" ENTRYPOINT_CONFIG_INIT_FILE="${ENTRYPOINT_CONFIG_INIT_FILE:-/config/.docker_has_run}" diff --git a/rootfs/usr/local/share/template-files/config/env/examples/zz-entrypoint.sh b/rootfs/usr/local/share/template-files/config/env/examples/zz-entrypoint.sh index 51b5729..8cc487b 100644 --- a/rootfs/usr/local/share/template-files/config/env/examples/zz-entrypoint.sh +++ b/rootfs/usr/local/share/template-files/config/env/examples/zz-entrypoint.sh @@ -1,6 +1,6 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - # File locations -ENTRYPOINT_PID_FILE="${ENTRYPOINT_PID_FILE:-/run/.entrypoint.pid}" +ENTRYPOINT_PID_FILE="${ENTRYPOINT_PID_FILE:-/run/init.d/entrypoint.pid}" ENTRYPOINT_INIT_FILE="${ENTRYPOINT_INIT_FILE:-/config/.entrypoint.done}" ENTRYPOINT_DATA_INIT_FILE="${ENTRYPOINT_DATA_INIT_FILE:-/data/.docker_has_run}" ENTRYPOINT_CONFIG_INIT_FILE="${ENTRYPOINT_CONFIG_INIT_FILE:-/config/.docker_has_run}"