From 62cfdf646afea2de6025583fc886957fd3562d38 Mon Sep 17 00:00:00 2001 From: Alexandre <44178713+alexbelgium@users.noreply.github.com> Date: Sat, 12 Dec 2020 12:33:54 +0100 Subject: [PATCH] addition of nextcloud and transmission based on linuxserver --- README.md | 12 +- nextcloud/Dockerfile | 20 +++ nextcloud/README.md | 32 +++++ nextcloud/build.json | 10 ++ nextcloud/config.json | 32 +++++ nextcloud/icon.png | Bin 0 -> 9156 bytes nextcloud/logo.png | Bin 0 -> 9156 bytes nextcloud/root/defaults/config.php | 6 + nextcloud/root/defaults/default | 121 ++++++++++++++++++ nextcloud/root/defaults/index.html | 34 +++++ nextcloud/root/defaults/nextcloud-perms.sh | 54 ++++++++ nextcloud/root/defaults/nginx.conf | 102 +++++++++++++++ nextcloud/root/defaults/root | 9 ++ nextcloud/root/etc/cont-init.d/10-adduser | 39 ++++++ nextcloud/root/etc/cont-init.d/30-keygen | 11 ++ nextcloud/root/etc/cont-init.d/40-config | 8 ++ nextcloud/root/etc/cont-init.d/50-install | 21 +++ nextcloud/root/etc/cont-init.d/60-memcache | 9 ++ nextcloud/root/etc/services.d/cron/run | 3 + transmission/Dockerfile | 62 +-------- transmission/README.md | 27 ++++ transmission/build.json | 12 +- transmission/config.json | 94 ++++++-------- {transmission => transmission_nas}/DOCS.md | 0 transmission_nas/Dockerfile | 59 +++++++++ transmission_nas/build.json | 11 ++ transmission_nas/config.json | 67 ++++++++++ transmission_nas/icon.png | Bin 0 -> 18546 bytes transmission_nas/logo.png | Bin 0 -> 17546 bytes .../rootfs/etc/cont-init.d/10-requirements.sh | 0 .../20-transmission-configuration.sh | 0 .../cont-init.d/21-openvpn-configuration.sh | 0 .../rootfs/etc/cont-init.d/30-nginx.sh | 0 .../rootfs/etc/cont-init.d/50-mounts.sh | 0 .../rootfs/etc/nginx/includes/mime.types | 0 .../etc/nginx/includes/proxy_params.conf | 0 .../rootfs/etc/nginx/includes/resolver.conf | 0 .../etc/nginx/includes/server_params.conf | 0 .../rootfs/etc/nginx/includes/ssl_params.conf | 0 .../rootfs/etc/nginx/includes/upstream.conf | 0 .../rootfs/etc/nginx/nginx.conf | 0 .../rootfs/etc/nginx/servers/ingress.conf | 0 .../rootfs/etc/openvpn/up-transmission.sh | 0 .../rootfs/etc/services.d/nginx/finish | 0 .../rootfs/etc/services.d/nginx/run | 0 .../rootfs/etc/services.d/transmission/finish | 0 .../rootfs/etc/services.d/transmission/run | 0 47 files changed, 734 insertions(+), 121 deletions(-) create mode 100644 nextcloud/Dockerfile create mode 100644 nextcloud/README.md create mode 100644 nextcloud/build.json create mode 100644 nextcloud/config.json create mode 100644 nextcloud/icon.png create mode 100644 nextcloud/logo.png create mode 100644 nextcloud/root/defaults/config.php create mode 100644 nextcloud/root/defaults/default create mode 100644 nextcloud/root/defaults/index.html create mode 100644 nextcloud/root/defaults/nextcloud-perms.sh create mode 100644 nextcloud/root/defaults/nginx.conf create mode 100644 nextcloud/root/defaults/root create mode 100644 nextcloud/root/etc/cont-init.d/10-adduser create mode 100644 nextcloud/root/etc/cont-init.d/30-keygen create mode 100644 nextcloud/root/etc/cont-init.d/40-config create mode 100644 nextcloud/root/etc/cont-init.d/50-install create mode 100644 nextcloud/root/etc/cont-init.d/60-memcache create mode 100644 nextcloud/root/etc/services.d/cron/run create mode 100644 transmission/README.md rename {transmission => transmission_nas}/DOCS.md (100%) create mode 100644 transmission_nas/Dockerfile create mode 100644 transmission_nas/build.json create mode 100644 transmission_nas/config.json create mode 100644 transmission_nas/icon.png create mode 100644 transmission_nas/logo.png rename {transmission => transmission_nas}/rootfs/etc/cont-init.d/10-requirements.sh (100%) rename {transmission => transmission_nas}/rootfs/etc/cont-init.d/20-transmission-configuration.sh (100%) rename {transmission => transmission_nas}/rootfs/etc/cont-init.d/21-openvpn-configuration.sh (100%) rename {transmission => transmission_nas}/rootfs/etc/cont-init.d/30-nginx.sh (100%) rename {transmission => transmission_nas}/rootfs/etc/cont-init.d/50-mounts.sh (100%) rename {transmission => transmission_nas}/rootfs/etc/nginx/includes/mime.types (100%) rename {transmission => transmission_nas}/rootfs/etc/nginx/includes/proxy_params.conf (100%) rename {transmission => transmission_nas}/rootfs/etc/nginx/includes/resolver.conf (100%) rename {transmission => transmission_nas}/rootfs/etc/nginx/includes/server_params.conf (100%) rename {transmission => transmission_nas}/rootfs/etc/nginx/includes/ssl_params.conf (100%) rename {transmission => transmission_nas}/rootfs/etc/nginx/includes/upstream.conf (100%) rename {transmission => transmission_nas}/rootfs/etc/nginx/nginx.conf (100%) rename {transmission => transmission_nas}/rootfs/etc/nginx/servers/ingress.conf (100%) rename {transmission => transmission_nas}/rootfs/etc/openvpn/up-transmission.sh (100%) rename {transmission => transmission_nas}/rootfs/etc/services.d/nginx/finish (100%) rename {transmission => transmission_nas}/rootfs/etc/services.d/nginx/run (100%) rename {transmission => transmission_nas}/rootfs/etc/services.d/transmission/finish (100%) rename {transmission => transmission_nas}/rootfs/etc/services.d/transmission/run (100%) diff --git a/README.md b/README.md index 7f69d0892..f4d233089 100644 --- a/README.md +++ b/README.md @@ -27,12 +27,22 @@ A Free Software Media System that puts you in control of managing and streaming - Forked from : https://github.com/petersendev/hassio-addons - Modifications : add smb and local disks mount -### [Transmission NAS](transmission/) +### [Transmission NAS](transmission_nas/) The torrent client for Hass.io with OpenVPN support. - Based on latest transmission - Forked from : https://github.com/Alexwijn/hassio-addon-transmission - Modifications : add smb and local disks mount +### [Transmission](transmission/) +The torrent client for Hass.io. +- Based on linuxserver image + +### [nextcloud](nextcloud/) +A Nextcloud container, brought to you by LinuxServer.io. +- Based on linuxserver image +- Forked from : https://github.com/haberda/hassio_addons +- Modifications : update based on images numbering instead of "latest" + ### [Doublecommander NAS](doublecommander/) A free cross platform open source file manager with two panels side by side. - Based on latest linuxserver image diff --git a/nextcloud/Dockerfile b/nextcloud/Dockerfile new file mode 100644 index 000000000..2650a7b78 --- /dev/null +++ b/nextcloud/Dockerfile @@ -0,0 +1,20 @@ +ARG BUILD_FROM + +FROM ${BUILD_FROM} + +ENV NEXTCLOUD_PATH="/data/config/www/nextcloud" + +# modify/copy files +RUN sed -i "s|data|share/nextcloud|g" /etc/cont-init.d/* + +RUN sed -i "s|config|data/config|g" /etc/cont-init.d/* + +RUN sed -i "s|data|share/nextcloud|g" /etc/services.d/nginx/* + +RUN sed -i "s|config|data/config|g" /etc/services.d/nginx/* + +COPY root/ / + +RUN ["chmod", "+x", "/defaults/nextcloud-perms.sh"] + +VOLUME ["/share", "/ssl", "/data", "/media"] diff --git a/nextcloud/README.md b/nextcloud/README.md new file mode 100644 index 000000000..b97933945 --- /dev/null +++ b/nextcloud/README.md @@ -0,0 +1,32 @@ +[![](logo.png)](https://nextcloud.com/) + +# Nextcloud + +Nextcloud Home Assistant add-on + +# How to use this add-on + +Install the add-on, choose your desired port, start. + +After the add-on is started proceed to: https://[ip]:[port] and follow the setup process. + +# How to add trusted domain +Nextcloud requires a whitelist of trusted domains in order to access Nextcloud externally, or even internally from an address that is different from the domain it is initially assessed from. Normally this requires editing of a config file. If you have access to the add-on data storage (i.e. Supervised Installation) then the recommended method is to follow official documentation to add your domain. + +If you are running HASSOS and have no access to edit this file you can add your domain from the web interface through a console app that allows access to the 'occ' command line. + +To do this, log into the Nextcloud web interface as an admin user, click the top right user image icon to expand the menu. Select the Apps to go to the app installation page. On the app installation page install an app called 'OCC Web'. + +Once installed return to the main page and launch OCCWeb. + +When the console is displayed type: + +> config:system:get trusted_domains + +Warning: overwriting the domain you are currently using will make Nextcloud inaccessible and the add-on will have to be deleted and reinstalled. This will list the current trusted domains. The domains are numbered from 0 so if you have two domains that display the first is domain 0, the second is domain 1. To add another domain: + +> config:system:set trusted_domains 2 --value=my.domain.com + +Where the number 2 is the now new third domain position in the config file, and 'my.domain.com' is your domain. Type the first command again to see whether the new domain has indeed been added. If it has, you are done! + +Based on the linuxserver image diff --git a/nextcloud/build.json b/nextcloud/build.json new file mode 100644 index 000000000..68ef72dea --- /dev/null +++ b/nextcloud/build.json @@ -0,0 +1,10 @@ +{ + "squash": false, + "build_from": { + "aarch64": "linuxserver/nextcloud:arm64v8-20.0.3-ls110", + "amd64": "linuxserver/nextcloud-20.0.3-ls110", + "armhf": "linuxserver/nextcloud:arm32v7-20.0.3-ls110", + "armv7": "linuxserver/nextcloud:arm32v7-20.0.3-ls110" + }, + "args": {} +} diff --git a/nextcloud/config.json b/nextcloud/config.json new file mode 100644 index 000000000..376c875ce --- /dev/null +++ b/nextcloud/config.json @@ -0,0 +1,32 @@ +{ + "name": "Nextcloud", + "url": "https://github.com/alexbelgium/hassio_addons", + "version": "20.0.3-ls110", + "slug": "nextcloud", + "ingress": false, + "ingress_port": 0, + "arch": [ + "aarch64", + "amd64", + "armv7" + ], + "description": "Nextcloud for Home Assistant", + "startup": "system", + "boot": "manual", + "auto_uart": true, + "map": [ + "share:rw", + "media:rw", + "ssl:rw" + ], + "options":{ + }, + "schema": { + }, + "ports": { + "443/tcp": 8099, + "80/tcp": null + }, + "webui": "https://[HOST]:[PORT:443]", + "panel_icon": "mdi:cloud" +} diff --git a/nextcloud/icon.png b/nextcloud/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e39902e1b2db36c0387a37decb8564a8ccaa3e7f GIT binary patch literal 9156 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

fpsUvtYM3Rz_C+;Z%xw5)Iz+@EIi?xzjW8+el=} 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 literal 0 HcmV?d00001 diff --git a/nextcloud/logo.png b/nextcloud/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e39902e1b2db36c0387a37decb8564a8ccaa3e7f GIT binary patch literal 9156 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

fpsUvtYM3Rz_C+;Z%xw5)Iz+@EIi?xzjW8+el=} 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 literal 0 HcmV?d00001 diff --git a/nextcloud/root/defaults/config.php b/nextcloud/root/defaults/config.php new file mode 100644 index 000000000..367cad15d --- /dev/null +++ b/nextcloud/root/defaults/config.php @@ -0,0 +1,6 @@ + '\OC\Memcache\APCu', + 'datadirectory' => '/share/nextcloud', + ); + diff --git a/nextcloud/root/defaults/default b/nextcloud/root/defaults/default new file mode 100644 index 000000000..f17b71216 --- /dev/null +++ b/nextcloud/root/defaults/default @@ -0,0 +1,121 @@ +upstream php-handler { + server 127.0.0.1:9000; +} +server { + listen 80; + listen [::]:80; + server_name _; + return 301 https://$host$request_uri; +} +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name _; + ssl_certificate /ssl/nextcloud/keys/cert.crt; + ssl_certificate_key /ssl/nextcloud/keys/cert.key; + + # Add headers to serve security related headers + # Before enabling Strict-Transport-Security headers please read into this + # topic first. + #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; + # + # WARNING: Only add the preload option once you read about + # the consequences in https://hstspreload.org/. This option + # will add the domain to a hardcoded list that is shipped + # in all major browsers and getting removed from this list + # could take several months. + + add_header X-Content-Type-Options nosniff; + add_header X-XSS-Protection "1; mode=block"; + add_header X-Robots-Tag none; + add_header X-Download-Options noopen; + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Permitted-Cross-Domain-Policies none; + add_header Referrer-Policy no-referrer; + fastcgi_hide_header X-Powered-By; + root /data/config/www/nextcloud/; + # display real ip in nginx logs when connected through reverse proxy via docker network + set_real_ip_from 172.0.0.0/8; + real_ip_header X-Forwarded-For; + location = /robots.txt { + allow all; + log_not_found off; + access_log off; + } + location = /.well-known/carddav { + return 301 $scheme://$host:$server_port/remote.php/dav; + } + location = /.well-known/caldav { + return 301 $scheme://$host:$server_port/remote.php/dav; + } + location = /.well-known/webfinger { + return 301 $scheme://$host:$server_port/public.php?service=webfinger; + } + location = /.well-known/host-meta { + return 301 $scheme://$host:$server_port/public.php?service=host-meta; + } + location = /.well-known/host-meta.json { + return 301 $scheme://$host:$server_port/public.php?service=host-meta-json; + } + client_max_body_size 10G; + fastcgi_buffers 64 4K; + gzip on; + gzip_vary on; + gzip_comp_level 4; + gzip_min_length 256; + gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; + gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; + location / { + rewrite ^ /index.php; + } + location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ { + deny all; + } + location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) { + deny all; + } + location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) { + fastcgi_split_path_info ^(.+?\.php)(\/.*|)$; + set $path_info $fastcgi_path_info; + try_files $fastcgi_script_name =404; + include /etc/nginx/fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $path_info; + fastcgi_param HTTPS on; + fastcgi_param modHeadersAvailable true; + fastcgi_param front_controller_active true; + fastcgi_pass php-handler; + fastcgi_intercept_errors on; + fastcgi_request_buffering off; + } + location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) { + try_files $uri/ =404; + index index.php; + } + location ~ \.(?:css|js|woff2?|svg|gif|map)$ { + try_files $uri /index.php$request_uri; + add_header Cache-Control "public, max-age=15778463"; + # Add headers to serve security related headers + # Before enabling Strict-Transport-Security headers please read into this + # topic first. + #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; + # + # WARNING: Only add the preload option once you read about + # the consequences in https://hstspreload.org/. This option + # will add the domain to a hardcoded list that is shipped + # in all major browsers and getting removed from this list + # could take several months. + add_header X-Content-Type-Options nosniff; + add_header X-XSS-Protection "1; mode=block"; + add_header X-Robots-Tag none; + add_header X-Download-Options noopen; + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Permitted-Cross-Domain-Policies none; + add_header Referrer-Policy no-referrer; + access_log off; + } + location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ { + try_files $uri /index.php$request_uri; + access_log off; + } +} diff --git a/nextcloud/root/defaults/index.html b/nextcloud/root/defaults/index.html new file mode 100644 index 000000000..8351def0e --- /dev/null +++ b/nextcloud/root/defaults/index.html @@ -0,0 +1,34 @@ + + + Welcome to our server + + + +

+

Welcome to our server

+

The website is currently being setup under this address.

+

For help and support, please contact: me@example.com

+
+ + diff --git a/nextcloud/root/defaults/nextcloud-perms.sh b/nextcloud/root/defaults/nextcloud-perms.sh new file mode 100644 index 000000000..cf2f0b3b4 --- /dev/null +++ b/nextcloud/root/defaults/nextcloud-perms.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +ocpath="${NEXTCLOUD_PATH}" +htuser='abc' +htgroup='abc' +rootuser='root' + +printf "Creating possible missing Directories\n" +mkdir -p $ocpath/data +mkdir -p $ocpath/assets +mkdir -p $ocpath/updater +mkdir -p $ocpath/apps +mkdir -p $ocpath/assets +mkdir -p $ocpath/config +mkdir -p $ocpath/data +mkdir -p $ocpath/themes +mkdir -p /data/config/nextcloud/config +mkdir -p /data/config/nextcloud/data +mkdir -p /data/config/www/nextcloud/occ +mkdir -p /share/nextcloud +mkdir -p /ssl/nextcloud/keys + +printf "chmod Files and Directories\n" +#chmod -R 777 ${ocpath} +find ${ocpath}/ -type f -exec chmod 0640 {} \; +find ${ocpath}/ -type d -exec chmod 0750 {} \; + +#find ${ocpath}/ -type f -print0 | xargs -0 chmod 0640 +#find ${ocpath}/ -type d -print0 | xargs -0 chmod 0750 + +printf "chown Directories\n" +chown -R ${rootuser}:${htgroup} ${ocpath}/ +chown -R ${htuser}:${htgroup} ${ocpath}/apps/ +chown -R ${htuser}:${htgroup} ${ocpath}/assets/ +chown -R ${htuser}:${htgroup} ${ocpath}/config/ +chown -R ${htuser}:${htgroup} ${ocpath}/data/ +chown -R ${htuser}:${htgroup} ${ocpath}/themes/ +chown -R ${htuser}:${htgroup} ${ocpath}/updater/ +chown -R ${htuser}:${htgroup} /share/nextcloud +chown -R ${htuser}:${htgroup} /ssl/nextcloud/keys + +chmod +x ${ocpath}/occ + +printf "chmod/chown .htaccess\n" +if [ -f ${ocpath}/.htaccess ] + then + chmod 0644 ${ocpath}/.htaccess + chown ${rootuser}:${htgroup} ${ocpath}/.htaccess +fi +if [ -f ${ocpath}/data/.htaccess ] + then + chmod 0644 ${ocpath}/data/.htaccess + chown ${rootuser}:${htgroup} ${ocpath}/data/.htaccess +fi diff --git a/nextcloud/root/defaults/nginx.conf b/nextcloud/root/defaults/nginx.conf new file mode 100644 index 000000000..9949edc82 --- /dev/null +++ b/nextcloud/root/defaults/nginx.conf @@ -0,0 +1,102 @@ +## Version 2018/08/16 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx.conf + +user abc; +worker_processes 4; +pid /run/nginx.pid; +include /etc/nginx/modules/*.conf; + +events { + worker_connections 768; + # multi_accept on; +} + +http { + + ## + # Basic Settings + ## + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 300; + types_hash_max_size 2048; + fastcgi_read_timeout 86400; + # server_tokens off; + + # server_names_hash_bucket_size 64; + # server_name_in_redirect off; + + client_max_body_size 0; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + ## + # Logging Settings + ## + + access_log /data/config/log/nginx/access.log; + error_log /data/config/log/nginx/error.log; + + ## + # Gzip Settings + ## + + gzip on; + gzip_disable "msie6"; + + # gzip_vary on; + # gzip_proxied any; + # gzip_comp_level 6; + # gzip_buffers 16 8k; + # gzip_http_version 1.1; + # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; + + ## + # nginx-naxsi config + ## + # Uncomment it if you installed nginx-naxsi + ## + + #include /etc/nginx/naxsi_core.rules; + + ## + # nginx-passenger config + ## + # Uncomment it if you installed nginx-passenger + ## + + #passenger_root /usr; + #passenger_ruby /usr/bin/ruby; + + ## + # Virtual Host Configs + ## + include /etc/nginx/conf.d/*.conf; + include /data/config/nginx/site-confs/*; + +} + +#mail { +# # See sample authentication script at: +# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript +# +# # auth_http localhost/auth.php; +# # pop3_capabilities "TOP" "USER"; +# # imap_capabilities "IMAP4rev1" "UIDPLUS"; +# +# server { +# listen localhost:110; +# protocol pop3; +# proxy on; +# } +# +# server { +# listen localhost:143; +# protocol imap; +# proxy on; +# } +#} +daemon off; + diff --git a/nextcloud/root/defaults/root b/nextcloud/root/defaults/root new file mode 100644 index 000000000..7563168d1 --- /dev/null +++ b/nextcloud/root/defaults/root @@ -0,0 +1,9 @@ +# do daily/weekly/monthly maintenance +# min hour day month weekday command +*/15 * * * * run-parts /etc/periodic/15min +0 * * * * run-parts /etc/periodic/hourly +0 2 * * * run-parts /etc/periodic/daily +0 3 * * 6 run-parts /etc/periodic/weekly +0 5 1 * * run-parts /etc/periodic/monthly +# nextcloud cron +*/5 * * * * s6-setuidgid abc php7 -f /data/config/www/nextcloud/cron.php diff --git a/nextcloud/root/etc/cont-init.d/10-adduser b/nextcloud/root/etc/cont-init.d/10-adduser new file mode 100644 index 000000000..1013098f3 --- /dev/null +++ b/nextcloud/root/etc/cont-init.d/10-adduser @@ -0,0 +1,39 @@ +#!/usr/bin/with-contenv bash + +PUID=${PUID:-911} +PGID=${PGID:-911} + +groupmod -o -g "$PGID" abc +usermod -o -u "$PUID" abc +mkdir -p /data/config +mkdir -p /share/nextcloud +echo ' +------------------------------------- + _ () + | | ___ _ __ + | | / __| | | / \ + | | \__ \ | | | () | + |_| |___/ |_| \__/ + + +Brought to you by linuxserver.io +-------------------------------------' +if [[ -f /donate.txt ]]; then + echo ' +To support the app dev(s) visit:' + cat /donate.txt +fi +echo ' +To support LSIO projects visit: +https://www.linuxserver.io/donate/ +------------------------------------- +GID/UID +-------------------------------------' +echo " +User uid: $(id -u abc) +User gid: $(id -g abc) +------------------------------------- +" +chown abc:abc /app +chown abc:abc /data/config +chown abc:abc /defaults diff --git a/nextcloud/root/etc/cont-init.d/30-keygen b/nextcloud/root/etc/cont-init.d/30-keygen new file mode 100644 index 000000000..66ba5f6ce --- /dev/null +++ b/nextcloud/root/etc/cont-init.d/30-keygen @@ -0,0 +1,11 @@ +#!/usr/bin/with-contenv bash +/defaults/nextcloud-perms.sh +SUBJECT="/C=US/ST=CA/L=Carlsbad/O=Linuxserver.io/OU=LSIO Server/CN=*" +if [[ -f /ssl/nextcloud/keys/cert.key && -f /ssl/nextcloud/keys/cert.crt ]]; then +echo "using keys found in /ssl/nextcloud/keys" +else +echo "generating self-signed keys in /ssl/nextcloud/keys, you can replace these with your own keys if required" +openssl req -new -x509 -days 3650 -nodes -out /ssl/nextcloud/keys/cert.crt -keyout /ssl/nextcloud/keys/cert.key -subj "$SUBJECT" +fi + + diff --git a/nextcloud/root/etc/cont-init.d/40-config b/nextcloud/root/etc/cont-init.d/40-config new file mode 100644 index 000000000..a0f0660e3 --- /dev/null +++ b/nextcloud/root/etc/cont-init.d/40-config @@ -0,0 +1,8 @@ +#!/usr/bin/with-contenv bash + +# permissions +chown abc:abc \ + /data/config/nextcloud/config \ + /data/config/nextcloud/data +chown -R abc:abc \ + /var/lib/nginx diff --git a/nextcloud/root/etc/cont-init.d/50-install b/nextcloud/root/etc/cont-init.d/50-install new file mode 100644 index 000000000..3f9473245 --- /dev/null +++ b/nextcloud/root/etc/cont-init.d/50-install @@ -0,0 +1,21 @@ +#!/usr/bin/with-contenv bash + +# create folders +mkdir -p \ + "${NEXTCLOUD_PATH}" \ + /data/config/crontabs + +# install app +if [ ! -e "${NEXTCLOUD_PATH}/index.php" ]; then + tar xf /app/nextcloud.tar.bz2 -C \ + "${NEXTCLOUD_PATH}" --strip-components=1 + chown abc:abc -R \ + "${NEXTCLOUD_PATH}" + chmod +x "${NEXTCLOUD_PATH}/occ" +fi + +# set cronjob +[[ ! -f /data/config/crontabs/root ]] && \ + cp /defaults/root /data/config/crontabs/root +cp /data/config/crontabs/root /etc/crontabs/root + diff --git a/nextcloud/root/etc/cont-init.d/60-memcache b/nextcloud/root/etc/cont-init.d/60-memcache new file mode 100644 index 000000000..91b1feea8 --- /dev/null +++ b/nextcloud/root/etc/cont-init.d/60-memcache @@ -0,0 +1,9 @@ +#!/usr/bin/with-contenv bash + +# copy config +[[ ! -f /data/config/www/nextcloud/config/config.php ]] && \ + cp /defaults/config.php /data/config/www/nextcloud/config/config.php + +# permissions +chown abc:abc \ + /data/config/www/nextcloud/config/config.php diff --git a/nextcloud/root/etc/services.d/cron/run b/nextcloud/root/etc/services.d/cron/run new file mode 100644 index 000000000..a1b27f4a7 --- /dev/null +++ b/nextcloud/root/etc/services.d/cron/run @@ -0,0 +1,3 @@ +#!/usr/bin/with-contenv bash + +/usr/sbin/crond -f -S -l 0 -c /etc/crontabs diff --git a/transmission/Dockerfile b/transmission/Dockerfile index 12187699c..193ff10cb 100644 --- a/transmission/Dockerfile +++ b/transmission/Dockerfile @@ -1,59 +1,7 @@ -ARG BUILD_FROM=hassioaddons/base:8.0.1 -# hadolint ignore=DL3006 -FROM ${BUILD_FROM} +ARG BUILD_FROM +FROM $BUILD_FROM -# Copy root filesystem -COPY rootfs / +# MOFIFY DATA PATH +RUN sed -i "s|config|data|g" /etc/services.d/transmission/run -# Setup base -RUN apk add --no-cache \ - coreutils \ - nginx \ - transmission-daemon \ - openvpn -# Small hack needed for ingress support -# -# Transmission always uses "transmission" as a subdirectory in the URL, so the web interface can for instance be found at: -# -# http:///transmission/web/ -# -# The same goes for the RPC API, which is exposed under /transmission/rpc. When using ingress, this is not the case however -# and "transmission" directory is not part of the URL. So transmission is basically served under the root (/), e.g.: -# -# http://10.0.10.110:8123/api/hassio_ingress/rQEi5X4zJFTmZ82ghplDjsx2AoK3r2lqx0zZHHjZ69Q/ -# -# As the web UI uses a relative path when resolving the RPC endpoint, it basically becomes: -# -# http://10.0.10.110:8123/api/hassio_ingress/rQEi5X4zJFTmZ82ghplDjsx2AoK3r2lqx0zZHHjZ69Q/../rpc -# -# which obviously is: -# -# http://10.0.10.110:8123/api/hassio_ingress -# -# This will not work. The sed statement below changes the way the RPC endpoint is determined by keeping the regular endpoint -# when accessing transmission as usual, but stripping the relative part when using ingress. -RUN sed -i 's|'"'"'\.\./rpc'"'"'|window.location.pathname.endsWith("/web/") ? "../rpc" : "rpc"|' /usr/share/transmission/web/javascript/remote.js - -# Build arugments -ARG BUILD_ARCH -ARG BUILD_DATE -ARG BUILD_REF -ARG BUILD_VERSION - -# Labels -LABEL \ - io.hass.name="Transmission" \ - io.hass.description="The torrent client for Hass.io with OpenVPN support" \ - io.hass.arch="${BUILD_ARCH}" \ - io.hass.type="addon" \ - io.hass.version=${BUILD_VERSION} \ - maintainer="Pierrick Rouxel " \ - org.label-schema.description="The torrent client for Hass.io" \ - org.label-schema.build-date=${BUILD_DATE} \ - org.label-schema.name="Transmission" \ - org.label-schema.schema-version="1.0" \ - org.label-schema.url="https://github.com/pierrickrouxel" \ - org.label-schema.usage="https://github.com/pierrickrouxel/hassio-addon-transmission/tree/master/README.md" \ - org.label-schema.vcs-ref=${BUILD_REF} \ - org.label-schema.vcs-url="https://github.com/pierrickrouxel" \ - org.label-schema.vendor="Community Hass.io Addons" +VOLUME [ "/data" ] diff --git a/transmission/README.md b/transmission/README.md new file mode 100644 index 000000000..00d20ca88 --- /dev/null +++ b/transmission/README.md @@ -0,0 +1,27 @@ +# Hassio Add-ons by alexbelgium: Transmission + +## About + +Transmission is designed for easy, powerful use. Transmission has the features you want from a BitTorrent client: encryption, a web interface, peer exchange, magnet links, DHT, µTP, UPnP and NAT-PMP port forwarding, webseed support, watch directories, tracker editing, global and per-torrent speed limits, and more. + +This addon is based on the [docker image](https://github.com/linuxserver/transmission) from linuxserver.io. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Hass.io add-on. + +1. [Add my Hass.io add-ons repository][repository] to your Hass.io instance. +1. Install this add-on. +1. Click the `Save` button to store your configuration. +1. Start the add-on. +1. Check the logs of the add-on to see if everything went well. +1. Carefully configure the add-on to your preferences, see the official documentation for for that. + + +## Configuration + +Webui can be found at `:9091`. + + +[repository]: https://github.com/alexbelgium/hassio-addons diff --git a/transmission/build.json b/transmission/build.json index 00a28bf95..87b607e48 100644 --- a/transmission/build.json +++ b/transmission/build.json @@ -1,11 +1,11 @@ { - "squash": false, "build_from": { - "aarch64": "hassioaddons/base-aarch64:8.0.1", - "amd64": "hassioaddons/base-amd64:8.0.1", - "armhf": "hassioaddons/base-armhf:8.0.1", - "armv7": "hassioaddons/base-armv7:8.0.1", - "i386": "hassioaddons/base-i386:8.0.1" + "armv7": "linuxserver/transmission:arm32v7-3.00-r0-ls69", + "armhf": "linuxserver/transmission:arm32v7-3.00-r0-ls69", + "aarch64": "linuxserver/code-server:arm64v8-3.00-r0-ls69", + "amd64": "linuxserver/code-server:amd64-3.00-r0-ls69" }, + "squash": false, "args": {} } + diff --git a/transmission/config.json b/transmission/config.json index d34d48e4f..bfca6a7a6 100644 --- a/transmission/config.json +++ b/transmission/config.json @@ -1,67 +1,47 @@ { - "name": "Transmission NAS", - "version": "1.2", - "slug": "transmission", - "description": "The torrent client for Hass.io with OpenVPN support", - "url": "https://github.com/pierrickrouxel/hassio-addon-transmission", - "webui": "http://[HOST]:[PORT:9091]/transmission/web/", - "startup": "services", - "ingress": "true", - "ingress_port": 8099, - "panel_icon": "mdi:progress-download", - "panel_title": "Transmission", - "arch": ["armhf", "armv7", "aarch64", "amd64", "i386"], - "map": [ - "config:rw", - "share:rw", - "media:rw", - "ssl" - ], - "boot": "auto", + "name": "Transmission", + "version": "3.00-r0-ls69", + "slug": "transmission", + "description": "The torrent client for Hass.io", + "url": "https://hub.docker.com/alexbelgium/transmission", + "startup": "services", + "arch": [ + "aarch64", + "amd64", + "armv7", + "armhf" + ], "ports": { - "9091/tcp": null, + "9091/tcp": 9091, "51413/tcp": 51413, "51413/udp": 51413 }, "ports_description": { - "9091/tcp": "Web UI port (Not required for Hass.io Ingress)", + "9091/tcp": "Web UI port", "51413/tcp": "Peer port (setup port forwarding to this port)", "51413/udp": "Peer port (setup port forwarding to this port)" }, - "privileged": [ - "NET_ADMIN" - ], - "devices": [ - "/dev/net/tun:/dev/net/tun:rwm" - ], - "privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"], - "full_access": true, - "hassio_api": true, - "homeassistant_api": false, - "host_network": false, - "options": { - "log_level": "info", - "authentication_required": false, - "username": "", - "password": "", - "localdisks": ["sda1"], - "openvpn_enabled": false, - "openvpn_config": "", - "openvpn_username": "", - "openvpn_password": "" - }, - "schema": { - "log_level": "match(^(trace|debug|info|notice|warning|error|fatal)$)", - "authentication_required": "bool", - "username": "str", - "password": "str", - "localdisks": ["str"], - "openvpn_enabled": "bool", - "openvpn_config": "str", - "openvpn_username": "str", - "openvpn_password": "str" - }, - "environment": { - "LOG_FORMAT": "{LEVEL}: {MESSAGE}" - } + "map": [ + "config:rw", + "share:rw", + "media:rw", + "ssl" + ], + "webui": "http://[HOST]:[PORT:8099]", + "boot": "auto", + "environment": { + "PUID": 0, + "PGID": 0 + }, + "options": { + "PUID": 0, + "PGID": 0, + "TRANSMISSION_WEB_HOME": "/combustion-release/" + }, + "schema": { + "PUID": "int", + "PGID": "int", + "TRANSMISSION_WEB_HOME": "str?", + "TZ": "str?" } +} diff --git a/transmission/DOCS.md b/transmission_nas/DOCS.md similarity index 100% rename from transmission/DOCS.md rename to transmission_nas/DOCS.md diff --git a/transmission_nas/Dockerfile b/transmission_nas/Dockerfile new file mode 100644 index 000000000..12187699c --- /dev/null +++ b/transmission_nas/Dockerfile @@ -0,0 +1,59 @@ +ARG BUILD_FROM=hassioaddons/base:8.0.1 +# hadolint ignore=DL3006 +FROM ${BUILD_FROM} + +# Copy root filesystem +COPY rootfs / + +# Setup base +RUN apk add --no-cache \ + coreutils \ + nginx \ + transmission-daemon \ + openvpn +# Small hack needed for ingress support +# +# Transmission always uses "transmission" as a subdirectory in the URL, so the web interface can for instance be found at: +# +# http:///transmission/web/ +# +# The same goes for the RPC API, which is exposed under /transmission/rpc. When using ingress, this is not the case however +# and "transmission" directory is not part of the URL. So transmission is basically served under the root (/), e.g.: +# +# http://10.0.10.110:8123/api/hassio_ingress/rQEi5X4zJFTmZ82ghplDjsx2AoK3r2lqx0zZHHjZ69Q/ +# +# As the web UI uses a relative path when resolving the RPC endpoint, it basically becomes: +# +# http://10.0.10.110:8123/api/hassio_ingress/rQEi5X4zJFTmZ82ghplDjsx2AoK3r2lqx0zZHHjZ69Q/../rpc +# +# which obviously is: +# +# http://10.0.10.110:8123/api/hassio_ingress +# +# This will not work. The sed statement below changes the way the RPC endpoint is determined by keeping the regular endpoint +# when accessing transmission as usual, but stripping the relative part when using ingress. +RUN sed -i 's|'"'"'\.\./rpc'"'"'|window.location.pathname.endsWith("/web/") ? "../rpc" : "rpc"|' /usr/share/transmission/web/javascript/remote.js + +# Build arugments +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_REF +ARG BUILD_VERSION + +# Labels +LABEL \ + io.hass.name="Transmission" \ + io.hass.description="The torrent client for Hass.io with OpenVPN support" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="Pierrick Rouxel " \ + org.label-schema.description="The torrent client for Hass.io" \ + org.label-schema.build-date=${BUILD_DATE} \ + org.label-schema.name="Transmission" \ + org.label-schema.schema-version="1.0" \ + org.label-schema.url="https://github.com/pierrickrouxel" \ + org.label-schema.usage="https://github.com/pierrickrouxel/hassio-addon-transmission/tree/master/README.md" \ + org.label-schema.vcs-ref=${BUILD_REF} \ + org.label-schema.vcs-url="https://github.com/pierrickrouxel" \ + org.label-schema.vendor="Community Hass.io Addons" diff --git a/transmission_nas/build.json b/transmission_nas/build.json new file mode 100644 index 000000000..00a28bf95 --- /dev/null +++ b/transmission_nas/build.json @@ -0,0 +1,11 @@ +{ + "squash": false, + "build_from": { + "aarch64": "hassioaddons/base-aarch64:8.0.1", + "amd64": "hassioaddons/base-amd64:8.0.1", + "armhf": "hassioaddons/base-armhf:8.0.1", + "armv7": "hassioaddons/base-armv7:8.0.1", + "i386": "hassioaddons/base-i386:8.0.1" + }, + "args": {} +} diff --git a/transmission_nas/config.json b/transmission_nas/config.json new file mode 100644 index 000000000..397a1552f --- /dev/null +++ b/transmission_nas/config.json @@ -0,0 +1,67 @@ +{ + "name": "Transmission NAS", + "version": "1.2", + "slug": "transmission_nas", + "description": "The torrent client for Hass.io with OpenVPN support", + "url": "https://github.com/pierrickrouxel/hassio-addon-transmission", + "webui": "http://[HOST]:[PORT:9091]/transmission/web/", + "startup": "services", + "ingress": "true", + "ingress_port": 8099, + "panel_icon": "mdi:progress-download", + "panel_title": "Transmission", + "arch": ["armhf", "armv7", "aarch64", "amd64", "i386"], + "map": [ + "config:rw", + "share:rw", + "media:rw", + "ssl" + ], + "boot": "auto", + "ports": { + "9091/tcp": null, + "51413/tcp": 51413, + "51413/udp": 51413 + }, + "ports_description": { + "9091/tcp": "Web UI port (Not required for Hass.io Ingress)", + "51413/tcp": "Peer port (setup port forwarding to this port)", + "51413/udp": "Peer port (setup port forwarding to this port)" + }, + "privileged": [ + "NET_ADMIN" + ], + "devices": [ + "/dev/net/tun:/dev/net/tun:rwm" + ], + "privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"], + "full_access": true, + "hassio_api": true, + "homeassistant_api": false, + "host_network": false, + "options": { + "log_level": "info", + "authentication_required": false, + "username": "", + "password": "", + "localdisks": ["sda1"], + "openvpn_enabled": false, + "openvpn_config": "", + "openvpn_username": "", + "openvpn_password": "" + }, + "schema": { + "log_level": "match(^(trace|debug|info|notice|warning|error|fatal)$)", + "authentication_required": "bool", + "username": "str", + "password": "str", + "localdisks": ["str"], + "openvpn_enabled": "bool", + "openvpn_config": "str", + "openvpn_username": "str", + "openvpn_password": "str" + }, + "environment": { + "LOG_FORMAT": "{LEVEL}: {MESSAGE}" + } + } diff --git a/transmission_nas/icon.png b/transmission_nas/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..29a6a3cdcc16ced8325fb5aa17e9153c77d6f6cb GIT binary patch literal 18546 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 literal 0 HcmV?d00001 diff --git a/transmission_nas/logo.png b/transmission_nas/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..524beb6b2668b9510b58bfc49de1fe81c29a42ca GIT binary patch literal 17546 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 a!2bsoc59w|B@`I|0000