diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..8c0c969 --- /dev/null +++ b/Containerfile @@ -0,0 +1,34 @@ +# Caddy recommended way to build the custom image +FROM registry.belway.me/belwayhome/almalinux9-minimal:latest + +ARG foundry_url +ARG nodejs_version +ENV foundry_url $foundry_url +ENV nodejs_version $nodejs_version + +# Because pipeline is rootless +VOLUME /var/lib/containers +VOLUME /home/podman/.local/share/containers + +RUN microdnf update \ + && microdnf -y install \ + openssl-devel \ + tar \ + unzip \ + wget \ + && rm -rf /var/cache/yum + +RUN curl --silent --location https://rpm.nodesource.com/setup_${nodejs_version}.x | bash - \ + && microdnf -y install \ + nodejs \ + && rm -rf /var/cache/yum + +WORKDIR /foundryvtt/foundryvtt +RUN wget -O foundryvtt.zip ${foundry_url} && unzip foundryvtt.zip && rm foundryvtt.zip + +WORKDIR /foundryvtt + +VOLUME /foundryvtt/foundrydata +EXPOSE 30000 + +ENTRYPOINT /usr/bin/node /foundryvtt/foundryvtt/resources/app/main.js --dataPath=/foundryvtt/foundrydata diff --git a/README.md b/README.md index 56b1917..b51d262 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,38 @@ # foundryvtt_container +## Builidng the Container +Just run the script with the URL and Version declared as follows: +```bash +./build.sh -U $FOUNDRY_URL -I -v $VERSION +``` +## Running the Container +I'm using quadlets, so here's an example quadlet: +```bash +# in your rootless podman container direction, ie: /etc/containers/systemd/users/${USER_UID}/ +# foundryvtt.container +[Unit] +Description=FoundryVTT Custom Container +Requires=var-mnt-data01.mount + +[Container] +AutoUpdate=registry +HostName=${VM_HOSTNAME} +Image=registry.belway.me/public/foundryvtt_container:latest +Label=registry +Network=slirp4netns:port_handler=slirp4netns +PublishPort=30000:30000 +Timezone=America/Montreal +Volume=${YOUR_DATA_DIRECTORY_HERE}:/foundryvtt/foundrydata:z + +[Service] +Restart=always + +[Install] +WantedBy=multi-user.target default.target +``` + +Then as the user, run: +```bash +systemctl --user daemon-reload +systemctl --user start foundryvtt +``` diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..b657d4d --- /dev/null +++ b/build.sh @@ -0,0 +1,191 @@ +#!/bin/bash +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# Name: build.sh +# Author(s): Thomas Belway +# Source: https://gitea.belway.me/Public/foundryvtt_container.git +# Example: ./build.sh -U $FOUNDRY_URL -I -v $VERSION +# Description: Builds custom foundryvtt container and pushes to registry. +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + +#################################################################### +# Variables +#################################################################### +# General Variables +REGISTRY="registry.belway.me" +REGISTRY_NAMESPACE="public/foundryvtt_container" + +############################################################################################################################### +# Functions +############################################################################################################################### + +# Informational Functions +usage() { +cat << EOF + +usage: ${SCRIPT_NAME} [options] + +This script exports data from one database to be compared with data from another database + +OPTIONS: + -D Enable DEBUG mode + -f Custom Containerfile with absolute or relative directory + -F Format of containerfile + -h Show this message + -I Initialize the registry + -n Node version + -R For rebuild the image. + -S Scheduled build, should only be used by automation (gitea actions). + -U Foundry URL for downloading the version + -v Version to build, defaults to 'latest' +EOF +exit 1 +} + +get_parameters() { + while getopts "Df:F:hIRSU:v:" option_name; do + case "$option_name" in + "D") + DEBUG="YES" + ;; + "f") + OPT_CONTAINERFILE="$OPTARG" + ;; + "F") + OPT_FORMAT_TYPE="$OPTARG" + ;; + "h") + usage + ;; + "I") + INITIALIZE="TRUE" + ;; + "n") + NODEJS_VERSION="$OPTARG" + ;; + "R") + OPT_REBUILD="TRUE" + ;; + "S") + OPT_SCHEDULED="TRUE" + ;; + "U") + FOUNDRY_URL="$OPTARG" + ;; + "v") + OPT_VERSION="$OPTARG" + ;; + "?") + echo "Error: Unknown option $OPTARG" + usage + ;; + ":") + echo "Error: No argument value for option $OPTARG" + usage + ;; + *) + echo "Error: Unknown error while processing options" + usage + ;; + esac + done + + if [[ -z $FOUNDRY_URL ]]; then + echo "Need the foundry URL, please try again..." + exit 1 + fi + + if [[ -z $OPT_CONTAINERFILE ]]; then + OPT_CONTAINERFILE="Containerfile" + fi + + if [[ -z $OPT_FORMAT_TYPE ]]; then + OPT_FORMAT="--format docker" + elif [[ $OPT_FORMAT_TYPE == "podman" ]]; then + OPT_FORMAT="" + else + OPT_FORMAT="--format ${OPT_FORMAT_TYPE}" + fi + + if [[ $DEBUG == "YES" ]]; then + SILENCE_OUTPUT="" + SILENCE_STOUT=" " + echo "Debug mode enabled." + fi + + if [[ -z $OPT_REBUILD ]]; then + OPT_REBUILD="FALSE" + fi + + if [[ -z $OPT_SCHEDULED ]]; then + OPT_SCHEDULED="FALSE" + fi + + if [[ -z $OPT_VERSION ]]; then + OPT_VERSION="12.331" + fi + + if [[ "${OPT_SCHEDULED}" == "TRUE" ]]; then + OPT_REBUILD="FALSE" + fi + + if [[ -z $NODEJS_VERSION ]]; then + NODEJS_VERSION=$(curl https://foundryvtt.com/article/installation/ | grep nodesource | grep rpm | tr -d -c 0-9) + fi + +TAG="$OPT_VERSION" + +} + +# Build Functions + +container_initialize() { + echo "Initializing container build..." + podman login ${REGISTRY} + podman build -f ${OPT_CONTAINERFILE} -t ${REGISTRY}/${REGISTRY_NAMESPACE}:${TAG} -t ${REGISTRY}/${REGISTRY_NAMESPACE}:latest --build-arg foundry_url=${FOUNDRY_URL} --build-arg nodejs_version=${NODEJS_VERSION} + podman push ${REGISTRY}/${REGISTRY_NAMESPACE}:${TAG} + podman push ${REGISTRY}/${REGISTRY_NAMESPACE}:latest + podman logout ${REGISTRY} + echo "Container build initialized!" +} + +container_scheduled_build() { + echoo "Scheduled build starting..." + if [[ "${CADDY_IMAGE_VERSION}" != "${CUSTOM_CADDY_IMAGE_VERSION}" ]]; then + podman login ${REGISTRY} + podman build -f ${OPT_CONTAINERFILE} -t ${REGISTRY}/${REGISTRY_NAMESPACE}:${TAG} -t ${REGISTRY}/${REGISTRY_NAMESPACE}:latest --build-arg foundry_url=${FOUNDRY_URL} + podman push ${REGISTRY}/${REGISTRY_NAMESPACE}:${TAG} + podman push ${REGISTRY}/${REGISTRY_NAMESPACE}:latest + podman logout ${REGISTRY} + else + echo "No new version, exiting..." + exit 1 + fi + echo "Scheduled build complete!" +} + +container_rebuild() { + echo "Rebuilding container..." + podman login ${REGISTRY} + podman build -f ${OPT_CONTAINERFILE} -t ${REGISTRY}/${REGISTRY_NAMESPACE}:${TAG} -t ${REGISTRY}/${REGISTRY_NAMESPACE}:latest --build-arg foundry_url=${FOUNDRY_URL} + podman push ${REGISTRY}/${REGISTRY_NAMESPACE}:${TAG} + podman push ${REGISTRY}/${REGISTRY_NAMESPACE}:latest + podman logout ${REGISTRY} + echo "Rebuild complete!" +} + +############################################################################################################################### +# Main Script +############################################################################################################################### +get_parameters "$@" + +if [[ "$OPT_SCHEDULED" == "TRUE" ]]; then + container_scheduled_build +fi + +if [[ "$OPT_REBUILD" == "TRUE" ]]; then + container_rebuild +fi + +if [[ "$INITIALIZE" == "TRUE" ]]; then + container_initialize +fi