Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New script: Outline LXC #472

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions ct/outline.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/burgerga/ProxmoxVE/add_outline/misc/build.func)
# Copyright (c) 2024 community-scripts ORG
# Author: Gerhard Burger (burgerga)
# License: MIT
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE

function header_info {
clear
cat <<"EOF"
____ __ ___
/ __ \__ __/ /_/ (_)___ ___
/ / / / / / / __/ / / __ \/ _ \
/ /_/ / /_/ / /_/ / / / / / __/
\____/\__,_/\__/_/_/_/ /_/\___/

EOF
}
header_info
echo -e "Loading..."
APP="Outline"
var_disk="8"
var_cpu="2"
var_ram="4096"
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"
echo_default
}

function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/outline ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
RELEASE=$(curl -s https://api.github.com/repos/outline/outline/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
burgerga marked this conversation as resolved.
Show resolved Hide resolved
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Stopping ${APP}"
systemctl stop outline
msg_ok "Stopped ${APP}"

msg_info "Updating ${APP} to ${RELEASE} (Patience)"
cd /opt
cp /opt/outline/.env /opt/.env
mv /opt/outline /opt/outline_bak
burgerga marked this conversation as resolved.
Show resolved Hide resolved
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

## Build in development mode
burgerga marked this conversation as resolved.
Show resolved Hide resolved
unset NODE_ENV
burgerga marked this conversation as resolved.
Show resolved Hide resolved
yarn install --no-optional --frozen-lockfile &>/dev/null &&
burgerga marked this conversation as resolved.
Show resolved Hide resolved
yarn cache clean &>/dev/null &&
burgerga marked this conversation as resolved.
Show resolved Hide resolved
yarn build &>/dev/null

## Continue in production mode
burgerga marked this conversation as resolved.
Show resolved Hide resolved
rm -rf ./node_modules
yarn install --production=true--frozen-lockfile &>/dev/null &&
burgerga marked this conversation as resolved.
Show resolved Hide resolved
yarn cache clean &>/dev/null

mv /opt/.env /opt/outline/.env

echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"

msg_info "Starting ${APP}"
systemctl start outline
msg_ok "Started ${APP}"
burgerga marked this conversation as resolved.
Show resolved Hide resolved
msg_info "Cleaning up"
rm -rf /opt/${RELEASE}.zip
rm -rf /opt/outline_bak
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}."
fi
exit
}

start
build_container
description

msg_ok "Completed Successfully!\n"
157 changes: 157 additions & 0 deletions install/outline-install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
#!/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
burgerga marked this conversation as resolved.
Show resolved Hide resolved
read -r -p "Would you like to add Adminer? <y/N> " adminer_prompt
burgerga marked this conversation as resolved.
Show resolved Hide resolved

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 \
burgerga marked this conversation as resolved.
Show resolved Hide resolved
curl \
lsb-release \
postgresql \
gnupg \
unzip
msg_ok "Installed Dependencies"

msg_info "Setting up Node.js Repository"
NODE_MAJOR=20
burgerga marked this conversation as resolved.
Show resolved Hide resolved
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
burgerga marked this conversation as resolved.
Show resolved Hide resolved

msg_info "Installing $APPLICATION (Patience)"
burgerga marked this conversation as resolved.
Show resolved Hide resolved
burgerga marked this conversation as resolved.
Show resolved Hide resolved
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) }')
burgerga marked this conversation as resolved.
Show resolved Hide resolved
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
burgerga marked this conversation as resolved.
Show resolved Hide resolved
burgerga marked this conversation as resolved.
Show resolved Hide resolved
$STD yarn install --no-optional --frozen-lockfile
$STD yarn cache clean
$STD yarn build

## Continue in production
burgerga marked this conversation as resolved.
Show resolved Hide resolved
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
burgerga marked this conversation as resolved.
Show resolved Hide resolved
burgerga marked this conversation as resolved.
Show resolved Hide resolved

{
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
burgerga marked this conversation as resolved.
Show resolved Hide resolved

$STD yarn sequelize db:create
$STD yarn sequelize db:migrate

echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Installed $APPLICATION"
burgerga marked this conversation as resolved.
Show resolved Hide resolved
burgerga marked this conversation as resolved.
Show resolved Hide resolved

msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/outline.service
[Unit]
Description=Linkwarden Service
burgerga marked this conversation as resolved.
Show resolved Hide resolved
burgerga marked this conversation as resolved.
Show resolved Hide resolved
After=network.target

[Service]
Type=exec
WorkingDirectory=/opt/outline
ExecStart=/usr/bin/yarn start
havardthom marked this conversation as resolved.
Show resolved Hide resolved

[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"
47 changes: 47 additions & 0 deletions json/outline.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{
"name": "Outline",
"slug": "outline",
"categories": [
14
],
"date_created": "2024-11-23",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": "3000",
"documentation": "https://docs.getoutline.com/s/guide",
"website": "https://www.getoutline.com/",
"logo": "https://raw.githubusercontent.com/outline/outline/refs/heads/main/public/images/icon-192.png",
"description": "Outline is the fastest knowledge base for growing teams. Beautiful, realtime collaborative, feature packed, and markdown compatible.",
"install_methods": [
{
"type": "default",
"script": "ct/outline.sh",
"resources": {
"cpu": "2",
"ram": "4096",
"hdd": "8",
"os": "debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
burgerga marked this conversation as resolved.
Show resolved Hide resolved
"password": null
},
"notes": [
{
"text": "Outline needs to be behind a reverse proxy (e.g., Nginx Proxy Manager) to obtain HTTPS and to allow clients to connect. The https URL on which Outline should be reached, is prompted in the script and might not be trivial to change after installation!",
"type": "warning"
},
{
"text": "At least one identity provider from `https://docs.getoutline.com/s/hosting/doc/authentication-7ViKRmRY5o` needs to be added to `/opt/outline/.env` to allow users to login, also SMTP can be configured here (look at `/opt/outline/.env.sample` for the correct ENV vars). After editing, restart outline with `systemctl restart outline`.",
"type": "warning"
},
{
"text": "Show database credentials: `cat ~/outline.creds`",
"type": "info"
}
]
}
12 changes: 6 additions & 6 deletions misc/build.func
burgerga marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -505,13 +505,13 @@ install_script() {
check_container_resources() {
# Check actual RAM & Cores
current_ram=$(free -m | awk '/^Mem:/{print $2}')
current_cpu=$(nproc)
current_cpu=$(nproc)

# Check whether the current RAM is less than the required RAM or the CPU cores are less than required
if [[ "$current_ram" -lt "$var_ram" ]] || [[ "$current_cpu" -lt "$var_cpu" ]]; then
echo -e "\n⚠️${HOLD} ${GN}Required: ${var_cpu} CPU, ${var_ram}MB RAM ${CL}| ${RD}Current: ${current_cpu} CPU, ${current_ram}MB RAM${CL}"
echo -e "${YWB}Please ensure that the ${APP} LXC is configured with at least ${var_cpu} vCPU and ${var_ram} MB RAM for the build process.${CL}\n"
exit 1
exit 1
else
echo -e ""
fi
Expand All @@ -525,7 +525,7 @@ check_container_storage() {
if (( usage > 80 )); then
# Prompt the user for confirmation to continue
echo -e "⚠️${HOLD} ${YWB}Warning: Storage is dangerously low (${usage}%).${CL}"
read -r -p "Continue anyway? <y/N> " prompt
read -r -p "Continue anyway? <y/N> " prompt
# Check if the input is 'y' or 'yes', otherwise exit with status 1
if [[ ! ${prompt,,} =~ ^(y|yes)$ ]]; then
echo -e "❌${HOLD} ${YWB}Exiting based on user input.${CL}"
Expand Down Expand Up @@ -572,7 +572,7 @@ build_container() {
if [ "$var_os" == "alpine" ]; then
export FUNCTIONS_FILE_PATH="$(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/alpine-install.func)"
else
export FUNCTIONS_FILE_PATH="$(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/install.func)"
export FUNCTIONS_FILE_PATH="$(curl -s https://raw.githubusercontent.com/burgerga/ProxmoxVE/add_outline/misc/install.func)"
fi
export CACHER="$APT_CACHER"
export CACHER_IP="$APT_CACHER_IP"
Expand Down Expand Up @@ -666,7 +666,7 @@ http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
EOF'
pct exec "$CTID" -- ash -c "apk add bash >/dev/null"
fi
lxc-attach -n "$CTID" -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/$var_install.sh)" || exit
lxc-attach -n "$CTID" -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/burgerga/ProxmoxVE/add_outline/install/$var_install.sh)" || exit

}

Expand All @@ -688,7 +688,7 @@ description() {
<img src='https://img.shields.io/badge/&#x2615;-Buy us a coffee-blue' alt='spend Coffee' />
</a>
</p>

<span style='margin: 0 10px;'>
<i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i>
<a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a>
Expand Down
4 changes: 2 additions & 2 deletions misc/install.func
burgerga marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ network_check() {
ipv6_connected=false
sleep 1
# Check IPv4 connectivity
if ping -c 1 -W 1 1.1.1.1 &>/dev/null; then
if ping -c 1 -W 1 1.1.1.1 &>/dev/null; then
msg_ok "IPv4 Internet Connected";
ipv4_connected=true
else
Expand Down Expand Up @@ -198,6 +198,6 @@ EOF
systemctl restart $(basename $(dirname $GETTY_OVERRIDE) | sed 's/\.d//')
msg_ok "Customized Container"
fi
echo "bash -c \"\$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/ct/${app}.sh)\"" >/usr/bin/update
echo "bash -c \"\$(wget -qLO - https://github.com/burgerga/ProxmoxVE/raw/add_outline/ct/${app}.sh)\"" >/usr/bin/update
chmod +x /usr/bin/update
}