AzuraCast Docker Compose 部署实战
AzuraCast 0.24.0 官方 Docker 脚本与手工 Compose 双形态部署实战:安装向导、建台、上传曲目、Icecast 拉流验证、端口规划、备份恢复与真实排障实录,Ubuntu 22.04 全量实测。
AzuraCast Docker Compose 部署实战
目标:在一台 Ubuntu 22.04 服务器上,从零完成 AzuraCast 0.24.0 网络电台套件的安装、初始化向导、电台创建、曲目上传与对外串流验证,并沉淀备份与日常运维命令。本文全部命令与回显已在 Ubuntu 22.04(x86_64,Docker 29.9.2 + Compose v5.6.1)真实环境实测通过。
一、环境信息
本文实测所用的服务器环境与软件版本如下,读者可对照检查自己的环境:
- 操作系统:Ubuntu 22.04 LTS(x86_64)
- Docker:29.9.2(
docker --version实测) - Docker Compose:v5.6.1(
docker compose version实测) - AzuraCast:0.24.0(官方 stable 频道最新稳定版,2026-10-25 发布;版本实查自 GitHub Releases,查询日期 2026-10-27)
- 部署形态:官方 Docker 发行(单套件集成全部组件),安装基目录
/var/azuracast - 实测网络说明:宿主机 80/443 端口已被既有服务占用,本文将 Web 端口映射改为宿主 8142(HTTP)/8143(HTTPS),串流端口段 8000–8496 按默认逐一映射。若你的服务器 80/443 空闲,可沿用官方默认值,两者仅端口不同。
- 下载渠道说明:官方镜像仓库
ghcr.io/azuracast/azuracast在国内直连拉取缓慢时,Docker 守护进程已配置 HTTP 代理(192.168.1.62:7897)自动加速;官方安装脚本docker.sh通过 GitHub 原始内容地址下载,当时实测可直连获取。
AzuraCast 的官方安装方式只有一种——官方 Docker 安装脚本(docker.sh)。它内部使用 Docker Compose 拉起全套服务,因此「官方脚本安装」与「手工 Compose 编排」本质是同一套 Compose 形态的两种入口。本文先走官方脚本主线,再给出手工 Compose 方案用于自定义端口/内网隔离等场景。
💡 技术拓展:网络电台的「串流引擎」不止一种。AzuraCast 内置了两个引擎并允许在电台级别选择——
引擎 角色 特点 Icecast 2 前端(面向听众) 开源、mp3/ogg/aac 等多格式、广泛兼容,AzuraCast 默认 SHOUTcast 2 前端(面向听众) Nullsoft 系老牌协议,兼容部分老播放器,需在 Web 界面同意其许可后安装 Liquidsoap 后端(编码推流) 函数式音频编排语言,负责自动播出、交叉淡化、直播接入,AzuraCast 默认 本文使用默认组合:Icecast 2 前端 + Liquidsoap 后端。
二、前置条件
安装前逐项确认,缺一不可:
- 64 位 x86_64(amd64)或 ARM64 服务器,最低配置 2 核 CPU / 2GB 内存 / 20GB 磁盘;官方推荐 4 核 / 4GB 内存 / 40GB 磁盘,可支撑 5–10 个电台(来源:官方 Requirements 页,查询日期 2026-10-27)。
- Linux 发行版首选 Ubuntu 22.04 LTS;已知不兼容 OpenVZ/LXC 虚拟化主机与 CentOS(其转向 Podman,与官方脚本不兼容)。
- 具备 root 或 sudo 权限,且已安装
curl、git、sudo三个基础包:
sudo apt update && sudo apt install -y curl git sudo
- 服务器未安装过 Docker/Compose 也可以——官方脚本会自动安装。已安装则版本不低于官方脚本要求即可(本文实测 29.9.2 可用)。
- 放行防火墙端口:Web 端口(默认 80/443)、SFTP 端口 2022(可选功能)、电台串流端口段 8000–8499(多电台时按需逐段放行)。
# 实测:确认本机端口占用情况,规划映射
ss -ltn | awk '{print $4}' | grep -oE '[0-9]+$' | sort -n | uniq | head -20
实测回显(节选):
22
53
631
8000
8005
...
⚠️ 注意:若 80/443 已被 Nginx 等服务占用,不要停掉既有服务,参照第七章「端口规划与自定义映射」把 AzuraCast 的 Web 端口改到空闲端口(本文实测使用 8142/8143)。
三、官方脚本安装(主线方案)
3.1 方案说明
官方 Docker 安装脚本 docker.sh 是一个自举脚本:首次执行 install 子命令时,它会安装(或校验)Docker 与 Docker Compose、生成 azuracast.env 与 docker-compose.yml、拉取镜像并启动全套服务。这是官方唯一推荐的安装方式,支持 x86_64 与 ARM64。
3.2 下载脚本并执行安装
# 官方标准安装三步(来源:官方文档 Install AzuraCast with Docker,查询日期 2026-10-27)
mkdir -p /var/azuracast
cd /var/azuracast
curl -fsSL https://raw.githubusercontent.com/AzuraCast/AzuraCast/main/docker.sh > docker.sh
chmod a+x docker.sh
./docker.sh install
安装器会依次打印:检测系统架构 → 安装 Docker(如缺失)→ 安装 Docker Compose(如缺失)→ 询问安装渠道(Stable / Rolling)→ 生成 azuracast.env 与 docker-compose.yml → 拉取镜像 → 启动服务。实测环境拉取镜像阶段耗时最长(镜像约 1–2 GB),其余步骤均在数分钟内完成。
⚠️ 网络说明:
raw.githubusercontent.com与ghcr.io在部分网络环境直连缓慢。实测环境 Docker 守护进程已配置代理 192.168.1.62:7897,镜像拉取可自动加速;脚本下载如遇超时,可为 curl 追加代理:curl -x http://192.168.1.62:7897 -fsSL <URL> > docker.sh。
3.3 无人值守安装(可选)
自动化场景(cloud-init、装机脚本)可跳过全部交互:
mkdir -p /var/azuracast
cd /var/azuracast
curl -fsSL https://raw.githubusercontent.com/AzuraCast/AzuraCast/main/docker.sh > docker.sh
chmod a+x docker.sh
# 固定使用 stable 频道(默认是 rolling 频道,生产建议 stable)
yes 'Y' | ./docker.sh setup-release
# 全部询问默认回答,开始安装
yes '' | ./docker.sh install
说明:setup-release 用于把更新频道固定为 stable;不执行该步则安装器默认选择 rolling(滚动更新)频道。频道后续可随时用 ./docker.sh setup-release 切换。
3.4 验证服务状态
安装完成后确认全部服务已拉起:
cd /var/azuracast
docker compose ps
实测回显(端口列表很长,此处节选首尾):
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
azuracast-0.24.0-web ghcr.io/azuracast/azuracast:0.24.0 "tini -- /usr/local/…" web 4 hours ago Up 4 hours 0.0.0.0:2022->2022/tcp, ... 0.0.0.0:8142->80/tcp, 0.0.0.0:8143->443/tcp
再验证 Web 服务可访问(本文宿主端口为 8142,官方默认 80):
curl -sI http://127.0.0.1:8142/ | head -8
实测回显:
HTTP/1.1 302 Found
Server: nginx
Date: Tue, 27 Oct 2026 06:23:12 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
X-Powered-By: PHP/8.5.12
Location: /setup
返回 302 且 Location: /setup 即安装成功——系统尚未初始化,正在等待你完成安装向导。
四、初始化向导与建台实测
4.1 创建超级管理员账号
浏览器打开 http://<服务器IP>:8142/(官方默认端口环境为 http://<服务器IP>/),自动跳转到安装向导。向导共两步:
- 系统设置:填写站点 Base URL(本文填
https://www.quzuo.net)、实例名称(本文填Quzuo 实测站点)、时区(Asia/Shanghai)。 - 创建超级管理员:填写邮箱、姓名、密码。本文使用演示账号:邮箱
admin@quzuo.net、用户名admin、密码q1w2e3r4。
⚠️ 注意:该账号是系统唯一的超级管理员,生产环境务必使用强密码;
q1w2e3r4仅为本文演示口令。
提交后进入登录页,用上述账号登录即可看到管理面板。实测可通过命令行确认账号已生效(登录后创建 API Key,后续脚本化管理都用它):
# 在 Web 界面:右上角头像 → API Keys → Create New Key
# 生成的 Key 形如 "ID:Token" 两段式
4.2 创建第一个电台
登录后进入「Stations」→「Create New Station」:
- Name:
Quzuo FM(系统自动生成 Shortcode:quzuo_fm,电台所有 URL 都基于它) - Description:
AzuraCast 测试电台站 - Genre:
Test - Timezone:
Asia/Shanghai
保存后系统自动完成三件事:分配串流端口(本台为前端 8000、DJ 直播端口 8005、Liquidsoap Telnet 端口 8004,均落在 AUTO_ASSIGN_PORT_MIN/MAX 区间内)、生成 Liquidsoap 与 Icecast 配置、启动播出进程。用 API 确认电台已就绪:
curl -s -H 'X-API-Key: 6176e5175e01d9c5:c05cfa6cfe007454dcea470d8fd329be' 'http://127.0.0.1:8142/api/stations'
实测回显(节选):
[{"id":1,"name":"Quzuo FM","shortcode":"quzuo_fm","description":"AzuraCast 测试电台站","frontend":"icecast","backend":"liquidsoap","timezone":"Asia/Shanghai","listen_url":"http://127.0.0.1/listen/quzuo_fm/radio.mp3",...}]
4.3 上传曲目并开播
电台创建后媒体库为空,系统自动以「离线占位流」播出。上传曲目有三种方式:Web 界面拖拽、SFTP(端口 2022)、API。本文用 API 上传一首本地测试曲目:
curl -s -X POST -H 'X-API-Key: 6176e5175e01d9c5:c05cfa6cfe007454dcea470d8fd329be' \
-F 'file=@/root/tone_a.mp3' \
'http://127.0.0.1:8142/api/station/quzuo_fm/files/upload'
上传成功后系统异步分析音频(时长/码率/CUE),几秒后将其加入「Default Playlist(默认播放列表)」,自动播出队列随即取用。验证当前正在播出:
curl -s -H 'X-API-Key: 6176e5175e01d9c5:c05cfa6cfe007454dcea470d8fd329be' 'http://127.0.0.1:8142/api/stations' | python3 -m json.tool | grep -A2 '"now_playing"'
实测回显(节选):
"now_playing": {
"sh_id": 268435457,
"played_at": 1793080000,
"duration": 20,
"playlist": "Default Playlist",
"stream": "Quzuo FM",
"title": "Quzuo Request Song D",
4.4 拉流验证(Icecast 直连)
电台串流端口(本台 8000)对宿主机直接暴露了 Icecast 挂载点。Icecast 内部挂载名是 /radio.mp3(对外展示地址 /listen/quzuo_fm/radio.mp3 是 Web 网关层的别名,见第八章排障实录)。直接拉流 20 秒验证音频真实可播:
curl -s --max-time 20 -o /tmp/listen-probe.mp3 -w 'HTTP %{http_code}, %{size_download} bytes, %{speed_download} B/s, type: %{content_type}\n' http://127.0.0.1:8000/radio.mp3
实测回显:
HTTP 200, 543826 bytes, 27190 B/s, type: audio/mpeg
用 ffprobe 校验流参数(192 kbps CBR mp3,与电台前端设置一致):
ffprobe -v error -show_entries format=format_name,bit_rate -show_entries stream=codec_name,sample_rate,channels -of default=noprint_wrappers=1 /tmp/listen-probe.mp3
实测回显:
format_name=mp3
bit_rate=192000
codec_name=mp3
sample_rate=44100
channels=2
至此「安装 → 初始化 → 建台 → 上传 → 对外串流」全链路闭环。外部听众访问地址为 http://<服务器IP>:8000/radio.mp3(直连 Icecast)或 http://<服务器IP>:8142/listen/quzuo_fm/radio.mp3(经 Web 网关)。
五、数据持久化说明
官方 Compose 文件把全部状态数据落在命名卷上,升级、重启均不丢数据:
| 卷名 | 容器内路径 | 内容 |
|---|---|---|
db_data | /var/lib/mysql | MariaDB 数据库(歌曲历史、统计、账号、电台配置) |
station_data | /var/azuracast/stations | 各电台媒体库、录音、播客、Liquidsoap/Icecast 配置 |
www_uploads | /var/azuracast/storage/uploads | Web 上传的临时资源、自定义 JS/CSS |
backups | /var/azuracast/backups | 备份产物默认输出目录 |
sftpgo_data | /var/azuracast/storage/sftpgo | SFTP 服务器(SFTPGo)账号数据 |
geolite_install | /var/azuracast/storage/geoip | 听众地理定位数据库(DBIP) |
shoutcast2_install | /var/azuracast/storage/shoutcast2 | SHOUTcast 2 按需安装目录 |
stereo_tool_install / rsas_install | /var/azuracast/storage/... | Stereo Tool / RSAS 音频处理组件按需安装目录 |
acme | /var/azuracast/storage/acme | Let's Encrypt 证书数据 |
关键解读:媒体文件不在数据库里而在 station_data 卷中,因此「仅备份数据库」不能恢复媒体库;做整机备份时务必包含 db_data 与 station_data 两卷(或直接用第十章的 azuracast:backup 全量备份命令,它会同时打包两者)。
六、环境变量表
安装脚本在 /var/azuracast/azuracast.env 生成系统级环境变量(官方模板默认值,全部实测确认):
| 变量 | 默认值 | 说明 |
|---|---|---|
APPLICATION_ENV | production | 运行环境标识;仅开发调试时改 development |
COMPOSER_PLUGIN_MODE | false | 是否启用 Composer 插件扩展机制 |
AUTO_ASSIGN_PORT_MIN | 8000 | 新电台串流端口自动分配区间下限 |
AUTO_ASSIGN_PORT_MAX | 8499 | 自动分配区间上限;与 Compose 端口映射段保持一致 |
SHOW_DETAILED_ERRORS | false | 页面是否显示详细堆栈;生产保持 false |
MYSQL_PASSWORD | azur4c457 | 应用连接 MariaDB 的口令;官方公开默认值,生产必须修改 |
MYSQL_RANDOM_ROOT_PASSWORD | yes | 数据库 root 口令随机化(在数据库初始化时生成) |
修改方式:编辑 /var/azuracast/azuracast.env 后执行 docker compose up -d 重建生效(幂等,数据不丢)。例如生产修改数据库口令:
# 1. 编辑 env 文件,将 MYSQL_PASSWORD 改为新值
sudo vim /var/azuracast/azuracast.env
# 2. 重建服务生效(若数据库卷已初始化过,需同步在数据库内执行 ALTER USER,见第十一章 FAQ)
cd /var/azuracast && docker compose up -d
⚠️ 注意:
MYSQL_PASSWORD只在 MariaDB 数据卷首次初始化时写入。已初始化的环境里改该值需两步:改 env 文件 + 进入数据库执行ALTER USER 'azuracast'@'%' IDENTIFIED BY '<新口令>',否则应用将无法连接数据库。
七、端口规划与自定义映射
7.1 默认端口清单
| 端口 | 用途 | 必需性 |
|---|---|---|
| 80 / 443 | Web 管理界面 + 公开播放页 + 网关层听流地址 | 必需 |
| 2022 | SFTP 媒体管理(SFTPGo) | 可选 |
| 8000–8499 | 电台串流端口自动分配池:每台占用 3 个(前端 / DJ 直播 / Liquidsoap Telnet) | 必需(按电台数) |
| 9000 | 容器内部健康检查端口,无需对外映射 | 内部 |
端口分配规律:第 1 个电台占 8000/8004/8005(前端/Telnet/DJ),第 2 个占 8010/8014/8015,间隔 10 递增——官方 Compose 按 5 端口粒度逐段映射到 8496,即最多预置约 100 个电台的端口池。
7.2 实测环境的端口调整
本文实测服务器 80/443 已被占用,因此把 Web 端口改为 8142/8143,compose 文件中相应两行写为:
ports:
- '8142:80'
- '8143:443'
- '2022:2022'
- '8000:8000'
# ...8005 至 8496 的电台端口池按官方模板逐段映射,实测文件全量见 7.3
- '8495:8495'
- '8496:8496'
电台串流端口(8000)保持默认映射,因此 4.4 节的听流地址不变。若服务器上 8000 段也被占用,可整体调整 AUTO_ASSIGN_PORT_MIN/MAX 并同步修改 compose 端口池,再重启电台(Web 界面电台列表 → Restart Broadcasting,或命令行 azuracast-cli azuracast:radio:restart)。
💡 技术拓展:把内部端口映射到宿主不同端口(
8142:80)与「修改服务监听端口」是两回事。前者只改对外入口,AzuraCast 内部各组件(80/8000/2022)之间互访不变,是端口冲突时的首选;后者需要同时改应用配置与映射,容易遗漏联动项,除非有明确需求否则不推荐。
7.3 手工 Compose 部署方案(备选)
不使用官方脚本、需要把部署纳入自有配置管理(Git/Ansible)时,可用手工 Compose。在安装目录放置两份文件——系统环境文件 azuracast.env(内容与第六章表格一致)与项目环境文件 .env(声明镜像版本,便于一键升级):
# /var/azuracast/.env
AZURACAST_VERSION=0.24.0
编排文件 docker-compose.yml(实测全量,单服务全栈形态):
name: azuracast-0.24.0-stack
services:
web:
container_name: azuracast-0.24.0-web
image: "ghcr.io/azuracast/azuracast:${AZURACAST_VERSION}"
ports:
- '8142:80'
- '8143:443'
- '2022:2022'
- '8000:8000'
- '8005:8005'
- '8006:8006'
- '8010:8010'
- '8015:8015'
- '8016:8016'
- '8020:8020'
- '8025:8025'
- '8026:8026'
- '8030:8030'
- '8035:8035'
- '8036:8036'
- '8040:8040'
- '8045:8045'
- '8046:8046'
- '8050:8050'
- '8055:8055'
- '8056:8056'
- '8060:8060'
- '8065:8065'
- '8066:8066'
- '8070:8070'
- '8075:8075'
- '8076:8076'
- '8080:8080'
- '8085:8085'
- '8086:8086'
- '8090:8090'
- '8095:8095'
- '8096:8096'
- '8100:8100'
- '8105:8105'
- '8106:8106'
- '8110:8110'
- '8115:8115'
- '8116:8116'
- '8120:8120'
- '8125:8125'
- '8126:8126'
- '8135:8135'
- '8136:8136'
- '8145:8145'
- '8146:8146'
- '8155:8155'
- '8156:8156'
- '8160:8160'
- '8165:8165'
- '8166:8166'
- '8170:8170'
- '8175:8175'
- '8176:8176'
- '8180:8180'
- '8185:8185'
- '8186:8186'
- '8190:8190'
- '8195:8195'
- '8196:8196'
- '8200:8200'
- '8205:8205'
- '8206:8206'
- '8210:8210'
- '8215:8215'
- '8216:8216'
- '8220:8220'
- '8225:8225'
- '8226:8226'
- '8230:8230'
- '8235:8235'
- '8236:8236'
- '8240:8240'
- '8245:8245'
- '8246:8246'
- '8250:8250'
- '8255:8255'
- '8256:8256'
- '8260:8260'
- '8265:8265'
- '8266:8266'
- '8270:8270'
- '8275:8275'
- '8276:8276'
- '8280:8280'
- '8285:8285'
- '8286:8286'
- '8290:8290'
- '8295:8295'
- '8296:8296'
- '8300:8300'
- '8305:8305'
- '8306:8306'
- '8310:8310'
- '8315:8315'
- '8316:8316'
- '8320:8320'
- '8325:8325'
- '8326:8326'
- '8330:8330'
- '8335:8335'
- '8336:8336'
- '8340:8340'
- '8345:8345'
- '8346:8346'
- '8350:8350'
- '8355:8355'
- '8356:8356'
- '8360:8360'
- '8365:8365'
- '8366:8366'
- '8370:8370'
- '8375:8375'
- '8376:8376'
- '8380:8380'
- '8385:8385'
- '8386:8386'
- '8390:8390'
- '8395:8395'
- '8396:8396'
- '8400:8400'
- '8405:8405'
- '8406:8406'
- '8410:8410'
- '8415:8415'
- '8416:8416'
- '8420:8420'
- '8425:8425'
- '8426:8426'
- '8430:8430'
- '8435:8435'
- '8436:8436'
- '8440:8440'
- '8445:8445'
- '8446:8446'
- '8450:8450'
- '8455:8455'
- '8456:8456'
- '8460:8460'
- '8465:8465'
- '8466:8466'
- '8470:8470'
- '8475:8475'
- '8476:8476'
- '8480:8480'
- '8485:8485'
- '8486:8486'
- '8490:8490'
- '8495:8495'
- '8496:8496'
env_file:
- azuracast.env
- .env
volumes:
- station_data:/var/azuracast/stations
- backups:/var/azuracast/backups
- db_data:/var/lib/mysql
- www_uploads:/var/azuracast/storage/uploads
- shoutcast2_install:/var/azuracast/storage/shoutcast2
- stereo_tool_install:/var/azuracast/storage/stereo_tool
- rsas_install:/var/azuracast/storage/rsas
- geolite_install:/var/azuracast/storage/geoip
- sftpgo_data:/var/azuracast/storage/sftpgo
- acme:/var/azuracast/storage/acme
restart: unless-stopped
ulimits:
nofile:
soft: 65536
hard: 65536
logging:
options:
max-size: "1m"
max-file: "5"
networks:
- azuracast-0.24.0-net
networks:
azuracast-0.24.0-net:
driver: bridge
ipam:
config:
- subnet: 10.89.70.0/24
volumes:
db_data: { }
acme: { }
shoutcast2_install: { }
stereo_tool_install: { }
rsas_install: { }
geolite_install: { }
sftpgo_data: { }
station_data: { }
www_uploads: { }
backups: { }
配置解读:name: 固定 Compose 项目名,避免多套件共存时项目名冲突;env_file 叠加系统 env 与版本 env 两层;nofile 65536 抬高文件句柄上限(听众并发连接多时必需);logging 限制日志体积防止写满磁盘;自定义 bridge 网络固定子网,便于与服务器上其他部署共存时做网段规划。
启动并验证:
cd /var/azuracast
docker compose up -d
docker compose up -d # 幂等性验证:重复执行无副作用
实测回显:
Container azuracast-0.24.0-web Running
7.4 两种入口对比
| 维度 | 官方脚本(./docker.sh install) | 手工 Compose |
|---|---|---|
| Docker/Compose 安装 | 自动安装 | 需自行预装 |
| compose 文件与 env | 自动生成、随版本更新维护 | 手工维护 |
| 版本升级 | ./docker.sh update 一条命令 | 改 .env 版本号 + docker compose up -d |
| 适用场景 | 标准单机安装(绝大多数用户) | 自定义网段/端口编排、配置统一纳管 |
选择建议:生产单机直接用官方脚本;只有当安装需要融入自己的基础设施即代码体系、或端口/网段需要精细规划时才走手工 Compose。
八、常见问题(FAQ)
Q1:curl http://127.0.0.1:8000/listen/quzuo_fm/radio.mp3 返回 404「The file you requested could not be found」,但 Icecast 状态页明明显示挂载在播?
这是本文实测踩到的真实坑。AzuraCast 对 Icecast 挂载名与对外听流地址做了分层:Icecast 进程内部挂载名是 /radio.mp3(stations/quzuo_fm/config/icecast.xml 中的 <mount-name>),而 /listen/quzuo_fm/radio.mp3 是 Web 网关(Nginx 层)提供的对外别名。两者都能听流,但直连串流端口时必须用内部挂载名:
# 直连 Icecast(串流端口 8000)→ 用挂载名 /radio.mp3
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8000/radio.mp3
实测回显:
200
另外注意:若电台刚被重启(azuracast:radio:restart 或修改电台配置),Icecast 需数秒重建挂载,期间直连老挂载会短暂 404,等自动播出恢复即可。
Q2:宿主机 80/443 已被占用,安装器报端口绑定失败?
不要卸载既有服务。先完成安装(安装本身不校验 80),再把 compose 文件中 '80:80'、'443:443' 两行改为空闲端口(本文 '8142:80'、'8143:443'),docker compose up -d 重建。电台串流端口同理。验证:curl -sI http://127.0.0.1:8142/ 返回 302 即恢复。
Q3:修改 MYSQL_PASSWORD 后应用报数据库连接失败?
该变量只在数据卷首次初始化时生效。已初始化的环境需两步:改 env 文件后,还需在数据库内同步修改应用账号口令(ALTER USER 'azuracast'@'%' IDENTIFIED BY '<新口令>'),再 docker compose up -d。顺序反了会导致应用起不来。
Q4:拉取 ghcr.io/azuracast/azuracast 镜像极慢或超时?
国内网络对 ghcr.io 限速常见。为 Docker 守护进程配置 HTTP 代理(/etc/systemd/system/docker.service.d/http-proxy.conf 中 HTTPS_PROXY=http://192.168.1.62:7897 后 systemctl daemon-reload && systemctl restart docker),或使用支持该镜像的国内镜像加速器。实测环境配置代理后拉取正常。
Q5:电台串流端口从 8000 改不回默认值?
端口是电台属性,在 Web 界面电台设置「Frontend(Icecast)」页修改 port 字段,保存后执行 azuracast-cli azuracast:radio:restart <电台名> 重启播出进程。确认 compose 已映射对应宿主端口,否则外部无法访问。
九、升级与回滚
官方脚本形态下升级一条命令(稳定频道下升级到 stable 最新版):
cd /var/azuracast
./docker.sh update
回滚到指定稳定版(实测脚本内置子命令):
# 交互式选择目标 stable 版本
./docker.sh rollback
手工 Compose 形态下升级=改 .env 中 AZURACAST_VERSION 后 docker compose up -d;回滚同理改回旧版本号。两种形态的数据都在命名卷中,版本切换不丢数据;升级前建议先执行一次全量备份(第十章)。
十、备份与恢复
10.1 全量备份
azuracast-cli azuracast:backup /var/azuracast/backups/station-full
实测回显:
AzuraCast Backup
================
Please wait while a backup is generated...
Backing up MariaDB...
---------------------
Creating backup archive...
--------------------------
adding: var/azuracast/storage/uploads/ (stored 0%)
adding: var/azuracast/stations/quzuo_fm/media/ (stored 0%)
adding: var/azuracast/stations/quzuo_fm/media/tone_a.mp3 (stored 0%)
adding: var/azuracast/stations/quzuo_fm/media/tone_b.mp3 (stored 0%)
adding: var/azuracast/stations/quzuo_fm/media/tone_c.mp3 (stored 0%)
adding: var/azuracast/stations/quzuo_fm/media/tone_d.mp3 (stored 0%)
adding: var/azuracast/stations/quzuo_fm/recordings/ (stored 0%)
adding: var/azuracast/stations/quzuo_fm/podcasts/ (stored 0%)
adding: tmp/azuracast_backup_mariadb/db.sql (deflated 87%)
Cleaning up temporary files...
------------------------------
[OK] Backup complete in 0.10 seconds.
产物自动追加 .zip 后缀,验证:
ls -lah /var/azuracast/backups/
实测回显:
total 2.5M
drwxr-xr-x 2 azuracast azuracast 4.0K Oct 27 06:29 .
drwx------ 1 azuracast azuracast 4.0K Oct 25 14:24 ..
-rw-r--r-- 1 azuracast azuracast 2.5M Oct 27 06:29 station-full.zip
⚠️ 注意(真实踩坑):
path参数是备份文件路径前缀,不能直接写挂载目录本身。实测执行azuracast:backup /var/azuracast/backups(恰好指向备份卷挂载点)报错:In Filesystem.php line 194: Failed to remove directory "/var/azuracast/backups": rmdir(/var/azuracast/b ackups): Device or resource busy原因是备份流程清理临时目录时试图删除挂载点。给 path 追加一层子路径(如
/var/azuracast/backups/station-full)即可。加--exclude-media可只备数据库与统计(速度快,适合高频定时备份),媒体库另用文件系统级备份覆盖station_data卷。
10.2 恢复
azuracast-cli azuracast:restore /var/azuracast/backups/station-full.zip
恢复命令会停播出、清库、导入 SQL 并解压媒体。若备份来自旧版本 AzuraCast,加 --release 指定来源稳定版本、加 --restore 强制恢复流程。恢复完成后执行 azuracast-cli azuracast:setup:migrate 把数据库结构对齐到当前版本,再重启电台。
十一、卸载与清理
# 1. 停止并删除服务(数据卷保留)
cd /var/azuracast && docker compose down --timeout 60
# 2. 连同全部数据卷删除(彻底清除,媒体/数据库全部丢失,先确认已有备份)
docker compose down -v
# 3. 删除安装目录
sudo rm -rf /var/azuracast
若用官方脚本安装且需要连 Docker 一起清,请先确认服务器上没有其他 Docker 业务后再卸载 Docker 本体。
十二、参考链接
- AzuraCast 官网:https://www.azuracast.com/
- 官方 Docker 安装文档:https://www.azuracast.com/docs/getting-started/installation/docker
- 系统要求:https://www.azuracast.com/docs/getting-started/requirements/
- GitHub 仓库:https://github.com/AzuraCast/AzuraCast
- 版本发布页(0.24.0,2026-10-25):https://github.com/AzuraCast/AzuraCast/releases/tag/0.24.0
- 命令行接口文档:https://www.azuracast.com/docs/administration/cli/
- 备份与恢复文档:https://www.azuracast.com/docs/administration/backup/