From d5d3e3e3ea49609f7b36a541508ffa68bebe61e0 Mon Sep 17 00:00:00 2001 From: QYG2297248353 Date: Fri, 6 Dec 2024 02:55:35 +0000 Subject: [PATCH] Processed apps directory via GitHub Actions --- appstore/immich-no-machine/1.122.0/.env | 42 ++++++ appstore/immich-no-machine/1.122.0/data.yml | 117 ++++++++++++++++ .../1.122.0/docker-compose.yml | 67 +++++++++ .../1.122.0/envs/default.env | 2 + .../immich-no-machine/1.122.0/envs/global.env | 2 + .../immich-no-machine/1.122.0/scripts/init.sh | 17 +++ .../1.122.0/scripts/uninstall.sh | 10 ++ .../1.122.0/scripts/upgrade.sh | 17 +++ appstore/immich-no-machine/README.md | 129 ++++++++++++++++++ appstore/immich-no-machine/data.yml | 16 +++ appstore/immich-no-machine/logo.png | Bin 0 -> 14868 bytes dockge/immich-no-machine/.env | 42 ++++++ dockge/immich-no-machine/docker-compose.yml | 67 +++++++++ dockge/immich-no-machine/envs/default.env | 2 + dockge/immich-no-machine/envs/global.env | 2 + 15 files changed, 532 insertions(+) create mode 100644 appstore/immich-no-machine/1.122.0/.env create mode 100644 appstore/immich-no-machine/1.122.0/data.yml create mode 100644 appstore/immich-no-machine/1.122.0/docker-compose.yml create mode 100644 appstore/immich-no-machine/1.122.0/envs/default.env create mode 100644 appstore/immich-no-machine/1.122.0/envs/global.env create mode 100644 appstore/immich-no-machine/1.122.0/scripts/init.sh create mode 100644 appstore/immich-no-machine/1.122.0/scripts/uninstall.sh create mode 100644 appstore/immich-no-machine/1.122.0/scripts/upgrade.sh create mode 100644 appstore/immich-no-machine/README.md create mode 100644 appstore/immich-no-machine/data.yml create mode 100644 appstore/immich-no-machine/logo.png create mode 100644 dockge/immich-no-machine/.env create mode 100644 dockge/immich-no-machine/docker-compose.yml create mode 100644 dockge/immich-no-machine/envs/default.env create mode 100644 dockge/immich-no-machine/envs/global.env diff --git a/appstore/immich-no-machine/1.122.0/.env b/appstore/immich-no-machine/1.122.0/.env new file mode 100644 index 00000000..da1ba0f5 --- /dev/null +++ b/appstore/immich-no-machine/1.122.0/.env @@ -0,0 +1,42 @@ +# Redis 服务 (前置检查) [必填] +PANEL_REDIS_TYPE=redis + +# 数据持久化路径 [必填] +IMMICH_ROOT_PATH=/home/immich-app + +# WebUI 端口 [必填] +PANEL_APP_PORT_HTTP=2283 + +# 数据库连接密码 [必填] +DB_PASSWORD= + +# 数据库 端口 [必填] +PANEL_APP_PORT_DB=5432 + +# 数据库 主机地址 [必填] +DB_HOSTNAME=immich-pg14-vectors + +# 数据库 用户名 [必填] +DB_USERNAME=postgres + +# 数据库 名称 [必填] +DB_DATABASE_NAME=immich + +# Redis 主机 [必填] +REDIS_HOSTNAME=127.0.0.1 + +# Redis 端口 [必填] +REDIS_PORT=6379 + +# Redis 索引 [必填] +REDIS_DBINDEX=0 + +# Redis 用户名 +REDIS_USERNAME= + +# Redis 密码 +REDIS_PASSWORD= + +# 是否跳过目录检查 +IMMICH_IGNORE_MOUNT_CHECK_ERRORS=false + diff --git a/appstore/immich-no-machine/1.122.0/data.yml b/appstore/immich-no-machine/1.122.0/data.yml new file mode 100644 index 00000000..093e32b1 --- /dev/null +++ b/appstore/immich-no-machine/1.122.0/data.yml @@ -0,0 +1,117 @@ +additionalProperties: + formFields: + - child: + default: "" + envKey: PANEL_REDIS_SERVICE + required: true + type: service + default: redis + envKey: PANEL_REDIS_TYPE + labelZh: Redis 服务 (前置检查) + labelEn: Redis Service (Pre-check) + required: true + type: apps + values: + - label: Redis + value: redis + - default: "/home/immich-app" + edit: true + envKey: IMMICH_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 2283 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: "" + edit: true + envKey: DB_PASSWORD + labelEn: Database Password + labelZh: 数据库连接密码 + random: true + required: true + rule: paramComplexity + type: password + - default: 5432 + edit: true + envKey: PANEL_APP_PORT_DB + labelZh: 数据库 端口 + labelEn: Database Port + required: true + rule: paramPort + type: number + - default: "immich-pg14-vectors" + disabled: true + envKey: DB_HOSTNAME + labelZh: 数据库 主机地址 + labelEn: Database Host + required: true + type: text + - default: "postgres" + disabled: true + envKey: DB_USERNAME + labelZh: 数据库 用户名 + labelEn: Database User + required: true + type: text + - default: "immich" + disabled: true + envKey: DB_DATABASE_NAME + labelZh: 数据库 名称 + labelEn: Database Name + required: true + type: text + - default: "127.0.0.1" + edit: true + envKey: REDIS_HOSTNAME + labelZh: Redis 主机 + labelEn: Redis Host + required: true + type: text + - default: 6379 + edit: true + envKey: REDIS_PORT + labelZh: Redis 端口 + labelEn: Redis Port + required: true + rule: paramPort + type: number + - default: 0 + edit: true + envKey: REDIS_DBINDEX + labelZh: Redis 索引 + labelEn: Redis Index + required: true + type: number + - default: "" + edit: true + envKey: REDIS_USERNAME + labelZh: Redis 用户名 + labelEn: Redis Username + required: false + type: text + - default: "" + edit: true + envKey: REDIS_PASSWORD + labelZh: Redis 密码 + labelEn: Redis Password + required: false + type: password + - default: "false" + edit: true + envKey: IMMICH_IGNORE_MOUNT_CHECK_ERRORS + labelZh: 是否跳过目录检查 + labelEn: Skip Mount Check + required: false + type: select + values: + - label: 跳过检查 + value: "true" + - label: 不跳过检查 + value: "false" diff --git a/appstore/immich-no-machine/1.122.0/docker-compose.yml b/appstore/immich-no-machine/1.122.0/docker-compose.yml new file mode 100644 index 00000000..cf81d652 --- /dev/null +++ b/appstore/immich-no-machine/1.122.0/docker-compose.yml @@ -0,0 +1,67 @@ +name: immich +networks: + 1panel-network: + external: true +services: + immich-pg14-vectors: + command: + - postgres + - -c + - shared_preload_libraries=vectors.so + - -c + - search_path="$$user", public, vectors + - -c + - logging_collector=on + - -c + - max_wal_size=2GB + - -c + - shared_buffers=512MB + - -c + - wal_compression=on + container_name: pg14-vectors-immich-no-machine + environment: + POSTGRES_DB: ${DB_DATABASE_NAME:-immich} + POSTGRES_INITDB_ARGS: --data-checksums + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_USER: ${DB_USERNAME:-postgres} + healthcheck: + interval: 5m + start_interval: 30s + start_period: 5m + test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' + || exit 1; Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' + --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), + 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ + "$$Chksum" = '0' ] || exit 1 + image: tensorchord/pgvecto-rs:pg14-v0.2.0 + labels: + createdBy: Apps + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_DB:-5432}:5432 + restart: always + volumes: + - ${IMMICH_ROOT_PATH}/pg14/data:/var/lib/postgresql/data + immich-server: + container_name: immich-server-immich-no-machine + depends_on: + - immich-pg14-vectors + devices: + - /dev/dri:/dev/dri + env_file: + - ./envs/global.env + - .env + healthcheck: + disable: false + image: ghcr.io/immich-app/immich-server:v1.122.0 + labels: + createdBy: Apps + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:2283 + restart: always + volumes: + - ${IMMICH_ROOT_PATH}/data/library:/usr/src/app/upload + - /etc/localtime:/etc/localtime diff --git a/appstore/immich-no-machine/1.122.0/envs/default.env b/appstore/immich-no-machine/1.122.0/envs/default.env new file mode 100644 index 00000000..cd05f46e --- /dev/null +++ b/appstore/immich-no-machine/1.122.0/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/appstore/immich-no-machine/1.122.0/envs/global.env b/appstore/immich-no-machine/1.122.0/envs/global.env new file mode 100644 index 00000000..e10989fe --- /dev/null +++ b/appstore/immich-no-machine/1.122.0/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/appstore/immich-no-machine/1.122.0/scripts/init.sh b/appstore/immich-no-machine/1.122.0/scripts/init.sh new file mode 100644 index 00000000..07fb8c3f --- /dev/null +++ b/appstore/immich-no-machine/1.122.0/scripts/init.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/appstore/immich-no-machine/1.122.0/scripts/uninstall.sh b/appstore/immich-no-machine/1.122.0/scripts/uninstall.sh new file mode 100644 index 00000000..c86c4fbc --- /dev/null +++ b/appstore/immich-no-machine/1.122.0/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/appstore/immich-no-machine/1.122.0/scripts/upgrade.sh b/appstore/immich-no-machine/1.122.0/scripts/upgrade.sh new file mode 100644 index 00000000..07fb8c3f --- /dev/null +++ b/appstore/immich-no-machine/1.122.0/scripts/upgrade.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/appstore/immich-no-machine/README.md b/appstore/immich-no-machine/README.md new file mode 100644 index 00000000..6c48c680 --- /dev/null +++ b/appstore/immich-no-machine/README.md @@ -0,0 +1,129 @@ +# Immich + +Immich - 高性能自托管照片和视频备份解决方案 + +![Immich](https://file.lifebus.top/imgs/immich_cover.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 简介 + +> 该版本无 `机器学习` 模块,适用于不具备硬件条件的用户。 +> +> 您将无法使用 `机器学习` 功能,如 `CLIP`、`人脸识别` 等功能。 +> +> 如果您需要 `机器学习` 模块,可通过配置远端 `机器学习` 服务来使用。 + +欢迎您 +您好,很高兴您能来到这里。 + +我叫亚历克斯。我在学校时是一名电气工程师,后来因为工作和对解决问题的纯粹热爱而成为了一名软件工程师。 + +我们和新生儿躺在床上,我妻子说:"我们开始积累大量宝宝的照片和视频,我不想再为 App-Which-Must-Not-Be-Name +付费了。你总是想为我建一些东西,为什么不为我建一个能做到这一点的应用程序呢? + +就这样,这个想法开始在我脑海中萌生。之后,我开始在自助托管领域寻找具有类似备份功能和 "非命名应用程序 " +性能水平的现有解决方案。我发现目前的解决方案主要集中在画廊类型的应用程序上。然而,我想要的是一个简单易用的备份工具,并带有一个能高效查看照片和视频的本地移动应用程序。于是,我作为一名如饥似渴的工程师踏上了寻找之旅。 + +另一个促使我执行 "不可名状的应用程序 "替代方案的动机是,我希望能为开源社区做出贡献,多年来我从这个社区中受益匪浅。 + +我很荣幸能与大家分享这一作品,它重视隐私、回忆,以及在易用、友好的界面中回顾这些时刻的喜悦。 + +如果您喜欢这款应用程序,或者它在某些方面对您有帮助,请考虑支持这个项目。这将有助于我继续开发和维护应用程序。 + +## 环境准备 + ++ `Redis` 服务 + +Immich 使用 Redis 作为缓存服务,所以需要安装 Redis 服务。 + +### 硬件驱动挂载 + +默认仅挂载: `/dev/dri`,如果您的设备不存在硬件驱动,请使用删除完整 `devices` 配置。 + +可以通过 `ls /dev/` 查看存在的设备驱动。 + +```yml +devices: + - /dev/dri:/dev/dri + # - /dev/nvidia0:/dev/nvidia0 + # - /dev/nvidiactl:/dev/nvidiactl + # - /dev/nvidia-modeset:/dev/nvidia-modeset + # - /dev/nvidia-nvswitchctl:/dev/nvidia-nvswitchctl + # - /dev/nvidia-uvm:/dev/nvidia-uvm + # - /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools + # - /dev/video11:/dev/video11 +``` + +如果您的设备存在其他硬件驱动,可以选择挂载。删除 `# ` 号即可。格式为:`宿主机路径:容器路径`。 + +格式请与 `- /dev/dri:/dev/dri` 保持一致。 + +## 升级说明 + ++ **大版本** `v1.106.2` + +`2024/06/12` 上线,升级需要注意: + +1. 移除 `immich-microservices` 服务 +2. 环境变量发生了合并 +3. 底层API发生了变化 + 4. 移动端需要同步更新 + +## 安装说明 + +### 机器学习 预加载模型(CLIP) + +可选模型列表,粘贴时输入 `immich-app/` 之后的内容即可。 + +[immich-app's Collections - CLIP](https://huggingface.co/collections/immich-app/clip-654eaefb077425890874cd07) + +[immich-app's Collections - Multilingual CLIP](https://huggingface.co/collections/immich-app/multilingual-clip-654eb08c2382f591eeb8c2a7) + +默认模型 + +中文支持较好的模型 `XLM-Roberta-Large-Vit-B-16Plus` + +### 人脸识别 预加载模型 + +`buffalo_l`, `buffalo_m`, `buffalo_s`, `antelopev2` + +## 常见问题 + ++ 安装失败 + + 网络问题,可以尝试使用代理 ++ 升级失败 + + 请查看升级说明 + + 请查看日志,查看具体错误信息 + + 记录安装参数,进行卸载重装 + + 升级1Panel后,提示容器找不到 + + 请删除容器,重新安装 + + 提示文件或目录不存在 + + 可手动创建不存在的文件和目录,然后重试 + + 创建的文件可为空文件 + + 每次都升级失败 + + 很抱歉,官方应用不支持编排式应用(一个应用包含多个容器)的安装与升级,您可以尝试手动卸载安装最新版 ++ 无法访问 + + 请检查是否安装了 `Redis` 服务 + + 请检查是否正确配置了 `Redis` 服务 + + 请检查是否正确配置了 `域名` 和 `SSL` + + 请检查是否正确配置了 `端口` + + 请检查是否正确配置了 `防火墙` 并开放了 `端口` + + 请检查是否正确配置了 `Nginx` 服务 + +## 移动端应用 + +
+
+ App Store + App Store +
+
+ Google Play + Google Play +
+
+ +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/appstore/immich-no-machine/data.yml b/appstore/immich-no-machine/data.yml new file mode 100644 index 00000000..65d883be --- /dev/null +++ b/appstore/immich-no-machine/data.yml @@ -0,0 +1,16 @@ +additionalProperties: + key: immich-no-machine + name: Immich (无机器学习) + tags: + - WebSite + - Media + - Storage + - Local + shortDescZh: 高性能自托管照片和视频备份解决方案 + shortDescEn: High performance self-hosted photo and video backup solution + type: website + crossVersionUpdate: true + limit: 0 + website: https://immich.app/ + github: https://github.com/immich-app/immich/ + document: https://immich.app/docs/overview/introduction/ diff --git a/appstore/immich-no-machine/logo.png b/appstore/immich-no-machine/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..081f92e449f3b4543123718778c1c69d42391d33 GIT binary patch literal 14868 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