PassNAT LogoPassNAT

Kyoo自托管媒体服务器搭建教程 Docker部署影视库帕斯内网穿透远程访问全教程

作者

小编

发布时间

Curving abstract shapes with an orange and blue gradient

项目介绍

Kyoo 是一个专注于视频内容(电影、电视剧和动漫)的自托管媒体服务器,是 Jellyfin 或 Plex 的优秀替代品。它采用'一次设置,永久使用'的理念,无需手动重命名文件或特定的文件夹结构,能够无缝处理直接从下载目录获取的文件,最大程度减少服务器管理员的维护负担。

Kyoo 具有强大的功能特性:支持动态转码、视频预览缩略图、基于 Meilisearch 的高级搜索、OIDC 身份验证、观看列表同步、离线下载支持、增强的字幕支持以及智能的动漫名称解析。项目专注于电影、电视剧和动漫流媒体播放,不包含音乐、电子书或游戏功能,为用户提供纯粹的影视享受体验。

界面美观现代,支持 Web 和 Android 客户端,未来还将支持 Chromecast 和 Android TV。项目采用微服务架构,使用多个专门的容器来实现不同功能,确保系统的可扩展性和稳定性。

项目地址: 点我跳转

部署安装

如需在外也打开项目需要配置内网穿透使用,点击前往 帕斯内网穿透,先注册好账号备用。

Kyoo 使用 Docker Compose 进行部署,这是最简单快速的安装方式。

复制下列的配置文件

1x-transcoder: &transcoder-base
2 image: ghcr.io/zoriya/kyoo_transcoder:edge
3 networks:
4 default:
5 aliases:
6 - transcoder
7 restart: unless-stopped
8 env_file:
9 - ./.env
10 volumes:
11 - ${LIBRARY_ROOT}:/video:ro
12 - ${CACHE_ROOT}:/cache
13 - metadata:/metadata
14
15services:
16 back:
17 image: ghcr.io/zoriya/kyoo_back:edge
18 restart: unless-stopped
19 cpus: 1.5
20 environment:
21 - TRANSCODER_URL=${TRANSCODER_URL:-http://transcoder:7666/video}
22 env_file:
23 - ./.env
24 depends_on:
25 postgres:
26 condition: service_healthy
27 meilisearch:
28 condition: service_healthy
29 rabbitmq:
30 condition: service_healthy
31 migrations:
32 condition: service_completed_successfully
33 volumes:
34 - kyoo:/metadata
35 labels:
36 - "traefik.enable=true"
37 - "traefik.http.routers.api.rule=PathPrefix(`/api/`)"
38 - "traefik.http.services.back.loadbalancer.server.port=5000"
39
40 migrations:
41 image: ghcr.io/zoriya/kyoo_migrations:edge
42 restart: "no"
43 depends_on:
44 postgres:
45 condition: service_healthy
46 env_file:
47 - ./.env
48
49 front:
50 image: ghcr.io/zoriya/kyoo_front:edge
51 restart: unless-stopped
52 environment:
53 - KYOO_URL=${KYOO_URL:-http://back:5000/api}
54 labels:
55 - "traefik.enable=true"
56 - "traefik.http.routers.front.rule=PathPrefix(`/`)"
57 - "traefik.http.services.front.loadbalancer.server.port=8901"
58
59 scanner:
60 image: ghcr.io/zoriya/kyoo_scanner:edge
61 restart: unless-stopped
62 depends_on:
63 back:
64 condition: service_healthy
65 env_file:
66 - ./.env
67 environment:
68 - KYOO_URL=${KYOO_URL:-http://back:5000/api}
69 volumes:
70 - ${LIBRARY_ROOT}:/video:ro
71
72 matcher:
73 image: ghcr.io/zoriya/kyoo_scanner:edge
74 command: matcher
75 restart: unless-stopped
76 depends_on:
77 back:
78 condition: service_healthy
79 env_file:
80 - ./.env
81 environment:
82 - KYOO_URL=${KYOO_URL:-http://back:5000/api}
83
84 autosync:
85 image: ghcr.io/zoriya/kyoo_autosync:edge
86 restart: unless-stopped
87 depends_on:
88 rabbitmq:
89 condition: service_healthy
90 env_file:
91 - ./.env
92
93 transcoder:
94 <<: *transcoder-base
95 profiles: ['', 'cpu']
96
97 traefik:
98 image: traefik:v3.5
99 restart: unless-stopped
100 command:
101 - "--providers.docker=true"
102 - "--providers.docker.exposedbydefault=false"
103 - "--entryPoints.web.address=:8901"
104 - "--accesslog=true"
105 ports:
106 - "8901:8901"
107 volumes:
108 - "/var/run/docker.sock:/var/run/docker.sock:ro"
109
110 postgres:
111 image: postgres:15
112 restart: unless-stopped
113 env_file:
114 - ./.env
115 volumes:
116 - db:/var/lib/postgresql/data
117 healthcheck:
118 test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
119 interval: 5s
120 timeout: 5s
121 retries: 5
122
123 meilisearch:
124 image: getmeili/meilisearch:v1.4
125 restart: unless-stopped
126 volumes:
127 - search:/meili_data
128 environment:
129 - MEILI_ENV=production
130 env_file:
131 - .env
132 healthcheck:
133 test: ["CMD", "wget", "--no-verbose", "--spider", "http://meilisearch:7700/health"]
134 interval: 30s
135 timeout: 5s
136 retries: 5
137
138 rabbitmq:
139 image: rabbitmq:4-alpine
140 restart: unless-stopped
141 environment:
142 - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER}
143 - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS}
144 healthcheck:
145 test: rabbitmq-diagnostics -q ping
146 interval: 30s
147 timeout: 10s
148 retries: 5
149 start_period: 10s
150
151volumes:
152 kyoo:
153 db:
154 metadata:
155 search:

同时需要创建一个 .env 文件,包含以下必要的环境变量:

1# 媒体库根目录路径
2LIBRARY_ROOT=/path/to/your/media
3
4# 缓存目录路径
5CACHE_ROOT=/path/to/cache
6
7# 数据库配置
8POSTGRES_USER=kyoo
9POSTGRES_PASSWORD=your_password_here
10POSTGRES_DB=kyoo
11
12# RabbitMQ 配置
13RABBITMQ_DEFAULT_USER=kyoo
14RABBITMQ_DEFAULT_PASS=your_rabbitmq_password
15
16# Meilisearch 主密钥
17MEILI_MASTER_KEY=your_master_key_here

打开飞牛 NAS 或其他的 NAS 设备

项目名称可以随便填,点击创建 docker-compose.yml

点击 Compose -> 新建项目

这里需要修改 .env 文件中的路径和密码配置:

- LIBRARY_ROOT: 设置为你的媒体文件存储路径

- CACHE_ROOT: 设置为缓存目录路径

- POSTGRES_PASSWORD: 设置数据库密码

- RABBITMQ_DEFAULT_PASS: 设置消息队列密码

- MEILI_MASTER_KEY: 设置搜索引擎主密钥

如果提示端口被占用可以修改 traefik 服务中的端口映射,但是需要保持格式正确。

创建成功后可以访问 ip:8901 到这里就可以正常显示项目了

穿透公网

打开帕斯内网穿透控制台,点击隧道管理-隧道列表

点击创建新隧道

隧道节点可以随便选,一般选个负载低的就可以

接下来填写信息,隧道名称可以随便填写

本地 IP 默认就可以

传输协议可以选择 TCP 也可以选择 HTTP/HTTPS

HTTP 就是域名的形式,教程以使用 TCP 为演示

本项目默认是 8901 端口,这里本地端口就填 8901

远程端口可以留空也可以自定义。下图仅做参考,请按照实际项目端口添加。

填写完毕点击确定

点击刚才创建好的隧道,点击获取配置文件

回到飞牛 NAS,点击应用中心下载 frpc 客户端

打开后粘贴刚才复制的配置文件,点击确定即可

复制帕斯内网穿透控制台的访问 IP 和端口

可以看到已经正常穿透成功了

本篇教程结束