From c8a8de38cc86dab2fe79292a2014a607af7cad8a Mon Sep 17 00:00:00 2001 From: samwiseg0 <2241731+samwiseg0@users.noreply.github.com> Date: Sun, 17 Jan 2021 22:58:14 -0500 Subject: [PATCH] build(snapcraft): Add snapcraft build yaml and workflow (#608) --- .github/workflows/snap.yaml | 103 +++++++++++++++++++++++++ docs/getting-started/installation.md | 110 +++++++++------------------ snap/snapcraft.yaml | 93 ++++++++++++++++++++++ 3 files changed, 233 insertions(+), 73 deletions(-) create mode 100644 .github/workflows/snap.yaml create mode 100644 snap/snapcraft.yaml diff --git a/.github/workflows/snap.yaml b/.github/workflows/snap.yaml new file mode 100644 index 000000000..d4fd1ec6d --- /dev/null +++ b/.github/workflows/snap.yaml @@ -0,0 +1,103 @@ +name: Publish Snap + +on: + push: + branches: [develop] + tags: [v*] + pull_request: ~ + +jobs: + test: + name: Lint & Build Test + runs-on: ubuntu-latest + container: node:12.18-alpine + steps: + - name: checkout + uses: actions/checkout@v2 + - name: install dependencies + env: + HUSKY_SKIP_INSTALL: 1 + run: yarn + - name: lint + run: yarn lint + - name: build + run: yarn build + build-snap: + name: Build Snap Package (${{ matrix.architecture }}) + needs: test + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, '[skip ci]')" + strategy: + fail-fast: false + matrix: + architecture: + - amd64 + - arm64 + - armhf + steps: + - name: Checkout Code + uses: actions/checkout@v2 + + - name: Prepare + id: prepare + run: | + git fetch --prune --unshallow --tags + if [[ $GITHUB_REF == refs/tags/* || $GITHUB_REF == refs/heads/master ]]; then + echo ::set-output name=RELEASE::stable + else + echo ::set-output name=RELEASE::edge + fi + + - name: Set Up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Build Snap Package + uses: diddlesnaps/snapcraft-multiarch-action@v1 + id: build + with: + architecture: ${{ matrix.architecture }} + + - name: Upload Snap Package + uses: actions/upload-artifact@v2 + with: + name: overseerr-snap-package-${{ matrix.architecture }} + path: ${{ steps.build.outputs.snap }} + + - name: Review Snap Package + uses: diddlesnaps/snapcraft-review-tools-action@v1 + with: + snap: ${{ steps.build.outputs.snap }} + + - name: Publish Snap Package + uses: snapcore/action-publish@v1 + with: + store_login: ${{ secrets.SNAP_LOGIN }} + snap: ${{ steps.build.outputs.snap }} + release: ${{ steps.prepare.outputs.RELEASE }} + + discord: + name: Discord Notification + needs: build-snap + if: always() && github.event_name != 'pull_request' + runs-on: ubuntu-latest + steps: + - name: Get Build Job Status + uses: technote-space/workflow-conclusion-action@v1 + + - name: Combine Job Status + id: status + run: | + failures=(neutral, skipped, timed_out, action_required) + if [[ ${array[@]} =~ $WORKFLOW_CONCLUSION ]]; then + echo ::set-output name=status::failure + else + echo ::set-output name=status::$WORKFLOW_CONCLUSION + fi + + - name: Post Status to Discord + uses: sarisia/actions-status-discord@v1 + with: + webhook: ${{ secrets.DISCORD_WEBHOOK }} + status: ${{ steps.status.outputs.status }} + title: ${{ github.workflow }} + nofail: true diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 6c8c38c72..723afd038 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -12,6 +12,7 @@ After running Overseerr for the first time, configure it by visiting the web UI {% tabs %} {% tab title="Basic" %} + ```bash docker run -d \ -e LOG_LEVEL=info \ @@ -21,9 +22,11 @@ docker run -d \ --restart unless-stopped \ sctx/overseerr ``` + {% endtab %} {% tab title="UID/GID" %} + ```text docker run -d \ --user=[ user | user:group | uid | uid:gid | user:gid | uid:group ] \ @@ -34,9 +37,11 @@ docker run -d \ --restart unless-stopped \ sctx/overseerr ``` + {% endtab %} {% tab title="Manual Update" %} + ```text # Stop the Overseerr container docker stop overseerr @@ -50,6 +55,7 @@ docker pull sctx/overseerr # Run the Overseerr container with the same parameters as before docker run -d ... ``` + {% endtab %} {% endtabs %} @@ -70,7 +76,7 @@ Use a 3rd party updating mechanism such as [Watchtower](https://github.com/conta Please refer to the [docker for windows documentation](https://docs.docker.com/docker-for-windows/) for installation. {% hint style="danger" %} -**WSL2 will need to be installed to prevent DB corruption! Please see** [**Docker Desktop WSL 2 backend**](https://docs.docker.com/docker-for-windows/wsl/) **on how to enable WSL2. The command below will only work with WSL2 installed! Details below.** +**WSL2 will need to be installed to prevent DB corruption! Please see** [**Docker Desktop WSL 2 backend**](https://docs.docker.com/docker-for-windows/wsl/) **on how to enable WSL2. The command below will only work with WSL2 installed!** {% endhint %} ```bash @@ -81,116 +87,74 @@ docker run -d -e LOG_LEVEL=info -e TZ=Asia/Tokyo -p 5055:5055 -v "/your/path/her Docker on Windows works differently than it does on Linux; it uses a VM to run a stripped-down Linux and then runs docker within that. The volume mounts are exposed to the docker in this VM via SMB mounts. While this is fine for media, it is unacceptable for the `/app/config` directory because SMB does not support file locking. This will eventually corrupt your database which can lead to slow behavior and crashes. If you must run in docker on Windows, you should put the `/app/config` directory mount inside the VM and not on the Windows host. It's worth noting that this warning also extends to other containers which use SQLite databases. {% endhint %} -## Linux \(Unsupported\) -{% tabs %} +## Linux -{% tab title="Ubuntu 16.04+/Debian" %} -{% hint style="danger" %} -This install method is **not currently supported**. Docker is the only install method supported. Do not create issues or ask for support unless you are able to reproduce the issue with Docker. +{% hint style="info" %} +The [Overseerr snap](https://snapcraft.io/overseerr) is the only supported linux install method. Currently, the listening port cannot be changed. Port `5055` will need to be available on your host. To install snapd please refer to [Installing snapd](https://snapcraft.io/docs/installing-snapd). {% endhint %} -```bash -# Install nodejs -sudo apt-get install -y curl git gnupg2 -curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - -sudo apt-get install -y nodejs -# Install yarn -curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - -echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list -sudo apt-get update && sudo apt-get install yarn -# Install Overseerr -cd ~ && git clone https://github.com/sct/overseerr.git -cd overseerr -yarn install -yarn build -yarn start -``` - -**Updating** +**To install:** -In order to update, you will need to re-build overseer. -```bash -cd ~/.overseerr -git pull -yarn install -yarn build -yarn start ``` -{% endtab %} +sudo snap install overseerr +``` -{% tab title="Ubuntu ARM" %} -{% hint style="danger" %} -This install method is **not currently supported**. Docker is the only install method supported. Do not create issues or ask for support unless you are able to reproduce the issue with Docker. -{% endhint %} +**Updating:** +Snap will keep Overseerr up-to-date automatically. You can force a refresh by using the following command. -```bash -# Install nodejs -sudo apt-get install -y curl git gnupg2 build-essential -curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - -sudo apt-get install -y nodejs -# Install yarn -curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - -echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list -sudo apt-get update && sudo apt-get install yarn -# Install Overseerr -cd ~ && git clone https://github.com/sct/overseerr.git -cd overseerr -npm config set python "$(which python3)" -yarn install -yarn build -yarn start +``` +sudo snap refresh ``` -**Updating** +**To install the development build:** -In order to update, you will need to re-build overseer. -```bash -cd ~/.overseerr -git pull -yarn install -yarn build -yarn start ``` -{% endtab %} +sudo snap install overseerr --edge +``` -{% tab title="ArchLinux \(3rd Party\)" %} -Built from tag \(master\): [https://aur.archlinux.org/packages/overseerr/](https://aur.archlinux.org/packages/overseerr/) -Built from latest \(develop\): [aur.archlinux.org/packages/overseerr-git](https://aur.archlinux.org/packages/overseerr-git/) -**To install these just use your favorite AUR package manager:** +{% hint style="danger" %} +This version can break any moment. Be prepared to troubleshoot any issues that arise! +{% endhint %} -```bash -yay -S overseer -``` -{% endtab %} +## Third Party -{% tab title="Gentoo \(3rd Party\)" %} +{% tabs %} + +{% tab title="Gentoo" %} Portage overlay [GitHub Repository](https://github.com/chriscpritchard/overseerr-overlay) Efforts will be made to keep up to date with the latest releases, however, this cannot be guaranteed. To enable using eselect repository, run: + ```bash eselect repository add overseerr-overlay git https://github.com/chriscpritchard/overseerr-overlay.git ``` Once complete, you can just run: + ```bash emerge www-apps/overseerr ``` -{% endtab %} -{% endtabs %} +{% endtab %} -## Swizzin \(Third party\) +{% tab title="Swizzin" %} The installation is not implemented via docker, but barebones. The latest released version of overseerr will be used. Please see the [swizzin documentation](https://swizzin.ltd/applications/overseerr) for more information. To install, run the following: + ```bash box install overseerr ``` To upgrade, run the following: + ```bash box upgrade overseerr ``` + +{% endtab %} + +{% endtabs %} diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 000000000..14f0109f2 --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,93 @@ +name: overseerr +adopt-info: overseerr +license: MIT +summary: Request management and media discovery tool for the Plex ecosystem. +description: > + Overseerr is a free and open source software application for managing requests for your media library. + It integrates with your existing services such as Sonarr, Radarr and Plex! +base: core18 +confinement: strict + +parts: + overseerr: + plugin: nodejs + nodejs-version: "12.18.4" + nodejs-package-manager: "yarn" + nodejs-yarn-version: v1.22.5 + build-packages: + - git + - on arm64: + - build-essential + - automake + - on armhf: + - libatomic1 + - build-essential + - automake + source: . + override-pull: | + snapcraftctl pull + # Get information to determine snap grade and version + BRANCH=$(git rev-parse --abbrev-ref HEAD) + COMMIT=$(git rev-parse HEAD) + COMMIT_SHORT=$(git rev-parse --short HEAD) + VERSION='v'$(cat package.json | grep 'version' | head -1 | sed 's/.*"\(.*\)"\,/\1/') + if [ "$VERSION" = "v0.1.0" ]; then + SNAP_VERSION=$COMMIT_SHORT + GRADE=devel + else + SNAP_VERSION=$VERSION + GRADE=stable + fi + # Write COMMIT_TAG as it is needed durring the build process + echo $COMMIT > commit.txt + # Print debug info for build version + echo "{\"commitShort\": \"$COMMIT_SHORT\", \ + \"version\": \"$VERSION\", \ + \"snapVersion\": \"$SNAP_VERSION\", \ + \"snapGrade\": \"$GRADE\", \ + \"branch\": \"$BRANCH\", \ + \"commit\": \"$COMMIT\"}" + echo "{\"commitTag\": \"$COMMIT\"}" > committag.json + # Set snap version and grade + snapcraftctl set-version "$SNAP_VERSION" + snapcraftctl set-grade "$GRADE" + build-environment: + - PATH: "$SNAPCRAFT_PART_BUILD/node_modules/.bin:$SNAPCRAFT_PART_BUILD/../npm/bin:$PATH" + override-build: | + set -e + # On arm builds "python" cannot be found. Set python to python3 + if [ "$ARCH" != "x86_64" ]; then + npm config set python "$(which python3)" + fi + # Set COMMIT_TAG before the build begins + export COMMIT_TAG=$(cat $SNAPCRAFT_PART_BUILD/commit.txt) + snapcraftctl build + yarn build + # Copy files needed for staging + cp $SNAPCRAFT_PART_BUILD/committag.json $SNAPCRAFT_PART_INSTALL/ + cp -R $SNAPCRAFT_PART_BUILD/.next $SNAPCRAFT_PART_INSTALL/ + cp -R $SNAPCRAFT_PART_BUILD/dist $SNAPCRAFT_PART_INSTALL/ + cp -R $SNAPCRAFT_PART_BUILD/node_modules $SNAPCRAFT_PART_INSTALL/ + # Remove .github and gitbook as it will fail snap lint + rm -rf $SNAPCRAFT_PART_INSTALL/.github && rm $SNAPCRAFT_PART_INSTALL/.gitbook.yaml + stage: + [ .next, ./* ] + prime: + [ .next, ./* ] + +apps: + deamon: + command: /bin/sh -c "cd $SNAP && node dist/index.js" + daemon: simple + restart-condition: on-failure + restart-delay: 5s + plugs: + - home + - network + - network-bind + environment: + PATH: "$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH" + OVERSEERR_SNAP: "True" + CONFIG_DIRECTORY: $SNAP_USER_COMMON + LOG_LEVEL: "debug" + NODE_ENV: "production"