From 9042ef24bc34974d207c7062741cdb2c2c6d0a9a Mon Sep 17 00:00:00 2001 From: root Date: Wed, 25 Sep 2024 13:57:35 +0200 Subject: [PATCH] . --- hassio-addons/.devcontainer/devcontainer.json | 29 ++ hassio-addons/.devcontainer/setup.sh | 5 + hassio-addons/.github/dependabot.yaml | 7 + hassio-addons/.github/workflows/builder.yaml | 113 ++++++++ hassio-addons/.github/workflows/lint.yaml | 41 +++ hassio-addons/.pre-commit-config.yaml | 18 ++ hassio-addons/LICENSE | 21 ++ hassio-addons/README.md | 9 + hassio-addons/backup-s3/CHANGELOG.md | 11 + hassio-addons/backup-s3/Dockerfile | 12 + hassio-addons/backup-s3/README.md | 66 +++++ hassio-addons/backup-s3/apparmor.txt | 30 ++ hassio-addons/backup-s3/build.yaml | 14 + hassio-addons/backup-s3/config.yaml | 27 ++ hassio-addons/backup-s3/icon.png | Bin 0 -> 4978 bytes .../rootfs/etc/services.d/backup/finish | 13 + .../rootfs/etc/services.d/backup/run | 23 ++ hassio-addons/backup-s3/translations/en.yaml | 17 ++ hassio-addons/kresus/CHANGELOG.md | 37 +++ hassio-addons/kresus/DOCS.md | 54 ++++ hassio-addons/kresus/Dockerfile | 107 +++++++ hassio-addons/kresus/README.md | 25 ++ hassio-addons/kresus/apparmor.txt | 72 +++++ hassio-addons/kresus/build.yaml | 18 ++ hassio-addons/kresus/config.yaml | 33 +++ hassio-addons/kresus/icon.png | Bin 0 -> 8772 bytes hassio-addons/kresus/logo.png | Bin 0 -> 8772 bytes .../kresus/rootfs/etc/kresus/config.ini | 270 ++++++++++++++++++ .../rootfs/etc/services.d/kresus/finish | 15 + .../kresus/rootfs/etc/services.d/kresus/run | 25 ++ .../kresus/rootfs/usr/libexec/kresus/start.sh | 55 ++++ hassio-addons/kresus/translations/en.yaml | 27 ++ hassio-addons/postgres/CHANGELOG.md | 13 + hassio-addons/postgres/DOCS.md | 76 +++++ hassio-addons/postgres/Dockerfile | 16 ++ hassio-addons/postgres/README.md | 19 ++ hassio-addons/postgres/apparmor.txt | 51 ++++ hassio-addons/postgres/build.yaml | 14 + hassio-addons/postgres/config.yaml | 42 +++ hassio-addons/postgres/icon.png | Bin 0 -> 10669 bytes hassio-addons/postgres/logo.png | Bin 0 -> 9903 bytes .../rootfs/etc/services.d/postgresql/finish | 15 + .../rootfs/etc/services.d/postgresql/run | 15 + .../rootfs/usr/libexec/postgres/checkdb.sh | 12 + .../rootfs/usr/libexec/postgres/config.sh | 49 ++++ .../rootfs/usr/libexec/postgres/initdb.sh | 14 + .../rootfs/usr/libexec/postgres/start.sh | 32 +++ hassio-addons/postgres/translations/en.yaml | 12 + hassio-addons/repository.yaml | 3 + kresus-mrraph-test/CHANGELOG.md | 37 +++ kresus-mrraph-test/DOCS.md | 54 ++++ kresus-mrraph-test/Dockerfile | 39 +++ kresus-mrraph-test/README.md | 25 ++ kresus-mrraph-test/build.yaml | 12 + kresus-mrraph-test/config.yaml | 30 ++ kresus-mrraph-test/icon.png | Bin 0 -> 8772 bytes kresus-mrraph-test/logo.png | Bin 0 -> 8772 bytes kresus-mrraph-test/requirements.txt | 1 + kresus-mrraph-test/start.sh | 56 ++++ kresus-mrraph-test/start.sh.ori | 55 ++++ kresus-mrraph-test/translations/en.yaml | 27 ++ kresus-mrraph/CHANGELOG.md | 37 +++ kresus-mrraph/DOCS.md | 54 ++++ kresus-mrraph/Dockerfile | 19 ++ kresus-mrraph/README.md | 25 ++ kresus-mrraph/build.yaml | 12 + kresus-mrraph/config.yaml | 30 ++ kresus-mrraph/icon.png | Bin 0 -> 8772 bytes kresus-mrraph/logo.png | Bin 0 -> 8772 bytes kresus-mrraph/requirements.txt | 1 + kresus-mrraph/start.sh | 56 ++++ kresus-mrraph/start.sh.ori | 55 ++++ kresus-mrraph/translations/en.yaml | 27 ++ 73 files changed, 2229 insertions(+) create mode 100644 hassio-addons/.devcontainer/devcontainer.json create mode 100755 hassio-addons/.devcontainer/setup.sh create mode 100644 hassio-addons/.github/dependabot.yaml create mode 100644 hassio-addons/.github/workflows/builder.yaml create mode 100644 hassio-addons/.github/workflows/lint.yaml create mode 100644 hassio-addons/.pre-commit-config.yaml create mode 100644 hassio-addons/LICENSE create mode 100644 hassio-addons/README.md create mode 100644 hassio-addons/backup-s3/CHANGELOG.md create mode 100644 hassio-addons/backup-s3/Dockerfile create mode 100644 hassio-addons/backup-s3/README.md create mode 100644 hassio-addons/backup-s3/apparmor.txt create mode 100644 hassio-addons/backup-s3/build.yaml create mode 100644 hassio-addons/backup-s3/config.yaml create mode 100644 hassio-addons/backup-s3/icon.png create mode 100755 hassio-addons/backup-s3/rootfs/etc/services.d/backup/finish create mode 100755 hassio-addons/backup-s3/rootfs/etc/services.d/backup/run create mode 100644 hassio-addons/backup-s3/translations/en.yaml create mode 100644 hassio-addons/kresus/CHANGELOG.md create mode 100644 hassio-addons/kresus/DOCS.md create mode 100644 hassio-addons/kresus/Dockerfile create mode 100644 hassio-addons/kresus/README.md create mode 100644 hassio-addons/kresus/apparmor.txt create mode 100644 hassio-addons/kresus/build.yaml create mode 100644 hassio-addons/kresus/config.yaml create mode 100644 hassio-addons/kresus/icon.png create mode 100644 hassio-addons/kresus/logo.png create mode 100644 hassio-addons/kresus/rootfs/etc/kresus/config.ini create mode 100755 hassio-addons/kresus/rootfs/etc/services.d/kresus/finish create mode 100755 hassio-addons/kresus/rootfs/etc/services.d/kresus/run create mode 100755 hassio-addons/kresus/rootfs/usr/libexec/kresus/start.sh create mode 100644 hassio-addons/kresus/translations/en.yaml create mode 100644 hassio-addons/postgres/CHANGELOG.md create mode 100644 hassio-addons/postgres/DOCS.md create mode 100644 hassio-addons/postgres/Dockerfile create mode 100644 hassio-addons/postgres/README.md create mode 100644 hassio-addons/postgres/apparmor.txt create mode 100644 hassio-addons/postgres/build.yaml create mode 100644 hassio-addons/postgres/config.yaml create mode 100644 hassio-addons/postgres/icon.png create mode 100644 hassio-addons/postgres/logo.png create mode 100755 hassio-addons/postgres/rootfs/etc/services.d/postgresql/finish create mode 100755 hassio-addons/postgres/rootfs/etc/services.d/postgresql/run create mode 100755 hassio-addons/postgres/rootfs/usr/libexec/postgres/checkdb.sh create mode 100755 hassio-addons/postgres/rootfs/usr/libexec/postgres/config.sh create mode 100755 hassio-addons/postgres/rootfs/usr/libexec/postgres/initdb.sh create mode 100755 hassio-addons/postgres/rootfs/usr/libexec/postgres/start.sh create mode 100644 hassio-addons/postgres/translations/en.yaml create mode 100644 hassio-addons/repository.yaml create mode 100644 kresus-mrraph-test/CHANGELOG.md create mode 100644 kresus-mrraph-test/DOCS.md create mode 100644 kresus-mrraph-test/Dockerfile create mode 100644 kresus-mrraph-test/README.md create mode 100644 kresus-mrraph-test/build.yaml create mode 100644 kresus-mrraph-test/config.yaml create mode 100644 kresus-mrraph-test/icon.png create mode 100644 kresus-mrraph-test/logo.png create mode 100644 kresus-mrraph-test/requirements.txt create mode 100755 kresus-mrraph-test/start.sh create mode 100755 kresus-mrraph-test/start.sh.ori create mode 100644 kresus-mrraph-test/translations/en.yaml create mode 100644 kresus-mrraph/CHANGELOG.md create mode 100644 kresus-mrraph/DOCS.md create mode 100644 kresus-mrraph/Dockerfile create mode 100644 kresus-mrraph/README.md create mode 100644 kresus-mrraph/build.yaml create mode 100644 kresus-mrraph/config.yaml create mode 100644 kresus-mrraph/icon.png create mode 100644 kresus-mrraph/logo.png create mode 100644 kresus-mrraph/requirements.txt create mode 100755 kresus-mrraph/start.sh create mode 100755 kresus-mrraph/start.sh.ori create mode 100644 kresus-mrraph/translations/en.yaml diff --git a/hassio-addons/.devcontainer/devcontainer.json b/hassio-addons/.devcontainer/devcontainer.json new file mode 100644 index 0000000..032f121 --- /dev/null +++ b/hassio-addons/.devcontainer/devcontainer.json @@ -0,0 +1,29 @@ +{ + "containerEnv": { + "WORKSPACE_DIRECTORY": "${containerWorkspaceFolder}" + }, + "extensions": [ + "timonwong.shellcheck", + "esbenp.prettier-vscode" + ], + "image": "ghcr.io/home-assistant/devcontainer:addons", + "name": "Example Home Assistant add-on repository", + "postStartCommand": ".devcontainer/setup.sh", + "runArgs": [ + "-e", + "GIT_EDITOR=code --wait", + "--privileged" + ], + "settings": { + "editor.formatOnPaste": false, + "editor.formatOnSave": true, + "editor.formatOnType": true, + "files.trimTrailingWhitespace": true, + "terminal.integrated.defaultProfile.linux": "zsh", + "terminal.integrated.profiles.linux": { + "zsh": { + "path": "/usr/bin/zsh" + } + } + } +} diff --git a/hassio-addons/.devcontainer/setup.sh b/hassio-addons/.devcontainer/setup.sh new file mode 100755 index 0000000..3f1eebd --- /dev/null +++ b/hassio-addons/.devcontainer/setup.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +# Install pre-commit +sudo apt install -y pre-commit +pre-commit install diff --git a/hassio-addons/.github/dependabot.yaml b/hassio-addons/.github/dependabot.yaml new file mode 100644 index 0000000..83b26ea --- /dev/null +++ b/hassio-addons/.github/dependabot.yaml @@ -0,0 +1,7 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: weekly + time: "06:00" diff --git a/hassio-addons/.github/workflows/builder.yaml b/hassio-addons/.github/workflows/builder.yaml new file mode 100644 index 0000000..7cb5b75 --- /dev/null +++ b/hassio-addons/.github/workflows/builder.yaml @@ -0,0 +1,113 @@ +name: Builder + +env: + BUILD_ARGS: "--test" + MONITORED_FILES: "build.yaml config.yaml Dockerfile rootfs" + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + init: + runs-on: ubuntu-latest + name: Initialize builds + outputs: + changed_addons: ${{ steps.changed_addons.outputs.addons }} + changed: ${{ steps.changed_addons.outputs.changed }} + steps: + - name: Check out the repository + uses: actions/checkout@v3.5.2 + + - name: Get changed files + id: changed_files + uses: jitterbit/get-changed-files@v1 + + - name: Find add-on directories + id: addons + uses: home-assistant/actions/helpers/find-addons@master + + - name: Get changed add-ons + id: changed_addons + run: | + declare -a changed_addons + for addon in ${{ steps.addons.outputs.addons }}; do + if [[ "${{ steps.changed_files.outputs.all }}" =~ $addon ]]; then + for file in ${{ env.MONITORED_FILES }}; do + if [[ "${{ steps.changed_files.outputs.all }}" =~ $addon/$file ]]; then + if [[ ! "${changed_addons[@]}" =~ $addon ]]; then + changed_addons+=("\"${addon}\","); + fi + fi + done + fi + done + + changed=$(echo ${changed_addons[@]} | rev | cut -c 2- | rev) + + if [[ -n ${changed} ]]; then + echo "Changed add-ons: $changed"; + echo "::set-output name=changed::true"; + echo "::set-output name=addons::[$changed]"; + else + echo "No add-on had any monitored files changed (${{ env.MONITORED_FILES }})"; + fi + build: + needs: init + runs-on: ubuntu-latest + if: needs.init.outputs.changed == 'true' + name: Build ${{ matrix.arch }} ${{ matrix.addon }} add-on + strategy: + matrix: + addon: ${{ fromJson(needs.init.outputs.changed_addons) }} + arch: ["aarch64", "amd64", "armhf", "armv7", "i386"] + + steps: + - name: Check out repository + uses: actions/checkout@v3.5.2 + + - name: Get information + id: info + uses: home-assistant/actions/helpers/info@master + with: + path: "./${{ matrix.addon }}" + + - name: Check if add-on should be built + id: check + run: | + if [[ "${{ steps.info.outputs.architectures }}" =~ ${{ matrix.arch }} ]]; then + echo "::set-output name=build_arch::true"; + echo "::set-output name=image::$(echo ${{ steps.info.outputs.image }} | cut -d'/' -f3)"; + if [[ -z "${{ github.head_ref }}" ]] && [[ "${{ github.event_name }}" == "push" ]]; then + echo "BUILD_ARGS=" >> $GITHUB_ENV; + fi + else + echo "${{ matrix.arch }} is not a valid arch for ${{ matrix.addon }}, skipping build"; + echo "::set-output name=build_arch::false"; + fi + + - name: Login to GitHub Container Registry + if: env.BUILD_ARGS != '--test' + uses: docker/login-action@v2.1.0 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build ${{ matrix.addon }} add-on + if: steps.check.outputs.build_arch == 'true' + uses: home-assistant/builder@2023.03.0 + with: + args: | + ${{ env.BUILD_ARGS }} \ + --${{ matrix.arch }} \ + --target /data/${{ matrix.addon }} \ + --image "${{ steps.check.outputs.image }}" \ + --docker-hub "ghcr.io/${{ github.repository_owner }}" \ + --addon + env: + CAS_API_KEY: ${{ secrets.CAS_API_KEY }} diff --git a/hassio-addons/.github/workflows/lint.yaml b/hassio-addons/.github/workflows/lint.yaml new file mode 100644 index 0000000..d99a004 --- /dev/null +++ b/hassio-addons/.github/workflows/lint.yaml @@ -0,0 +1,41 @@ +name: Lint + +on: + push: + branches: + - main + pull_request: + branches: + - main + schedule: + - cron: "0 0 * * *" + +jobs: + find: + name: Find add-ons + runs-on: ubuntu-latest + outputs: + addons: ${{ steps.addons.outputs.addons_list }} + steps: + - name: ⤵️ Check out code from GitHub + uses: actions/checkout@v3.5.2 + + - name: 🔍 Find add-on directories + id: addons + uses: home-assistant/actions/helpers/find-addons@master + + lint: + name: Lint add-on ${{ matrix.path }} + runs-on: ubuntu-latest + needs: find + strategy: + matrix: + path: ${{ fromJson(needs.find.outputs.addons) }} + steps: + - name: ⤵️ Check out code from GitHub + uses: actions/checkout@v3.5.2 + + - name: 🚀 Run Home Assistant Add-on Lint + uses: frenck/action-addon-linter@v2.12 + with: + path: "./${{ matrix.path }}" diff --git a/hassio-addons/.pre-commit-config.yaml b/hassio-addons/.pre-commit-config.yaml new file mode 100644 index 0000000..d668a50 --- /dev/null +++ b/hassio-addons/.pre-commit-config.yaml @@ -0,0 +1,18 @@ +fail_fast: false +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: check-added-large-files + - id: check-json + - id: check-merge-conflict + - id: check-symlinks + - id: check-yaml + - id: destroyed-symlinks + - id: detect-private-key + - id: end-of-file-fixer + - id: mixed-line-ending + args: ["--fix=auto"] + - id: pretty-format-json + args: [--autofix, --indent, "4"] + - id: trailing-whitespace diff --git a/hassio-addons/LICENSE b/hassio-addons/LICENSE new file mode 100644 index 0000000..32ee9c8 --- /dev/null +++ b/hassio-addons/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Ezlo Picori + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/hassio-addons/README.md b/hassio-addons/README.md new file mode 100644 index 0000000..545fed4 --- /dev/null +++ b/hassio-addons/README.md @@ -0,0 +1,9 @@ +# Ezlo's custom Home Assistant addons + +This repository defines a few custom addons for Home Assistant. Notably: + +- [Backup S3](./backup-s3): automatically synchronizes your home-assistant backups with a S3-compatible storage backend. +- [PostgreSQL](./postgres): provides a PostgreSQL instance, strongly inspired by the [official MariaDB](https://github.com/home-assistant/addons/tree/master/mariadb) addon. +- [Kresus](./kresus): sets-up a [Kresus](https://kresus.org/) instance which is a personal finances management software. + +These addons are published under [MIT license](./LICENSE). diff --git a/hassio-addons/backup-s3/CHANGELOG.md b/hassio-addons/backup-s3/CHANGELOG.md new file mode 100644 index 0000000..5945142 --- /dev/null +++ b/hassio-addons/backup-s3/CHANGELOG.md @@ -0,0 +1,11 @@ +## 3.1.0 + +- Prevent service restart +- Rename configuration keys + +## 3.0.0 + +- Update run script to bashio +- Add proper translations for configuration items +- Sign addon with Codenotary +- Enable Apparmor in complain mode diff --git a/hassio-addons/backup-s3/Dockerfile b/hassio-addons/backup-s3/Dockerfile new file mode 100644 index 0000000..edce5fd --- /dev/null +++ b/hassio-addons/backup-s3/Dockerfile @@ -0,0 +1,12 @@ +ARG BUILD_FROM +FROM $BUILD_FROM + +ENV LANG C.UTF-8 + +# add aws-cli and deps +RUN apk add --no-cache py3-pip && \ + pip3 install --no-cache-dir awscli awscli-plugin-endpoint + +# Copy root filesystem +COPY rootfs / +WORKDIR / diff --git a/hassio-addons/backup-s3/README.md b/hassio-addons/backup-s3/README.md new file mode 100644 index 0000000..a19df22 --- /dev/null +++ b/hassio-addons/backup-s3/README.md @@ -0,0 +1,66 @@ +# Home Assistant Add-on: S3 Backup + +Add-on for uploading hass.io snapshots to AWS S3. + +## Installation + +Under the Add-on Store tab in the Hass.io Supervisor view in HA add this repo as an add-on repository: `https://github.com/ezlo-picori/hassio-addons`. + +Install, then set the config variables that you obtained from setting up the S3 storage: + +```yaml +awskey: `access key id` +awssecret: `secret access key` +awsendpoint: `URL to S3 endpoint` +bucketname: `AWS S3 bucket name` +``` + +## Usage + +To sync your HASSIO backup folder with AWS just click START in this add-on. It will keep a synced cloud-copy, so any purged backup files will not be kept in your bucket either. + +You could automate this using Automation: + +``` +# backups +- alias: Make snapshot + trigger: + platform: time + at: '3:00:00' + condition: + condition: time + weekday: + - mon + action: + service: hassio.snapshot_full + data_template: + name: Automated Backup {{ now().strftime('%Y-%m-%d') }} + +- alias: Upload to S3 + trigger: + platform: time + at: '4:00:00' + condition: + condition: time + weekday: + - mon + action: + service: hassio.addon_start + data: + addon: b2ddf90b_backup_s3 +``` + +The automation above first makes a snapshot at 3am, and then at 3.30am uploads to S3. + +## Help and Debug + +Please post an issue on this repo with your full log. + +## Credits + +This addon was subject to many forks since its original development. +Original project was developed by [rrostt]/[hassio-backup-s3](https://github.com/rrostt/hassio-backup-s3). It has been forked by [jperquin] and then by [mikebell] whose fork served as a basis for the current addon version. + +[jperquin]: https://github.com/jperquin +[mikebell]: https://github.com/mikebell +[rrostt]: https://github.com/rrostt diff --git a/hassio-addons/backup-s3/apparmor.txt b/hassio-addons/backup-s3/apparmor.txt new file mode 100644 index 0000000..8915d2c --- /dev/null +++ b/hassio-addons/backup-s3/apparmor.txt @@ -0,0 +1,30 @@ +#include + +profile example flags=(attach_disconnected,mediate_deleted,complain) { + #include + + # Capabilities + file, + signal (send) set=(kill,term,int,hup,cont), + + # S6-Overlay + /init ix, + /bin/** ix, + /usr/bin/** ix, + /run/{s6,s6-rc*,service}/** ix, + /package/** ix, + /command/** ix, + /etc/services.d/** rwix, + /etc/cont-init.d/** rwix, + /etc/cont-finish.d/** rwix, + /run/{,**} rwk, + /dev/tty rw, + + # Bashio + /usr/lib/bashio/** ix, + /tmp/** rwk, + + # Access to options.json and other files within your addon + /data/** r, + +} diff --git a/hassio-addons/backup-s3/build.yaml b/hassio-addons/backup-s3/build.yaml new file mode 100644 index 0000000..51f6ba7 --- /dev/null +++ b/hassio-addons/backup-s3/build.yaml @@ -0,0 +1,14 @@ +build_from: + aarch64: "ghcr.io/home-assistant/aarch64-base:3.16" + amd64: "ghcr.io/home-assistant/amd64-base:3.16" + armhf: "ghcr.io/home-assistant/armhf-base:3.16" + armv7: "ghcr.io/home-assistant/armv7-base:3.16" + i386: "ghcr.io/home-assistant/i386-base:3.16" +labels: + org.opencontainers.image.title: "Ezlo's add-on: S3 Backup" + org.opencontainers.image.description: "Addon for backup synchronization to S3 storage" + org.opencontainers.image.source: "https://github.com/ezlo-picori/hassio-addons" + org.opencontainers.image.licenses: "MIT License" +codenotary: + signer: ezlo@protonmail.com + base_image: notary@home-assistant.io diff --git a/hassio-addons/backup-s3/config.yaml b/hassio-addons/backup-s3/config.yaml new file mode 100644 index 0000000..a70996b --- /dev/null +++ b/hassio-addons/backup-s3/config.yaml @@ -0,0 +1,27 @@ +name: Backup S3 +version: 3.1.3 +slug: backup_s3 +codenotary: ezlo@protonmail.com +description: Synchronize your Home-Assistant backups to S3 bucket +url: "https://github.com/ezlo-picori/hassio-addons/tree/main/backup-s3" +arch: + - armhf + - armv7 + - aarch64 + - amd64 + - i386 +image: "ghcr.io/ezlo-picori/haos-addon-backup_s3-{arch}" +init: false +startup: once +options: + s3keyid: "" + s3secret: "" + s3endpoint: "" + bucketname: "" +schema: + s3keyid: str + s3secret: password + s3endpoint: str + bucketname: str +map: + - backup:ro diff --git a/hassio-addons/backup-s3/icon.png b/hassio-addons/backup-s3/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..316b3ecc574d33fd6e9e6f88c0ee81df0e9272b3 GIT binary patch literal 4978 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 literal 0 HcmV?d00001 diff --git a/hassio-addons/backup-s3/rootfs/etc/services.d/backup/finish b/hassio-addons/backup-s3/rootfs/etc/services.d/backup/finish new file mode 100755 index 0000000..ebdcd39 --- /dev/null +++ b/hassio-addons/backup-s3/rootfs/etc/services.d/backup/finish @@ -0,0 +1,13 @@ +#!/usr/bin/env bashio + +declare APP_EXIT_CODE=${1} + +echo "${APP_EXIT_CODE}" > /run/s6-linux-init-container-results/exitcode + +if [[ "${APP_EXIT_CODE}" -eq 0 ]] +then + bashio::log.info "Service ran successfully. Stopping the add-on." +else + bashio::log.warning "Error raised by backup service (error code: ${APP_EXIT_CODE}). Stopping the add-on." +fi +exec /run/s6/basedir/bin/halt diff --git a/hassio-addons/backup-s3/rootfs/etc/services.d/backup/run b/hassio-addons/backup-s3/rootfs/etc/services.d/backup/run new file mode 100755 index 0000000..a6c0238 --- /dev/null +++ b/hassio-addons/backup-s3/rootfs/etc/services.d/backup/run @@ -0,0 +1,23 @@ +#!/usr/bin/with-contenv bashio + +bashio::log.info "Setting AWS CLI options." + +BUCKET="$(bashio::config 'bucketname')" +ENDPOINT="$(bashio::config 's3endpoint')" +KEY="$(bashio::config 's3keyid')" +SECRET="$(bashio::config 's3secret')" + +aws configure set aws_access_key_id "${KEY}" +aws configure set aws_secret_access_key "${SECRET}" +aws configure set plugins.endpoint awscli_plugin_endpoint + +bashio::log.info "Starting backup synchronisation to S3 bucket ${BUCKET} on endpoint ${ENDPOINT}." + +if aws s3 sync /backup "s3://${BUCKET}/" --no-progress --delete --endpoint-url "${ENDPOINT}" +then + bashio::log.info "Synchronization succeeded." + exit 0 +else + bashio::log.warning "Synchronization failed." + exit 1 +fi diff --git a/hassio-addons/backup-s3/translations/en.yaml b/hassio-addons/backup-s3/translations/en.yaml new file mode 100644 index 0000000..ed0e869 --- /dev/null +++ b/hassio-addons/backup-s3/translations/en.yaml @@ -0,0 +1,17 @@ +configuration: + awskey: + s3keyid: "S3 Key" + description: >- + Access Key ID for your S3 storage backend. + s3secret: + name: "S3 Secret" + description: >- + Secret Access Key for your S3 storage backend. + s3endpoint: + name: "S3 Endpoint" + description: >- + Endpoint URL end the S3 backend. + bucketname: + name: "S3 Bucket" + description: >- + Name of the bucket used for backup synchronization. diff --git a/hassio-addons/kresus/CHANGELOG.md b/hassio-addons/kresus/CHANGELOG.md new file mode 100644 index 0000000..1e4983e --- /dev/null +++ b/hassio-addons/kresus/CHANGELOG.md @@ -0,0 +1,37 @@ +## 0.6.2 + +- Update woob dependencies install method + +## 0.6.1 + +- Remove support for i386 architecture + +## 0.6.0 + +- Bump Kresus to 0.19.0 + +## 0.5.1 + +- Fix AppArmor profile + +## 0.5.0 + +- Attempt using `alpine:edge` as base image + +## 0.4.2 + +- Fix AppArmor profile + +## 0.4.1 + +- Reinstall py3-lxml by default + +## 0.4.0 + +- Remove python dependencies from Dockerfile to prevent + incompatibility with woob requirements + +## 0.3.0 + +- Use `s6-setuidgid` instead of `su-exec` +- Set AppArmor in complain mode diff --git a/hassio-addons/kresus/DOCS.md b/hassio-addons/kresus/DOCS.md new file mode 100644 index 0000000..a6484b0 --- /dev/null +++ b/hassio-addons/kresus/DOCS.md @@ -0,0 +1,54 @@ +# Home Assistant Custom Add-on: Kresus + +[Kresus](https://kresus.org/) is an open-source self-hostable Personal Finance Manager. +It automatically retrieves your daily bank transactions, lets you categorize them and manage your monthly budgets. + +It relies on [woob](https://gitlab.com/woob/woob) to fetch data from your bank website. + +## Installation + +Kresus requires a PostgreSQL database to store data. +If you do not already have a PostgreSQL database installed, you may consider the [PostgreSQL addon](https://github.com/ezlo-picori/hassio-addons/tree/main/postgres). + +The installation of Kresus add-on is quite straightforward and do not differ from the standard installation process for Home-Assistant add-ons: + +1. Click the Home Assistant My button below to open the add-on on your Home + Assistant instance. + + [![Open this add-on in your Home Assistant instance.][addon-badge]][addon] + +1. Click the "Install" button to install the add-on. +1. Start the "Kresus" add-on. +1. Check the logs of the "Kresus" add-on to see if everything + went well. A working installation should indicate `Server is ready, let's start the show!` +1. Click the "OPEN WEB UI" button to open Kresus UI. + +## Configuration + +The only configuration configurations required are the database connection options. +If you used the [PostgreSQL add-on](https://github.com/ezlo-picori/hassio-addons/tree/main/postgres) configured with following options: + +```yaml +databases: + - kresus_db +logins: + - password: CHANGEME_kr3sus-p@ssword_CHANGEME + username: kresus_user +rights: + - database: kresus_db + username: kresus_user +``` + +then you may configure kresus with these options: + +```yaml +postgres_hostname: homeassistant.local +postgres_port: 5432 +postgres_user: kresus_user +postgres_password: CHANGEME_kr3sus-p@ssword_CHANGEME +postgres_database: kresus_db +``` + +## Authors & contributors + +The original setup of this repository is by [Ezlo Picori](https://github.com/ezlo-picori). diff --git a/hassio-addons/kresus/Dockerfile b/hassio-addons/kresus/Dockerfile new file mode 100644 index 0000000..733a82b --- /dev/null +++ b/hassio-addons/kresus/Dockerfile @@ -0,0 +1,107 @@ +ARG BUILD_FROM +FROM $BUILD_FROM + +# Default ENV +ENV \ + LANG="C.UTF-8" \ + S6_BEHAVIOUR_IF_STAGE2_FAILS=2 \ + S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \ + S6_CMD_WAIT_FOR_SERVICES=1 \ + S6_SERVICES_READYTIME=50 + +# Set shell +SHELL ["/bin/ash", "-o", "pipefail", "-c"] + +# Build Args +ARG \ + BASHIO_VERSION \ + TEMPIO_VERSION \ + S6_OVERLAY_VERSION \ + JEMALLOC_VERSION \ + QEMU_CPU + +# Base system +WORKDIR /usr/src +ARG BUILD_ARCH + +RUN \ + set -x \ + && apk add --no-cache \ + bash \ + bind-tools \ + ca-certificates \ + curl \ + jq \ + tzdata \ + xz \ + \ + && apk add --no-cache --virtual .build-deps \ + build-base \ + autoconf \ + git \ + \ + && if [ "${BUILD_ARCH}" = "armv7" ]; then \ + export S6_ARCH="arm"; \ + elif [ "${BUILD_ARCH}" = "i386" ]; then \ + export S6_ARCH="i686"; \ + elif [ "${BUILD_ARCH}" = "amd64" ]; then \ + export S6_ARCH="x86_64"; \ + else \ + export S6_ARCH="${BUILD_ARCH}"; \ + fi \ + \ + && curl -L -f -s "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz" \ + | tar Jxvf - -C / \ + && curl -L -f -s "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz" \ + | tar Jxvf - -C / \ + && curl -L -f -s "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-arch.tar.xz" \ + | tar Jxvf - -C / \ + && curl -L -f -s "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-noarch.tar.xz" \ + | tar Jxvf - -C / \ + && mkdir -p /etc/fix-attrs.d \ + && mkdir -p /etc/services.d \ + \ + && git clone "https://github.com/jemalloc/jemalloc" /usr/src/jemalloc \ + && cd /usr/src/jemalloc \ + && git checkout ${JEMALLOC_VERSION} \ + && ./autogen.sh \ + && make -j "$(nproc)" \ + && make install \ + \ + && mkdir -p /usr/src/bashio \ + && curl -L -f -s "https://github.com/hassio-addons/bashio/archive/v${BASHIO_VERSION}.tar.gz" \ + | tar -xzf - --strip 1 -C /usr/src/bashio \ + && mv /usr/src/bashio/lib /usr/lib/bashio \ + && ln -s /usr/lib/bashio/bashio /usr/bin/bashio \ + \ + && curl -L -f -s -o /usr/bin/tempio \ + "https://github.com/home-assistant/tempio/releases/download/${TEMPIO_VERSION}/tempio_${BUILD_ARCH}" \ + && chmod a+x /usr/bin/tempio \ + \ + && apk del .build-deps \ + && rm -rf /usr/src/* + +# S6-Overlay +WORKDIR / +ENTRYPOINT ["/init"] + +# Copy root filesystem +COPY rootfs / + +# Setup base +RUN apk add --no-cache \ + gcc g++ gpgv jpeg-dev pwgen python3-dev py3-lxml py3-pip \ + py3-wheel make nodejs npm zlib-dev && \ + npm install --omit=dev -g kresus@0.19.0 && \ + addgroup kresus && \ + adduser -G kresus -D -H kresus && \ + mkdir -p /woob && \ + chown kresus:kresus /woob && \ + chown -R kresus:kresus /etc/kresus && \ + chmod 0400 /etc/kresus/config.ini && \ + chmod 0755 /etc/kresus + +ENV KRESUS_DIR="/data/kresus" +ENV KRESUS_USER="kresus" + +WORKDIR / diff --git a/hassio-addons/kresus/README.md b/hassio-addons/kresus/README.md new file mode 100644 index 0000000..d20aef7 --- /dev/null +++ b/hassio-addons/kresus/README.md @@ -0,0 +1,25 @@ +# Home Assistant Add-on: Kresus + +Open source personal accounting solution. + +![Supports aarch64 Architecture][aarch64-shield] +![Supports amd64 Architecture][amd64-shield] +![Supports armhf Architecture][armhf-shield] +![Supports armv7 Architecture][armv7-shield] +![Supports i386 Architecture][i386-shield] + +## About + +[Kresus][kresus] is a free solution for personal accounting management. +It automatically retrieves your daily bank transactions, lets you categorize them +and manage your monthly budgets. + +![Kresus Preview][screenshot] + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg +[i386-shield]: https://img.shields.io/badge/i386-no-red.svg +[screenshot]: https://kresus.org/images/pages/view-all-accounts.png +[kresus]: https://kresus.org/ diff --git a/hassio-addons/kresus/apparmor.txt b/hassio-addons/kresus/apparmor.txt new file mode 100644 index 0000000..44f634b --- /dev/null +++ b/hassio-addons/kresus/apparmor.txt @@ -0,0 +1,72 @@ +include + +profile kresus flags=(attach_disconnected,mediate_deleted) { + #include + + # Capabilities + file, + signal (send) set=(kill,term,int,hup,cont), + capability chown, + capability fowner, + capability kill, + + # S6-Overlay + /init ix, + /bin/** ix, + /usr/bin/** ix, + /run/{s6,s6-rc*,service}/** ix, + /package/** ix, + /command/** ix, + /etc/services.d/** rwix, + /etc/cont-init.d/** rwix, + /etc/cont-finish.d/** rwix, + /run/{,**} rwk, + /dev/tty rw, + + # Access to options.json and other files within your addon + /data/options.json r, + /data/kresus/{,**} rw, + + /package/admin/s6-2.11.2.0/command/s6-applyuidgid cx -> s6setuidgid, + profile s6setuidgid flags=(attach_disconnected,mediate_deleted) { + #include + capability setuid, + capability setgid, + + signal (receive) set=("cont","kill","term"), + + # Generic accesses + /package/admin/s6-2.11.2.0/command/s6-applyuidgid rm, + + /bin/{bash,busybox} ix, + /dev/{null,tty} rw, + /etc/{group,hosts,os-release,passwd,resolv.conf,ssl/**} r, + /package/admin/** rmix, + /run/s6/container_environment** r, + /tmp/.bashio/{,**} rw, + /usr/bin/{curl,jq,ssl_client} rix, + /usr/lib/bashio/bashio ix, + /lib/** rmix, + /tmp/pip-install-** rw, + + # Kresus specific accesses + /data/kresus_salt r, + /data/kresus/{,**} rw, + /etc/kresus/config.ini r, + /woob/ r, + /woob/** lrw, + /woob/.py-deps/** lrwix, + + /usr/bin/{,**} r, + /usr/bin/git ix, + /usr/bin/gpgv ix, + /usr/bin/node ix, + /usr/bin/python3.11 ix, + /usr/bin/pip3 rix, + /usr/libexec/git-core/** ix, + /usr/libexec/kresus/** rix, + /usr/local/lib/node_modules/** rm, + /usr/local/lib/node_modules/kresus/bin/kresus.js rix, + /usr/share/** r, + } +} diff --git a/hassio-addons/kresus/build.yaml b/hassio-addons/kresus/build.yaml new file mode 100644 index 0000000..a953b79 --- /dev/null +++ b/hassio-addons/kresus/build.yaml @@ -0,0 +1,18 @@ +build_from: + aarch64: "arm64v8/alpine:edge" + armv7: "arm32v7/alpine:edge" + armhf: "arm32v6/alpine:edge" + amd64: "alpine:edge" +labels: + org.opencontainers.image.title: "Home Assistant Add-on: Kresus" + org.opencontainers.image.description: "Kresus addon" + org.opencontainers.image.source: "https://github.com/ezlo-picori/hassio-addons" + org.opencontainers.image.licenses: "MIT License" + io.hass.base.name: alpine +codenotary: + signer: ezlo@protonmail.com +args: + BASHIO_VERSION: 0.14.3 + TEMPIO_VERSION: 2021.09.0 + S6_OVERLAY_VERSION: 3.1.3.0 + JEMALLOC_VERSION: 5.3.0 diff --git a/hassio-addons/kresus/config.yaml b/hassio-addons/kresus/config.yaml new file mode 100644 index 0000000..0a9d78a --- /dev/null +++ b/hassio-addons/kresus/config.yaml @@ -0,0 +1,33 @@ +name: Kresus +version: "0.6.2" +slug: kresus +codenotary: ezlo@protonmail.com +url: "https://github.com/ezlo-picori/hassio-addons/tree/main/kresus" +description: Open source personal accounting management +arch: + - armhf + - armv7 + - aarch64 + - amd64 +image: "ghcr.io/ezlo-picori/haos-addon-kresus-{arch}" +init: false +options: + postgres_hostname: homeassistant.local + postgres_port: 5432 + postgres_user: kresus + postgres_password: null + postgres_database: kresus +panel_icon: mdi:piggy-bank-outline +ports: + 9876/tcp: 9876 +ports_description: + 9876/tcp: "The port to access kresus web server." +schema: + postgres_hostname: str + postgres_port: int + postgres_user: str + postgres_password: password + postgres_database: str + http_basicauth: str? +startup: system +timeout: 20 diff --git a/hassio-addons/kresus/icon.png b/hassio-addons/kresus/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..df04d0d3b35c63dc0c90ef2847620ee96ece908a GIT binary patch literal 8772 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:" +; Overriden by the KRESUS_AUTH environment variable, if it's set. +; Example: +; auth=foo:bar +auth= + +[woob] + +; The directory in which Woob core is stored. If empty, indicates +; that woob is already in the PYTHON_PATH (e.g. installed at the global +; level) +; Overriden by the KRESUS_WOOB_DIR environment variable, if it's set. +; Example: +; srcdir=/home/ben/code/woob +srcdir= + +; Path to a file containing a valid Woob's source list directory. +; If empty (the default), indicates that Kresus will generate its own +; source list file and will store it in +; KRESUS_DIR/woob-data/sources.list. +; Overriden by the KRESUS_WOOB_SOURCES_LIST environment variable, if it's set. +; Example: +; sources_list=/home/ben/code/woob/sources.list +sources_list= + +[email] + +; The transport method you want to use. Can be either: +; * "sendmail": relies on sendmail executable to be available on your +; system and only sendmail-specific parameters are used, +; +; * "smtp": you should provide proper SMTP credentials to use, in the +; dedicated configuration entries. +; +; If empty, no emails will be sent by Kresus. +; Overriden by the KRESUS_EMAIL_TRANSPORT environment variable, if it's set. +; Example: +; transport=smtp +transport= + +; The path to the sendmail executable to use. If empty, indicates +; that the default sendmail executable will be used. +; Overriden by the KRESUS_EMAIL_SENDMAIL_BIN environment variable, if it's set. +; Example: +; sendmail_bin=/usr/bin/sendmail +sendmail_bin= + +; The email address from which email alerts will be sent. Make sure +; that your domain DNS is correctly configured and that you've done +; what's needed to prevent email alerts from landing in the spam folder. +; Overriden by the KRESUS_EMAIL_FROM environment variable, if it's set. +; Example: +; from=kresus@domain.tld +from= + +; The network address (ipv4, ipv6 or FQDN) of the SMTP server. +; Overriden by the KRESUS_EMAIL_HOST environment variable, if it's set. +; Example: +; host=mail.domain.tld +host= + +; The port to which the SMTP server listens. Default values tend to +; be: 25 (server to server), or 587 (clients to server), or 465 +; (nonstandard). +; Overriden by the KRESUS_EMAIL_PORT environment variable, if it's set. +; Example: +; port=465 +port= + +; The username used during authentication to the SMTP server. If +; empty, indicates an anonymous connection will be used. +; Overriden by the KRESUS_EMAIL_USER environment variable, if it's set. +; Example: +; user=login +user= + +; The password used during authentication to the SMTP server. If +; empty, indicates no password will be used. +; Overriden by the KRESUS_EMAIL_PASSWORD environment variable, if it's set. +; Example: +; password=hunter2 +password= + +; If set to true, will force using a TLS connection. By default, +; emails are sent with STARTTLS, i.e. using TLS if available. +; Can be removed; defaults to false. +; Overriden by the KRESUS_EMAIL_FORCE_TLS environment variable, if it's set. +; Example: +; force_tls=false +force_tls= + +; If set to false, will allow self-signed TLS certificates. +; Can be removed; defaults to true. +; Overriden by the KRESUS_EMAIL_REJECT_UNAUTHORIZED_TLS environment variable, if it's set. +; Example: +; reject_unauthorized_tls=true +reject_unauthorized_tls= + +[notifications] + +; The baseurl from which apprise-api will be called for +; notifications to be sent. +; See https://github.com/caronc/apprise-api#installation for +; installation +; Overriden by the KRESUS_APPRISE_API_BASE_URL environment variable, if it's set. +; Example: +; appriseApiBaseUrl=http://localhost:8000/ +appriseApiBaseUrl= + +[logs] + +; The path to the log file to use. If empty, defaults to kresus.log +; in datadir. +; Overriden by the KRESUS_LOG_FILE environment variable, if it's set. +; Example: +; log_file=/var/log/kresus.log +log_file= + +[db] + +; Database type supported by Kresus, to choose among: +; - postgres +; - sqlite +; +; It must be set by the user. PostgreSQL is recommended and strongly supported; your experience with other databases might vary. +; +; Note using sqlite is *strongly discouraged* because it can't properly handle certain kinds of database migrations. It is only intended for development purposes. +; Overriden by the KRESUS_DB_TYPE environment variable, if it's set. +; Example: +; type=sqlite +type= + +; Logging level for the SQL queries. Possible values are: +; +; - all: will log every SQL query, including queries causing errors. +; - error (default value): will only log SQL queries resulting in errors. This is useful for debugging purposes. +; - none: nothing will be logged. +; Can be removed; defaults to error. +; Overriden by the KRESUS_DB_LOG environment variable, if it's set. +; Example: +; log=error +log= + +; Path to the sqlite database file. Make sure that the user running +; Kresus has the right permissions to write into this file. Required only for +; sqlite. +; Overriden by the KRESUS_DB_SQLITE_PATH environment variable, if it's set. +; Example: +; sqlite_path=/tmp/dev.sqlite +sqlite_path= + +; Path to a directory containing a Unix socket to connect to the +; database, or host address of the database server. Required for postgres. +; +; If using a Unix socket, the socket file's name will be inferred from the +; standard postgres name and the port number. +; Can be removed; defaults to localhost for postgres. +; Overriden by the KRESUS_DB_HOST environment variable, if it's set. +; Example: +; host=localhost +host= + +; Port of the database server. Required for postgres, even when +; using a Unix socket (the port is used to compute the socket's file name). +; Can be removed; defaults to 5432 for postgres. +; Overriden by the KRESUS_DB_PORT environment variable, if it's set. +; Example: +; port=5432 +port= + +; Username to connect to the database server. Required for postgres. +; Overriden by the KRESUS_DB_USERNAME environment variable, if it's set. +; Example: +; username=benjamin +username= + +; Password to connect to the database server. Required for postgres. +; Overriden by the KRESUS_DB_PASSWORD environment variable, if it's set. +; Example: +; password=hunter2 +password= + +; Database name to use. Required for postgres. +; Can be removed; defaults to kresus. +; Overriden by the KRESUS_DB_NAME environment variable, if it's set. +; Example: +; name=kresus +name= diff --git a/hassio-addons/kresus/rootfs/etc/services.d/kresus/finish b/hassio-addons/kresus/rootfs/etc/services.d/kresus/finish new file mode 100755 index 0000000..230d179 --- /dev/null +++ b/hassio-addons/kresus/rootfs/etc/services.d/kresus/finish @@ -0,0 +1,15 @@ +#!/usr/bin/env bashio +# ============================================================================== +# Take down the S6 supervision tree when example fails +# s6-overlay docs: https://github.com/just-containers/s6-overlay +# ============================================================================== + +declare APP_EXIT_CODE=${1} + +if [[ "${APP_EXIT_CODE}" -ne 0 ]] && [[ "${APP_EXIT_CODE}" -ne 256 ]]; then + bashio::log.warning "Halt add-on with exit code ${APP_EXIT_CODE}" + echo "${APP_EXIT_CODE}" > /run/s6-linux-init-container-results/exitcode + exec /run/s6/basedir/bin/halt +fi + +bashio::log.info "Service restart after closing" diff --git a/hassio-addons/kresus/rootfs/etc/services.d/kresus/run b/hassio-addons/kresus/rootfs/etc/services.d/kresus/run new file mode 100755 index 0000000..d8bcbce --- /dev/null +++ b/hassio-addons/kresus/rootfs/etc/services.d/kresus/run @@ -0,0 +1,25 @@ +#!/usr/bin/with-contenv bashio + +# ============================================================================== +# Init data directory +# ============================================================================== +if ! bashio::fs.directory_exists "${KRESUS_DIR}"; then + bashio::log.info "Create data directory \"${KRESUS_DIR}\"" + mkdir "${KRESUS_DIR}" + chown "${KRESUS_USER}:${KRESUS_USER}" "${KRESUS_DIR}" + chmod 0700 "${KRESUS_DIR}" +fi + +# ============================================================================== +# Generate Kresus salt once +# ============================================================================== +if ! bashio::fs.file_exists "/data/kresus_salt"; then + pwgen 32 1 > /data/kresus_salt + chown "${KRESUS_USER}:${KRESUS_USER}" /data/kresus_salt + chmod 400 /data/kresus_salt +fi + +# ============================================================================== +# Start service as unprivileged user +# ============================================================================== +exec s6-setuidgid "${KRESUS_USER}" /usr/libexec/kresus/start.sh diff --git a/hassio-addons/kresus/rootfs/usr/libexec/kresus/start.sh b/hassio-addons/kresus/rootfs/usr/libexec/kresus/start.sh new file mode 100755 index 0000000..a03d20d --- /dev/null +++ b/hassio-addons/kresus/rootfs/usr/libexec/kresus/start.sh @@ -0,0 +1,55 @@ +#!/usr/bin/with-contenv bashio +WOOB_DIR="/woob" +KRESUS_INI_FILE="/etc/kresus/config.ini" + +# ============================================================================== +# Pull latest Woob version +# ============================================================================== +cd "${WOOB_DIR}" || bashio::exit.nok + +bashio::log.info "Clear woob install" +rm -rf {,.[!.],..?}* + +bashio::log.info "Add clean woob install" +wget -qO- https://gitlab.com/woob/woob/-/archive/master/woob-master.tar.gz | tar xz --strip-components=1 + +bashio::log.info "Updating Woob dependencies..." +pip3 install --no-cache-dir --prefix .py-deps . +PYTHONPATH=$(python3 -c "import sys, os; print(os.sep.join(['$(pwd)', '.py-deps', 'lib', f'python{sys.version_info.major}.{sys.version_info.minor}', 'site-packages']))") +export PYTHONPATH +bashio::log.info "Done updating Woob dependencies." + +# ============================================================================== +# Set-up environment variables +# ============================================================================== + +# Basic Kresus options +export PORT=9876 +export HOST=0.0.0.0 +export KRESUS_PYTHON_EXEC=python3 +export KRESUS_WOOB_DIR="${WOOB_DIR}" + +KRESUS_SALT="$(cat /data/kresus_salt)" +export KRESUS_SALT + +# Kresus Basic auth +if bashio::config.has_value 'http_basicauth'; then + KRESUS_AUTH="$(bashio::config 'http_basicauth')" + export KRESUS_AUTH +fi + +# Kresus database +export KRESUS_DB_TYPE="postgres" + +KRESUS_DB_HOST="$(bashio::config 'postgres_hostname')" +KRESUS_DB_PORT="$(bashio::config 'postgres_port')" +KRESUS_DB_USERNAME="$(bashio::config 'postgres_user')" +KRESUS_DB_PASSWORD="$(bashio::config 'postgres_password')" +KRESUS_DB_NAME="$(bashio::config 'postgres_database')" +export KRESUS_DB_HOST KRESUS_DB_PORT KRESUS_DB_USERNAME \ + KRESUS_DB_PASSWORD KRESUS_DB_NAME + +# ============================================================================== +# Start Kresus +# ============================================================================== +kresus -c ${KRESUS_INI_FILE} diff --git a/hassio-addons/kresus/translations/en.yaml b/hassio-addons/kresus/translations/en.yaml new file mode 100644 index 0000000..a9aa6a8 --- /dev/null +++ b/hassio-addons/kresus/translations/en.yaml @@ -0,0 +1,27 @@ +configuration: + postgres_hostname: + name: "DB hostname" + description: >- + Hostname of the PostgreSQL database. + postgres_port: + name: "DB port" + description: >- + Port of the PostgreSQL database. + postgres_user: + name: "DB user" + description: >- + User to connect to the database. + postgres_password: + name: "DB password" + description: >- + Password of the database user. + postgres_database: + name: "DB database" + description: >- + Name of the kresus database. + http_basicauth: + name: "Authentication" + description: >- + Logins for HTTP basic auth authentication ("login:passwd" format, optional). +network: + 9876/tcp: Port to access kresus web server. diff --git a/hassio-addons/postgres/CHANGELOG.md b/hassio-addons/postgres/CHANGELOG.md new file mode 100644 index 0000000..e8a6217 --- /dev/null +++ b/hassio-addons/postgres/CHANGELOG.md @@ -0,0 +1,13 @@ +## 0.5.1 + +- Fix detection of existing users + +## 0.5.0 + +- Enforce apparmor +- Do not stop on pg_checksums failure +- Simplify script by setting PGDATA environment variable + +## 0.4.0 + +- Initial test without su-exec diff --git a/hassio-addons/postgres/DOCS.md b/hassio-addons/postgres/DOCS.md new file mode 100644 index 0000000..4fd9a7c --- /dev/null +++ b/hassio-addons/postgres/DOCS.md @@ -0,0 +1,76 @@ +# Home Assistant Add-on: PostgreSQL + +[PostgreSQL](https://www.postgresql.org/) is an open-source relational SQL database. +It can be used as a backend for [Kresus](https://github.com/ezlo-picori/hassio-addons/tree/main/kresus), Nextcloud or even as your Home-Assistant recorder. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Home Assistant add-on. + +1. Click the Home Assistant My button below to open the add-on on your Home + Assistant instance. + + [![Open this add-on in your Home Assistant instance.][addon-badge]][addon] + +1. Click the "Install" button to install the add-on. +1. Change the configuration (see next section) +1. Start the "PostgreSQL" add-on. +1. Check the logs of the add-on to see if everything went well. +1. Enjoy the add-on! + +## Configuration + +The configuration of the PostgreSQL add-on matches that of the official [MariaDB add-on](https://github.com/home-assistant/addons/tree/master/mariadb). + +Example add-on configuration: + +```yaml +databases: + - homeassistant +logins: + - username: homeassistant + password: PASSWORD + - username: read_only_user + password: PASSWORD +rights: + - username: homeassistant + database: homeassistant + - username: read_only_user + database: homeassistant + privileges: + - SELECT +``` + +### Option: `databases` (required) + +Database name, e.g., `homeassistant`. Multiple are allowed. + +### Option: `logins` (required) + +This section defines a create user definition in PostgreSQL. + +### Option: `logins.username` (required) + +Database user login, e.g., `homeassistant`. + +### Option: `logins.password` (required) + +Password for user login. This should be strong and unique. + +### Option: `rights` (required) + +This section grant privileges to users in MariaDB. + +### Option: `rights.username` (required) + +This should be the same user name defined in `logins` -> `username`. + +### Option: `rights.database` (required) + +This should be the same database defined in `databases`. + +### Option: `rights.privileges` (optional) + +A list of privileges to grant to this user from grant like `SELECT` and `CREATE`. +If omitted, grants `ALL PRIVILEGES` to the user. diff --git a/hassio-addons/postgres/Dockerfile b/hassio-addons/postgres/Dockerfile new file mode 100644 index 0000000..de90840 --- /dev/null +++ b/hassio-addons/postgres/Dockerfile @@ -0,0 +1,16 @@ +# https://developers.home-assistant.io/docs/add-ons/configuration#add-on-dockerfile +ARG BUILD_FROM +FROM $BUILD_FROM + +# Setup base +RUN apk add --no-cache \ + postgresql14 && \ + mkdir /run/postgresql && \ + chown postgres:postgres /run/postgresql + +# Copy root filesystem +COPY rootfs / + +ENV PGDATA=/data/databases + +WORKDIR / diff --git a/hassio-addons/postgres/README.md b/hassio-addons/postgres/README.md new file mode 100644 index 0000000..daafc7c --- /dev/null +++ b/hassio-addons/postgres/README.md @@ -0,0 +1,19 @@ +# Home Assistant Add-on: PostgreSQL + +PostgreSQL database in Home-Assistant. + +![Supports aarch64 Architecture][aarch64-shield] +![Supports amd64 Architecture][amd64-shield] +![Supports armhf Architecture][armhf-shield] +![Supports armv7 Architecture][armv7-shield] +![Supports i386 Architecture][i386-shield] + +## About + +You can use this add-on to install the PostgreSQL database and easily define databases, users and their permissions. + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg +[i386-shield]: https://img.shields.io/badge/i386-yes-green.svg diff --git a/hassio-addons/postgres/apparmor.txt b/hassio-addons/postgres/apparmor.txt new file mode 100644 index 0000000..8ea49e7 --- /dev/null +++ b/hassio-addons/postgres/apparmor.txt @@ -0,0 +1,51 @@ +include + +profile b2ddf90b_postgres flags=(attach_disconnected,mediate_deleted) { + #include + + # Capabilities + file, + signal (send) set=(kill,term,int,hup,cont), + capability chown, + capability kill, + + # S6-Overlay + /init ix, + /bin/** ix, + /usr/bin/** ix, + /run/{s6,s6-rc*,service}/** ix, + /package/** ix, + /command/** ix, + /etc/services.d/** rwix, + /etc/cont-init.d/** rwix, + /etc/cont-finish.d/** rwix, + /run/{,**} rwk, + /dev/tty rw, + + # Access to options.json and other files within your addon + /data/options.json r, + + /package/admin/s6-2.11.1.2/command/s6-applyuidgid cx -> s6setuidgid, + profile s6setuidgid flags=(attach_disconnected,mediate_deleted) { + #include + capability setuid, + capability setgid, + + signal (receive) set=("cont","kill","term"), + + /bin/{bash,busybox} ix, + /data/databases/{,**} lrw, + /dev/{null,tty} rw, + /dev/shm/PostgreSQL.* rw, + /etc/{hosts,passwd,resolv.conf,ssl/*} r, + /package/admin/** rmix, + /run/postgresql/* rw, + /run/s6/container_environment** r, + /tmp/.bashio/{,**} rw, + /usr/bin/{curl,jq} rix, + /usr/libexec/postgres{ql14,}/** rix, + /usr/lib/** rm, + /usr/lib/bashio/bashio ix, + /usr/share/{icu,postgresql14,zoneinfo}/** r, + } +} diff --git a/hassio-addons/postgres/build.yaml b/hassio-addons/postgres/build.yaml new file mode 100644 index 0000000..40a28be --- /dev/null +++ b/hassio-addons/postgres/build.yaml @@ -0,0 +1,14 @@ +build_from: + aarch64: "ghcr.io/home-assistant/aarch64-base:3.16" + amd64: "ghcr.io/home-assistant/amd64-base:3.16" + armhf: "ghcr.io/home-assistant/armhf-base:3.16" + armv7: "ghcr.io/home-assistant/armv7-base:3.16" + i386: "ghcr.io/home-assistant/i386-base:3.16" +labels: + org.opencontainers.image.title: "Home Assistant Add-on: PostgreSQL" + org.opencontainers.image.description: "PostgreSQL database addon" + org.opencontainers.image.source: "https://github.com/ezlo-picori/hassio-addons" + org.opencontainers.image.licenses: "MIT License" +codenotary: + signer: ezlo@protonmail.com + base_image: notary@home-assistant.io diff --git a/hassio-addons/postgres/config.yaml b/hassio-addons/postgres/config.yaml new file mode 100644 index 0000000..f3b7f95 --- /dev/null +++ b/hassio-addons/postgres/config.yaml @@ -0,0 +1,42 @@ +name: PostgreSQL +version: 0.5.1 +slug: postgres +codenotary: ezlo@protonmail.com +url: "https://github.com/ezlo-picori/hassio-addons/tree/main/postgres" +description: PostgreSQL database +arch: + - armhf + - armv7 + - aarch64 + - amd64 + - i386 +image: "ghcr.io/ezlo-picori/haos-addon-postgres-{arch}" +init: false +options: + databases: + - homeassistant + logins: + - password: null + username: homeassistant + rights: + - database: homeassistant + username: homeassistant +ports: + 5432/tcp: 5432 +ports_description: + 5432/tcp: "The port to access the database engine." +schema: + databases: + - str + logins: + - username: str + password: password + rights: + - database: str + privileges: + - "list(ALTER|CREATE|CREATE ROUTINE|CREATE TEMPORARY TABLES|\ + CREATE VIEW|DELETE|DELETE HISTORY|DROP|EVENT|GRANT OPTION|INDEX|\ + INSERT|LOCK TABLES|SELECT|SHOW VIEW|TRIGGER|UPDATE)?" + username: str +startup: system +timeout: 20 diff --git a/hassio-addons/postgres/icon.png b/hassio-addons/postgres/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7f9cb7b10d30d02a0d91f2d6ba1331e2d9da84e0 GIT binary patch literal 10669 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 literal 0 HcmV?d00001 diff --git a/hassio-addons/postgres/logo.png b/hassio-addons/postgres/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d404139ef0c5fb5d7556200f14ee4c6865d9017a GIT binary patch literal 9903 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 literal 0 HcmV?d00001 diff --git a/hassio-addons/postgres/rootfs/etc/services.d/postgresql/finish b/hassio-addons/postgres/rootfs/etc/services.d/postgresql/finish new file mode 100755 index 0000000..230d179 --- /dev/null +++ b/hassio-addons/postgres/rootfs/etc/services.d/postgresql/finish @@ -0,0 +1,15 @@ +#!/usr/bin/env bashio +# ============================================================================== +# Take down the S6 supervision tree when example fails +# s6-overlay docs: https://github.com/just-containers/s6-overlay +# ============================================================================== + +declare APP_EXIT_CODE=${1} + +if [[ "${APP_EXIT_CODE}" -ne 0 ]] && [[ "${APP_EXIT_CODE}" -ne 256 ]]; then + bashio::log.warning "Halt add-on with exit code ${APP_EXIT_CODE}" + echo "${APP_EXIT_CODE}" > /run/s6-linux-init-container-results/exitcode + exec /run/s6/basedir/bin/halt +fi + +bashio::log.info "Service restart after closing" diff --git a/hassio-addons/postgres/rootfs/etc/services.d/postgresql/run b/hassio-addons/postgres/rootfs/etc/services.d/postgresql/run new file mode 100755 index 0000000..b73f71d --- /dev/null +++ b/hassio-addons/postgres/rootfs/etc/services.d/postgresql/run @@ -0,0 +1,15 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Start PostgreSQL service +# ============================================================================== + +if ! bashio::fs.directory_exists "${PGDATA}"; then + bashio::log.info "Create database directory \"${PGDATA}\"" + mkdir "${PGDATA}" + chown postgres:postgres "${PGDATA}" + + exec s6-setuidgid postgres /usr/libexec/postgres/initdb.sh +else + bashio::log.info "Using existing postgres initial system" + exec s6-setuidgid postgres /usr/libexec/postgres/checkdb.sh +fi diff --git a/hassio-addons/postgres/rootfs/usr/libexec/postgres/checkdb.sh b/hassio-addons/postgres/rootfs/usr/libexec/postgres/checkdb.sh new file mode 100755 index 0000000..3ee75bd --- /dev/null +++ b/hassio-addons/postgres/rootfs/usr/libexec/postgres/checkdb.sh @@ -0,0 +1,12 @@ +#!/usr/bin/with-contenv bashio +# ======================================================= +# 1 - Check database checksums in PGDATA directory +# 2 - Delegate execution to database start procedure +# ======================================================= + +# Initialize database +bashio::log.info "Checking data integrity" +pg_checksums --check || bashio::log.warning "Error raised when checking data integrity, still trying to start the database." + +# Delegate execution to start script +/usr/libexec/postgres/start.sh diff --git a/hassio-addons/postgres/rootfs/usr/libexec/postgres/config.sh b/hassio-addons/postgres/rootfs/usr/libexec/postgres/config.sh new file mode 100755 index 0000000..ed89452 --- /dev/null +++ b/hassio-addons/postgres/rootfs/usr/libexec/postgres/config.sh @@ -0,0 +1,49 @@ +#!/usr/bin/with-contenv bashio +# ======================================================= +# 1 - Create missing databases +# 2 - Initialize users +# 3 - Initialize permissions +# 4 - Delegate execution to monitoring +# ======================================================= + +# Init databases +bashio::log.info "Ensure databases exists" +for database in $(bashio::config "databases"); do + if psql "${database}" -c '' &> /dev/null; then + bashio::log.info "Database ${database} already defined" + else + bashio::log.info "Create database ${database}" + psql -c "CREATE DATABASE ${database};" 2> /dev/null || true + fi +done + +# Init logins +bashio::log.info "Ensure users exists and are updated" +for login in $(bashio::config "logins|keys"); do + USERNAME=$(bashio::config "logins[${login}].username") + PASSWORD=$(bashio::config "logins[${login}].password") + + if ! psql -U "${USERNAME}" -d "postgres" -c '' &> /dev/null; then + bashio::log.info "Create user ${USERNAME}" + psql -c "CREATE USER ${USERNAME};" + fi + bashio::log.info "Set password of user ${USERNAME}" + psql -c "ALTER USER ${USERNAME} WITH PASSWORD '${PASSWORD}';" +done + +# Init rights +bashio::log.info "Init/Update rights" +for right in $(bashio::config "rights|keys"); do + USERNAME=$(bashio::config "rights[${right}].username") + DATABASE=$(bashio::config "rights[${right}].database") + + if bashio::config.exists "rights[${right}].privileges"; then + PRIVILEGES=$(bashio::config "rights[${right}].privileges") + bashio::log.info "Granting ${PRIVILEGES} to ${USERNAME} on ${DATABASE}" + psql -c "REVOKE ALL PRIVILEGES ON DATABASE ${DATABASE} FROM ${USERNAME};" 2> /dev/null || true + psql -c "GRANT ${PRIVILEGES} ON DATABASE ${DATABASE} TO ${USERNAME};" 2> /dev/null || true + else + bashio::log.info "Granting all privileges to ${USERNAME} on ${DATABASE}" + psql -c "GRANT ALL PRIVILEGES ON DATABASE ${DATABASE} TO ${USERNAME};" 2> /dev/null || true + fi +done diff --git a/hassio-addons/postgres/rootfs/usr/libexec/postgres/initdb.sh b/hassio-addons/postgres/rootfs/usr/libexec/postgres/initdb.sh new file mode 100755 index 0000000..49a6c2f --- /dev/null +++ b/hassio-addons/postgres/rootfs/usr/libexec/postgres/initdb.sh @@ -0,0 +1,14 @@ +#!/usr/bin/with-contenv bashio +# ======================================================= +# 1 - Initialize the database in PGDATA directory +# 2 - Delegate execution to database start procedure +# ======================================================= + +# Initialize database +bashio::log.info "Create a new postgres initial system" +initdb --data-checksums > /dev/null +echo "host all all 0.0.0.0/0 scram-sha-256" >> "${PGDATA}/pg_hba.conf" +echo "listen_addresses='*'" >> "${PGDATA}/postgresql.conf" + +# Delegate execution to start script +/usr/libexec/postgres/start.sh diff --git a/hassio-addons/postgres/rootfs/usr/libexec/postgres/start.sh b/hassio-addons/postgres/rootfs/usr/libexec/postgres/start.sh new file mode 100755 index 0000000..3d384ed --- /dev/null +++ b/hassio-addons/postgres/rootfs/usr/libexec/postgres/start.sh @@ -0,0 +1,32 @@ +#!/usr/bin/with-contenv bashio +# ======================================================= +# 1 - Start the PostgreSQL database +# 2 - Trap stop signals to properly stop the database +# 3 - Delegate execution to configuration application +# ======================================================= + +# Start the database +bashio::log.info "Starting PostgreSQL..." +postgres & +POSTGRES_PID=$! + +# Wait until DB is running +while ! psql -c '' 2> /dev/null; do + sleep 1 +done +bashio::log.info "PostgreSQL database started." + +# Register stop +function stop_postgres() { + pg_ctl stop -m smart + # Successful exit, avoid wait exit status to propagate + exit 0 +} +trap "stop_postgres" SIGTERM SIGHUP + +# Apply database configuration +/usr/libexec/postgres/config.sh + +# Wait for process to end +bashio::log.info "Waiting for PostgreSQL termination..." +wait "${POSTGRES_PID}" diff --git a/hassio-addons/postgres/translations/en.yaml b/hassio-addons/postgres/translations/en.yaml new file mode 100644 index 0000000..0a999ee --- /dev/null +++ b/hassio-addons/postgres/translations/en.yaml @@ -0,0 +1,12 @@ +configuration: + databases: + name: Databases + description: Database names. + logins: + name: Logins + description: This section defines a create user definition in PostgreSQL. + rights: + name: Rights + description: This section grant privileges to users in PostgreSQL. +network: + 5432/tcp: The port to access the database engine. diff --git a/hassio-addons/repository.yaml b/hassio-addons/repository.yaml new file mode 100644 index 0000000..d7e78d8 --- /dev/null +++ b/hassio-addons/repository.yaml @@ -0,0 +1,3 @@ +name: Ezlo's custom Home Assistant addons +url: "https://github.com/ezlo-picori/hassio-addons" +maintainer: Ezlo Picori diff --git a/kresus-mrraph-test/CHANGELOG.md b/kresus-mrraph-test/CHANGELOG.md new file mode 100644 index 0000000..1e4983e --- /dev/null +++ b/kresus-mrraph-test/CHANGELOG.md @@ -0,0 +1,37 @@ +## 0.6.2 + +- Update woob dependencies install method + +## 0.6.1 + +- Remove support for i386 architecture + +## 0.6.0 + +- Bump Kresus to 0.19.0 + +## 0.5.1 + +- Fix AppArmor profile + +## 0.5.0 + +- Attempt using `alpine:edge` as base image + +## 0.4.2 + +- Fix AppArmor profile + +## 0.4.1 + +- Reinstall py3-lxml by default + +## 0.4.0 + +- Remove python dependencies from Dockerfile to prevent + incompatibility with woob requirements + +## 0.3.0 + +- Use `s6-setuidgid` instead of `su-exec` +- Set AppArmor in complain mode diff --git a/kresus-mrraph-test/DOCS.md b/kresus-mrraph-test/DOCS.md new file mode 100644 index 0000000..a6484b0 --- /dev/null +++ b/kresus-mrraph-test/DOCS.md @@ -0,0 +1,54 @@ +# Home Assistant Custom Add-on: Kresus + +[Kresus](https://kresus.org/) is an open-source self-hostable Personal Finance Manager. +It automatically retrieves your daily bank transactions, lets you categorize them and manage your monthly budgets. + +It relies on [woob](https://gitlab.com/woob/woob) to fetch data from your bank website. + +## Installation + +Kresus requires a PostgreSQL database to store data. +If you do not already have a PostgreSQL database installed, you may consider the [PostgreSQL addon](https://github.com/ezlo-picori/hassio-addons/tree/main/postgres). + +The installation of Kresus add-on is quite straightforward and do not differ from the standard installation process for Home-Assistant add-ons: + +1. Click the Home Assistant My button below to open the add-on on your Home + Assistant instance. + + [![Open this add-on in your Home Assistant instance.][addon-badge]][addon] + +1. Click the "Install" button to install the add-on. +1. Start the "Kresus" add-on. +1. Check the logs of the "Kresus" add-on to see if everything + went well. A working installation should indicate `Server is ready, let's start the show!` +1. Click the "OPEN WEB UI" button to open Kresus UI. + +## Configuration + +The only configuration configurations required are the database connection options. +If you used the [PostgreSQL add-on](https://github.com/ezlo-picori/hassio-addons/tree/main/postgres) configured with following options: + +```yaml +databases: + - kresus_db +logins: + - password: CHANGEME_kr3sus-p@ssword_CHANGEME + username: kresus_user +rights: + - database: kresus_db + username: kresus_user +``` + +then you may configure kresus with these options: + +```yaml +postgres_hostname: homeassistant.local +postgres_port: 5432 +postgres_user: kresus_user +postgres_password: CHANGEME_kr3sus-p@ssword_CHANGEME +postgres_database: kresus_db +``` + +## Authors & contributors + +The original setup of this repository is by [Ezlo Picori](https://github.com/ezlo-picori). diff --git a/kresus-mrraph-test/Dockerfile b/kresus-mrraph-test/Dockerfile new file mode 100644 index 0000000..ff92201 --- /dev/null +++ b/kresus-mrraph-test/Dockerfile @@ -0,0 +1,39 @@ +FROM node:lts-bookworm-slim + +ENV LANG="C.UTF-8" + +# Install Weboob OS-level dependencies. +RUN apt-get update \ +&& apt-get install -y git python3 python3-dev libffi-dev \ + libxml2-dev libxslt-dev libyaml-dev libtiff-dev libjpeg-dev zlib1g-dev \ + libfreetype6-dev libwebp-dev build-essential gcc g++ wget mupdf-tools \ + python3-pip \ + && rm -rf /var/lib/apt/lists/ + +# Install Weboob python dependencies +RUN mkdir /tmp/install && cd /tmp/install +#RUN $(which pip) install --upgrade setuptools +RUN pip install html2text simplejson BeautifulSoup PyExecJS pdfminer python-jose +RUN rm -rf /tmp/install + +# Setup kresus layout. +RUN useradd -d /home/kreseus -m -s /bin/bash -U user && \ + mkdir -p /data/kreseus && \ + mkdir -p /data/weboob && \ + npm install -g --production kresus; + +# Run server. +ENV HOST 0.0.0.0 +ENV KRESUS_DIR /data/kreseus +ENV KRESUS_WEBOOB_DIR /data/weboob +ENV NODE_ENV production + +EXPOSE 9876 + +COPY ./config.example.ini /opt/config.ini +RUN chmod -x /opt/config.ini +COPY ./docker/entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] +CMD ["kresus --config /opt/config.ini"] diff --git a/kresus-mrraph-test/README.md b/kresus-mrraph-test/README.md new file mode 100644 index 0000000..d20aef7 --- /dev/null +++ b/kresus-mrraph-test/README.md @@ -0,0 +1,25 @@ +# Home Assistant Add-on: Kresus + +Open source personal accounting solution. + +![Supports aarch64 Architecture][aarch64-shield] +![Supports amd64 Architecture][amd64-shield] +![Supports armhf Architecture][armhf-shield] +![Supports armv7 Architecture][armv7-shield] +![Supports i386 Architecture][i386-shield] + +## About + +[Kresus][kresus] is a free solution for personal accounting management. +It automatically retrieves your daily bank transactions, lets you categorize them +and manage your monthly budgets. + +![Kresus Preview][screenshot] + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg +[i386-shield]: https://img.shields.io/badge/i386-no-red.svg +[screenshot]: https://kresus.org/images/pages/view-all-accounts.png +[kresus]: https://kresus.org/ diff --git a/kresus-mrraph-test/build.yaml b/kresus-mrraph-test/build.yaml new file mode 100644 index 0000000..f5f795f --- /dev/null +++ b/kresus-mrraph-test/build.yaml @@ -0,0 +1,12 @@ +build_from: + aarch64: "node:lts-bookworm-slim" +labels: + org.opencontainers.image.title: "Home Assistant Add-on: Kresus Local TEST" + org.opencontainers.image.description: "Kresus Local TEST addon" + org.opencontainers.image.licenses: "MIT License" + io.hass.base.name: alpine +args: + BASHIO_VERSION: 0.14.3 + TEMPIO_VERSION: 2021.09.0 + S6_OVERLAY_VERSION: 3.1.3.0 + JEMALLOC_VERSION: 5.3.0 diff --git a/kresus-mrraph-test/config.yaml b/kresus-mrraph-test/config.yaml new file mode 100644 index 0000000..fb5bc81 --- /dev/null +++ b/kresus-mrraph-test/config.yaml @@ -0,0 +1,30 @@ +name: Kresus Local TEST +version: "0.6.2" +slug: kresuslocaltest +description: Open source personal accounting management +arch: + - armhf + - armv7 + - aarch64 + - amd64 +init: false +options: + postgres_hostname: homeassistant.local + postgres_port: 5432 + postgres_user: kresus + postgres_password: null + postgres_database: kresus +panel_icon: mdi:piggy-bank-outline +ports: + 9876/tcp: 9876 +ports_description: + 9876/tcp: "The port to access kresus web server." +schema: + postgres_hostname: str + postgres_port: int + postgres_user: str + postgres_password: password + postgres_database: str + http_basicauth: str? +startup: system +timeout: 20 diff --git a/kresus-mrraph-test/icon.png b/kresus-mrraph-test/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..df04d0d3b35c63dc0c90ef2847620ee96ece908a GIT binary patch literal 8772 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 + Hostname of the PostgreSQL database. + postgres_port: + name: "DB port" + description: >- + Port of the PostgreSQL database. + postgres_user: + name: "DB user" + description: >- + User to connect to the database. + postgres_password: + name: "DB password" + description: >- + Password of the database user. + postgres_database: + name: "DB database" + description: >- + Name of the kresus database. + http_basicauth: + name: "Authentication" + description: >- + Logins for HTTP basic auth authentication ("login:passwd" format, optional). +network: + 9876/tcp: Port to access kresus web server. diff --git a/kresus-mrraph/CHANGELOG.md b/kresus-mrraph/CHANGELOG.md new file mode 100644 index 0000000..1e4983e --- /dev/null +++ b/kresus-mrraph/CHANGELOG.md @@ -0,0 +1,37 @@ +## 0.6.2 + +- Update woob dependencies install method + +## 0.6.1 + +- Remove support for i386 architecture + +## 0.6.0 + +- Bump Kresus to 0.19.0 + +## 0.5.1 + +- Fix AppArmor profile + +## 0.5.0 + +- Attempt using `alpine:edge` as base image + +## 0.4.2 + +- Fix AppArmor profile + +## 0.4.1 + +- Reinstall py3-lxml by default + +## 0.4.0 + +- Remove python dependencies from Dockerfile to prevent + incompatibility with woob requirements + +## 0.3.0 + +- Use `s6-setuidgid` instead of `su-exec` +- Set AppArmor in complain mode diff --git a/kresus-mrraph/DOCS.md b/kresus-mrraph/DOCS.md new file mode 100644 index 0000000..a6484b0 --- /dev/null +++ b/kresus-mrraph/DOCS.md @@ -0,0 +1,54 @@ +# Home Assistant Custom Add-on: Kresus + +[Kresus](https://kresus.org/) is an open-source self-hostable Personal Finance Manager. +It automatically retrieves your daily bank transactions, lets you categorize them and manage your monthly budgets. + +It relies on [woob](https://gitlab.com/woob/woob) to fetch data from your bank website. + +## Installation + +Kresus requires a PostgreSQL database to store data. +If you do not already have a PostgreSQL database installed, you may consider the [PostgreSQL addon](https://github.com/ezlo-picori/hassio-addons/tree/main/postgres). + +The installation of Kresus add-on is quite straightforward and do not differ from the standard installation process for Home-Assistant add-ons: + +1. Click the Home Assistant My button below to open the add-on on your Home + Assistant instance. + + [![Open this add-on in your Home Assistant instance.][addon-badge]][addon] + +1. Click the "Install" button to install the add-on. +1. Start the "Kresus" add-on. +1. Check the logs of the "Kresus" add-on to see if everything + went well. A working installation should indicate `Server is ready, let's start the show!` +1. Click the "OPEN WEB UI" button to open Kresus UI. + +## Configuration + +The only configuration configurations required are the database connection options. +If you used the [PostgreSQL add-on](https://github.com/ezlo-picori/hassio-addons/tree/main/postgres) configured with following options: + +```yaml +databases: + - kresus_db +logins: + - password: CHANGEME_kr3sus-p@ssword_CHANGEME + username: kresus_user +rights: + - database: kresus_db + username: kresus_user +``` + +then you may configure kresus with these options: + +```yaml +postgres_hostname: homeassistant.local +postgres_port: 5432 +postgres_user: kresus_user +postgres_password: CHANGEME_kr3sus-p@ssword_CHANGEME +postgres_database: kresus_db +``` + +## Authors & contributors + +The original setup of this repository is by [Ezlo Picori](https://github.com/ezlo-picori). diff --git a/kresus-mrraph/Dockerfile b/kresus-mrraph/Dockerfile new file mode 100644 index 0000000..54acad6 --- /dev/null +++ b/kresus-mrraph/Dockerfile @@ -0,0 +1,19 @@ +ARG BUILD_FROM +FROM $BUILD_FROM + +COPY requirements.txt /requirements.txt +COPY start.sh /usr/libexec/kresus/start.sh + +# Addintional Python Libs +RUN pip install -r /requirements.txt && \ + npm install --omit=dev -g kresus@0.20.0 && \ + cd /woob && \ + rm -rf {,.[!.],..?}* && \ + wget -qO- https://gitlab.com/woob/woob/-/archive/master/woob-master.tar.gz | tar xz --strip-components=1 && \ + pip3 install --no-cache-dir --prefix .py-deps . && \ + chown -R kresus:kresus /woob && \ + chown -R kresus:kresus /etc/kresus && \ + chown -R kresus:kresus .py-deps woob .ci .gitlab modules tests tools woob.egg-info man weboob icons docs && \ + chmod 0400 /etc/kresus/config.ini && \ + chmod 0755 /etc/kresus && \ + rm -rf {,.[!.],..?}* \ No newline at end of file diff --git a/kresus-mrraph/README.md b/kresus-mrraph/README.md new file mode 100644 index 0000000..d20aef7 --- /dev/null +++ b/kresus-mrraph/README.md @@ -0,0 +1,25 @@ +# Home Assistant Add-on: Kresus + +Open source personal accounting solution. + +![Supports aarch64 Architecture][aarch64-shield] +![Supports amd64 Architecture][amd64-shield] +![Supports armhf Architecture][armhf-shield] +![Supports armv7 Architecture][armv7-shield] +![Supports i386 Architecture][i386-shield] + +## About + +[Kresus][kresus] is a free solution for personal accounting management. +It automatically retrieves your daily bank transactions, lets you categorize them +and manage your monthly budgets. + +![Kresus Preview][screenshot] + +[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg +[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg +[i386-shield]: https://img.shields.io/badge/i386-no-red.svg +[screenshot]: https://kresus.org/images/pages/view-all-accounts.png +[kresus]: https://kresus.org/ diff --git a/kresus-mrraph/build.yaml b/kresus-mrraph/build.yaml new file mode 100644 index 0000000..2da25fa --- /dev/null +++ b/kresus-mrraph/build.yaml @@ -0,0 +1,12 @@ +build_from: + aarch64: "ghcr.io/ezlo-picori/haos-addon-kresus-aarch64:latest" +labels: + org.opencontainers.image.title: "Home Assistant Add-on: Kresus Local" + org.opencontainers.image.description: "Kresus Local addon" + org.opencontainers.image.licenses: "MIT License" + io.hass.base.name: alpine +args: + BASHIO_VERSION: 0.14.3 + TEMPIO_VERSION: 2021.09.0 + S6_OVERLAY_VERSION: 3.1.3.0 + JEMALLOC_VERSION: 5.3.0 diff --git a/kresus-mrraph/config.yaml b/kresus-mrraph/config.yaml new file mode 100644 index 0000000..3c4dc02 --- /dev/null +++ b/kresus-mrraph/config.yaml @@ -0,0 +1,30 @@ +name: Kresus Local +version: "0.6.2" +slug: kresuslocal +description: Open source personal accounting management +arch: + - armhf + - armv7 + - aarch64 + - amd64 +init: false +options: + postgres_hostname: homeassistant.local + postgres_port: 5432 + postgres_user: kresus + postgres_password: null + postgres_database: kresus +panel_icon: mdi:piggy-bank-outline +ports: + 9876/tcp: 9876 +ports_description: + 9876/tcp: "The port to access kresus web server." +schema: + postgres_hostname: str + postgres_port: int + postgres_user: str + postgres_password: password + postgres_database: str + http_basicauth: str? +startup: system +timeout: 20 diff --git a/kresus-mrraph/icon.png b/kresus-mrraph/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..df04d0d3b35c63dc0c90ef2847620ee96ece908a GIT binary patch literal 8772 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 + Hostname of the PostgreSQL database. + postgres_port: + name: "DB port" + description: >- + Port of the PostgreSQL database. + postgres_user: + name: "DB user" + description: >- + User to connect to the database. + postgres_password: + name: "DB password" + description: >- + Password of the database user. + postgres_database: + name: "DB database" + description: >- + Name of the kresus database. + http_basicauth: + name: "Authentication" + description: >- + Logins for HTTP basic auth authentication ("login:passwd" format, optional). +network: + 9876/tcp: Port to access kresus web server.