28 Commits

Author SHA1 Message Date
9cf5b3e39c Merge pull request '1.0.1' (#2) from develop into main
Reviewed-on: #2
2023-05-27 22:10:46 +00:00
363169e636 cleanup misc files in app dir 2023-05-27 22:05:58 +00:00
877e98eff7 set permissions to 1000 at build 2023-05-27 21:58:31 +00:00
90910f9fdf fix to defined cronicle version 2023-05-27 21:53:40 +00:00
1089abc2cb rename user to cronicle 2023-05-27 18:46:23 +00:00
b932a8d2f1 fix not hooking conf in if already setup 2023-05-27 18:15:12 +00:00
52332d7e22 get correct s6 for architecture 2023-05-27 17:49:19 +00:00
96bdd83385 Merge pull request '1.0.0' (#1) from develop into main
Reviewed-on: #1
2023-05-27 16:53:07 +00:00
7d94621192 tweak build behaviour [CI SKIP] 2023-05-27 16:49:13 +00:00
b5d80d90a0 updated readme [CI SKIP] 2023-05-27 16:46:47 +00:00
06f5e5d27a add .gitignore [CI SKIP] 2023-05-27 15:37:58 +00:00
3f239e2527 redesign around s6-overlay 2023-05-27 13:43:46 +00:00
056748f20c update readme [CI SKIP] 2023-05-27 13:42:38 +00:00
d4846a0ccf add goreleaser [CI SKIP] 2023-05-27 13:40:53 +00:00
52460f8741 update drone behaviour [CI SKIP] 2023-05-27 13:40:44 +00:00
d1c1cfd46f create cronicle user at build 2022-12-29 23:49:45 +00:00
bfd684f06f Merge branch 'main' of https://git.mrmeeb.stream/MrMeeb/cronicle-docker 2022-12-29 20:36:16 +00:00
c6007e71f8 logic fixes 2022-12-29 20:36:15 +00:00
4485b53801 Update '.drone.yml' 2022-12-29 19:41:42 +00:00
0f96656929 Update '.drone.yml' 2022-12-29 19:03:26 +00:00
74a1e3f206 drone notify on failure 2022-12-29 17:51:38 +00:00
a611ceff70 Add logic to detect if config is missing as worker 2022-12-29 17:46:57 +00:00
7f98dc08ce Update '.drone.yml' 2022-12-27 11:48:39 +00:00
8cc55e3bf8 Merge branch 'main' of https://git.mrmeeb.stream/MrMeeb/cronicle-docker 2022-12-27 11:44:58 +00:00
6c6395097f add drone, add logic for init scripts 2022-12-27 11:44:51 +00:00
821dbf140c Update 'README.md' 2022-12-26 22:31:41 +00:00
22f4727800 more dev 2022-12-26 22:30:42 +00:00
113839c359 first commit 2022-12-26 18:21:10 +00:00
21 changed files with 259 additions and 115 deletions

View File

@ -1,11 +1,12 @@
kind: pipeline
type: docker
name: build-release-images
name: build-main-images
trigger:
event:
exclude:
- pull_request
ref:
- refs/heads/main
- refs/tags/**
platform:
@ -13,14 +14,34 @@ platform:
arch: amd64
steps:
# Set tags for main branch - release tag and 'latest'
- name: make-tags-main
- name: get-tags
image: docker:git
commands:
- git fetch --tags
when:
ref:
- refs/tags/**
# Set tags for main branch
- name: make-tags
image: node
commands:
- echo -n "${DRONE_COMMIT_SHA:0:8}, latest" > .tags
when:
ref:
- refs/heads/main
- name: make-tags-release
image: node
commands:
- echo -n "${DRONE_TAG}, latest" > .tags
when:
ref:
- refs/tags/**
# Build containers from main branch when released
- name: build-main
# Build containers from main branch
- name: build
image: thegeeklab/drone-docker-buildx
privileged: true
settings:
@ -42,6 +63,9 @@ steps:
from_secret: gitea_token
commands:
- goreleaser release
when:
ref:
- refs/tags/**
- name: notify
image: plugins/slack
@ -70,13 +94,13 @@ platform:
steps:
# Set tags for develop branch - git commit SHA and 'develop'
- name: make-tags-develop
- name: make-tags
image: node
commands:
- echo -n "${DRONE_COMMIT_SHA:0:8}, develop" > .tags
- echo -n "develop-${DRONE_COMMIT_SHA:0:8}, develop" > .tags
# Build containers from develop branch
- name: build-develop
- name: build
image: thegeeklab/drone-docker-buildx
privileged: true
settings:

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
dist/
.tags

View File

@ -1,35 +1,60 @@
FROM alpine:latest
FROM alpine:latest as base
ARG TARGETARCH
FROM base AS base-amd64
ENV S6_OVERLAY_ARCH=x86_64
FROM base AS base-arm64
ENV S6_OVERLAY_ARCH=aarch64
FROM base-${TARGETARCH}${TARGETVARIANT}
ARG S6_OVERLAY_VERSION=3.1.5.0
ARG CRONICLE_EDGE_VERSION=1.6.2
ENV CRONICLE_foreground=1
ENV CRONICLE_echo=1
ENV CRONICLE_color=1
ENV EDITOR=vi
ENV MODE=manager
ENV PUID=1000
ENV PGID=1000
ENV TZ=UTC
#RUN apt update && apt install -y tini curl git procps
#Get required packages
RUN apk update && apk add tzdata curl shadow bash xz git procps nodejs npm
RUN apk update && apk add bash tini git procps nodejs npm
#Make folders
RUN mkdir /config && \
mkdir /app && \
#Create default user
useradd -u 1000 -U -d /config -s /bin/false cronicle && \
usermod -G users cronicle
RUN git clone https://github.com/cronicle-edge/cronicle-edge.git /opt/cronicle
#Install s6-overlay
RUN curl -fsSL "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz" | tar Jpxf - -C / && \
curl -fsSL "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_OVERLAY_ARCH}.tar.xz" | tar Jpxf - -C / && \
curl -fsSL "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-noarch.tar.xz" | tar Jpxf - -C / && \
curl -fsSL "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-arch.tar.xz" | tar Jpxf - -C /
ENV S6_BEHAVIOUR_IF_STAGE2_FAILS=2 S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 S6_VERBOSITY=1
WORKDIR /opt/cronicle
#Install Cronicle
RUN mkdir /app/cronicle && \
cd /app/cronicle && \
wget https://github.com/cronicle-edge/cronicle-edge/archive/refs/tags/v${CRONICLE_EDGE_VERSION}.tar.gz && \
tar -xf v${CRONICLE_EDGE_VERSION}.tar.gz --strip-components 1 && \
rm -rf Docker* .gitignore Readme.md .vscode && \
rm -rf v${CRONICLE_EDGE_VERSION}.tar.gz
RUN npm install
WORKDIR /app/cronicle
RUN npm install && \
node bin/build dist
RUN node bin/build dist
COPY run.sh /
RUN chmod +x /run.sh
RUN mkdir /config
RUN adduser --disabled-password --no-create-home cronicle
#RUN ln -sf /dev/stdout /opt/cronicle/logs/Cronicle.log
COPY root/ /
RUN chmod +x /cronicle-prepare.sh && \
chmod +x /container-init.sh && \
chown -R ${PUID}:${PGID} /app /config
EXPOSE 3012
ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "/run.sh" ]
ENTRYPOINT [ "/init" ]

View File

@ -1,9 +1,20 @@
# Cronicle Docker
![Drone (self-hosted) with branch](https://img.shields.io/drone/build/MrMeeb/cronicle-docker/main?label=main&server=https%3A%2F%2Fdrone.mrmeeb.stream&style=for-the-badge) ![Drone (self-hosted) with branch](https://img.shields.io/drone/build/MrMeeb/cronicle-docker/develop?label=develop&server=https%3A%2F%2Fdrone.mrmeeb.stream&style=for-the-badge)
Dockerised Cronicle, based on the [Cronicle-Edge](https://github.com/cronicle-edge/cronicle-edge) fork.
Can function in both the **manager** and **worker** role.
## Tags
|Tag |Description|
|-------|-----------|
|latest |Latest image built from the main branch. Usually coincides with a tagged release.|
|develop|Latest image built from the develop branch. Commits are made to the develop branch before being merged to main. Old versions of `develop` are removed after 14 days.|
Tags relating to releases are also available, for locking in on a specific version.
## Running
`config.json`, located in `/config/cronicle/conf/config.json`, is automatically generated on the first run of Cronicle in 'manager' mode. This file must be kept identical between the manager and any workers it controls.

53
root/container-init.sh Normal file
View File

@ -0,0 +1,53 @@
#!/command/with-contenv bash
# shellcheck shell=bash
echo ""
echo ""
echo "================================================"
echo "| __ _______ __ ___________________ |"
echo "| / |/ / __ \/ |/ / ____/ ____/ __ ) |"
echo "| / /|_/ / /_/ / /|_/ / __/ / __/ / __ | |"
echo "| / / / / _, _/ / / / /___/ /___/ /_/ / |"
echo "| /_/ /_/_/ |_/_/ /_/_____/_____/_____/ |"
echo "| |"
echo "================================================"
echo ""
echo "Initialising container"
echo "
----------------------------------------------------------------------
ENVIRONMENT
----------------------------------------------------------------------
PUID=${PUID}
PGID=${PGID}
TZ=${TZ}
MODE=${MODE}
----------------------------------------------------------------------
"
#Setting UID and GID as configured
if [[ ! "${PUID}" -eq 0 ]] && [[ ! "${PGID}" -eq 0 ]]; then
echo "Executing usermod..."
mkdir "/tmp/temphome"
usermod -d "/tmp/temphome" cronicle
usermod -o -u "${PUID}" cronicle
usermod -d /config cronicle
rm -rf "/tmp/temphome"
groupmod -o -g "${PGID}" cronicle
else
echo "Running as root is not supported, please fix your PUID and PGID!"
exit 1
fi
echo "Checking permissions in /config and /app."
if [ ! "$(stat -c %u /app)" -eq "${PUID}" ] || [ ! "$(stat -c %g /app)" -eq "${PGID}" ]
then
echo "Fixing permissions for /app (this can take some time)."
chown -R cronicle:cronicle /app
fi
if [ ! "$(stat -c %u /config)" -eq "${PUID}" ] || [ ! "$(stat -c %g /config)" -eq "${PGID}" ]
then
echo "Fixing permissions for /config (this can take some time)."
chown -R cronicle:cronicle /config
fi

106
root/cronicle-prepare.sh Normal file
View File

@ -0,0 +1,106 @@
#!/command/with-contenv bash
# shellcheck shell=bash
echo "Preparing Cronicle"
#Importing and running additional scripts placed in /config/init
if [ -d /config/init ]
then
if [ "$(ls -A /config/init)" ]
then
echo "Running additional startup scripts."
bash /config/init/*
else
echo "/config/init is empty - no additional startup scripts detected."
fi
else
echo "Directory /config/init not found. Creating."
mkdir /config/init
fi
if [ ! -d /config/cronicle ]
then
echo "Directory /config/cronicle not found. Creating."
mkdir /config/cronicle
fi
#Detecting what mode Cronicle should be started in
if [ $MODE == "manager" ]
then
echo "Cronicle is running in 'manager' mode."
#Copying config directory to /config/cronicle/conf if not already there, then linking back into Cronicle
if [ ! -d /config/cronicle/conf ]
then
echo "Config dir is missing, creating."
cp -r /app/cronicle/conf /config/cronicle/conf
rm -rf /app/cronicle/conf
ln -s /config/cronicle/conf /app/cronicle/conf
else
echo "Config dir already exists. Doesn't need creating."
echo "Linking persistent config dir back into Cronicle."
rm -rf /app/cronicle/conf
ln -s /config/cronicle/conf /app/cronicle/conf
fi
if [ ! -f /config/cronicle/data/.setup_done ]
then
echo "Setup needed - running now."
/app/cronicle/bin/control.sh setup
touch /app/cronicle/data/.setup_done
#Moving data dir to /config, then linking it back into Cronicle
mv -n /app/cronicle/data /config/cronicle/data
rm -rf /app/cronicle/data
ln -s /config/cronicle/data /app/cronicle/data
else
echo "Setup already completed."
rm -rf /app/cronicle/data
ln -s /config/cronicle/data /app/cronicle/data
fi
elif [ $MODE == "worker" ]
then
echo "Cronicle is running in 'worker' mode."
if [ ! -f /config/cronicle/conf/config.json ]
then
echo "No config found. Copy config.json from the manager server and place it in /config/cronicle/conf dir."
mkdir -p /config/cronicle/conf
exit 0
else
#Removing default config.json and linking provided one back into Cronicle
rm -rf /app/cronicle/conf/config.json
ln -s /config/cronicle/conf/config.json /app/cronicle/conf/config.json
fi
else
echo "'$MODE' is not a recognised appion for the MODE environment variable. Accepted appions are 'manager' and 'worker'."
fi

View File

@ -0,0 +1 @@
oneshot

View File

@ -0,0 +1 @@
/container-init.sh

View File

@ -0,0 +1 @@
oneshot

View File

@ -0,0 +1 @@
exec s6-setuidgid cronicle /cronicle-prepare.sh

View File

@ -0,0 +1 @@
echo "$e" > /run/s6-linux-init-container-results/exitcode

View File

@ -0,0 +1,3 @@
#!/command/with-contenv bash
# shellcheck shell=bash
exec s6-setuidgid cronicle node /app/cronicle/lib/main.js --color 1

View File

@ -0,0 +1 @@
longrun

86
run.sh
View File

@ -1,86 +0,0 @@
#!/bin/bash
#Importing and running additional scripts placed in /config/init
if [ -d /config/init ]
then
if [ "$(ls -A /config/init)" ]
then
echo "Running additional startup scripts."
bash /config/init/*
else
echo "/config/init is empty - no additional startup scripts detected."
fi
else
echo "Directory /config/init not found. Creating."
mkdir /config/init
fi
#Detecting what mode Cronicle should be started in
if [ $MODE == "manager" ]
then
echo "Cronicle is running in 'manager' mode."
#Copying config.json to /config if it isn't there already, then linking it back into Cronicle
mv -n /opt/cronicle/conf/config.json /config/config.json
rm -rf /opt/cronicle/conf/config.json
ln -s /config/config.json /opt/cronicle/conf/config.json
if [ ! -f /config/data/.setup_done ]
then
echo "Setup needed - running now."
/opt/cronicle/bin/control.sh setup
touch /opt/cronicle/data/.setup_done
#Moving data dir to /config, then linking it back into Cronicle
mv -n /opt/cronicle/data /config/data
rm -rf /opt/cronicle/data
ln -s /config/data /opt/cronicle/data
exec node /opt/cronicle/lib/main.js --color 1
else
rm -rf /opt/cronicle/data
ln -s /config/data /opt/cronicle/data
exec node /opt/cronicle/lib/main.js --color 1
fi
elif [ $MODE == "worker" ]
then
echo "Cronicle is running in 'worker' mode."
if [ ! -f /config/config.json ]
then
echo "No config found. Copy config.json from the manager server and place it in the /config dir."
exit 0
else
#Removing default config.json and linking provided one back into Cronicle
rm -rf /opt/cronicle/conf/config.json
ln -s /config/config.json /opt/cronicle/conf/config.json
exec node /opt/cronicle/lib/main.js --color 1
fi
else
echo "'$MODE' is not a recognised option for the MODE environment variable. Accepted options are 'manager' and 'worker'."
fi