diff --git a/ct/koillection.sh b/ct/koillection.sh new file mode 100644 index 00000000..a78e2b2c --- /dev/null +++ b/ct/koillection.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://koillection.github.io/ + +# App Default Values +APP="Koillection" +var_tags="network" +var_cpu="2" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +# App Output & Base Settings +header_info "$APP" +base_settings + +# Core +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/koillection ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -s https://api.github.com/repos/benjaminjonard/koillection/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping Service" + systemctl stop apache2 + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + cd /opt + mv /opt/koillection/ /opt/koillection-backup + wget -q "https://github.com/benjaminjonard/koillection/archive/refs/tags/${RELEASE}.zip" + unzip -q "${RELEASE}.zip" + mv "/opt/koillection-${RELEASE}" /opt/koillection + cd /opt/koillection + cp -r /opt/koillection-backup/.env.local /opt/koillection + cp -r /opt/koillection-backup/public/uploads/. /opt/koillection/public/uploads/ + export COMPOSER_ALLOW_SUPERUSER=1 + composer install --no-dev -o --no-interaction --classmap-authoritative &>/dev/null + php bin/console doctrine:migrations:migrate --no-interaction &>/dev/null + php bin/console app:translations:dump &>/dev/null + cd assets/ + yarn install &>/dev/null + yarn build &>/dev/null + chown -R www-data:www-data /opt/koillection/public/uploads + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting Service" + systemctl start apache2 + msg_ok "Started Service" + + msg_info "Cleaning up" + rm -r "/opt/${RELEASE}.zip" + rm -r /opt/koillection-backup + msg_ok "Cleaned" + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at v${RELEASE}" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}" diff --git a/install/koillection-install.sh b/install/koillection-install.sh new file mode 100644 index 00000000..90745a21 --- /dev/null +++ b/install/koillection-install.sh @@ -0,0 +1,124 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/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 \ + sudo \ + mc \ + gnupg2\ + postgresql \ + apache2 \ + lsb-release +msg_ok "Installed Dependencies" + +msg_info "Setup PHP8.4 Repository" +$STD curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb +$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb +$STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' +$STD apt-get update +msg_ok "Setup PHP8.4 Repository" + +msg_info "Setup PHP" +$STD apt-get install -y \ + php8.4 \ + php8.4-{apcu,ctype,curl,dom,fileinfo,gd,iconv,intl,mbstring,pgsql} \ + libapache2-mod-php8.4 \ + composer +msg_info "Setup PHP" + +msg_info "Setting up PostgreSQL" +DB_NAME=koillection +DB_USER=koillection +DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) +$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" +$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;" +{ +echo "Koillection Credentials" +echo "Koillection Database User: $DB_USER" +echo "Koillection Database Password: $DB_PASS" +echo "Koillection Database Name: $DB_NAME" +} >> ~/koillection.creds +msg_ok "Set up PostgreSQL" + +msg_info "Setting up Node.js/Yarn" +mkdir -p /etc/apt/keyrings +curl -fsSL 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_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list +$STD apt-get update +$STD apt-get install -y nodejs +$STD npm install -g npm@latest +$STD npm install -g yarn +msg_ok "Installed Node.js/Yarn" + +msg_info "Installing Koillection" +RELEASE=$(curl -s https://api.github.com/repos/benjaminjonard/koillection/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') +cd /opt +wget -q "https://github.com/benjaminjonard/koillection/archive/refs/tags/${RELEASE}.zip" +unzip -q "${RELEASE}.zip" +mv "/opt/koillection-${RELEASE}" /opt/koillection +cd /opt/koillection +cp /opt/koillection/.env /opt/koillection/.env.local +APP_SECRET=$(openssl rand -base64 32) +sed -i -e "s|^APP_ENV=.*|APP_ENV=prod|" \ + -e "s|^APP_DEBUG=.*|APP_DEBUG=0|" \ + -e "s|^APP_SECRET=.*|APP_SECRET=${APP_SECRET}|" \ + -e "s|^DB_NAME=.*|DB_NAME=${DB_NAME}|" \ + -e "s|^DB_USER=.*|DB_USER=${DB_USER}|" \ + -e "s|^DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|" \ + /opt/koillection/.env.local +export COMPOSER_ALLOW_SUPERUSER=1 +$STD composer install --no-dev -o --no-interaction --classmap-authoritative +$STD php bin/console doctrine:migrations:migrate --no-interaction +$STD php bin/console app:translations:dump +cd assets/ +$STD yarn install +$STD yarn build +chown -R www-data:www-data /opt/koillection/public/uploads +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +msg_ok "Installed Koillection" + +msg_info "Creating Service" +cat </etc/apache2/sites-available/koillection.conf + + ServerName koillection + DocumentRoot /opt/koillection/public + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.*)$ index.php/\$1 [L] + + + ErrorLog /var/log/apache2/koillection_error.log + CustomLog /var/log/apache2/koillection_access.log combined + +EOF +$STD a2ensite koillection +$STD a2enmod rewrite +$STD a2dissite 000-default.conf +$STD systemctl reload apache2 +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" diff --git a/json/koillection.json b/json/koillection.json new file mode 100644 index 00000000..55cec121 --- /dev/null +++ b/json/koillection.json @@ -0,0 +1,34 @@ +{ + "name": "Koillection", + "slug": "koillection", + "categories": [ + 24 + ], + "date_created": "2025-02-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://github.com/benjaminjonard/koillection/wiki", + "website": "https://koillection.github.io/", + "logo": "https://user-images.githubusercontent.com/20560781/80213166-0e560e00-8639-11ea-944e-4f79fdbcef55.png", + "description": "Koillection is a self-hosted collection manager created to keep track of physical (mostly) collections of any kind like books, DVDs, stamps, games... Koillection is meant to be used for any kind of collections and doesn't come with pre-built metadata download. But you can tailor your own HTML scraper, or you can add your own metadata freely.", + "install_methods": [ + { + "type": "default", + "script": "ct/koillection.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 8, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] + } \ No newline at end of file