koel 9.15.0 配置参数详解

Koel 9.15.0 配置参数详解:.env 全量变量按应用基础/数据库/存储/扫描/流式转码/搜索/集成/功能开关/SSO/Laravel 十类逐项解说,含 config:show 实测回显与生产配置模板。

koelkoelLaravel音乐2026/10/29

koel 9.15.0 配置参数详解

目标:把 Koel 9.15.0 的全部配置参数(.env 变量)按用途分类讲清含义、默认值与实测表现,并给出可直接套用的生产配置模板。全部取值与回显在 Ubuntu 24.04.5 LTS 实测实例(部署见《koel 9.15.0 Docker Compose 部署指南》)上验证,镜像内 .env.example(358 行)与运行时 config:show 输出均已逐项核对。

一、环境信息

项目值备注
操作系统Ubuntu 24.04.5 LTS(x86_64)实测服务器
Koel 版本9.15.0配置结构以该版本的 .env.example 与 config/koel.php 为准
运行时PHP 8.4.27 / Laravel 13.24.0php artisan about 实测
数据库MariaDB 10.11.19(DB_CONNECTION=mysql)实测连接正常
应用目录/var/www/koel下文所有 artisan 命令均在该目录执行
配置文件/var/www/koel/.envKoel 全部自定义参数所在(Laravel 约定)
演示管理账号admin@koel.dev / q1w2e3r4实测登录通过

二、前置条件

  1. 已完成 Koel 9.15.0 安装并能正常访问(首次安装见《koel 9.15.0 Docker Compose 部署指南》或官方手动安装文档);
  2. 能登录服务器编辑 /var/www/koel/.env,并能以应用运行用户(www-data)执行 artisan 命令;
  3. 演示账号 admin@koel.dev / q1w2e3r4 已可登录 Web 界面(用于对照界面表现)。

三、参数查看与修改方式

Koel 的自定义参数集中在应用根目录的 .env 文件(KEY=VALUE 格式),全部参数都有"运行时真实值"可查——改配置前后务必用下面三种手段核对,而不是只看文件。

方式 1:直接查看 .env 文件(实测实例的完整内容,33 行):

cat /var/www/koel/.env

实测回显:

APP_NAME=Koel
APP_ENV=production
APP_DEBUG=false
APP_URL=http://127.0.0.1
DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=koel
DB_USERNAME=koel
DB_PASSWORD=koeldb2026
STORAGE_DRIVER=local
MEDIA_PATH=/music
ARTIFACTS_PATH=
IGNORE_DOT_FILES=true
APP_MAX_SCAN_TIME=600
MEMORY_LIMIT=1024
STREAMING_METHOD=php
SCOUT_DRIVER=tntsearch
USE_MUSICBRAINZ=true
TRANSCODE_FLAC=false
ALLOW_DOWNLOAD=true
BACKUP_ON_DELETE=true
PODCASTS_ENABLED=true
RADIO_ENABLED=true
CLEAN_URLS_ENABLED=false
EMBED_ENABLED=true
MAIL_MAILER=log
BROADCAST_CONNECTION=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

方式 2:config:show 查看运行时真实值——比看文件更可信,因为它显示的是"应用此刻实际生效"的值(完整配置树,支持 config:show koel.streaming 这类点号路径下钻):

cd /var/www/koel && php artisan config:show koel.scan

实测回显:

  koel.scan ..................................................................
  timeout ................................................................ 600
  memory_limit .......................................................... 1024
  jobs ..................................................................... 4
php artisan config:show koel.streaming | head -7

实测回显:

  koel.streaming .............................................................
  bitrate ................................................................ 128
  aac_fast .............................................................. true
  method .......................................................... x-sendfile
  ffmpeg_path ................................................ /usr/bin/ffmpeg
  transcode_flac ....................................................... false
  transcode_timeout ...................................................... 300
php artisan config:show scout | head -6 && php artisan config:show database.default

实测回显:

  scout ......................................................................
  driver ........................................................... tntsearch
  prefix .....................................................................
  queue ................................................................ false
  after_commit ......................................................... false
  chunk ⇁ searchable ..................................................... 500

  database.default ..................................................... mysql

方式 3:koel:doctor 一屏总览关键配置的健康状态(目录权限、数据库、搜索索引、FFmpeg、集成状态、流式方式等十余项,详见《koel 9.15.0 常用 CLI 命令与工具详解》)。

修改生效规则(重要):

  1. 编辑 .env 后需清配置缓存并重启应用进程:php artisan config:clear 后重启 php-fpm/Apache(或容器);
  2. 进程环境变量优先于 .env 文件:若运行环境注入了同名变量(systemd 的 Environment=、shell 导出、编排平台的 environment 等),.env 中的同名项会被静默覆盖——本文实测实例就发生了 .env 写 STREAMING_METHOD=php 而运行时实际为 x-sendfile 的现象,核辨方法见第七章 FAQ Q1。

四、参数总览

Koel 9.15.0 的 .env.example 共 358 行,约 70 个变量。按用途归为十类,总览如下(★=本文实测实例已启用并验证的项):

分类代表变量一句话作用
应用基础★APP_NAME、★APP_ENV、★APP_DEBUG、★APP_URL、TRUSTED_HOSTS、TRUSTED_PROXIES、APP_KEY、FORCE_HTTPS应用标识、环境、安全边界
数据库★DB_CONNECTION、★DB_HOST、★DB_PORT、★DB_DATABASE、★DB_USERNAME、★DB_PASSWORD、DATABASE_URL、MYSQL_ATTR_SSL_CA关系库连接
媒体存储★STORAGE_DRIVER、★MEDIA_PATH、★ARTIFACTS_PATH、AWS_、SFTP_、WEBDAV_、DROPBOX_、IMAGE_STORAGE_*音频与图片的存放位置
扫描与媒体库★IGNORE_DOT_FILES、★APP_MAX_SCAN_TIME、★MEMORY_LIMIT、SCAN_JOBS、SYNC_LOG_LEVEL扫描行为与资源上限
流式与转码★STREAMING_METHOD、★TRANSCODE_FLAC、FFMPEG_PATH、TRANSCODE_BIT_RATE、TRANSCODE_AAC_FAST、TRANSCODE_TIMEOUT、CDN_URL音频出流方式与实时转码
搜索★SCOUT_DRIVER、ALGOLIA_APP_ID、ALGOLIA_SECRET、MEILISEARCH_HOST、MEILISEARCH_KEY全文搜索引擎选择
元数据与集成★USE_MUSICBRAINZ、MUSICBRAINZ_USER_AGENT、LASTFM_API_KEY/SECRET、LISTENBRAINZ_API_ENDPOINT、SPOTIFY_CLIENT_ID/SECRET、YOUTUBE_API_KEY、TICKETMASTER_*、IPINFO_TOKEN封面/MBID/scrobble 等外部服务
功能开关★ALLOW_DOWNLOAD、★BACKUP_ON_DELETE、MEDIA_BROWSER_ENABLED、★CLEAN_URLS_ENABLED、★EMBED_ENABLED、★PODCASTS_ENABLED、★RADIO_ENABLED模块与能力开关
SSO 与代理认证SSO_GOOGLE_、SSO_OIDC_、SSO_DEFAULT_ROLE、PROXY_AUTH_*免密登录与企业身份对接
Laravel 基础★MAIL_MAILER、★BROADCAST_CONNECTION、★CACHE_DRIVER、★QUEUE_CONNECTION、★SESSION_DRIVER、★SESSION_LIFETIME、PUSHER_*、SENTRY_LARAVEL_DSN、FILESYSTEM_DISK框架层驱动选型

💡 技术拓展:Koel 的全文搜索走 Laravel Scout 抽象层,可选驱动不止一种——

驱动原理适用场景
tntsearch纯 PHP 全文索引,数据在本地文件,零外部依赖默认;中小库(数万首内)个人部署
database直接用数据库 LIKE/FULLTEXT 查询不想维护索引文件的极简场景
meilisearch独立 MeiliSearch 服务,毫秒级搜索大库(十万首级)、要求即时搜索体验
algoliaSaaS 托管搜索不介意第三方托管与费用

实测实例采用默认 tntsearch(config:show scout 实测 driver=tntsearch),个人库规模下无需额外维护搜索引擎服务。

五、核心参数分类详解

5.1 应用基础

APP_NAME=Koel
APP_ENV=production
APP_DEBUG=false
APP_URL=http://127.0.0.1
TRUSTED_HOSTS=
TRUSTED_PROXIES=PRIVATE_SUBNETS
APP_KEY=base64:...        # 首次初始化自动生成
FORCE_HTTPS=
参数默认值说明
APP_NAMEKoel应用名;同时是 Sanctum 令牌签发名(实测令牌所属应用名即 Koel)
APP_ENVproduction运行环境;实测 about 输出 Environment=production、Debug Mode=OFF
APP_DEBUGfalse调试开关;生产必须 false,否则异常页暴露堆栈
APP_URLhttp://localhost:8000对外访问地址,影响生成的绝对链接(封面 URL、密码重置链接等);实测实例为 http://127.0.0.1
TRUSTED_HOSTS空逗号分隔的合法主机名白名单,空=不限制;支持 *.example.com 通配
TRUSTED_PROXIESPRIVATE_SUBNETS信任 X-Forwarded-* 的反代 IP 列表;默认仅信任私网网段
APP_KEY空(自动生成)32 字节加密密钥;更换后所有已签发令牌失效、加密数据不可解,实测登录返回的 token/audio-token 均依赖它
FORCE_HTTPS空反代后 HTTPS 探测失败时置 true 强制生成 https 链接

验证:改 APP_DEBUG 前后用 php artisan about 对照 Debug Mode 行(实测 OFF)。

5.2 数据库

DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=koel
DB_USERNAME=koel
DB_PASSWORD=koeldb2026
DATABASE_URL=
MYSQL_ATTR_SSL_CA=
参数默认值说明
DB_CONNECTIONmysql驱动值域(实测 .env.example 注释):mysql(MySQL/MariaDB 默认)、mariadb、pgsql(PostgreSQL)、sqlsrv(SQL Server)、sqlite-persistent(本地 SQLite 文件)
DB_HOST127.0.0.1数据库主机;实测实例为容器编排服务名 database
DB_PORT3306端口,随驱动变化(pgsql 为 5432)
DB_DATABASE / DB_USERNAME / DB_PASSWORDkoel / koel / 空库名与凭据
DATABASE_URL空整串连接 URL(Heroku 类平台),设置后替代上面散装五项
MYSQL_ATTR_SSL_CA空MySQL over SSL 的根 CA 绝对路径

实测连接验证:php artisan koel:doctor(实测输出 "Checking database connection .... OK")或 php artisan db:show。数据库侧实测共 40 张业务表(songs、albums、artists、playlists、podcasts、radio_stations、personal_access_tokens 等)。

5.3 媒体存储

STORAGE_DRIVER=local
MEDIA_PATH=/music
ARTIFACTS_PATH=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_REGION=
AWS_ENDPOINT=
AWS_BUCKET=
SFTP_HOST=
SFTP_PORT=
SFTP_ROOT=
SFTP_USERNAME=
SFTP_PASSWORD=
SFTP_PRIVATE_KEY=
SFTP_PASSPHRASE=
WEBDAV_BASE_URL=
WEBDAV_USERNAME=
WEBDAV_PASSWORD=
WEBDAV_PATH_PREFIX=
DROPBOX_APP_KEY=
DROPBOX_APP_SECRET=
DROPBOX_REFRESH_TOKEN=
IMAGE_STORAGE_DRIVER=local
IMAGE_STORAGE_DIR=storage/images
IMAGE_STORAGE_BUCKET=
IMAGE_STORAGE_URL=
参数默认值说明
STORAGE_DRIVERlocal值域(实测 .env.example 注释):local 本地磁盘;sftp SFTP 服务器;s3 / dropbox / webdav 为 Koel Plus 专属(实测免费实例 koel:license:status 返回 "No license found",配了也用不了)
MEDIA_PATH空local 驱动的媒体库根目录(绝对路径);实测实例为 /music,扫描与上传均落在此目录(实测扫描 "Scanning /music with 4 parallel workers")
ARTIFACTS_PATH空转码产物、播客下载等中间文件目录;空=系统临时目录/koel(实测 doctor 显示 "Artifacts directory /tmp/koel/ is readable/writable .... OK")
AWS_* / SFTP_* / WEBDAV_* / DROPBOX_*空对应驱动的连接凭据,启用相应驱动时才需要
IMAGE_STORAGE_DRIVER / DIRlocal / storage/images封面与头像的存储;可独立设为 s3 并配独立桶

💡 技术拓展:媒体存储后端(STORAGE_DRIVER)是典型的多选架构点——local 性能最好且零依赖但受单机磁盘约束;sftp 适合媒体在 NAS/远程盘;s3/dropbox/webdav 属 Plus,把库托管到对象存储适合多实例或超大库。实测实例数据量小且本地盘充裕,采用 local。

5.4 扫描与媒体库

IGNORE_DOT_FILES=true
APP_MAX_SCAN_TIME=600
MEMORY_LIMIT=1024
SCAN_JOBS=
SYNC_LOG_LEVEL=error
参数默认值说明
IGNORE_DOT_FILEStrue扫描时跳过点文件/点目录(.git、.cache 等),大目录显著提速;媒体确在点目录下才改 false
APP_MAX_SCAN_TIME600网页端触发扫描的超时秒数(CLI 的 koel:scan 不受此限,实测 .env.example 注释明确说明)
MEMORY_LIMIT空扫描进程内存上限 MB;实测设 1024,运行时确认 config:show koel.scan 输出 memory_limit=1024
SCAN_JOBS4并行扫描 worker 数;实测 config:show koel.scan 输出 jobs=4,koel:scan 回显 "Scanning /music with 4 parallel workers"
SYNC_LOG_LEVELerror扫描日志粒度:all(全量)/ error(默认,仅报错);日志在 storage/logs/

5.5 流式与转码

STREAMING_METHOD=php
TRANSCODE_FLAC=false
FFMPEG_PATH=
TRANSCODE_BIT_RATE=128
TRANSCODE_AAC_FAST=true
TRANSCODE_TIMEOUT=300
CDN_URL=
参数默认值说明
STREAMING_METHODphp值域(实测 .env.example 注释):php / x-sendfile / x-accel-redirect;移动 App 场景官方强烈建议后两者;实测实例运行时为 x-sendfile(来源与核辨见第七章 FAQ Q1)
TRANSCODE_FLACfalseFLAC 实时转 AAC 开关;实测关闭(FLAC 原样直出)
FFMPEG_PATH空(自动探测)ffmpeg 绝对路径;实测自动探测为 /usr/bin/ffmpeg(koel:doctor 输出 "FFmpeg binary /usr/bin/ffmpeg is executable .... OK")
TRANSCODE_BIT_RATE128转码码率 kbps;运行时实测 koel.streaming.bitrate=128(兼容旧变量名 OUTPUT_BIT_RATE)
TRANSCODE_AAC_FASTtrue用 FFmpeg 快速 AAC 编码器(快且高码率下质量好);false 用慢速 twoloop
TRANSCODE_TIMEOUT300单文件转码超时秒;0=不限(不建议)
CDN_URL空媒体文件 CDN 前缀,映射到站点根;无 CDN 不配

流式方式核验命令与实测回显:

php artisan config:show koel.streaming | grep method

实测回显:

  method .......................................................... x-sendfile

5.6 搜索

SCOUT_DRIVER=tntsearch
ALGOLIA_APP_ID=
ALGOLIA_SECRET=
MEILISEARCH_HOST=
MEILISEARCH_KEY=
参数默认值说明
SCOUT_DRIVERtntsearch值域(实测 .env.example 注释):tntsearch(默认)/ database / algolia / meilisearch;运行时实测 driver=tntsearch
ALGOLIA_APP_ID / ALGOLIA_SECRET空Algolia 凭据
MEILISEARCH_HOST / MEILISEARCH_KEY空MeiliSearch 服务地址与密钥

切换驱动后需重建索引:php artisan koel:search:import(实测回显为 Song/Album/Artist/Playlist/Podcast 五类模型逐个 Imported)。

5.7 元数据与外部集成

USE_MUSICBRAINZ=true
MUSICBRAINZ_USER_AGENT=
LASTFM_API_KEY=
LASTFM_API_SECRET=
LISTENBRAINZ_API_ENDPOINT=
SPOTIFY_CLIENT_ID=
SPOTIFY_CLIENT_SECRET=
YOUTUBE_API_KEY=
TICKETMASTER_API_KEY=
TICKETMASTER_DEFAULT_COUNTRY_CODE=US
IPINFO_TOKEN=
参数默认值说明
USE_MUSICBRAINZtrue用 MusicBrainz 社区音乐库补全艺人/专辑/曲目元数据;实测开启
MUSICBRAINZ_USER_AGENT空(自动生成)访问 MusicBrainz 的 UA;空则按站点 URL+版本生成
LASTFM_API_KEY / SECRET空Last.fm 集成(艺术家信息 + scrobble);需在 last.fm/api 创建 API 账号
LISTENBRAINZ_API_ENDPOINT空ListenBrainz 上报端点;不填用官方服务,用户在个人资料页自助连接
SPOTIFY_CLIENT_ID / SECRET空Spotify 封面补全
YOUTUBE_API_KEY空YouTube 集成
TICKETMASTER_* / IPINFO_TOKEN空 / 空演出推荐集成(按用户 IP 定位国家)

集成是否就绪用 koel:doctor 一屏可见,实测回显(未申请 Key 时的形态):

  Last.fm integration .......................................... Not available
  YouTube integration .......................................... Not available
  Spotify integration .......................................... Not available

5.8 功能开关

ALLOW_DOWNLOAD=true
BACKUP_ON_DELETE=true
MEDIA_BROWSER_ENABLED=false
CLEAN_URLS_ENABLED=false
EMBED_ENABLED=true
PODCASTS_ENABLED=true
RADIO_ENABLED=true
参数默认值说明
ALLOW_DOWNLOADtrue允许歌曲下载
BACKUP_ON_DELETEtrue从文件系统删除歌曲前先备份一份(误删保险)
MEDIA_BROWSER_ENABLEDfalse资源管理器式媒体浏览器(Plus 功能)
CLEAN_URLS_ENABLEDfalse伪静态 URL(/albums 代替 /#/albums);实测关闭
EMBED_ENABLEDtrue允许歌曲/专辑/歌单外链嵌入第三方站点
PODCASTS_ENABLEDtrue播客模块;实测开启(koel:podcasts:sync 可运行,空库返回 "No podcasts to sync.")
RADIO_ENABLEDtrue电台模块;实测开启(radio_stations 表存在)

5.9 SSO 与反向代理认证

SSO_GOOGLE_CLIENT_ID=
SSO_GOOGLE_CLIENT_SECRET=
SSO_GOOGLE_HOSTED_DOMAIN=yourdomain.com
SSO_OIDC_ISSUER=
SSO_OIDC_CLIENT_ID=
SSO_OIDC_CLIENT_SECRET=
SSO_OIDC_BUTTON_LABEL=
SSO_DEFAULT_ROLE=user
PROXY_AUTH_ENABLED=false
PROXY_AUTH_USER_HEADER=remote-user
PROXY_AUTH_PREFERRED_NAME_HEADER=remote-preferred-name
PROXY_AUTH_ALLOW_LIST=
参数默认值说明
SSO_GOOGLE_*空Google OAuth 单点登录;三项配齐即自动启用 SSO
SSO_OIDC_*空通用 OIDC 提供商(实测 .env.example 注释点名 Authentik、Authelia、Keycloak、Zitadel);ISSUER 填暴露 /.well-known/openid-configuration 的 URL
SSO_DEFAULT_ROLEuserSSO 首登用户被授予的角色:user(默认)或 guest
PROXY_AUTH_ENABLEDfalse反向代理头认证(Authelia 类网关后部署)
PROXY_AUTH_USER_HEADERremote-user携带用户唯一标识的请求头名
PROXY_AUTH_ALLOW_LIST空允许注入认证头的代理 IP/CIDR 白名单;空=全部拒绝(等效禁用)

5.10 Laravel 基础驱动

MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
BROADCAST_CONNECTION=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=
SENTRY_LARAVEL_DSN=
SQS_PUBLIC_KEY=
SQS_SECRET_KEY=
SQS_QUEUE_PREFIX=
SQS_QUEUE_NAME=
SQS_QUEUE_REGION=
参数默认值说明
MAIL_MAILERsmtp邮件驱动;实测 log(写日志不真发)——个人部署无邀请邮件需求时最省事;需邀请成员/找回密码才配 smtp
BROADCAST_CONNECTIONlog事件广播驱动;实测 log。配 pusher 可获得"远程遥控播放、后台上传完成实时刷新"等增强(需同时填 PUSHER_*)
CACHE_DRIVERfile缓存驱动;实测 file。多实例或高频访问可换 redis
QUEUE_CONNECTIONsync队列驱动;实测 sync(同步执行)。上传后处理较多时建议 database/redis + 常驻队列进程
SESSION_DRIVER / SESSION_LIFETIMEfile / 120会话存储与有效期(分钟)
FILESYSTEM_DISKlocalLaravel 文件系统默认盘
PUSHER_*空Pusher 凭据(配合 BROADCAST_CONNECTION=pusher)
SENTRY_LARAVEL_DSN空Sentry 异常上报;实测 about 显示 Enabled=MISSING DSN(未配置即关闭)
SQS_*空AWS SQS 队列配置

六、生产配置模板

以下模板按三档典型场景给出,均已在实测实例的参数值域内验证过取值合法性;直接替换 .env 相应段落即可。

模板 A:个人自用(1–2 人,库 ≤1 万首,8GB 内存 / 机械盘或 SATA SSD)——实测实例即此档:

APP_ENV=production
APP_DEBUG=false
DB_CONNECTION=mysql
DB_HOST=database
STORAGE_DRIVER=local
MEDIA_PATH=/music
IGNORE_DOT_FILES=true
APP_MAX_SCAN_TIME=600
MEMORY_LIMIT=1024
SCAN_JOBS=4
STREAMING_METHOD=x-sendfile
TRANSCODE_FLAC=false
SCOUT_DRIVER=tntsearch
USE_MUSICBRAINZ=true
ALLOW_DOWNLOAD=true
BACKUP_ON_DELETE=true
PODCASTS_ENABLED=true
RADIO_ENABLED=true
MAIL_MAILER=log
BROADCAST_CONNECTION=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

要点:搜索/队列/缓存全用零依赖默认值,FLAC 不转码(文件少、盘慢时转码反而增加卡顿),流式用 x-sendfile 为移动 App 做准备。

模板 B:家庭多用户(3–8 人,库 1–5 万首,16GB 内存 / NVMe SSD):

APP_ENV=production
APP_DEBUG=false
DB_CONNECTION=mysql
STORAGE_DRIVER=local
MEDIA_PATH=/music
ARTIFACTS_PATH=/var/koel-artifacts
IGNORE_DOT_FILES=true
APP_MAX_SCAN_TIME=1800
MEMORY_LIMIT=2048
SCAN_JOBS=8
STREAMING_METHOD=x-sendfile
TRANSCODE_FLAC=true
TRANSCODE_BIT_RATE=192
TRANSCODE_TIMEOUT=600
SCOUT_DRIVER=tntsearch
USE_MUSICBRAINZ=true
ALLOW_DOWNLOAD=true
BACKUP_ON_DELETE=true
PODCASTS_ENABLED=true
RADIO_ENABLED=true
EMBED_ENABLED=false
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
BROADCAST_CONNECTION=pusher
CACHE_DRIVER=file
QUEUE_CONNECTION=database
SESSION_DRIVER=file
SESSION_LIFETIME=1440

要点:多 FLAC 收藏开转码(弱终端播 192k AAC 更顺);扫描资源翻倍;邮箱配 smtp 以支持成员邀请与密码找回;队列用 database 让上传后处理异步化;对外分享少时关 EMBED。

模板 C:大库/团队(≥5 万首或团队 10+ 人,32GB 内存 / NVMe,另备 MeiliSearch 与 S3 兼容存储):

APP_ENV=production
APP_DEBUG=false
DB_CONNECTION=mariadb
STORAGE_DRIVER=s3
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
AWS_REGION=auto
AWS_ENDPOINT=https://<s3-兼容服务>
AWS_BUCKET=koel-media
MEDIA_PATH=
ARTIFACTS_PATH=/var/koel-artifacts
SCAN_JOBS=8
MEMORY_LIMIT=4096
APP_MAX_SCAN_TIME=3600
STREAMING_METHOD=x-accel-redirect
TRANSCODE_FLAC=true
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://<meilisearch>:7700
MEILISEARCH_KEY=${MEILISEARCH_KEY}
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
BROADCAST_CONNECTION=pusher
SENTRY_LARAVEL_DSN=${SENTRY_LARAVEL_DSN}

要点:第三方凭据一律经环境变量注入(${VAR}),不落 .env 明文;s3 存储为 Plus 功能需先激活许可;搜索换 MeiliSearch、缓存/队列/会话换 redis,为本机 tntsearch 索引与文件缓存减负;x-accel-redirect 配合 Nginx 出流。

七、常见问题(FAQ)

Q1:.env 里写 STREAMING_METHOD=php,为什么运行时是 x-sendfile?

实测排查实录:先看文件——

grep STREAMING_METHOD /var/www/koel/.env

实测回显:

STREAMING_METHOD=php

再看运行时——

php artisan config:show koel.streaming | grep method

实测回显:

  method .......................................................... x-sendfile

两者不一致说明该值不是来自 .env 文件:Laravel 读取配置时进程环境变量优先于 .env 文件,实测实例的运行环境(Koel 官方应用镜像的内置环境变量)注入了 STREAMING_METHOD=x-sendfile。核辨方法:

printenv STREAMING_METHOD

实测回显:

x-sendfile

结论与解决:环境变量 > .env。想让 .env 的值生效,必须让运行环境不再注入同名变量(编排层面覆盖),改完用 config:show 复核。这条优先级规则对所有 KEY 都成立,排查"改了不生效"时先 printenv 再怀疑缓存。

Q2:改了 .env 但界面行为没变?

三步核查:① printenv <KEY> 确认没有同名环境变量覆盖(见 Q1);② php artisan config:clear 清配置缓存(若开启过 config:cache,缓存未清前 .env 改动不可见);③ 重启应用进程(php-fpm/Apache 或容器)后用 config:show 核对生效值。

Q3:koel:doctor 里 Last.fm/YouTube/Spotify 显示 Not available 是故障吗?

不是。这些集成都需要先到对应平台申请 API Key 并写入 .env(见 5.7 节),未配置时 doctor 如实显示 Not available(实测回显见 5.7 节)。配置后重跑 doctor 应显示 OK。

Q4:上传大文件失败,跟 MEMORY_LIMIT 有关吗?

无关。MEMORY_LIMIT(实测 1024)只限定扫描进程的内存上限(config:show koel.scan 的 memory_limit 项)。上传大小受 PHP 的 upload_max_filesize/post_max_size 与 Web 服务器 client_max_body_size(Nginx)限制——实测实例 koel:doctor 显示 "Max upload size ....... 800M",即应用镜像预设的 PHP 上传上限;自建环境按需调大 php.ini 相应项。

Q5:忘记管理员密码怎么办?

用 CLI 重置(实测可用的完整过程见《koel 9.15.0 常用 CLI 命令与工具详解》4.5 节):

cd /var/www/koel && php artisan koel:admin:change-password admin@koel.dev

按提示两次输入新密码,实测回显(输入不回显):

Changing the user's password (ID: 1, email: admin@koel.dev)
Alrighty, the new password has been saved. Enjoy! 👌

Q6:换了 APP_KEY 后所有人都要重新登录?

是。APP_KEY 参与令牌与加密数据签名,实测登录返回的 token/audio-token 与之绑定。除非密钥泄露,不要更换;确需更换后让用户重新登录即可,媒体库数据不受影响(存在数据库中,与 APP_KEY 无关)。

八、参考链接