#!/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 ## Following Ghostfolio's Dockerfile and docker-compose for versions/steps, but installing all postgres/redis on the same host # - https://github.com/ghostfolio/ghostfolio/blob/main/Dockerfile # - https://github.com/ghostfolio/ghostfolio/blob/main/docker/docker-compose.yml msg_info "Installing Dependencies" $STD apt-get update $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="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)" ACCESS_TOKEN_SALT="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)" DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer" JWT_SECRET_KEY="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)" $STD apt-get install -y postgresql-15 # Setup postgres $STD su postgres <~/ghostfolio.creds echo "Ghostfolio Database Credentials" >>~/ghostfolio.creds echo "" >>~/ghostfolio.creds echo -e "Ghostfolio Database User: \e[32m$POSTGRES_USER\e[0m" >>~/ghostfolio.creds echo -e "Ghostfolio Database Password: \e[32m$POSTGRES_PASSWORD\e[0m" >>~/ghostfolio.creds echo -e "Ghostfolio Database Name: \e[32m$POSTGRES_DB\e[0m" >>~/ghostfolio.creds msg_ok "Set up Postgresql" #-- END POSTGRES # REDIS CACHE ================================= msg_info "Setting up Redis" REDIS_HOST=localhost REDIS_PORT=6379 REDIS_PASSWORD="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)" $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 "" >>~/ghostfolio.creds echo "Ghostfolio Redis Credentials" >>~/ghostfolio.creds echo "" >>~/ghostfolio.creds echo -e "Ghostfolio Redis Password: \e[32m$REDIS_PASSWORD\e[0m" >>~/ghostfolio.creds msg_ok "Set up Redis" #-- END REDIS CACHE # GHOSTFOLIO ================================= msg_info "Set up Ghostfolio" ## Setup Vars ## default node to 20 (current required version, but determine from nvmrc later) NODE_VERSION=20 GHOSTFOLIO_VERSION='latest' # tested with 2.117.0 cd /opt/ $STD apt-get install -y --no-install-suggests \ g++ \ git \ make \ openssl \ python3 if [[ "$GHOSTFOLIO_VERSION" == "latest" ]]; then GHOSTFOLIO_VERSION=$(curl -sL https://api.github.com/repos/ghostfolio/ghostfolio/releases/latest | grep '"tag_name":' | cut -d'"' -f4) 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 # Stash these so we have clean versions later cp /opt/ghostfolio-$GHOSTFOLIO_VERSION/package.json /opt/ghostfolio-$GHOSTFOLIO_VERSION/package.json.bak cp /opt/ghostfolio-$GHOSTFOLIO_VERSION/package-lock.json /opt/ghostfolio-$GHOSTFOLIO_VERSION/package-lock.json.bak # Get node version and install node test -f .nvmrc && NODE_VERSION=$(sed 's/^v\([0-9]*\)[.]*.*/\1/g' .nvmrc) # get first digits after an v, excluding potential .minor.patch versions $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 # 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 mv /opt/ghostfolio-$GHOSTFOLIO_VERSION/package-lock.json.bak /opt/ghostfolio-$GHOSTFOLIO_VERSION/dist/apps/api/package-lock.json cd /opt/ghostfolio-$GHOSTFOLIO_VERSION/dist/apps/api/ $STD npm install mv /opt/ghostfolio-$GHOSTFOLIO_VERSION/prisma . # Overwrite the generated package.json with the original one to ensure having all the scripts mv /opt/ghostfolio-$GHOSTFOLIO_VERSION/package.json.bak /opt/ghostfolio-$GHOSTFOLIO_VERSION/dist/apps/api/package.json $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 msg_ok "Set up Ghostfolio" # --- END GHOSTFOLIO # SERVICE ================================= msg_info "Creating Startup Scripts" # Create env file msg_info "Creating Environment File" cat </opt/ghostfolio/api/.env # 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 # 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.service redis.service Require=postgresql.service 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 Startup Scripts" # -- 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"