From fba7c37de6778b2ccf14a093185177cff8b77e2f Mon Sep 17 00:00:00 2001 From: Alexandre Date: Thu, 9 Jun 2022 21:20:10 +0200 Subject: [PATCH] initial build --- seafile/CHANGELOG.md | 1 + seafile/Dockerfile | 92 +++++++++++++++++ seafile/README.md | 77 ++++++++++++++ seafile/apparmor.txt | 56 ++++++++++ seafile/build.json | 10 ++ seafile/config.json | 97 ++++++++++++++++++ seafile/icon.png | Bin 0 -> 20754 bytes seafile/logo.png | Bin 0 -> 20754 bytes seafile/rootfs/entrypoint.sh | 27 +++++ .../cont-init.d/00-aaa_dockerfile_backup.sh | 46 +++++++++ seafile/rootfs/etc/cont-init.d/99-run.sh | 60 +++++++++++ seafile/rootfs/etc/cont-init.d/99-run2.sh | 95 +++++++++++++++++ seafile/updater.json | 10 ++ 13 files changed, 571 insertions(+) create mode 100644 seafile/CHANGELOG.md create mode 100644 seafile/Dockerfile create mode 100644 seafile/README.md create mode 100644 seafile/apparmor.txt create mode 100644 seafile/build.json create mode 100644 seafile/config.json create mode 100644 seafile/icon.png create mode 100644 seafile/logo.png create mode 100644 seafile/rootfs/entrypoint.sh create mode 100644 seafile/rootfs/etc/cont-init.d/00-aaa_dockerfile_backup.sh create mode 100644 seafile/rootfs/etc/cont-init.d/99-run.sh create mode 100644 seafile/rootfs/etc/cont-init.d/99-run2.sh create mode 100644 seafile/updater.json diff --git a/seafile/CHANGELOG.md b/seafile/CHANGELOG.md new file mode 100644 index 000000000..66f7e8b76 --- /dev/null +++ b/seafile/CHANGELOG.md @@ -0,0 +1 @@ +- Initial release diff --git a/seafile/Dockerfile b/seafile/Dockerfile new file mode 100644 index 000000000..e79dc39af --- /dev/null +++ b/seafile/Dockerfile @@ -0,0 +1,92 @@ +#============================# +# ALEXBELGIUM'S DOCKERFILE # +#============================# +# _.------. +# _.-` ('>.-`"""-. +# '.--'` _'` _ .--.) +# -' '-.-';` ` +# ' - _.' ``'--. +# '---` .-'""` +# /` +#=== Home Assistant Addon ===# + +################# +# 1 Build Image # +################# + +ARG BUILD_FROM +ARG BUILD_VERSION +FROM ${BUILD_FROM} +ENV BASHIO_VERSION=1.29.1 + +################## +# 2 Modify Image # +################## + +ENV LANG C.UTF-8 + +################## +# 3 Install apps # +################## + +# Copy local files +COPY rootfs/ / + +# Modules +ARG MODULES="00-banner.sh 00-global_var.sh 92-local_mounts.sh 92-smb_mounts.sh" + +# Automatic modules download +RUN if ! command -v bash >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && mkdir -p /etc/cont-init.d \ + && for scripts in $MODULES; do echo "$scripts" && curl -k -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/$scripts" -o /etc/cont-init.d/"$scripts" && [ "$(sed -n '/\/bin/p;q' /etc/cont-init.d/"$scripts")" != "" ] || (echo "script failed to install $scripts" && exit 1); done \ + && chmod -R 755 /etc/cont-init.d || printf '%s\n' "${MODULES}" >/MODULESFILE + +# Manual apps +ENV PACKAGES="" + +# Automatic apps & bashio +RUN if ! command -v bash >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && curl -k -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/automatic_packages.sh" --output /automatic_packages.sh \ + && chmod 777 /automatic_packages.sh \ + && eval /./automatic_packages.sh "${PACKAGES:-}" \ + && rm /automatic_packages.sh || printf '%s\n' "${PACKAGES:-}" > /ENVFILE + +################ +# 4 Entrypoint # +################ + +RUN chmod 777 /entrypoint.sh +ENTRYPOINT [ "/usr/bin/env" ] +CMD [ "/entrypoint.sh" ] + +############ +# 5 Labels # +############ + +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME +ARG BUILD_REF +ARG BUILD_REPOSITORY +ARG BUILD_VERSION +LABEL \ + io.hass.name="${BUILD_NAME}" \ + io.hass.description="${BUILD_DESCRIPTION}" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.title="${BUILD_NAME}" \ + org.opencontainers.image.description="${BUILD_DESCRIPTION}" \ + org.opencontainers.image.vendor="Home Assistant Add-ons" \ + org.opencontainers.image.authors="alexbelgium (https://github.com/alexbelgium)" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.url="https://github.com/alexbelgium" \ + org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \ + org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/main/README.md" \ + org.opencontainers.image.created=${BUILD_DATE} \ + org.opencontainers.image.revision=${BUILD_REF} \ + org.opencontainers.image.version=${BUILD_VERSION} diff --git a/seafile/README.md b/seafile/README.md new file mode 100644 index 000000000..cdc499b6b --- /dev/null +++ b/seafile/README.md @@ -0,0 +1,77 @@ +# Home assistant add-on: seafile + +[![Donate][donation-badge]](https://www.buymeacoffee.com/alexbelgium) + +![Version](https://img.shields.io/badge/dynamic/json?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fseafile%2Fconfig.json) +![Ingress](https://img.shields.io/badge/dynamic/json?label=Ingress&query=%24.ingress&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fseafile%2Fconfig.json) +![Arch](https://img.shields.io/badge/dynamic/json?color=success&label=Arch&query=%24.arch&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fseafile%2Fconfig.json) + +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/9c6cf10bdbba45ecb202d7f579b5be0e)](https://www.codacy.com/gh/alexbelgium/hassio-addons/dashboard?utm_source=github.com&utm_medium=referral&utm_content=alexbelgium/hassio-addons&utm_campaign=Badge_Grade) +[![GitHub Super-Linter](https://github.com/alexbelgium/hassio-addons/workflows/Lint%20Code%20Base/badge.svg)](https://github.com/marketplace/actions/super-linter) +[![Builder](https://github.com/alexbelgium/hassio-addons/workflows/Builder/badge.svg)](https://github.com/alexbelgium/hassio-addons/actions/workflows/builder.yaml) + +[donation-badge]: https://img.shields.io/badge/Buy%20me%20a%20coffee-%23d32f2f?logo=buy-me-a-coffee&style=flat&logoColor=white + +_Thanks to everyone having starred my repo! To star it click on the image below, then it will be on top right. Thanks!_ + +[![Stargazers repo roster for @alexbelgium/hassio-addons](https://reporoster.com/stars/alexbelgium/hassio-addons)](https://github.com/alexbelgium/hassio-addons/stargazers) + +## About + +--- + +High performance file syncing and sharing, with also Markdown WYSIWYG editing, Wiki, file label and other knowledge management features. + +This addon is based on the docker image [https://hub.docker.com/r/franchetti/seafile-arm](https://hub.docker.com/r/franchetti/seafile-arm) + +## Installation + +--- + +The installation of this add-on is pretty straightforward and not different in comparison to installing any other add-on. + +1. Add my add-ons repository to your home assistant instance (in supervisor addons store at top right, or click button below if you have configured my HA) + [![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons) +1. Install this add-on. +1. Click the `Save` button to store your configuration. +1. Set the add-on options to your preferences +1. Start the add-on. +1. Check the logs of the add-on to see if everything went well. +1. Open the webUI and adapt the software options + +## Configuration + +--- + +Webui can be found at . +The default username/password : described in the startup log. +Configurations can be done through the app webUI, except for the following options + +Default name : admin +Default password : admin123 + +```yaml +GUID: user +GPID: user +TZ: timezone +PASSWORD: Optionally set a password for the gui +CLI_ARGS: Optionally pass cli start arguments to seafile +localdisks: sda1 #put the hardware name of your drive to mount separated by commas, or its label. Ex: sda1, sdb1, MYNAS... +networkdisks: "//SERVER/SHARE" # optional, list of smb servers to mount, separated by commas +cifsusername: "username" # optional, smb username, same for all smb shares +cifspassword: "password" # optional, smb password +force_scheme_https: if you have issues accessing ingress with https, check this box to force https +force_external_port: if you have issues accessing ingress with https, note here your external port used to access HA +``` + +## Support + +Create an issue on github + +## Illustration + +--- + +![illustration](https://seafile.com/img/slider/artistdetails.png) + +[repository]: https://github.com/alexbelgium/hassio-addons diff --git a/seafile/apparmor.txt b/seafile/apparmor.txt new file mode 100644 index 000000000..646f6c57b --- /dev/null +++ b/seafile/apparmor.txt @@ -0,0 +1,56 @@ +#include + +profile seafile_addon flags=(attach_disconnected,mediate_deleted) { + #include + + capability, + file, + signal, + mount, + umount, + remount, + network udp, + network tcp, + network dgram, + network stream, + network inet, + network inet6, + network netlink raw, + + capability setgid, + capability setuid, + capability sys_admin, + capability dac_read_search, + # capability dac_override, + # capability sys_rawio, + +# S6-Overlay + /bin/** ix, + /usr/bin/** ix, + /usr/lib/bashio/** ix, + /etc/s6/** rix, + /run/s6/** rix, + /etc/services.d/** rwix, + /etc/cont-init.d/** rwix, + /etc/cont-finish.d/** rwix, + /init rix, + /var/run/** mrwkl, + /var/run/ mrwkl, + /dev/i2c-1 mrwkl, + # Files required + /dev/sda1 mrwkl, + /dev/sdb1 mrwkl, + /dev/mmcblk0p1 mrwkl, + /dev/* mrwkl, + /tmp/** mrkwl, + + # Data access + /data/** rw, + + # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container + ptrace (trace,read) peer=docker-default, + + # docker daemon confinement requires explict allow rule for signal + signal (receive) set=(kill,term) peer=/usr/bin/docker, + +} diff --git a/seafile/build.json b/seafile/build.json new file mode 100644 index 000000000..7d32bce02 --- /dev/null +++ b/seafile/build.json @@ -0,0 +1,10 @@ +{ + "build_from": { + "aarch64": "franchetti/seafile-arm:latest", + "amd64": "franchetti/seafile-arm:latest", + "armv7": "franchetti/seafile-arm:latest" + }, + "codenotary": { + "signer": "alexandrep.github@gmail.com" + } +} diff --git a/seafile/config.json b/seafile/config.json new file mode 100644 index 000000000..168a6092f --- /dev/null +++ b/seafile/config.json @@ -0,0 +1,97 @@ +{ + "arch": [ + "aarch64", + "amd64", + "armv7" + ], + "codenotary": "alexandrep.github@gmail.com", + "description": "High performance file syncing and sharing, with also Markdown WYSIWYG editing, Wiki, file label and other knowledge management features", + "devices": [ + "/dev/sda", + "/dev/sdb", + "/dev/sdc", + "/dev/sdd", + "/dev/sde", + "/dev/sdf", + "/dev/sdg", + "/dev/nvme", + "/dev/mmcblk", + "/dev/sda1", + "/dev/sdb1", + "/dev/sdc1", + "/dev/sdd1", + "/dev/sde1", + "/dev/sdf1", + "/dev/sdg1", + "/dev/sda2", + "/dev/sdb2", + "/dev/sdc2", + "/dev/sdd2", + "/dev/sde2", + "/dev/sdf2", + "/dev/sdg2", + "/dev/sda3", + "/dev/sdb3", + "/dev/sda4", + "/dev/sdb4", + "/dev/nvme0", + "/dev/nvme1", + "/dev/nvme2" + ], + "environment": { + "NOSWAG": "1" + }, + "image": "ghcr.io/alexbelgium/seafile-{arch}", + "map": [ + "media:rw", + "share:rw", + "config:rw", + "ssl" + ], + "name": "Seafile", + "options": { + "database": "sqlite", + "data_location": "/share/seafile", + "seafile_server_letsencrypt": false, + "seafile_server_hostname": "seafile.example.com", + "seafile_admin_email": "me@example.com", + "seafile_admin_password": "a_very_secret_password", + "PUID": 0, + "GUID": 0, + "TZ": "Europe/Paris" + }, + "panel_icon": "mdi:library", + "ports": { + "80/tcp": 8077 + }, + "ports_description": { + "80/tcp": "seafile webui" + }, + "privileged": [ + "SYS_ADMIN", + "DAC_READ_SEARCH", + "NET_ADMIN" + ], + "schema": { + "PUID": "int", + "GUID": "int", + "TZ": "str", + "database": "list(sqlite|mariadb_addon)", + "data_location": "str", + "seafile_server_letsencrypt": "bool?", + "seafile_server_hostname": "str", + "seafile_admin_email": "email", + "seafile_admin_password": "str", + "cifspassword": "str?", + "cifsusername": "str?", + "localdisks": "str?", + "networkdisks": "str?" + }, + "services": [ + "mysql:want" + ], + "slug": "seafile", + "url": "https://github.com/alexbelgium/hassio-addons/tree/master/seafile", + "version": "1.0", + "webui": "http://[HOST]:[PORT:80]" +} \ No newline at end of file diff --git a/seafile/icon.png b/seafile/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..93dd1e539ac1cffbfd77bd2449531e873b5022a5 GIT binary patch literal 20754 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/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && mkdir -p /etc/cont-init.d \ + && for scripts in $MODULES; do echo "$scripts" && curl -k -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/$scripts" -o /etc/cont-init.d/"$scripts" && [ "$(sed -n '/\/bin/p;q' /etc/cont-init.d/"$scripts")" != "" ] || (echo "script failed to install $scripts" && exit 1); done \ + && chmod -R 755 /etc/cont-init.d +fi + +####################### +# Automatic installer # +####################### +if [ -e "/ENVFILE" ]; then + PACKAGES=$(/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) >/dev/null; fi \ + && if ! command -v curl >/dev/null 2>/dev/null; then (apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) >/dev/null; fi \ + && curl -k -f -L -s -S "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/automatic_packages.sh" --output /automatic_packages.sh \ + && chmod 777 /automatic_packages.sh \ + && eval /./automatic_packages.sh "${PACKAGES:-}" \ + && rm /automatic_packages.sh +fi + +if [ -e "/MODULESFILE" ] && [ ! -f /entrypoint.sh ]; then + for scripts in $MODULES; do + echo "$scripts : executing" + chown "$(id -u)":"$(id -g)" /etc/cont-init.d/"$scripts" + chmod a+x /etc/cont-init.d/"$scripts" + /./etc/cont-init.d/"$scripts" || echo "/etc/cont-init.d/$scripts: exiting $?" + rm /etc/cont-init.d/"$scripts" + done | tac +fi diff --git a/seafile/rootfs/etc/cont-init.d/99-run.sh b/seafile/rootfs/etc/cont-init.d/99-run.sh new file mode 100644 index 000000000..fecb5a899 --- /dev/null +++ b/seafile/rootfs/etc/cont-init.d/99-run.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bashio + +cd /opt/seafile +cp /opt/seafile/.env.example /opt/seafile/.env + +#################### +# GLOBAL VARIABLES # +#################### +sed -i "s|NOSWAG=0|NOSWAG=1|g" .env +sed -i "s|USE_HTTPS=1|USE_HTTPS=0|g" .env +sed -i "s|PUID=1000|PUID=$(bashio::config 'PUID')|g" .env +sed -i "s|PGID=1000|PGID=$(bashio::config 'PGID')|g" .env +sed -i "s|TZ=Europe/Zurich|TZ=$(bashio::config 'TZ')|g" .env +sed -i "s|URL=your.domain|URL=$(bashio::config 'SEAFILE_SERVER_HOSTNAME')|g" .env +sed -i "s|SEAFILE_ADMIN_EMAIL=you@your.email|SEAFILE_ADMIN_EMAIL=$(bashio::config 'SEAFILE_ADMIN_EMAIL')|g" .env +sed -i "s|SEAFILE_CONF_DIR=./seafile/conf|SEAFILE_CONF_DIR=$(bashio::config 'data_location')/conf|g" .env +sed -i "s|SEAFILE_LOGS_DIR=./seafile/logs|SEAFILE_LOGS_DIR=$(bashio::config 'data_location')/logs|g" .env +sed -i "s|SEAFILE_DATA_DIR=./seafile/seafile-data|SEAFILE_DATA_DIR=$(bashio::config 'data_location')/seafile-data|g" .env +sed -i "s|SEAFILE_SEAHUB_DIR=./seafile/seahub-data|SEAFILE_SEAHUB_DIR=$(bashio::config 'data_location'/seahub-data)|g" .env +sed -i "s|SEAFILE_SQLITE_DIR=./seafile/sqlite|SSEAFILE_SQLITE_DIR=$(bashio::config 'data_location'/sqlite)|g" .env +sed -i "s|DATABASE_DIR=./db|DATABASE_DIR=$(bashio::config 'data_location'/db)|g" .env + +################### +# Define database # +################### +bashio::log.info "Defining database" +case $(bashio::config 'database') in + + # Use sqlite + sed -i "s|SQLITE=0|SQLITE=1|g" .env + sqlite) + + # Use mariadb + mariadb_addon) + bashio::log.info "Using MariaDB addon. Requirements : running MariaDB addon. Discovering values..." + if ! bashio::services.available 'mysql'; then + bashio::log.fatal \ + "Local database access should be provided by the MariaDB addon" + bashio::exit.nok \ + "Please ensure it is installed and started" + fi + + # Use values + sed -i "s|MYSQL_HOST=db|MYSQL_HOST=$(bashio::services "mysql" "host")|g" .env + sed -i "s|MYSQL_USER_PASSWD=secret|MYSQL_USER_PASSWD=$(bashio::services "mysql" "username")|g" .env + sed -i "s|MYSQL_ROOT_PASSWD=secret|MYSQL_USER_PASSWD=$(bashio::services "mysql" "password")|g" .env + + bashio::log.warning "This addon is using the Maria DB addon" + bashio::log.warning "Please ensure this is included in your backups" + bashio::log.warning "Uninstalling the MariaDB addon will remove any data" + ;; +esac + +############## +# LAUNCH APP # +############## + +bashio::log.info "Starting app" +#/sbin/my_init -- /scripts/enterpoint.sh +/./docker_entrypoint.sh diff --git a/seafile/rootfs/etc/cont-init.d/99-run2.sh b/seafile/rootfs/etc/cont-init.d/99-run2.sh new file mode 100644 index 000000000..7fe4dc6b6 --- /dev/null +++ b/seafile/rootfs/etc/cont-init.d/99-run2.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bashio + +exit 0 + +################# +# DATA LOCATION # +################# + +DATA_LOCATION="$(bashio::config 'data_location')" + +# Chack Seafile dir +bashio::log.info "Making data folder $DATA_LOCATION" + +# Make dir +echo "Checking location exists" +mkdir -p "$DATA_LOCATION" + +# Make dir +echo "Checking permissions" +chown -R "$(id -u)":"$(id -g)" "$DATA_LOCATION" +chmod -R 755 "$DATA_LOCATION" + +# Create symlink +echo "Checking symlink" +ln -fs "$DATA_LOCATION" /shared + +#################### +# GLOBAL VARIABLES # +#################### + +echo "Exporting variables" +export SEAFILE_SERVER_LETSENCRYPT="$(bashio::config 'seafile_server_letsencrypt')" +export SEAFILE_SERVER_HOSTNAME="$(bashio::config 'seafile_server_hostname')" +export SEAFILE_ADMIN_EMAIL="$(bashio::config 'seafile_admin_email')" +export SEAFILE_ADMIN_PASSWORD="$(bashio::config 'seafile_admin_password')" +bashio::log.blue "SEAFILE_SERVER_LETSENCRYPT=$SEAFILE_SERVER_LETSENCRYPT" +bashio::log.blue "SEAFILE_SERVER_HOSTNAME=$SEAFILE_SERVER_HOSTNAME" +bashio::log.blue "SEAFILE_ADMIN_EMAIL=$SEAFILE_ADMIN_EMAIL" +bashio::log.blue "SEAFILE_ADMIN_PASSWORD=$SEAFILE_ADMIN_PASSWORD" + +################### +# Define database # +################### + +bashio::log.info "Defining database" +case $(bashio::config 'database') in + + # Use sqlite + sqlite) + bashio::log.info "Using a local sqlite database" + ehco "Installing sqlite" + apt-get update &>/dev/null \ + apt-get install -y sqlite3 &>/dev/null \ + apt-get clean &>/dev/null + + echo "Configuring sqlite" + sed -i 's/setup-seafile-mysql\.sh/setup-seafile.sh/g' /scripts/bootstrap.py \ + && sed -i '/def wait_for_mysql()/a\\ return' /scripts/utils.py \ + && touch $DATA_LOCATION/seahub.db \ + && ln -fs "$DATA_LOCATION/seahub.db" /opt/seafile + + export SEAFILE_ADMIN_EMAIL=test@test.test + export SEAFILE_ADMIN_PASSWORD=gf7Ads¤f#B2G + export SEAFILE_SERVER_HOSTNAME=seafile.test + ;; + + # Use mariadb + mariadb_addon) + bashio::log.info "Using MariaDB addon. Requirements : running MariaDB addon. Discovering values..." + if ! bashio::services.available 'mysql'; then + bashio::log.fatal \ + "Local database access should be provided by the MariaDB addon" + bashio::exit.nok \ + "Please ensure it is installed and started" + fi + + # Use values + export MYSQL_SERVER=$(bashio::services "mysql" "host") && bashio::log.blue "MYSQL_SERVER=$MYSQL_SERVER" + export MYSQL_PORT=$(bashio::services "mysql" "port") && bashio::log.blue "MYSQL_PORT=$MYSQL_PORT" + export MYSQL_USER=$(bashio::services "mysql" "username") && bashio::log.blue "MYSQL_USER=$MYSQL_USER" + export MYSQL_PORT=$(bashio::services "mysql" "password") && bashio::log.blue "MYSQL_PORT=$MYSQL_PORT" + + bashio::log.warning "This addon is using the Maria DB addon" + bashio::log.warning "Please ensure this is included in your backups" + bashio::log.warning "Uninstalling the MariaDB addon will remove any data" + ;; +esac + +############## +# LAUNCH APP # +############## + +bashio::log.info "Starting app" +#/sbin/my_init -- /scripts/enterpoint.sh +/./docker_entrypoint.sh diff --git a/seafile/updater.json b/seafile/updater.json new file mode 100644 index 000000000..f140618be --- /dev/null +++ b/seafile/updater.json @@ -0,0 +1,10 @@ +{ + "github_fulltag": "true", + "last_update": "09-06-2022", + "paused": false, + "repository": "alexbelgium/hassio-addons", + "slug": "seafile", + "source": "github", + "upstream_repo": "haiwen/seahub", + "upstream_version": "0.6.18-ls164" +} \ No newline at end of file