From 34930dbb63fecd78fc811179ca82c9375f1f7149 Mon Sep 17 00:00:00 2001 From: Jesse Antoszyk <22500761+jcantosz@users.noreply.github.com> Date: Mon, 21 Oct 2024 17:46:00 -0400 Subject: [PATCH] initial commit (untested) --- ct/ghostfolio.sh | 73 ++++++++++++ install/ghostfolio-install.sh | 216 ++++++++++++++++++++++++++++++++++ 2 files changed, 289 insertions(+) create mode 100644 ct/ghostfolio.sh create mode 100644 install/ghostfolio-install.sh diff --git a/ct/ghostfolio.sh b/ct/ghostfolio.sh new file mode 100644 index 00000000..f081a879 --- /dev/null +++ b/ct/ghostfolio.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func) +# Copyright (c) 2021-2024 tteck +# Author: tteck +# Co-Author: jcantosz +# License: MIT +# https://github.com/tteck/Proxmox/raw/main/LICENSE + +function header_info { +clear +cat <<"EOF" + ________ __ ____ ___ + / ____/ /_ ____ _____/ /_/ __/___ / (_)___ + / / __/ __ \/ __ \/ ___/ __/ /_/ __ \/ / / __ \ +/ /_/ / / / / /_/ (__ ) /_/ __/ /_/ / / / /_/ / +\____/_/ /_/\____/____/\__/_/ \____/_/_/\____/ + +EOF +} +header_info +echo -e "Loading..." +APP="Ghostfolio" +var_disk="6" +var_cpu="2" +var_ram="2048" +var_os="debian" +var_version="12" +variables +color +catch_errors + +function default_settings() { + CT_TYPE="1" + PW="" + CT_ID=$NEXTID + HN=$NSAPP + DISK_SIZE="$var_disk" + CORE_COUNT="$var_cpu" + RAM_SIZE="$var_ram" + BRG="vmbr0" + NET="dhcp" + GATE="" + APT_CACHER="" + APT_CACHER_IP="" + DISABLEIP6="no" + MTU="" + SD="" + NS="" + MAC="" + VLAN="" + SSH="no" + VERB="no" + INSTALL_ALL="yes" + echo_default +} + +function update_script() { +header_info +if [[ ! -d /etc/neo4j ]]; then msg_error "No ${APP} Installation Found!"; exit; fi +msg_info "Updating OS" +apt-get update &>/dev/null +apt-get -y upgrade &>/dev/null +msg_ok "Updated Successfully" +exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${APP} should be reachable by going to the following URL. + ${BL}http://${IP}:3333${CL} \n" diff --git a/install/ghostfolio-install.sh b/install/ghostfolio-install.sh new file mode 100644 index 00000000..8b827d83 --- /dev/null +++ b/install/ghostfolio-install.sh @@ -0,0 +1,216 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2024 tteck +# Author: tteck (tteckster) +# Co-Author: jcantosz +# License: MIT +# https://github.com/tteck/Proxmox/raw/main/LICENSE + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + curl \ + lsb-release \ + gpg +msg_ok "Installed Dependencies" + + +# POSTGRES ================================= +msg_info "Setting up postgresql" + +POSTGRES_HOST=localhost +POSTGRES_PORT=5432 +POSTGRES_DB=ghostfolio-db +POSTGRES_USER='postgres' +POSTGRES_PASSWORD="$(base64 --wrap=0 /dev/random | head -c 32 | tr -dc 'a-zA-Z0-9')" +ACCESS_TOKEN_SALT="$(base64 --wrap=0 /dev/random | head -c 16 | tr -dc 'a-zA-Z0-9')" +DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer" +JWT_SECRET_KEY="$(base64 --wrap=0 /dev/random | head -c 16 | tr -dc 'a-zA-Z0-9')" + +$STD apt-get install -y postgresql-15 + +# Setup postgres +$STD su postgres <~/ghostery.creds +echo "Ghostery Database Credentials" >>~/ghostery.creds +echo "" >>~/ghostery.creds +echo -e "ghostery Database User: \e[32m$POSTGRES_USER\e[0m" >>~/ghostery.creds +echo -e "ghostery Database Password: \e[32m$POSTGRES_PASSWORD\e[0m" >>~/ghostery.creds +echo -e "ghostery Database Name: \e[32m$POSTGRES_DB\e[0m" >>~/ghostery.creds +msg_ok "Set up postgresql" +#-- END POSTGRES + +# REDIS CACHE ================================= +msg_info "Setting up redis" +REDIS_HOST=localhost +REDIS_PORT=6379 +REDIS_PASSWORD="$(base64 --wrap=0 /dev/random | head -c 32 | tr -dc 'a-zA-Z0-9')" + +$STD apt-get install -y redis + +## Configure Redis +$STD redis-cli CONFIG SET requirepass "$REDIS_PASSWORD" +$STD redis-cli -a "$REDIS_PASSWORD" CONFIG REWRITE +$STD systemctl restart redis + +# Test Redis with password auth +$STD redis-cli -a "$REDIS_PASSWORD" ping + +echo "" >~/ghostery.creds +echo "Ghostery Redis Credentials" >>~/ghostery.creds +echo "" >>~/ghostery.creds +echo -e "ghostery Redis Password: \e[32m$REDIS_PASSWORD\e[0m" >>~/ghostery.creds + +#-- END REDIS CACHE + +# GHOSTFOLIO ================================= +## Setup Vars +NODE_VERSION=20 +GHOSTFOLIO_VERSION='latest' + +cd /opt/ + +# Set up nodejs 20 (project requires this version) +$STD curl -fsSL https://deb.nodesource.com/setup_$NODE_VERSION.x -o nodesource_setup.sh +$STD bash nodesource_setup.sh +rm nodesource_setup.sh +$STD apt-get update + +$STD apt-get install -y --no-install-suggests \ + nodejs \ + g++ \ + git \ + make \ + openssl \ + python3 + +# Determine the latest version if needed +if [[ $GHOSTFOLIO_VERSION == 'latest']]; then + $STD version=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/ghostfolio/ghostfolio/releases/latest) + $STD GHOSTFOLIO_VERSION=${version##*/} +fi + +# Get the realease +$STD curl -Ls -o ghostfolio-$GHOSTFOLIO_VERSION.tgz https://github.com/ghostfolio/ghostfolio/archive/refs/tags/$GHOSTFOLIO_VERSION.tar.gz +$STD tar xzf ghostfolio-$GHOSTFOLIO_VERSION.tgz +$STD rm ghostfolio-$GHOSTFOLIO_VERSION.tgz + +cd /opt/ghostfolio-$GHOSTFOLIO_VERSION + +# Build the project +$STD npm install +$STD npm run build:production + +# package.json was generated by the build process, however the original +# package-lock.json needs to be used to ensure the same versions +# curl -o package-lock.json https://raw.githubusercontent.com/ghostfolio/ghostfolio/refs/tags/$GHOSTFOLIO_VERSION/package-lock.json +mv /opt/ghostfolio-$GHOSTFOLIO_VERSION/package-lock.json /opt/ghostfolio-$GHOSTFOLIO_VERSION/dist/apps/api/ +#cp package-lock.json dist/apps/api/ + +cd /opt/ghostfolio-$GHOSTFOLIO_VERSION/dist/apps/api/ +$STD npm install +mv -r /opt/ghostfolio-$GHOSTFOLIO_VERSION/prisma . + +# Overwrite the generated package.json with the original one to ensure having +# all the scripts +# curl -o package.json https://raw.githubusercontent.com/ghostfolio/ghostfolio/refs/tags/$GHOSTFOLIO_VERSION/package.json +mv /opt/ghostfolio-$GHOSTFOLIO_VERSION/package.json /opt/ghostfolio-$GHOSTFOLIO_VERSION/dist/apps/api/ +$STD npm run database:generate-typings + +# Move the built project to /opt/ghostfolio +cd /opt +mv /opt/ghostfolio-$GHOSTFOLIO_VERSION/dist/apps /opt/ghostfolio +mv /opt/ghostfolio-$GHOSTFOLIO_VERSION/docker/entrypoint.sh /opt/ghostfolio/ + +rm -rf /opt/ghostfolio-$GHOSTFOLIO_VERSION + +# --- END GHOSTFOLIO + +# SERVICE ================================= +# Create env file +msg_info "Creating Environment File" +cat </opt/ghostfolio/api/.env +# Node +NODE_OPTIONS=--max_old_space_size=2048 +# CACHE +REDIS_HOST=$REDIS_HOST +REDIS_PORT=$REDIS_PORT +REDIS_PASSWORD=$REDIS_PASSWORD +# POSTGRES +POSTGRES_DB=$POSTGRES_DB +POSTGRES_USER=$POSTGRES_USER +POSTGRES_PASSWORD=$POSTGRES_PASSWORD +# VARIOUS +ACCESS_TOKEN_SALT=$ACCESS_TOKEN_SALT +DATABASE_URL="$DATABASE_URL" +JWT_SECRET_KEY=$JWT_SECRET_KEY +EOF + +msg_info "Creating Startup Script" +# Create startup script +cat </opt/ghostfolio/start.sh +#!/bin/bash +# Source the environment vars and export them otherwise it wont get them properly +set -a +. /opt/ghostfolio/api/.env +set +a +# Run the docker entrypoint +/opt/ghostfolio/entrypoint.sh +EOF + +chmod +x /opt/ghostfolio/start.sh + +msg_info "Creating Systemd Service Definition" +# Create Systemd Service +cat </etc/systemd/system/ghostfolio.service +[Unit] +Description=ghostfolio +[Service] +After=postgresql.servicei redis.service +Require=postgresql.servicei redis.service +# Start Service +ExecStart=/opt/ghostfolio/start.sh +WorkingDirectory=/opt/ghostfolio/api/ +# Restart service after 10 seconds if node service crashes +RestartSec=10 +Restart=always +# Output to syslog +StandardOutput=syslog +StandardError=syslog +SyslogIdentifier=ghostfolio +[Install] +WantedBy=multi-user.target +EOF + +# Make the service run on container startup +systemctl enable ghostfolio +systemctl start ghostfolio +msg_ok "Created Service" +# -- END SERVICE + +motd_ssh +customize + +msg_info "Cleaning up" +apt remove -y make git g++ +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned"