#!/usr/bin/env bash # Copyright (c) 2024 community-scripts ORG # Author: Gerhard Burger (burgerga) # License: MIT # https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE read -r -p "Enter the public url for your Outline instance (e.g., https://outline.your-domain.tld)): " URL read -r -p "Would you like to add Adminer? " adminer_prompt 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 \ sudo \ curl \ lsb-release \ postgresql \ gnupg \ unzip msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" NODE_MAJOR=20 mkdir -p /etc/apt/keyrings wget -qO- https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_${NODE_MAJOR}.x nodistro main" >/etc/apt/sources.list.d/nodesource.list msg_ok "Set up Node.js Repository" msg_info "Setting up Redis Repository" wget -qO- https://packages.redis.io/gpg | gpg --dearmor -o /etc/apt/keyrings/redis-archive-keyring.gpg echo "deb [signed-by=/etc/apt/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" >/etc/apt/sources.list.d/redis.list msg_ok "Set up Redis Repository" msg_info "Installing Node.js/Yarn" $STD apt-get update $STD apt-get install -y nodejs $STD npm install -g yarn msg_ok "Installed Node.js/Yarn" msg_info "Installing Redis" $STD apt-get install -y redis sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis/redis.conf systemctl enable -q --now redis-server.service msg_ok "Installed Redis" msg_info "Setting up PostgreSQL DB" SECRET_KEY="$(openssl rand -hex 32)" UTILS_SECRET="$(openssl rand -hex 32)" DB_NAME=outlinedb DB_USER=outline DB_PASS="$(openssl rand -base64 18 | tr -d '/' | cut -c1-13)" DATABASE_URL="postgres://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}" $STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER WITH CREATEDB;" $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';" { echo "Outline-Credentials" echo "Outline Database User: $DB_USER" echo "Outline Database Password: $DB_PASS" echo "Outline Database Name: $DB_NAME" echo "Outline Secret: $SECRET_KEY" echo "Outline Utils Secret: $UTILS_SECRET" } >> ~/outline.creds msg_ok "Set up PostgreSQL DB" if [[ "${adminer_prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Installing Adminer" $STD apt install -y adminer $STD a2enconf adminer systemctl reload apache2 IP=$(hostname -I | awk '{print $1}') { echo "" echo "Adminer Interface: $IP/adminer/" echo "Adminer System: PostgreSQL" echo "Adminer Server: localhost:5432" echo "Adminer Username: $DB_USER" echo "Adminer Password: $DB_PASS" echo "Adminer Database: $DB_NAME" } >> ~/outline.creds msg_ok "Installed Adminer" fi msg_info "Installing $APPLICATION (Patience)" cd /opt RELEASE=$(curl -s https://api.github.com/repos/outline/outline/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') wget -q "https://github.com/outline/outline/archive/refs/tags/${RELEASE}.zip" unzip -q ${RELEASE}.zip mv outline-${RELEASE:1} /opt/outline cd /opt/outline ## First build in development $STD yarn install --no-optional --frozen-lockfile $STD yarn cache clean $STD yarn build ## Continue in production rm -rf ./node_modules $STD yarn install --production=true--frozen-lockfile $STD yarn cache clean FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data mkdir -p $FILE_STORAGE_LOCAL_ROOT_DIR { echo NODE_ENV=production echo SECRET_KEY=$SECRET_KEY echo UTILS_SECRET=$UTILS_SECRET echo DATABASE_URL=$DATABASE_URL echo REDIS_URL=redis://localhost:6379 echo URL=$URL echo FILE_STORAGE=local echo FILE_STORAGE_LOCAL_ROOT_DIR=$FILE_STORAGE_LOCAL_ROOT_DIR echo FILE_STORAGE_UPLOAD_MAX_SIZE=262144000 echo WEB_CONCURRENCY=2 } > /opt/outline/.env $STD yarn sequelize db:create $STD yarn sequelize db:migrate echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed $APPLICATION" msg_info "Creating Service" cat </etc/systemd/system/outline.service [Unit] Description=Linkwarden Service After=network.target [Service] Type=exec WorkingDirectory=/opt/outline ExecStart=/usr/bin/yarn start [Install] WantedBy=multi-user.target EOF systemctl enable -q --now outline.service msg_ok "Created Service" motd_ssh customize msg_info "Cleaning up" rm -rf /opt/${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned"