From af89341da0af3bbd6ecad7e0dc0d601b995be158 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 5 Oct 2018 23:58:22 +0200 Subject: [PATCH] :tada: Initial add-on code --- motioneye/.README.j2 | 73 +++++++++++++ motioneye/Dockerfile | 49 +++++++++ motioneye/build.json | 9 ++ motioneye/config.json | 44 ++++++++ motioneye/icon.png | Bin 0 -> 6527 bytes motioneye/logo.png | Bin 0 -> 4864 bytes .../rootfs/etc/cont-init.d/10-requirement.sh | 26 +++++ .../etc/cont-init.d/20-init-configuration.sh | 12 +++ .../rootfs/etc/cont-init.d/21-init-media.sh | 12 +++ motioneye/rootfs/etc/cont-init.d/30-nginx.sh | 29 ++++++ motioneye/rootfs/etc/motioneye/motioneye.conf | 97 ++++++++++++++++++ motioneye/rootfs/etc/nginx/ngins-ssl.conf | 70 +++++++++++++ motioneye/rootfs/etc/nginx/nginx.conf | 51 +++++++++ .../rootfs/etc/services.d/motioneye/finish | 9 ++ motioneye/rootfs/etc/services.d/motioneye/run | 19 ++++ motioneye/rootfs/etc/services.d/nginx/finish | 9 ++ motioneye/rootfs/etc/services.d/nginx/run | 9 ++ 17 files changed, 518 insertions(+) create mode 100644 motioneye/.README.j2 create mode 100755 motioneye/Dockerfile create mode 100644 motioneye/build.json create mode 100755 motioneye/config.json create mode 100644 motioneye/icon.png create mode 100644 motioneye/logo.png create mode 100644 motioneye/rootfs/etc/cont-init.d/10-requirement.sh create mode 100644 motioneye/rootfs/etc/cont-init.d/20-init-configuration.sh create mode 100644 motioneye/rootfs/etc/cont-init.d/21-init-media.sh create mode 100644 motioneye/rootfs/etc/cont-init.d/30-nginx.sh create mode 100644 motioneye/rootfs/etc/motioneye/motioneye.conf create mode 100644 motioneye/rootfs/etc/nginx/ngins-ssl.conf create mode 100644 motioneye/rootfs/etc/nginx/nginx.conf create mode 100644 motioneye/rootfs/etc/services.d/motioneye/finish create mode 100644 motioneye/rootfs/etc/services.d/motioneye/run create mode 100644 motioneye/rootfs/etc/services.d/nginx/finish create mode 100644 motioneye/rootfs/etc/services.d/nginx/run diff --git a/motioneye/.README.j2 b/motioneye/.README.j2 new file mode 100644 index 0000000..5c730a0 --- /dev/null +++ b/motioneye/.README.j2 @@ -0,0 +1,73 @@ +# Community Hass.io Add-ons: motionEye + +[![Release][release-shield]][release] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] + +[![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] + +[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee] + +[![Support my work on Patreon][patreon-shield]][patreon] + +Simple, elegant and feature-rich CCTV/NVR for your camera's. + +## About + +Lorem ipsum + +[Click here for the full documentation][docs] + +![HADashboard screenshot][screenshot] + +{% if channel == "edge" %} +## WARNING! THIS IS AN EDGE VERSION! + +This Hass.io Add-ons repository contains edge builds of add-ons. Edge builds +add-ons are based upon the latest development version. + +- They may not work at all. +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. +- Developers. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +{% if channel == "beta" %} +## WARNING! THIS IS A BETA VERSION! + +This Hass.io Add-ons repository contains beta releases of add-ons. + +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/guidelines/download-assets-sm-2.svg +[buymeacoffee]: https://www.buymeacoffee.com/frenck +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[docs]: {{ repo }}/blob/{{ version }}/README.md +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/t/community-hass-io-add-on-motioneye/41261?u=frenck +[maintenance-shield]: https://img.shields.io/maintenance/yes/2018.svg +[patreon-shield]: https://www.frenck.nl/images/patreon.png +[patreon]: https://www.patreon.com/frenck +[project-stage-shield]: https://img.shields.io/badge/project%20stage-production%20ready-brightgreen.svg +[release-shield]: https://img.shields.io/badge/version-{{ version }}-blue.svg +[release]: {{ repo }}/tree/{{ version }} +[screenshot]: https://github.com/hassio-addons/addon-motioneye/raw/master/images/screenshot.png diff --git a/motioneye/Dockerfile b/motioneye/Dockerfile new file mode 100755 index 0000000..7dad636 --- /dev/null +++ b/motioneye/Dockerfile @@ -0,0 +1,49 @@ +ARG BUILD_FROM=hassioaddons/base:2.3.0 +# hadolint ignore=DL3006 +FROM ${BUILD_FROM} + +# Set shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Setup base +RUN \ + apk add --no-cache \ + cifs-utils=6.8-r0 \ + ffmpeg=3.4.4-r1 \ + motion@edge=4.1.1-r0 \ + nginx=1.14.0-r1 \ + py2-curl=7.43.0-r5 \ + py2-pillow=4.3.0-r0 \ + py2-pip=10.0.1-r0 \ + python2=2.7.15-r1 \ + v4l-utils=1.12.6-r1 \ + \ + && pip2 install \ + motioneye==0.39.3 + +# Copy root filesystem +COPY rootfs / + +# Build arugments +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_REF +ARG BUILD_VERSION + +# Labels +LABEL \ + io.hass.name="motionEye" \ + io.hass.description="Simple, elegant and feature-rich CCTV/NVR for your camera's" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="Franck Nijhof " \ + org.label-schema.description="Simple, elegant and feature-rich CCTV/NVR for your camera's" \ + org.label-schema.build-date=${BUILD_DATE} \ + org.label-schema.name="motionEye" \ + org.label-schema.schema-version="1.0" \ + org.label-schema.url="https://community.home-assistant.io/?u=frenck" \ + org.label-schema.usage="https://github.com/hassio-addons/addon-motioneye/tree/master/README.md" \ + org.label-schema.vcs-ref=${BUILD_REF} \ + org.label-schema.vcs-url="https://github.com/hassio-addons/addon-motioneye" \ + org.label-schema.vendor="Community Hass.io Add-ons" diff --git a/motioneye/build.json b/motioneye/build.json new file mode 100644 index 0000000..13665d0 --- /dev/null +++ b/motioneye/build.json @@ -0,0 +1,9 @@ +{ + "build_from": { + "aarch64": "hassioaddons/base-aarch64:2.3.0", + "amd64": "hassioaddons/base-amd64:2.3.0", + "armhf": "hassioaddons/base-armhf:2.3.0", + "i386": "hassioaddons/base-i386:2.3.0" + }, + "args": {} +} diff --git a/motioneye/config.json b/motioneye/config.json new file mode 100755 index 0000000..faedee8 --- /dev/null +++ b/motioneye/config.json @@ -0,0 +1,44 @@ +{ + "name": "motionEye", + "version": "dev", + "slug": "motioneye", + "description": "Simple, elegant and feature-rich CCTV/NVR for your camera's", + "url": "https://community.home-assistant.io/?u=frenck", + "webui": "[PROTO:ssl]://[HOST]:[PORT:8765]", + "startup": "application", + "arch": [ + "aarch64", + "amd64", + "armhf", + "i386" + ], + "boot": "auto", + "hassio_api": true, + "hassio_role": "default", + "homeassistant_api": false, + "host_network": true, + "map": [ + "config", + "share:rw", + "ssl" + ], + "options": { + "log_level": "info", + "port": 8765, + "ssl": true, + "certfile": "fullchain.pem", + "keyfile": "privkey.pem", + "ipv6": false + }, + "schema": { + "log_level": "match(^(trace|debug|info|notice|warning|error|fatal)$)", + "port": "port", + "ssl": "bool", + "certfile": "str", + "keyfile": "str", + "ipv6": "bool" + }, + "environment": { + "LOG_FORMAT": "{LEVEL}: {MESSAGE}" + } +} diff --git a/motioneye/icon.png b/motioneye/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2507ebea75437066d5a3b986c3d73571bc3ef3a6 GIT binary patch literal 6527 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