Meetable 介绍与选型指南
Meetable(aaronpk/Meetable,latest=main@7d2d22ab 2026-10-16,MIT)自托管事件聚合站认知篇:Laravel 12/PHP 8.2 + MariaDB + Redis 四容器架构、RSVP/webmention/iCal/Discord 能力面、GitHub API 实查 172 星社区数据,与 Gancio/Bitpoll/Framadate 量化选型对比(联网+部署实查,查询日期 2026-11-02)
Meetable 介绍与选型指南
目标:回答「Meetable 是什么、架构长什么样、能干什么、社区健康度如何、和同类活动/日程工具怎么选」。本文事实来自 GitHub API 联网实查与 2026-11-02 本地 Docker 部署实测(查询日期均为 2026-11-02,北京时间),部署与配置细节见本专栏其余篇目。
⚠️ 批次计划文档将 Meetable 预设为「Rails 应用、SQLite/PG、participort/meetable 仓库、带签到二维码」——以上四点经实查全部不成立,本文以实测为准:Meetable 是 Laravel(PHP) 应用、MariaDB + Redis 存储、仓库为 aaronpk/Meetable、到场登记形态是 RSVP 而非二维码签到。详见 §2.4 与 §5。
一、环境信息(信息源与查询日期)
- 官方仓库:
https://github.com/aaronpk/Meetable(GitHub API 实查,repo id 228271344) - 官网:
https://meetable.org;生产实例:https://events.indieweb.org、https://events.oauth.net、https://meet.modelcontextprotocol.io(README 自述) - 版本来源:GitHub tags/releases(均为空)、ghcr.io 镜像 tag 清单、
composer.json、容器内php artisan about - 社区数据:GitHub API(stars/forks/issues/contributors,查询 2026-11-02);对比项 star 数沿用站内各专栏 2026-11-01 实查值
- 本地实测环境:Docker + docker compose v2,
ghcr.io/aaronpk/meetable:latest(image created 2026-10-16T22:21:49Z),Web 端口 8158
二、定位:公开事件聚合站,而非签到系统
2.1 一句话定位
Meetable 是 IndieWeb 社区核心开发者 Aaron Parecki(aaronpk)编写的极简事件聚合网站(README 原话 "a minimal events aggregator website"):把某圈子(社区、协议组织、公司内团队)的公开活动集中列在一块日历墙上,支持订阅、报名(RSVP)、回帖(webmention)与 Discord 联动。events.indieweb.org 就是它的官方生产实例。
2.2 核心能力面(routes 全量实查,107 条 web 路由 + ics 路由)
| 能力 | 实现 | 实测证据 |
|---|---|---|
| 事件列表/归档 | 首页按日期分组,/archive 归档页,/{年}/{月} 视图 | GET /archive → 200 Past Events | Meetable |
| 标签体系 | /tags、/tag/{tag}、按年标签页 | GET /tag/test → 200 |
| iCal 订阅 | /ics/events.ics、/ics/tag/{tag}.ics、单事件 .ics | 实测返回 VCALENDAR,DTSTART:20261110T110000Z(19:00 Asia/Shanghai 正确换算 UTC) |
| Add to Calendar | /add-to-google/{event} 与 .ics 导出 | 路由实查存在 |
| 事件详情页 | 封面图、时间地点、官网/购票链接、Markdown 描述、时区换算器 /local-time | GET /2026/11/quzuo-demo-event-quzuo1demo01 → 200 |
| RSVP 报名 | POST /event/{id}/rsvp(登录用户 yes/if-needed/no),响应可带照片、可审核(/moderate) | 事件页未登录时不显示 RSVP 按钮(实测行为,符合设计) |
| Proposed Events | 无固定日期的提案事件,用户投票选期(/proposed、POST /event/{id}/vote) | 未启用站点设置时 GET /proposed → 404 |
| 周期事件/模板 | is_template、recurrence_interval 字段 + recurring:schedule 定时任务 | schedule:list 实测列出 |
| Webmention | POST /webmention,外部站点可在自己博客"回帖"到事件页 | event:list 实测 WebmentionReceived ⇂ Listener (ShouldQueue) |
| Discord 集成 | 机器人预告事件、同步服务器事件列表(discord:notify/discord:sync-events) | schedule:list 实测列出 |
| MCP 服务端 | POST /mcp(throttle:60,1),AI 代理可接入 | GET /mcp → 405(仅 POST,实测) |
| 事件 JSON API | GET /event/{key}.json 返回会议链接状态 | 实测 {"meeting_url":false,"meeting_state":"none"} |
| 其他 | 事件历史版本对比、克隆、私密导出 URL(export_secret)、unlisted 事件、自定义 CSS、多语言、PWA manifest | 路由/manifest.json 实测 |
2.3 认证与权限模型
AUTH_METHOD 五选一(.env 实查):session(内置 Passkey/WebAuthn,首个登录者成为管理员)、github(OAuth + GITHUB_ALLOWED_USERS/GITHUB_ADMIN_USERS 白名单)、oidc(OIDC_* 端点 + sub 白名单)、vouch(网关 REMOTE_USER 头)、heroku。权限两开关:ALLOW_MANAGE_EVENTS、ALLOW_MANAGE_SITE(users/admins)。实测 AUTH_METHOD=session 时 /login 呈现 "Create Admin User" passkey 注册表单。
2.4 与"签到工具"预期的差距
任务书预设的「签到二维码/QR check-in」在代码层不存在:全量路由 grep qr|checkin 无匹配。Meetable 的"到场"表达是 RSVP 应答 + 会后照片/webmention,面向的是活动发布与聚合而非现场核销。若需求是扫码核销入场,应看票务系统(如 Hi.Events),不在本文范围。
三、架构与技术栈(部署实测)
┌────────────── docker compose 栈(实测 4 容器)──────────────┐
│ app ghcr.io/aaronpk/meetable:latest Apache 2.4.68+PHP │
│ 8.2.34(mod 方式内嵌),entrypoint 自动 migrate + │
│ storage:link,端口 127.0.0.1:8080→80 │
│ worker 同镜像,php artisan queue:work(队列消费者) │
│ db mariadb:11.8(MARIADB_AUTO_UPGRADE=1) │
│ redis redis:8-alpine(cache/queue/session 三用) │
│ 卷:meetable_storage / meetable_db / meetable_redis │
└─────────────────────────────────────────────────────────────┘
- 框架:Laravel Framework 12.69.1(容器内
php artisan about实测),PHP^8.2,Composer 2.10.3 - 存储:MySQL/MariaDB(
DB_CONNECTION=mysql);缓存/队列/会话默认走 Redis(compose 的x-app-config锚点强制覆盖 .env 中这五项,实测about显示 Cache=redis、Queue=redis) - 前端为 Laravel Blade 服务端渲染(无独立 SPA),PWA manifest 提供"添加到主屏"
- 无 semver 发布:GitHub tags/releases 均为空,ghcr 仅
main/latest两个滚动 tag;版本锚点取 main 最新 commit7d2d22ab7f85(2026-10-16)与镜像 created 时间 - 运维缺口(实测发现):compose 栈内没有任何进程跑
php artisan schedule:run(README 手动安装要求每分钟 cron),因此会议提醒、Discord 同步、周期事件生成四类定时任务在纯 compose 部署下不会自动触发,需自建 scheduler 容器或宿主机 cron 补位(详见部署指南篇)
四、社区数据实查(GitHub API,2026-11-02)
| 指标 | 值 | 说明 |
|---|---|---|
| Stars / Forks | 172 / 14 | 小型项目 |
| Open Issues | 18 | 含 PR |
| Watchers | 3 | |
| 贡献者 | 10 人,aaronpk 占 598/633 提交(≈94%) | 单维护者结构,bus factor=1 |
| 创建 / 最近推送 | 2019-12-16 / 2026-10-16 | 持续活跃(查询当日往前 17 天) |
| 许可证 | MIT | 商用/闭源修改无障碍 |
| 语言 | PHP(Laravel 12) | |
| 生产实例 | events.indieweb.org、events.oauth.net、meet.modelcontextprotocol.io | IndieWeb/OAuth/MCP 三个协议社区在用 |
五、选型对比(量化)
对比对象取站内已收官的三个活动类专栏 + Meetable 本次实测(star 数查询日期 2026-11-01/02,来源见各专栏文档):
| 维度 | Meetable | Gancio | Bitpoll | Framadate |
|---|---|---|---|---|
| 仓库 | aaronpk/Meetable(GitHub) | les/gancio(Framagit,GitHub 镜像 lesion/gancio) | fsinfuhh/Bitpoll | framasoft/framadate |
| 定位 | 公开事件聚合墙+RSVP | 活动发布日历+Fediverse 联邦 | 会议时间投票 | Doodle 式日程投票 |
| 技术栈 | PHP 8.2 / Laravel 12 | Node.js(Express+Nuxt) | Python / Django | PHP |
| 数据库 | MariaDB + Redis(强制) | SQLite/PG/MSSQL | SQLite/PG | MariaDB/MySQL |
| 许可证 | MIT | AGPL-3.0 | GPL-3.0 | CeCILL-B(随包 LICENSE 实测) |
| Stars | 172 | 66 | 318 | 103 |
| 认证 | Passkey/GitHub/OIDC/Vouch/Heroku/Discord | 本地账户 | 可匿名/可选账户 | 可匿名 |
| 日历订阅 | ✅ iCal(全站/标签/单事件) | ✅ | ❌ | ❌ |
| 现场签到/QR | ❌(RSVP 代替) | ❌ | ❌ | ❌ |
| 联邦/社交集成 | Webmention + Discord 机器人 | ActivityPub(Mastodon 可见) | ❌ | ❌ |
| 周期事件 | ✅(模板+间隔) | ✅ | ❌ | ❌ |
| 部署形态 | 官方 compose 四容器 | 官方 compose 双容器 | 单容器 | 源码+PHP 环境 |
决策建议:
- 要一个「社区/组织公开活动日历」,成员用 GitHub/OIDC 登录报名、活动可被 iCal 订阅和 webmention 回帖 → Meetable(MIT 许可、认证面最宽、协议社区背书)。
- 要活动信息广播到 Fediverse、面向不特定公众报名 → Gancio(ActivityPub 原生)。
- 只是「凑会议时间」的轻量投票 → Bitpoll(功能最贴合)或 Framadate(匿名可用、法语生态)。
- 需要扫码核销/票务 → 四者皆非,另寻票务系统(见 §2.4)。
风险提示:单维护者(94% 提交)+ 无版本发布 + compose 栈缺 scheduler,三者叠加意味着升级即 docker compose pull 滚动 main 分支,需自测后上生产。
六、快速上手(30 秒版)
curl -O https://raw.githubusercontent.com/aaronpk/Meetable/main/docker-compose.yml
curl -o .env https://raw.githubusercontent.com/aaronpk/Meetable/main/.env.example
# 至少填 APP_KEY(openssl rand -hex 16)、APP_URL、DB_PASSWORD、DB_ROOT_PASSWORD
docker compose up -d
完整逐段实测、管理员创建与 iCal/RSVP 闭环验收见 《Meetable Docker Compose 部署指南》。
七、关联文档
- 站内互链:《Gancio 介绍与选型指南》、《Bitpoll 0.11.0 介绍与选型指南》、《Framadate 1.1.19 介绍与选型指南》
- 本专栏:《Meetable Docker Compose 部署指南》、《Meetable latest 配置参数详解》、《Meetable latest 常用 CLI 命令与工具详解》
八、取证与参考来源
- GitHub API:
/repos/aaronpk/Meetable、/contributors、/commits、/tags(2026-11-02) - ghcr.io token API:
/v2/aaronpk/meetable/tags/list→["main","latest"] - 官方 README.md(main 分支 420 行全文)、
.env.example(154 行)、docker-compose.yml、routes/web.php、routes/ics.php、app/Http/Controllers/Controller.php、app/Event.php(raw.githubusercontent.com 下载实查) - 本地部署实测:
/opt/data/quzuo/tmp/meetable/evidence.md(compose 输出、容器日志、HTTP 状态码/标题、tinker 建数据、iCal/JSON 闭环、参数改验、artisan 命令回显)