16 Commits

Author SHA1 Message Date
MrMeeb 30026b4e17 update readme [CI SKIP] 2023-05-27 13:42:38 +00:00
MrMeeb 580845afe0 add goreleaser [CI SKIP] 2023-05-27 13:40:53 +00:00
MrMeeb d4aa8ff410 update drone behaviour [CI SKIP] 2023-05-27 13:40:44 +00:00
MrMeeb b3436f3b2c create cronicle user at build
continuous-integration/drone/push Build is passing
2022-12-29 23:49:45 +00:00
MrMeeb 4541df4c8a Merge branch 'main' of https://git.mrmeeb.stream/MrMeeb/cronicle-docker
continuous-integration/drone/push Build is passing
2022-12-29 20:36:16 +00:00
MrMeeb 26c3a15c81 logic fixes 2022-12-29 20:36:15 +00:00
MrMeeb e10acf4e46 Update '.drone.yml'
continuous-integration/drone/push Build is passing
2022-12-29 19:41:42 +00:00
MrMeeb 2d8fb52b23 Update '.drone.yml'
continuous-integration/drone/push Build is failing
2022-12-29 19:03:26 +00:00
MrMeeb 511704a90f drone notify on failure
continuous-integration/drone/push Build was killed
2022-12-29 17:51:38 +00:00
MrMeeb 70d6215ca3 Add logic to detect if config is missing as worker
continuous-integration/drone/push Build is failing
2022-12-29 17:46:57 +00:00
MrMeeb d759db2bb0 Update '.drone.yml'
continuous-integration/drone/push Build is passing
2022-12-27 11:48:39 +00:00
MrMeeb c04d6febad Merge branch 'main' of https://git.mrmeeb.stream/MrMeeb/cronicle-docker
continuous-integration/drone/push Build was killed
2022-12-27 11:44:58 +00:00
MrMeeb cad9b48ab9 add drone, add logic for init scripts 2022-12-27 11:44:51 +00:00
MrMeeb 327208391b Update 'README.md' 2022-12-26 22:31:41 +00:00
MrMeeb ee7034cba3 more dev 2022-12-26 22:30:42 +00:00
MrMeeb 78f681fb41 first commit 2022-12-26 18:21:10 +00:00
6 changed files with 467 additions and 2 deletions
+102
View File
@@ -0,0 +1,102 @@
kind: pipeline
type: docker
name: build-release-images
trigger:
event:
exclude:
- pull_request
ref:
- refs/tags/**
platform:
os: linux
arch: amd64
steps:
# Set tags for main branch - release tag and 'latest'
- name: make-tags-main
image: node
commands:
- echo -n "${DRONE_TAG}, latest" > .tags
# Build containers from main branch when released
- name: build-main
image: thegeeklab/drone-docker-buildx
privileged: true
settings:
provenance: false
registry: git.mrmeeb.stream
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: git.mrmeeb.stream/mrmeeb/cronicle
platforms:
- linux/arm64
- linux/amd64
- name: release
image: goreleaser/goreleaser
environment:
GITEA_TOKEN:
from_secret: gitea_token
commands:
- goreleaser release
- name: notify
image: plugins/slack
when:
status:
- success
- failure
settings:
webhook:
from_secret: slack_webhook
---
kind: pipeline
type: docker
name: build-develop-images
trigger:
event:
exclude:
- pull_request
branch:
- develop
platform:
os: linux
arch: amd64
steps:
# Set tags for develop branch - git commit SHA and 'develop'
- name: make-tags-develop
image: node
commands:
- echo -n "${DRONE_COMMIT_SHA:0:8}, develop" > .tags
# Build containers from develop branch
- name: build-develop
image: thegeeklab/drone-docker-buildx
privileged: true
settings:
provenance: false
registry: git.mrmeeb.stream
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: git.mrmeeb.stream/mrmeeb/cronicle
platforms:
- linux/arm64
- linux/amd64
- name: notify
image: plugins/slack
when:
status:
- success
- failure
settings:
webhook:
from_secret: slack_webhook
+25
View File
@@ -0,0 +1,25 @@
build:
skip: true
archives:
- format: binary
release:
draft: true
gitea:
owner: MrMeeb
name: cronicle-docker
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
# .goreleaser.yaml
gitea_urls:
api: https://git.mrmeeb.stream/api/v1
download: https://git.mrmeeb.stream
# set to true if you use a self-signed certificate
skip_tls_verify: false
+35
View File
@@ -0,0 +1,35 @@
FROM alpine:latest
ENV CRONICLE_foreground=1
ENV CRONICLE_echo=1
ENV CRONICLE_color=1
ENV EDITOR=vi
ENV MODE=manager
#RUN apt update && apt install -y tini curl git procps
RUN apk update && apk add bash tini git procps nodejs npm
RUN git clone https://github.com/cronicle-edge/cronicle-edge.git /opt/cronicle
WORKDIR /opt/cronicle
RUN npm install
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
EXPOSE 3012
ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "/run.sh" ]
+70 -2
View File
@@ -1,3 +1,71 @@
# cronicle-docker # Cronicle Docker
Dockerised Cronicle, based on the Cronicle-Edge fork Dockerised Cronicle, based on the [Cronicle-Edge](https://github.com/cronicle-edge/cronicle-edge) fork.
Can function in both the **manager** and **worker** role.
## 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.
If you want to configure Cronicle before first run (e.g to use a different storage engine), download `config_sample.json` and adjust accordingly before placing in `/config/cronicle/conf/config.json`.
:exclamation: NOTE: You must define the hostname of the container. Cronicle expects the hostname to remain the same, so the randomly-generated container hostname can cause problems if it changes. :exclamation:
### Docker CLI
```
docker run -d --name cronicle \
--hostname cronicle-manager \
-p 3012:3012 \
-e MODE=manager \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Europe/London \
-v {path on host}:/config
git.mrmeeb.stream/mrmeeb/cronicle:latest
```
### Docker Compose
```
version: '3'
services:
cronicle:
container_name: cronicle
image: git.mrmeeb.stream/mrmeeb/cronicle:latest
restart: unless-stopped
hostname: cronicle-manager
ports:
- 3012:3012
volumes:
- {path on host}:/config
environment:
- MODE=manager
- PUID=1000
- PGID=1000
- TZ=Europe/London
```
## Custom Scripts
This container automatically checks for scripts in `/config/init` and runs them at startup. This could be useful if you need to install additional applications into a worker container so it can execute jobs.
## Ports
|Port |Description|
|-----|-----------|
|3012 |WebUI and communication between manager and workers|
## Volumes
|Mount |Description|
|------|-----------|
|/config |Persistent config file and job configurations|
## Environment Variables
|Variable|Options|Default|Description|
|--------|-------|-------|-------|
|MODE |manager, worker|manager|Determines what mode Cronicle runs in
|PUID |int |1000 |Sets the UID of the user Cronicle runs under
|PGID |int |1000 |Sets the GID of the user Cronicle runs under
|TZ |[List of valid TZs](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List) |UTC |Sets the timezone of the container and by extension Cronicle
+149
View File
@@ -0,0 +1,149 @@
{
"base_app_url": "http://localhost:3012",
"email_from": "admin@cronicle.com",
"smtp_hostname": "mailrelay.cronicle.com",
"smtp_port": 25,
"secret_key": "f5cb3d08bad903c6a12b84f666070630",
"ad_domain": "corp.cronicle.com",
"log_dir": "logs",
"log_filename": "[component].log",
"log_columns": ["hires_epoch", "date", "hostname", "pid", "component", "category", "code", "msg", "data"],
"log_archive_path": "logs/archives/[yyyy]/[mm]/[dd]/[filename]-[yyyy]-[mm]-[dd].log.gz",
"log_crashes": true,
"pid_file": "logs/cronicled.pid",
"copy_job_logs_to": "",
"queue_dir": "queue",
"debug_level": 6,
"maintenance": "04:00",
"list_row_max": 10000,
"job_data_expire_days": 180,
"child_kill_timeout": 10,
"dead_job_timeout": 120,
"manager_ping_freq": 20,
"manager_ping_timeout": 60,
"udp_broadcast_port": 3014,
"scheduler_startup_grace": 10,
"universal_web_hook": "",
"track_manual_jobs": false,
"max_jobs": 0,
"server_comm_use_hostnames": true,
"web_direct_connect": false,
"web_socket_use_hostnames": true,
"job_memory_max": 1073741824,
"job_memory_sustain": 0,
"job_cpu_max": 0,
"job_cpu_sustain": 0,
"job_log_max_size": 0,
"job_env": {},
"web_hook_text_templates": {
"job_start": "🚀 *[event_title]* started on [hostname] <[job_details_url] | More details>",
"job_complete": "✔️ *[event_title]* completed successfully on [hostname] <[job_details_url] | More details>",
"job_warning": "⚠️ *[event_title]* completed with warning on [hostname]:\nWarning: _*[description]*_\n <[job_details_url] | More details>",
"job_failure": "❌ *[event_title]* failed on [hostname]:\nError: _*[description]*_\n <[job_details_url] | More details>",
"job_launch_failure": "💥 Failed to launch *[event_title]*:\n*[description]*\n<[edit_event_url] | More details>"
},
"client": {
"name": "Cronicle",
"debug": 1,
"default_password_type": "password",
"privilege_list": [
{ "id": "admin", "title": "Administrator" },
{ "id": "create_events", "title": "Create Events" },
{ "id": "edit_events", "title": "Edit Events" },
{ "id": "delete_events", "title": "Delete Events" },
{ "id": "run_events", "title": "Run Events" },
{ "id": "abort_events", "title": "Abort Events" },
{ "id": "state_update", "title": "Toggle Scheduler" }
],
"new_event_template": {
"enabled": 1,
"params": {},
"timing": { "minutes": [0] },
"max_children": 1,
"timeout": 3600,
"catch_up": 0,
"queue_max": 1000
}
},
"git": {
"enabled": false,
"auto": false,
"user": "cronicle",
"email": "croncile@cronicle.com",
"remote": "origin",
"branch": "master"
},
"Storage": {
"engine": "Filesystem",
"list_page_size": 50,
"concurrency": 4,
"log_event_types": { "get": 1, "put": 1, "head": 1, "delete": 1, "expire_set": 1 },
"Filesystem": {
"base_dir": "data",
"key_namespaces": 1
}
},
"WebServer": {
"http_port": 3012,
"http_htdocs_dir": "htdocs",
"http_max_upload_size": 104857600,
"http_static_ttl": 3600,
"http_static_index": "index.html",
"http_server_signature": "Cronicle 1.0",
"http_gzip_text": true,
"http_timeout": 30,
"http_regex_json": "(text|javascript|js|json)",
"http_response_headers": {
"Access-Control-Allow-Origin": "*"
},
"https": false,
"https_port": 3013,
"https_cert_file": "conf/ssl.crt",
"https_key_file": "conf/ssl.key",
"https_force": false,
"https_timeout": 30,
"https_header_detect": {
"Front-End-Https": "^on$",
"X-Url-Scheme": "^https$",
"X-Forwarded-Protocol": "^https$",
"X-Forwarded-Proto": "^https$",
"X-Forwarded-Ssl": "^on$"
}
},
"User": {
"session_expire_days": 30,
"max_failed_logins_per_hour": 5,
"max_forgot_passwords_per_hour": 3,
"free_accounts": false,
"sort_global_users": true,
"use_bcrypt": true,
"email_templates": {
"welcome_new_user": "conf/emails/welcome_new_user.txt",
"changed_password": "conf/emails/changed_password.txt",
"recover_password": "conf/emails/recover_password.txt"
},
"default_privileges": {
"admin": 0,
"create_events": 1,
"edit_events": 1,
"delete_events": 1,
"run_events": 0,
"abort_events": 0,
"state_update": 0
}
}
}
+86
View File
@@ -0,0 +1,86 @@
#!/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