
freshrss/freshrss!Docker Pulls  apt install docker-compose-v2
shdocker run -d --restart unless-stopped --log-opt max-size=10m \ -p 8080:80 \ -e TZ=Asia/Shanghai \ -e 'CRON_MIN=1,31' \ -v freshrss_data:/var/www/FreshRSS/data \ -v freshrss_extensions:/var/www/FreshRSS/extensions \ --name freshrss \ freshrss/freshrss
参数说明:
-p 8080:80:将容器 80 端口映射到主机 8080 端口-e TZ=Asia/Shanghai:设置时区(默认 UTC)-e 'CRON_MIN=1,31':设置定时刷新订阅的分钟数(每小时的第 1 和 31 分钟)-v freshrss_data:/var/www/FreshRSS/data:持久化存储数据-v freshrss_extensions:/var/www/FreshRSS/extensions:持久化存储扩展通过浏览器访问 [***],通过 FreshRSS 网页界面完成安装,或使用命令行方式(见下文)。
可通过容器内的 CLI 命令管理 FreshRSS,命令格式:
shdocker exec --user www-data freshrss 命令
注意:使用 Alpine 版本镜像时,需将
--user www-data替换为--user apache
sh# 执行基础安装 docker exec --user www-data freshrss cli/do-install.php --default-user freshrss # 创建管理员用户 docker exec --user www-data freshrss cli/create-user.php --user freshrss --password freshrss
sh# 列出所有用户 docker exec --user www-data freshrss cli/list-users.php # 更新所有订阅源 docker exec --user www-data freshrss cli/actualize-user.php --user freshrss
Docker 镜像标签对应不同的 FreshRSS 版本和分支:
| 标签格式 | 说明 |
|---|---|
:latest | 默认标签,指向最新稳定版 |
:edge | 滚动更新版本,对应 git 的 edge 分支 |
:x.y.z | 特定版本,如 :1.21.0 |
:x | 主版本系列,如 :1 会自动更新到最新的 1.x 版本 |
*-alpine | 基于 Alpine Linux 的轻量版本,如 :latest-alpine |
| 变量名 | 默认值 | 说明 |
|---|---|---|
TZ | UTC | 服务器时区,参考 PHP 时区列表 |
CRON_MIN | 未设置 | cron 任务分钟数,如 1,31 表示每小时的第 1 和 31 分钟执行 |
DATA_PATH | 空 | 可写数据路径,由 constants.php 或 constants.local.php 定义 |
FRESHRSS_ENV | production | 运行环境,设为 development 启用开发模式(更多日志输出) |
COPY_LOG_TO_SYSLOG | On | 是否将日志复制到 syslog |
COPY_SYSLOG_TO_STDERR | On | 是否将 syslog 复制到标准错误输出(docker logs 可见) |
LISTEN | 80 | 内部 Apache 监听地址和端口,如 0.0.0.0:8080 |
FRESHRSS_INSTALL | 未设置 | 自动安装参数,仅在首次运行时生效 |
FRESHRSS_USER | 未设置 | 自动创建用户参数,仅在首次运行时生效 |
TRUSTED_PROXY | 未设置 | 受信任代理 IP 范围,影响日志记录和外部认证 |
OIDC_ENABLED | 0 | 是否启用 OpenID Connect 认证(仅 Debian 版本支持) |
sh# 拉取最新镜像 docker pull freshrss/freshrss # 停止并备份当前容器 docker stop freshrss docker rename freshrss freshrss_old # 启动新容器(使用之前的运行命令) docker run ... --name freshrss freshrss/freshrss # 确认正常运行后删除旧容器 docker rm freshrss_old
对于 Docker Hub 未提供的架构(如非 x64/arm 平台),可自行构建镜像:
sh# 构建 Alpine 版本(latest 分支) docker build --pull --tag freshrss/freshrss:latest -f Docker/Dockerfile-Alpine [***] # 构建 Debian 版本(edge 分支) docker build --pull --tag freshrss/freshrss:edge -f Docker/Dockerfile [***]
挂载本地代码目录进行开发:
shcd ./FreshRSS/ docker run --rm \ -p 8080:80 \ -e FRESHRSS_ENV=development \ -e TZ=Asia/Shanghai \ -e 'CRON_MIN=1,31' \ -v $(pwd):/var/www/FreshRSS \ -v freshrss_data:/var/www/FreshRSS/data \ --name freshrss \ freshrss/freshrss:edge
此命令会将当前目录的代码挂载到容器中,在 8080 端口启动服务,并输出详细日志。按 Ctrl+C 停止服务。
FreshRSS 默认使用 SQLite 数据库,也可配置 PostgreSQL 或 MySQL/MariaDB。
shdocker network create freshrss-network
sh# 启动 PostgreSQL 容器 docker run -d --restart unless-stopped --log-opt max-size=10m \ -v pgsql_data:/var/lib/postgresql/data \ -e POSTGRES_DB=freshrss \ -e POSTGRES_USER=freshrss \ -e POSTGRES_PASSWORD=freshrss \ --net freshrss-network \ --name freshrss-db postgres
在 FreshRSS 安装界面中,数据库主机填写容器名 freshrss-db。
sh# 启动 MariaDB 容器 docker run -d --restart unless-stopped --log-opt max-size=10m \ -v mysql_data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=rootpass \ -e MYSQL_DATABASE=freshrss \ -e MYSQL_USER=freshrss \ -e MYSQL_PASSWORD=freshrss \ --net freshrss-network \ --name freshrss-db mariadb
创建 .env 文件:
iniBASE_URL=[***] ADMIN_EMAIL=*** ADMIN_PASSWORD=your_secure_password ADMIN_API_PASSWORD=your_api_password PUBLISHED_PORT=8080 DB_HOST=freshrss-db DB_BASE=freshrss DB_PASSWORD=freshrss DB_USER=freshrss
yamlvolumes: data: extensions: db_data: services: freshrss: image: freshrss/freshrss:latest restart: unless-stopped logging: options: max-size: 10m ports: - "${PUBLISHED_PORT}:80" volumes: - data:/var/www/FreshRSS/data - extensions:/var/www/FreshRSS/extensions environment: TZ: Asia/Shanghai CRON_MIN: '2,32' FRESHRSS_ENV: production LISTEN: 0.0.0.0:80 TRUSTED_PROXY: 172.16.0.1/12 192.168.0.1/16 FRESHRSS_INSTALL: |- --api-enabled --base-url ${BASE_URL} --db-base ${DB_BASE} --db-host ${DB_HOST} --db-password ${DB_PASSWORD} --db-type pgsql --db-user ${DB_USER} --default-user admin --language zh-CN FRESHRSS_USER: |- --api-password ${ADMIN_API_PASSWORD} --email ${ADMIN_EMAIL} --language zh-CN --password ${ADMIN_PASSWORD} --user admin depends_on: - freshrss-db networks: - freshrss-network freshrss-db: image: postgres:14-alpine restart: unless-stopped logging: options: max-size: 10m volumes: - db_data:/var/lib/postgresql/data environment: POSTGRES_DB: ${DB_BASE} POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} networks: - freshrss-network networks: freshrss-network:
sh# 启动服务 docker compose up -d # 查看日志 docker compose logs -f --timestamps # 停止服务 docker compose down --remove-orphans
在 docker-compose.yml 中添加 Traefik 标签:
yamllabels: - traefik.enable=true - traefik.http.routers.freshrss.rule=Host(`freshrss.example.com`) - traefik.http.routers.freshrss.entrypoints=websecure - traefik.http.routers.freshrss.tls.certresolver=myresolver
yamllabels: - traefik.enable=true - traefik.http.middlewares.freshrss-stripprefix.stripprefix.prefixes=/freshrss - traefik.http.routers.freshrss.middlewares=freshrss-stripprefix - traefik.http.routers.freshrss.rule=PathPrefix(`/freshrss`) - traefik.http.routers.freshrss.entrypoints=websecure - traefik.http.routers.freshrss.tls.certresolver=myresolver
作为子目录部署的 Apache 配置示例:
apacheProxyPreserveHost On <Location /freshrss/> ProxyPass [***] ProxyPassReverse [***] RequestHeader set X-Forwarded-Prefix "/freshrss" RequestHeader set X-Forwarded-Proto "https" Require all granted Options none </Location>
nginxupstream freshrss { server 127.0.0.1:8080; keepalive 64; } server { listen 80; server_name example.com; return 301 [***] } server { listen 443 ssl http2; server_name example.com; # SSL 配置省略 location /freshrss/ { proxy_pass [***] add_header X-Frame-Options SAMEORIGIN; add_header X-XSS-Protection "1; mode=block"; proxy_redirect off; proxy_buffering off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Prefix /freshrss/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_read_timeout 90; proxy_set_header Authorization $http_authorization; proxy_pass_header Authorization; } }
通过 CRON_MIN 环境变量启用,如:
shdocker run ... -e 'CRON_MIN=13,43' ... freshrss/freshrss
在主机创建 cron 任务:
text7,37 * * * * root docker exec --user www-data freshrss php ./app/actualize_script.php > /tmp/FreshRSS.log 2>&1
Debian 版本示例:
shdocker run -d --restart unless-stopped --log-opt max-size=10m \ -v freshrss_data:/var/www/FreshRSS/data \ -v freshrss_extensions:/var/www/FreshRSS/extensions \ -e 'CRON_MIN=17,47' \ --net freshrss-network \ --name freshrss_cron freshrss/freshrss \ cron -f
FreshRSS 配置存储在 data/config.php 中,可通过以下步骤修改:
sh# 查看数据卷路径 docker volume inspect freshrss_data # 编辑配置文件(路径可能不同,请根据实际输出调整) sudo nano /var/lib/docker/volumes/freshrss_data/_data/config.php # 重启容器使配置生效 docker restart freshrss
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务