Immich安装部署及更换默认数据库帐号及更新错误
应用简览
Immich 是一个高性能的自托管照片和视频备份方案,和 iCloud 类似,你可以自行搭建云服务。它支持移动端和网页。
部署完成后可以实现照片和视频自动备份到你自己的服务器上,数据安全可控。
主要特性
- 多平台支持: Immich 提供了移动端和 Web 端的版本,你可以随时随地访问相关的媒体内容。
- 自动备份: 和 iCloud 一样,Immich 支持后台自动备份照片和视频。
- 选择性备份: Immich 还支持备份特定的相册,而不必备份所有的照片和视频。
- 高级搜索功能: Immich 提供了强大的搜索功能,用户可以根据元数据、对象、人脸等条件进行搜索,轻松找到照片。
- 安全性: Immich 完全开源,且数据存储在你自己的服务器上。数据安全可控,同时还支持 OAuth 进行身份验证。
- 多用户支持和分享: Immich 支持多用户,并允许用户创建共享相册,与朋友、家人或合作伙伴分享照片和视频。
- 地理位置信息: 应用程序提供了地图视图,允许用户查看和浏览地理位置信息,以及在地图上查看媒体内容。
- 人脸识别和聚合: Immich 可以识别人脸并进行聚合,使用户能够更轻松地组织和查找他们的照片。
- 离线支持: 移动端应用程序提供离线支持,允许在没有网络的情况下查看照片和视频。
应用特色
一、多平台支持
Immich 提供了移动端和 Web 端的版本,你可以随时随地访问相关的媒体内容。且所有照片和视频都可以做到多端同步。
二、自动备份、选择目录备份
不用再担心数据丢失。Immich 可以在打开程序时自动备份照片和视频,还支持后台自动备份,确保每一张珍贵的照片和视频都得到保护。
同时,你还可以自由选择备份哪些相册,而不必备份所有内容。这种个性化的备份策略更灵活且占用资源更少。
三、人脸识别和聚合
Immich 采用了机器学习技术,它可以自动识别照片中的人脸,并将它们与特定的个体相关联。
在识别完成后,Immich 会自动将相同人脸的照片分组在一起。这样可以帮助你快速浏览某个人的所有照片,而不必手动搜索。
同时 Immich 也会根据照片的地理信息,将同一个地点的照片进行分组。这两种方式都能使用户更轻松地组织和浏览照片。
四、全局地图展示
Immich 能根据照片的地理信息,在地图上绘制出你所有照片的轨迹,你可以查看到所有照片在地图上的位置,且某处有哪些照片。
安装Immich
Immich
支持脚本一键安装和Docker安装,但一键脚本事件还是使用Docker来安装的,核心是配置好.env
中的各种变量,具体操作如下。
1、一键脚本安装
curl -o- https://raw.githubusercontent.com/immich-app/immich/main/install.sh | bash
这个脚本将执行以下操作:
1、从存储库的主分支下载docker-compose.yml
和.env
文件。
2、根据当前目录路径,使用必要的信息填充.env
文件。
3、启动Docker容器。
2、Docker Compose安装
Immich
需要依赖Redis 和PostgreSQL才能使用,因为这两个程序是比较通用的中间件,所以笔者建议单独安装好这两个应用,不建议直接在一个 Docker Compose 中启动。将下面的内容保存到docker-compose.yml
文件中。
version: "3.9"
services:
immich:
image: ghcr.io/imagegenius/immich:latest
container_name: immich
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- DB_HOSTNAME=<PostgreSQL Host>
- DB_USERNAME=postgres
- DB_PASSWORD=postgres
- DB_DATABASE_NAME=immich
- REDIS_HOSTNAME=<Redis Host>
- DISABLE_MACHINE_LEARNING=false #optional
- DISABLE_TYPESENSE=false #optional
- DB_PORT=5432 #optional
- REDIS_PORT=6379 #optional
- REDIS_PASSWORD= #optional
- MACHINE_LEARNING_WORKERS=1 #optional
- MACHINE_LEARNING_WORKER_TIMEOUT=120 #optional
volumes:
- path_to_appdata:/config
- path_to_photos:/photos
- path_to_machine-learning:/config/machine-learning #optional
- path_to_imports:/import:ro #optional
ports:
- 8080:8080
restart: unless-stopped
然后在docker-compose.yml
文件所在目录中执行下面命令,启动Immich
。
docker-compose up -d
安装完成后,在浏览器中打开http://<machine-ip-address>:2283
,移动端则是将服务器URL设置为http://<machine-ip-address>:2283/api
即可访问Immich
了。
docker-compose
现在可能出了V2版本,我在armbian上,已无法使用,需要修改成docker compose up -d
curl -o- https://raw.githubusercontent.com/immich-app/immich/main/install.sh | bash
)发现Immich
是用PostgreSQL
数据库的超级管理员连接的,感觉有些不安全。所以更换了下用户,结果发现一堆坑,也是我对数据库完全无知,以为和mysql
一样,只需要新建一个用户,然后把Immich
数据库的权限给到新的用户就可以。结果完全不行,然后开始google,查不到游泳信息,然后就和ChatGPT一直提问,还好最终解决了。简单记录一下过程:docker run --net immich_default --name adminer -p 2281:8080 -d --restart=always adminer
,--net immich_default
是官方一键脚本使用的默认网络,请根据实际情况调整,否则连不上数据库。-- 创建用户
CREATE USER immich WITH PASSWORD 'your_password';
-- 授予连接数据库的权限
GRANT CONNECT ON DATABASE your_database TO immich;
-- 授予对所有表的权限
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO immich;
为用户 immich
分配对所有表的适当权限:
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO immich;
这时我以为就完成了,结果用新用户连接数据库提示(类似错误还有一堆,没记录)
ERROR [TypeOrmModule] Unable to connect to the database. Retrying
ERROR [TypeOrmModule] Unable to connect to the database. Retrying QueryFailedError: relation "migrations" already exists
最后查了下,要更改很多表的所有者
-- 修改表的所有者
SELECT 'ALTER TABLE ' || table_name || ' OWNER TO immich;'
FROM information_schema.tables
WHERE table_schema = 'public';
-- 授予权限给用户 immich
SELECT 'GRANT ALL PRIVILEGES ON TABLE ' || table_name || ' TO immich;'
FROM information_schema.tables
WHERE table_schema = 'public';
执行完,复制查询结果再运行,例如这样的:
GRANT ALL PRIVILEGES ON TABLE migrations TO immich;
GRANT ALL PRIVILEGES ON TABLE typeorm_metadata TO immich;
GRANT ALL PRIVILEGES ON TABLE system_config TO immich;
GRANT ALL PRIVILEGES ON TABLE tags TO immich;
GRANT ALL PRIVILEGES ON TABLE tag_asset TO immich;
GRANT ALL PRIVILEGES ON TABLE shared_link__asset TO immich;
GRANT ALL PRIVILEGES ON TABLE api_keys TO immich;
GRANT ALL PRIVILEGES ON TABLE albums_assets_assets TO immich;
GRANT ALL PRIVILEGES ON TABLE albums_shared_users_users TO immich;
GRANT ALL PRIVILEGES ON TABLE smart_info TO immich;
GRANT ALL PRIVILEGES ON TABLE user_token TO immich;
GRANT ALL PRIVILEGES ON TABLE libraries TO immich;
GRANT ALL PRIVILEGES ON TABLE audit TO immich;
GRANT ALL PRIVILEGES ON TABLE person TO immich;
GRANT ALL PRIVILEGES ON TABLE move_history TO immich;
GRANT ALL PRIVILEGES ON TABLE asset_faces TO immich;
GRANT ALL PRIVILEGES ON TABLE shared_links TO immich;
GRANT ALL PRIVILEGES ON TABLE activity TO immich;
GRANT ALL PRIVILEGES ON TABLE albums TO immich;
GRANT ALL PRIVILEGES ON TABLE asset_job_status TO immich;
GRANT ALL PRIVILEGES ON TABLE users TO immich;
GRANT ALL PRIVILEGES ON TABLE partners TO immich;
GRANT ALL PRIVILEGES ON TABLE assets TO immich;
GRANT ALL PRIVILEGES ON TABLE exif TO immich;
运行完,在docker compose down
,docker compose up -d
一下应该就可以正常运行了。
附与ChatGPT的完整对话 (因为完全不懂数据库,所以废话很多):https://chat.openai.com/share/bf688807-03cd-412e-bd0e-6e2155ea774f
2023.11.29 immich 1.88.2 升级到 1.89
Warning
If you are running your own Postgres database (not the one in our default docker-compose) and created the immich user yourself, you may need to enable the required extensions as the database superuser. You can do this by running the following two queries under the context of the immich database. This will only need to be run once.
CREATE EXTENSION cube;
CREATE EXTENSION earthdistance;
警告
如果您正在运行自己的 Postgres 数据库(不是我们默认的 docker-compose 中的数据库)并自己创建了 immich 用户,则可能需要以数据库超级用户身份启用所需的扩展。为此,可以在 immich 数据库的上下文中运行以下两个查询。这只需要运行一次。
CREATE EXTENSION cube;
CREATE EXTENSION earthdistance;
更新后提示
QueryFailedError: must be owner of table asset_faces
QueryFailedError: must be owner of table assets
ALTER TABLEasset_faces
OWNER TO immich; #immich为immich数据库用户
ALTER TABLE assets OWNER TO immich; #immich为immich数据库用户
2023.12.17 immich 1.90.0 升级到 1.91.0
docker-compose.yml
变动较大,而且新版docker compose对缩进的要求比较淡,建议参照一下官方的docker-compose.yml
修改。注意:如果使用 Immich 的非超级用户角色运行数据库,则必须手动启用 pgvecto.rs 扩展。为此,您可以以超级用户身份连接到数据库并运行:immich
CREATE EXTENSION vectors;
提示错误:
QueryFailedError: must be owner of table smart_info
QueryFailedError: must be owner of table exif
ALTER TABLE smart_info OWNER TO immich; #immich为immich数据库用户
ALTER TABLE exif OWNER TO immich; #immich为immich数据库用户
2023.12.18 immich 19.1.3 无法删除相册,日志提示
[Nest] 7 - 12/18/2023, 2:01:17 AM ERROR [ErrorInterceptor] Failed to delete album
[Nest] 7 - 12/18/2023, 2:01:17 AM ERROR [ErrorInterceptor] QueryFailedError: permission denied for sequence audit_id_seq
解决方案
grant all on sequence audit_id_seq to immich
[错误]QueryFailedError:创建扩展“earthdistance”的权限被拒绝 ·期刊 #5399 ·immich-app/immich (github.com)
POSTing 时出现错误“序列user_id_seq权限被拒绝” ·期刊 #251 ·PostgREST/后重 (github.com)
2024.02.22
1、 immich_machine_learning
研究,由于国内网络原因,程序无法直接下载AI模型,可以去huggingface.co
下载后,上传到相关目录。
The machine learning models cannot be downloaded. · Issue #6616 · immich-app/immich (github.com)
immich的国内部署_immich clip-CSDN博客
2、immich 19.5.1更新的数据库操作有坑,注意。这段数据库操作的代码有问题,
其中ALTER EXTENSION vectors UPDATE TO '0.2.0'
查询出错: ERROR: type "vecf16" already exists
我的解决方案是:
DROP EXTENSION IF EXISTS vectors CASCADE;
CREATE EXTENSION vectors;
ALTER EXTENSION vectors UPDATE TO '0.2.0';
官方升级SQL命令:版本 v1.95.1 ·immich-app/immich (github.com)
BEGIN;
CREATE SCHEMA IF NOT EXISTS vectors;
ALTER DATABASE immich SET search_path TO "$user", public, vectors;
SET search_path TO "$user", public, vectors;
UPDATE pg_catalog.pg_extension SET extversion = '0.1.11' WHERE extname = 'vectors';
UPDATE pg_catalog.pg_extension SET extrelocatable = true WHERE extname = 'vectors';
ALTER EXTENSION vectors SET SCHEMA vectors;
UPDATE pg_catalog.pg_extension SET extrelocatable = false WHERE extname = 'vectors';
ALTER EXTENSION vectors UPDATE TO '0.2.0';
SELECT pgvectors_upgrade();
COMMIT;
1.95.1 BUG很多
1.95.1升级到1.97
docker comepose pull #Upgrade 1.97.0
UPDATE pg_catalog.pg_extension SET extversion = '0.2.0' WHERE extname = 'vectors';
docker compose down
docker compose up -d
[Nest] 7 - 03/09/2024, 3:53:32 AM LOG [CommunicationRepository] Initialized websocket server
Migration "CascadeSharedLinksDelete1709825430031" failed, error: must be owner of table shared_links
/usr/src/app/node_modules/typeorm/driver/postgres/PostgresQueryRunner.js:219
throw new QueryFailedError_1.QueryFailedError(query, parameters, err);
^
QueryFailedError: must be owner of table shared_links
at PostgresQueryRunner.query (/usr/src/app/node_modules/typeorm/driver/postgres/PostgresQueryRunner.js:219:19)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async CascadeSharedLinksDelete1709825430031.up (/usr/src/app/dist/infra/migrations/1709825430031-CascadeSharedLinksDelete.js:7:9)
at async MigrationExecutor.executePendingMigrations (/usr/src/app/node_modules/typeorm/migration/MigrationExecutor.js:225:17)
at async DataSource.runMigrations (/usr/src/app/node_modules/typeorm/data-source/DataSource.js:265:35)
at async DatabaseRepository.runMigrations (/usr/src/app/dist/infra/repositories/database.repository.js:177:9)
at async /usr/src/app/dist/domain/database/database.service.js:52:13
at async /usr/src/app/dist/infra/repositories/database.repository.js:185:23 {
query: 'ALTER TABLE "shared_links" DROP CONSTRAINT "FK_66fe3837414c5a9f1c33ca49340"',
parameters: undefined,
driverError: error: must be owner of table shared_links
ALTER TABLE shared_links OWNER TO immich;
internalQuery: undefined, QueryFailedError: must be owner of table albums QueryFailedError: must be owner of table shared_links at PostgresQueryRunner.query (/usr/src/app/node_modules/typeorm/driver/postgres/PostgresQueryRunner.js:219:19) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async CascadeSharedLinksDelete1709825430031.up (/usr/src/app/dist/infra/migrations/1709825430031-CascadeSharedLinksDelete.js:7:9) at async MigrationExecutor.executePendingMigrations (/usr/src/app/node_modules/typeorm/migration/MigrationExecutor.js:225:17) at async DataSource.runMigrations (/usr/src/app/node_modules/typeorm/data-source/DataSource.js:265:35) at async DatabaseRepository.runMigrations (/usr/src/app/dist/infra/repositories/database.repository.js:177:9) at async /usr/src/app/dist/domain/database/database.service.js:52:13 at async /usr/src/app/dist/infra/repositories/database.repository.js:185:23 { query: 'ALTER TABLE "shared_links" DROP CONSTRAINT "FK_66fe3837414c5a9f1c33ca49340"', parameters: undefined, driverError: error: must be owner of table shared_links at /usr/src/app/node_modules/pg/lib/client.js:526:17 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async PostgresQueryRunner.query (/usr/src/app/node_modules/typeorm/driver/postgres/PostgresQueryRunner.js:184:25) at async CascadeSharedLinksDelete1709825430031.up (/usr/src/app/dist/infra/migrations/1709825430031-CascadeSharedLinksDelete.js:7:9) at async MigrationExecutor.executePendingMigrations (/usr/src/app/node_modules/typeorm/migration/MigrationExecutor.js:225:17) at async DataSource.runMigrations (/usr/src/app/node_modules/typeorm/data-source/DataSource.js:265:35) at async DatabaseRepository.runMigrations (/usr/src/app/dist/infra/repositories/database.repository.js:177:9) at async /usr/src/app/dist/domain/database/database.service.js:52:13 at async /usr/src/app/dist/infra/repositories/database.repository.js:185:23 {
ALTER TABLE tag_asset OWNER TO immich;
ALTER TABLE albums OWNER TO immich;
参考:
手机照片备份方案Immich(修订版) | 老苏的blog (gitee.io)
sandman
“Immich需要依赖Redis 和PostgreSQL才能使用,因为这两个程序是比较通用的中间件,所以笔者建议单独安装好这两个应用,不建议直接在一个 Docker Compose 中启动。将下面的内容保存到docker-compose.yml文件中。”
谢谢,解决我的问题了