Docker一键部署Glean:搭建你的专属RSS阅读器与知识管理利器
# 一、Glean介绍 ## 1.1 Glean简介 > `Glean`是一款自托管的 RSS 阅读器与个人知识管理工具,帮助用户高效聚合、阅读和整理网络内容,同时完全掌控自己的数据。 ## 1.2 Glean主要特点 - **RSS 订阅管理**:支持订阅和组织 RSS/Atom 源,并提供 OPML 导入导出功能。 - **智能阅读体验**:提供干净无干扰的阅读界面,支持内容过滤以去除广告和杂乱元素。 - **稍后阅读功能**:可将文章保存至“稍后阅读”列表,并支持自动清理过期内容。 - **多级文件夹与标签**:通过嵌套文件夹和自定义标签灵活分类和归档文章。 - **书签收藏**:不仅能收藏来自订阅源的文章,还可保存任意外部网页链接。 - **后台自动同步**:每 15 分钟自动更新所有订阅源,确保内容及时获取。 - **完全自托管**:基于 Docker 部署,用户拥有全部数据所有权和隐私控制权。 - **现代温暖暗色 UI**:采用美观、响应式的深色主题界面,提升长时间阅读舒适度。 - **管理员仪表盘**:内置管理面板,支持用户管理和系统运行状态监控。 # 二、本次实践规划 ## 2.1 本地环境规划 > 本次实践为个人测试环境,操作系统版本为 Ubuntu 24.04.2 LTS。 |hostname|IP地址 |操作系统版本 |Docker版本 |部署项目|备注| | --- | --- | --- | --- | --- | --- | |jeven|192.168.3.88 |Ubuntu 24.04.2 LTS|28.5.0 |Glean |——| ## 2.2 本次实践介绍 > 1.本次实践部署环境为个人测试环境,生产环境请谨慎; > 2.在Docker环境下部RSS阅读器Glean。 # 三、本地环境检查 ## 3.1 检查Docker服务状态 > 检查Docker服务是否正常运行,确保Docker正常运行。 ``` root@jeven:~# systemctl restart docker root@jeven:~# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled) Active: active (running) since Tue 2026-01-06 17:39:44 CST; 7s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 1220391 (dockerd) Tasks: 12 Memory: 127.0M (peak: 127.8M) CPU: 1.767s CGroup: /system.slice/docker.service └─1220391 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ```  ## 3.2 检查Docker版本 > 检查Docker版本 ``` root@jeven:~# docker -v Docker version 28.5.0, build 887030f ``` ## 3.3 检查docker compose 版本 > 检查Docker compose版本,确保2.0以上版本。 ``` root@jeven:~# docker compose version Docker Compose version v2.39.4 ``` # 四、拉取Glean镜像 > 下载Glean相关的5个容器镜像,执行以下命令: ``` docker pull registry.cn-hangzhou.aliyuncs.com/jeson/postgres:16-alpine ``` ``` docker pull registry.cn-hangzhou.aliyuncs.com/jeson/redis:7-alpine ``` ``` docker pull registry.cn-hangzhou.aliyuncs.com/jeson/glean-backend:latest ``` ``` docker pull registry.cn-hangzhou.aliyuncs.com/jeson/glean-web:latest ``` ``` docker pull registry.cn-hangzhou.aliyuncs.com/jeson/glean-admin:latest ```  # 五、部署Glean服务 ## 5.1 创建部署目录 - 创建部署目录 ``` mkdir -p /data/glean/{postgres,redis} && cd /data/glean ``` - 目前授权工作 ``` chmod -R 777 /data/glean/ ``` ## 5.2 编辑变量文件 > 在`/data/glean`目录下,新建及编辑变量文件env.txt。可自行修改映射端口和相关账号密码,测试环境下可直接使用以下简单示例。 ``` vim env.txt ``` ``` # Glean Environment Configuration # Copy this file to .env and customize for your environment # ======================================== # Database Configuration # ======================================== POSTGRES_DB=glean POSTGRES_USER=glean POSTGRES_PASSWORD=glean # ======================================== # Backend Configuration # ======================================== # JWT secret key - CHANGE THIS IN PRODUCTION! # Generate with: openssl rand -hex 32 SECRET_KEY=7f3a1b8c4d2e9f0a5b6c8d1e3f7a2b9c4d6e8f1a3b5c7d9e2f4a6b8c1d3e5f7a # Enable debug mode (shows API docs at /api/docs) DEBUG=false # ======================================== # Port Configuration # ======================================== # Web interface port WEB_PORT=7100 # Admin dashboard port (only for full deployment) ADMIN_PORT=7200 # ============================================================================= # ADMIN (Optional - Full Deployment Only) # ============================================================================= # Set CREATE_ADMIN=true on first startup to auto-create admin account # The password will be printed in the logs (save it immediately!) CREATE_ADMIN=true ADMIN_USERNAME=admin ADMIN_PASSWORD=admin@123 ADMIN_ROLE=super_admin # ======================================== # Development Configuration (optional) # ======================================== # Full database URL (auto-generated from above if not set) # DATABASE_URL=postgresql+asyncpg://glean:glean@localhost:5432/glean # Redis URL # REDIS_URL=redis://localhost:6379/0 # CORS origins (JSON array) # CORS_ORIGINS=["http://localhost", "http://localhost:3000"] ``` ## 5.3 编辑部署文件 > 新建及编辑docker-compose.yaml文件,内容如下所示: ``` vim docker-compose.yaml ``` ``` # Glean Full Deployment - Docker Compose (with Admin Dashboard) # Usage: docker compose -f docker-compose.full.yml up -d # # This deployment includes the admin dashboard. # Set CREATE_ADMIN=true to auto-create admin account on first startup. services: postgres: image: registry.cn-hangzhou.aliyuncs.com/jeson/postgres:16-alpine container_name: glean-postgres environment: POSTGRES_DB: ${POSTGRES_DB:-glean} POSTGRES_USER: ${POSTGRES_USER:-glean} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-glean} volumes: - ./postgres:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-glean}"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped redis: image: registry.cn-hangzhou.aliyuncs.com/jeson/redis:7-alpine container_name: glean-redis command: redis-server --appendonly yes volumes: - ./redis:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped backend: image: registry.cn-hangzhou.aliyuncs.com/jeson/glean-backend:latest container_name: glean-backend environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-glean}:${POSTGRES_PASSWORD:-glean}@postgres:5432/${POSTGRES_DB:-glean} REDIS_URL: redis://redis:6379/0 SECRET_KEY: ${SECRET_KEY:-change-me-in-production-use-a-long-random-string} CORS_ORIGINS: '["http://localhost", "http://localhost:3000", "http://localhost:3001"]' DEBUG: ${DEBUG:-false} # Only backend runs migrations to avoid race conditions RUN_MIGRATIONS: "true" # Admin auto-creation (set to true for first startup) CREATE_ADMIN: ${CREATE_ADMIN:-false} ADMIN_USERNAME: ${ADMIN_USERNAME:-admin} ADMIN_PASSWORD: ${ADMIN_PASSWORD:-} ADMIN_ROLE: ${ADMIN_ROLE:-super_admin} depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/health"] interval: 10s timeout: 5s retries: 5 start_period: 30s restart: unless-stopped command: ["uv", "run", "--no-sync", "uvicorn", "glean_api.main:app", "--host", "0.0.0.0", "--port", "8000"] worker: image: registry.cn-hangzhou.aliyuncs.com/jeson/glean-backend:latest container_name: glean-worker environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-glean}:${POSTGRES_PASSWORD:-glean}@postgres:5432/${POSTGRES_DB:-glean} REDIS_URL: redis://redis:6379/0 SECRET_KEY: ${SECRET_KEY:-change-me-in-production-use-a-long-random-string} depends_on: postgres: condition: service_healthy redis: condition: service_healthy backend: condition: service_healthy restart: unless-stopped command: ["uv", "run", "--no-sync", "arq", "glean_worker.main.WorkerSettings"] web: image: registry.cn-hangzhou.aliyuncs.com/jeson/glean-web:latest container_name: glean-web ports: - "${WEB_PORT:-80}:80" depends_on: - backend restart: unless-stopped admin: image: registry.cn-hangzhou.aliyuncs.com/jeson/glean-admin:latest container_name: glean-admin ports: - "${ADMIN_PORT:-5000}:80" depends_on: - backend restart: unless-stopped ``` ## 5.4 创建Glean相关容器 > 执行以下命令,创建Glean相关容器。 ``` docker compose --env-file env.txt up -d ```  ## 5.5 查看Glean容器状态 > 检查Glean容器运行状态,确保Glean各容器正常启动。 ``` root@jeven:/data/glean# docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS glean-admin registry.cn-hangzhou.aliyuncs.com/jeson/glean-admin:latest "/docker-entrypoint.…" admin 4 minutes ago Up 4 minutes 0.0.0.0:7200->80/tcp, [::]:7200->80/tcp glean-backend registry.cn-hangzhou.aliyuncs.com/jeson/glean-backend:latest "/app/scripts/entryp…" backend 4 minutes ago Up 4 minutes (healthy) 8000/tcp glean-postgres registry.cn-hangzhou.aliyuncs.com/jeson/postgres:16-alpine "docker-entrypoint.s…" postgres 4 minutes ago Up 4 minutes (healthy) 5432/tcp glean-redis registry.cn-hangzhou.aliyuncs.com/jeson/redis:7-alpine "docker-entrypoint.s…" redis 4 minutes ago Up 4 minutes (healthy) 6379/tcp glean-web registry.cn-hangzhou.aliyuncs.com/jeson/glean-web:latest "/docker-entrypoint.…" web 4 minutes ago Up 4 minutes 0.0.0.0:7100->80/tcp, [::]:7100->80/tcp glean-worker registry.cn-hangzhou.aliyuncs.com/jeson/glean-backend:latest "/app/scripts/entryp…" worker 4 minutes ago Up 3 minutes 8000/tcp ```  ## 5.6 检查Glean容器日志 > 检查容器运行日志,确保Glean服务正常运行。 ``` docker compose logs ```  # 六、访问Glean服务 ## 6.1 访问Glean首页 > 浏览器地址: `http://:7100`,访问Glean初始页。如果无法访问,请确保宿主机的防火墙已关闭或已放行相关端口,对于云服务器还需配置相应的安全组规则。  ## 6.2 创建账号 > 第一次登录时,我们创建账号。点击“创建账号”,自行填写账号信息注册即可。   # 七、RSS使用方案 ## 7.1 添加RSS地址 > 点击“+”选项,新增RSS地址。  > 可自行添加一些RSS地址源,以下一些RSS源可供参考: > 少数派: [https://sspai.com/feed](https://sspai.com/feed) 分享科技产品使用技巧与优质工具推荐 > 虎嗅网: 地址:[https://www.huxiu.com/rss/0.xml](https://www.huxiu.com/rss/0.xml) 深度商业分析,涵盖科技、互联网、金融等领域。 - 本人博客订阅地址: [https://rss.csdn.net/jks212454/rss/map](https://rss.csdn.net/jks212454/rss/map)  ## 6.2 浏览效果 > 添加RSS源后,刷新一下即可看到相关文章,效果还是非常不错的。  ## 6.3 注意 > 写作本文时,当前版本存在后台管理登录后账号无法正常登录的问题,建议等待作者修复,或使用最新版镜像以获取修复更新。 # 八、总结 > 通过本次实战,我们成功使用 Docker 快速部署了自托管 RSS 阅读器 Glean,体验了其简洁美观的界面与强大的内容管理能力。整个过程标准化、可复现,充分体现了容器化部署的便捷性与隔离优势。Glean 不仅支持 RSS 订阅与智能阅读,还集成了书签、标签和稍后读等知识管理功能,非常适合个人信息聚合。