aboutsummaryrefslogtreecommitdiffstats
path: root/karakeep-linux.sh
diff options
context:
space:
mode:
authorChris <punk.sand7393@fastmail.com>2025-04-13 12:09:39 -0400
committerGitHub <noreply@github.com>2025-04-13 17:09:39 +0100
commitf07266354e073fcb457c59c6a6523ea5fc880dfd (patch)
tree31fcf33e5bff6eada8d2725ef609b45d2256ff8e /karakeep-linux.sh
parentbc5c1a1b312a69931e9eabca8fae8ff9f02a2c85 (diff)
downloadkarakeep-f07266354e073fcb457c59c6a6523ea5fc880dfd.tar.zst
chore: hoarder-linux.sh > karakeep-linux.sh v2.1 (#1219)
* hoarder-linux.sh > karakeep-linux.sh v2.1 - Adds a migrate function so users can convert their Hoarder install to a Karakeep install - The function will also check for an update after finishing the migration - Various fixes and optimisations * Update docs with Debuntu migration path and replace Hoarder with Karakeep
Diffstat (limited to '')
-rw-r--r--karakeep-linux.sh (renamed from hoarder-linux.sh)225
1 files changed, 135 insertions, 90 deletions
diff --git a/hoarder-linux.sh b/karakeep-linux.sh
index 8a857091..4e7123df 100644
--- a/hoarder-linux.sh
+++ b/karakeep-linux.sh
@@ -2,7 +2,7 @@
set -Eeuo pipefail
-# v2.0
+# v2.1
# Copyright 2024-2025
# Author: vhsdream
# Adapted from: The Karakeep installation script from https://github.com/community-scripts/ProxmoxVE
@@ -12,18 +12,18 @@ set -Eeuo pipefail
trap 'catch $? $LINENO' ERR
catch() {
- if [ "$1" == 0 ]; then
- return
- fi
- echo "Caught error $1 on line $2"
+ if [ "$1" == 0 ]; then
+ return
+ fi
+ echo "Caught error $1 on line $2"
}
-OS="$( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release )"
-INSTALL_DIR=/opt/hoarder
-export DATA_DIR=/var/lib/hoarder
-CONFIG_DIR=/etc/hoarder
-LOG_DIR=/var/log/hoarder
-ENV_FILE=${CONFIG_DIR}/hoarder.env
+OS="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
+INSTALL_DIR=/opt/karakeep
+export DATA_DIR=/var/lib/karakeep
+CONFIG_DIR=/etc/karakeep
+LOG_DIR=/var/log/karakeep
+ENV_FILE=${CONFIG_DIR}/karakeep.env
install() {
echo "Karakeep installation for Debian 12/Ubuntu 24.04" && sleep 4
@@ -32,7 +32,6 @@ install() {
g++ \
curl \
build-essential \
- curl \
sudo \
unzip \
gnupg \
@@ -50,8 +49,8 @@ install() {
fi
wget -q https://github.com/Y2Z/monolith/releases/latest/download/monolith-gnu-linux-x86_64 -O /usr/bin/monolith && chmod +x /usr/bin/monolith
- wget -q https://github.com/meilisearch/meilisearch/releases/latest/download/meilisearch.deb && \
- DEBIAN_FRONTEND=noninteractive dpkg -i meilisearch.deb && rm meilisearch.deb
+ wget -q https://github.com/meilisearch/meilisearch/releases/latest/download/meilisearch.deb &&
+ DEBIAN_FRONTEND=noninteractive dpkg -i meilisearch.deb && rm meilisearch.deb
echo "Installed Dependencies" && sleep 1
echo "Installing Node.js..."
@@ -60,38 +59,38 @@ install() {
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
apt-get update
apt-get install -y nodejs
- # https://github.com/hoarder-app/hoarder/issues/967
+ # https://github.com/karakeep-app/karakeep/issues/967
npm install -g corepack@0.31.0
echo "Installed Node.js" && sleep 1
echo "Installing Karakeep..."
- mkdir -p $DATA_DIR
- mkdir -p $CONFIG_DIR
- mkdir -p $LOG_DIR
+ mkdir -p "$DATA_DIR"
+ mkdir -p "$CONFIG_DIR"
+ mkdir -p "$LOG_DIR"
M_DATA_DIR=/var/lib/meilisearch
M_CONFIG_FILE=/etc/meilisearch.toml
RELEASE=$(curl -s https://api.github.com/repos/karakeep-app/karakeep/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
cd /tmp
wget -q "https://github.com/karakeep-app/karakeep/archive/refs/tags/v${RELEASE}.zip"
- unzip -q v${RELEASE}.zip
- mv karakeep-${RELEASE} ${INSTALL_DIR} && cd ${INSTALL_DIR}/apps/web
+ unzip -q v"$RELEASE".zip
+ mv karakeep-"$RELEASE" "$INSTALL_DIR" && cd "$INSTALL_DIR"/apps/web
corepack enable
export NEXT_TELEMETRY_DISABLED=1
export PUPPETEER_SKIP_DOWNLOAD="true"
export CI="true"
pnpm i --frozen-lockfile
pnpm exec next build --experimental-build-mode compile
- cd ${INSTALL_DIR}/apps/workers
+ cd "$INSTALL_DIR"/apps/workers
pnpm i --frozen-lockfile
- cd ${INSTALL_DIR}/apps/cli
+ cd "$INSTALL_DIR"/apps/cli
pnpm i --frozen-lockfile
pnpm build
- cd ${INSTALL_DIR}/packages/db
+ cd "$INSTALL_DIR"/packages/db
pnpm migrate
echo "Installed Karakeep" && sleep 1
echo "Creating configuration files..."
- cd $INSTALL_DIR
+ cd "$INSTALL_DIR"
MASTER_KEY="$(openssl rand -base64 12)"
cat <<EOF >${M_CONFIG_FILE}
env = "production"
@@ -101,13 +100,13 @@ dump_dir = "${M_DATA_DIR}/dumps"
snapshot_dir = "${M_DATA_DIR}/snapshots"
no_analytics = true
EOF
- chmod 600 $M_CONFIG_FILE
+ chmod 600 "$M_CONFIG_FILE"
- KARAKEEP_SECRET="$(openssl rand -base64 36 | cut -c1-24)"
+ karakeep_SECRET="$(openssl rand -base64 36 | cut -c1-24)"
cat <<EOF >${ENV_FILE}
NODE_ENV=production
SERVER_VERSION=${RELEASE}
-NEXTAUTH_SECRET="${KARAKEEP_SECRET}"
+NEXTAUTH_SECRET="${karakeep_SECRET}"
NEXTAUTH_URL="http://localhost:3000"
DATA_DIR=${DATA_DIR}
MEILI_ADDR="http://127.0.0.1:7700"
@@ -120,15 +119,15 @@ BROWSER_WEB_URL="http://127.0.0.1:9222"
# INFERENCE_TEXT_MODEL=
# INFERENCE_IMAGE_MODEL=
EOF
- chmod 600 $ENV_FILE
- echo ${RELEASE} > ${INSTALL_DIR}/version.txt
+ chmod 600 "$ENV_FILE"
+ echo "$RELEASE" >"$INSTALL_DIR"/version.txt
echo "Configuration complete" && sleep 1
echo "Creating users and modifying permissions..."
- useradd -U -s /usr/sbin/nologin -r -m -d "${M_DATA_DIR}" meilisearch
- useradd -U -s /usr/sbin/nologin -r -M -d "${INSTALL_DIR}" hoarder
- chown meilisearch:meilisearch "${M_CONFIG_FILE}"
- chown -R hoarder:hoarder "${INSTALL_DIR}" "${CONFIG_DIR}" "${DATA_DIR}" "${LOG_DIR}"
+ useradd -U -s /usr/sbin/nologin -r -m -d "$M_DATA_DIR" meilisearch
+ useradd -U -s /usr/sbin/nologin -r -M -d "$INSTALL_DIR" karakeep
+ chown meilisearch:meilisearch "$M_CONFIG_FILE"
+ chown -R karakeep:karakeep "$INSTALL_DIR" "$CONFIG_DIR" "$DATA_DIR" "$LOG_DIR"
echo "Users created, permissions modified" && sleep 1
echo "Creating service files..."
@@ -167,9 +166,9 @@ RemoveIPC=true
WantedBy=multi-user.target
EOF
- cat <<EOF >/etc/systemd/system/hoarder-browser.service
+ cat <<EOF >/etc/systemd/system/karakeep-browser.service
[Unit]
-Description=Hoarder headless browser
+Description=Karakeep headless browser
After=network.target
[Service]
@@ -177,61 +176,61 @@ User=root
Restart=on-failure
ExecStart=/usr/bin/chromium --headless --no-sandbox --disable-gpu --disable-dev-shm-usage --remote-debugging-address=127.0.0.1 --remote-debugging-port=9222 --hide-scrollbars
TimeoutStopSec=5
-SyslogIdentifier=hoarder-browser
+SyslogIdentifier=karakeep-browser
[Install]
WantedBy=multi-user.target
EOF
- cat <<EOF >/etc/systemd/system/hoarder-workers.service
+ cat <<EOF >/etc/systemd/system/karakeep-workers.service
[Unit]
-Description=Hoarder workers
-Wants=network.target hoarder-browser.service meilisearch.service
-After=network.target hoarder-browser.service meilisearch.service
+Description=Karakeep workers
+Wants=network.target karakeep-browser.service meilisearch.service
+After=network.target karakeep-browser.service meilisearch.service
[Service]
-User=hoarder
-Group=hoarder
+User=karakeep
+Group=karakeep
Restart=always
EnvironmentFile=${ENV_FILE}
WorkingDirectory=${INSTALL_DIR}/apps/workers
ExecStart=/usr/bin/pnpm run start:prod
-StandardOutput=file:${LOG_DIR}/hoarder-workers.log
-StandardError=file:${LOG_DIR}/hoarder-workers.log
+StandardOutput=file:${LOG_DIR}/karakeep-workers.log
+StandardError=file:${LOG_DIR}/karakeep-workers.log
TimeoutStopSec=5
-SyslogIdentifier=hoarder-workers
+SyslogIdentifier=karakeep-workers
[Install]
WantedBy=multi-user.target
EOF
- cat <<EOF >/etc/systemd/system/hoarder-web.service
+ cat <<EOF >/etc/systemd/system/karakeep-web.service
[Unit]
-Description=Hoarder web
-Wants=network.target hoarder-workers.service
-After=network.target hoarder-workers.service
+Description=Karakeep web
+Wants=network.target karakeep-workers.service
+After=network.target karakeep-workers.service
[Service]
-User=hoarder
-Group=hoarder
+User=karakeep
+Group=karakeep
Restart=on-failure
EnvironmentFile=${ENV_FILE}
WorkingDirectory=${INSTALL_DIR}/apps/web
ExecStart=/usr/bin/pnpm start
-StandardOutput=file:${LOG_DIR}/hoarder-web.log
-StandardError=file:${LOG_DIR}/hoarder-web.log
+StandardOutput=file:${LOG_DIR}/karakeep-web.log
+StandardError=file:${LOG_DIR}/karakeep-web.log
TimeoutStopSec=5
-SyslogIdentifier=hoarder-web
+SyslogIdentifier=karakeep-web
[Install]
WantedBy=multi-user.target
EOF
- cat <<EOF >/etc/systemd/system/hoarder.target
+ cat <<EOF >/etc/systemd/system/karakeep.target
[Unit]
-Description=Hoarder Services
+Description=Karakeep Services
After=network-online.target
-Wants=meilisearch.service hoarder-browser.service hoarder-workers.service hoarder-web.service
+Wants=meilisearch.service karakeep-browser.service karakeep-workers.service karakeep-web.service
[Install]
WantedBy=multi-user.target
@@ -239,11 +238,11 @@ EOF
echo "Service files created" && sleep 1
echo "Enabling and starting services, please wait..." && sleep 3
- systemctl enable -q --now meilisearch.service hoarder.target
+ systemctl enable -q --now meilisearch.service karakeep.target
echo "Done" && sleep 1
echo "Cleaning up" && sleep 1
- rm /tmp/v${RELEASE}.zip
+ rm /tmp/v"$RELEASE".zip
apt -y autoremove
apt -y autoclean
echo "Cleaned" && sleep 1
@@ -254,37 +253,45 @@ EOF
update() {
echo "Checking for an update..." && sleep 1
- if [[ ! -d ${INSTALL_DIR} ]]; then echo "Is Karakeep even installed?"; exit 1; fi
+ if [[ ! -d ${INSTALL_DIR} ]]; then
+ echo "Is Karakeep even installed?"
+ exit 1
+ fi
RELEASE=$(curl -s https://api.github.com/repos/karakeep-app/karakeep/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
- PREV_RELEASE=$(cat ${INSTALL_DIR}/version.txt)
- if [[ "${RELEASE}" != "${PREV_RELEASE}" ]]; then
- echo "Stopping affected services..." && sleep 1
- systemctl stop hoarder-web hoarder-workers
- echo "Stopped services" && sleep 1
-
+ PREV_RELEASE=$(cat "$INSTALL_DIR"/version.txt)
+ if [[ "$RELEASE" != "$PREV_RELEASE" ]]; then
+ if [[ "$(systemctl is-active karakeep-web)" == "active" ]]; then
+ echo "Stopping affected services..." && sleep 1
+ systemctl stop karakeep-web karakeep-workers
+ echo "Stopped services" && sleep 1
+ fi
echo "Updating Karakeep to v${RELEASE}..." && sleep 1
- sed -i "s|SERVER_VERSION=${PREV_RELEASE}|SERVER_VERSION=${RELEASE}|" ${ENV_FILE}
- rm -R ${INSTALL_DIR}
+ sed -i "s|SERVER_VERSION=${PREV_RELEASE}|SERVER_VERSION=${RELEASE}|" "$ENV_FILE"
+ rm -R "$INSTALL_DIR"
cd /tmp
wget -q "https://github.com/karakeep-app/karakeep/archive/refs/tags/v${RELEASE}.zip"
- unzip -q v${RELEASE}.zip
- mv karakeep-${RELEASE} ${INSTALL_DIR}
- # https://github.com/hoarder-app/hoarder/issues/967
+ unzip -q v"$RELEASE".zip
+ mv karakeep-"$RELEASE" "$INSTALL_DIR"
+ # https://github.com/karakeep-app/karakeep/issues/967
if [[ $(corepack -v) < "0.31.0" ]]; then
- npm install -g corepack@0.31.0
+ npm install -g corepack@0.31.0
fi
- cd ${INSTALL_DIR}/apps/web && pnpm i --frozen-lockfile
+ corepack enable
+ export NEXT_TELEMETRY_DISABLED=1
+ export PUPPETEER_SKIP_DOWNLOAD="true"
+ export CI="true"
+ cd "$INSTALL_DIR"/apps/web && pnpm i --frozen-lockfile
pnpm exec next build --experimental-build-mode compile
- cd ${INSTALL_DIR}/apps/workers && pnpm i --frozen-lockfile
- cd ${INSTALL_DIR}/apps/cli && pnpm i --frozen-lockfile
+ cd "$INSTALL_DIR"/apps/workers && pnpm i --frozen-lockfile
+ cd "$INSTALL_DIR"/apps/cli && pnpm i --frozen-lockfile
pnpm build
- cd ${INSTALL_DIR}/packages/db && pnpm migrate
- echo "${RELEASE}" >${INSTALL_DIR}/version.txt
- chown -R hoarder:hoarder ${INSTALL_DIR} ${DATA_DIR}
+ cd "$INSTALL_DIR"/packages/db && pnpm migrate
+ echo "$RELEASE" >"$INSTALL_DIR"/version.txt
+ chown -R karakeep:karakeep "$INSTALL_DIR" "$DATA_DIR"
echo "Updated Karakeep to v${RELEASE}" && sleep 1
echo "Restarting services and cleaning up..." && sleep 1
- systemctl start hoarder-workers hoarder-web
- rm /tmp/v${RELEASE}.zip
+ systemctl start karakeep-workers karakeep-web
+ rm /tmp/v"$RELEASE".zip
echo "Ready!"
else
echo "No update required."
@@ -292,19 +299,57 @@ update() {
exit 0
}
+migrate() {
+ if [[ ! -d /opt/karakeep ]]; then
+ echo "Migrating your Hoarder installation to Karakeep, then checking for an update..." && sleep 3
+ systemctl stop hoarder-browser hoarder-workers hoarder-web
+ sed -i -e "s|hoarder|karakeep|g" /etc/hoarder/hoarder.env /etc/systemd/system/hoarder-{browser,web,workers}.service /etc/systemd/system/hoarder.target \
+ -e "s|Hoarder|Karakeep|g" /etc/systemd/system/hoarder-{browser,web,workers}.service /etc/systemd/system/hoarder.target
+ for path in /etc/systemd/system/hoarder*.service; do
+ new_path="${path//hoarder/karakeep}"
+ mv "$path" "$new_path"
+ done
+ mv /etc/systemd/system/hoarder.target /etc/systemd/system/karakeep.target
+ mv /opt/hoarder "$INSTALL_DIR"
+ mv /var/lib/hoarder "$DATA_DIR"
+ mv /etc/hoarder "$CONFIG_DIR"
+ mv /var/log/hoarder "$LOG_DIR"
+ mv "$CONFIG_DIR"/hoarder.env "$ENV_FILE"
+ mv "$LOG_DIR"/hoarder-web.log "$LOG_DIR"/karakeep-web.log
+ mv "$LOG_DIR"/hoarder-workers.log "$LOG_DIR"/karakeep-workers.log
+ usermod -l karakeep hoarder -d "$INSTALL_DIR"
+ groupmod -n karakeep hoarder
+ chown -R karakeep:karakeep "$INSTALL_DIR" "$CONFIG_DIR" "$DATA_DIR" "$LOG_DIR"
+ systemctl daemon-reload
+ systemctl -q enable --now karakeep.target
+ echo "Migration complete!" && sleep 2
+ else
+ echo "There is no need for a migration: Karakeep is already installed."
+ exit 1
+ fi
+}
+
[ "$(id -u)" -ne 0 ] && echo "This script requires root privileges. Please run with sudo or as the root user." && exit 1
command="${1:-}"
-if [ -z "$command" ]; then
- echo -e "Run script with 'install' to install Karakeep and 'update' to update Karakeep" && exit 1
+if [ "$command" = "" ]; then
+ echo -e "\nRun script with:\r
+parameter 'install' to install Karakeep\r
+parameter 'update' to update Karakeep\r
+parameter 'migrate' to migrate your Hoarder install to Karakeep\n
+Note: 'migrate' will also update to the latest version if necessary" && exit 1
fi
case "$command" in
- install)
- install
- ;;
- update)
- update
- ;;
- *)
- echo -e "Unknown command. Choose 'install' or 'update'" && exit 1
+install)
+ install
+ ;;
+update)
+ update
+ ;;
+migrate)
+ migrate && update
+ ;;
+*)
+ echo -e "Unknown command. Choose 'install', 'update' or 'migrate'." && exit 1
+ ;;
esac