{"id":30686075,"url":"https://github.com/tanknee/anonymousquestionbox","last_synced_at":"2025-09-01T22:13:48.572Z","repository":{"id":37732603,"uuid":"502935732","full_name":"TankNee/AnonymousQuestionBox","owner":"TankNee","description":null,"archived":false,"fork":false,"pushed_at":"2023-03-03T07:42:49.000Z","size":3141,"stargazers_count":33,"open_issues_count":5,"forks_count":9,"subscribers_count":2,"default_branch":"master","last_synced_at":"2023-03-04T10:29:46.896Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://qb.tanknee.cn","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TankNee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-06-13T11:55:24.000Z","updated_at":"2023-02-28T12:15:20.000Z","dependencies_parsed_at":"2022-09-16T06:12:14.994Z","dependency_job_id":null,"html_url":"https://github.com/TankNee/AnonymousQuestionBox","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/TankNee/AnonymousQuestionBox","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TankNee%2FAnonymousQuestionBox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TankNee%2FAnonymousQuestionBox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TankNee%2FAnonymousQuestionBox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TankNee%2FAnonymousQuestionBox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TankNee","download_url":"https://codeload.github.com/TankNee/AnonymousQuestionBox/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TankNee%2FAnonymousQuestionBox/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273198256,"owners_count":25062452,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-01T02:00:09.058Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-09-01T22:13:34.660Z","updated_at":"2025-09-01T22:13:48.558Z","avatar_url":"https://github.com/TankNee.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 私有部署提问盒\n\n这两年提问盒形式的匿名问答越来越多了，像在朋友圈流行的 Popi，在推特流行的那个匿名提问箱，还有以前 QQ 的悄悄话。玩这类匿名社交最有意思的事情就是猜测提问者是谁，提问者提问时的心态。读者在看提问盒的回答历史的时候可以快速建立回答者的初步形象，然后进一步推断作者是一个什么样的人。\n\n## 匿名？\n\n但是，匿名问答，真的可以匿名吗？很难！数据和流量太过重要，没有人可以舍弃，就算是那些声称极为注重隐私的公司，也会默默收集用户的页面浏览信息（例如浏览时长，用户来源，用户 IP 地址等）。我在最开始的时候并不想收集任何信息，希望做一个完全匿名，没有任何额外信息收集的提问箱，但是后来遇到了轰炸式提问，几分钟发了几十条，非常影响体验，所以我觉得还是要有所限制的（因为需要限定固定 IP 轰炸）。\n\n## 社交监管？\n\n众所周知，社交类应用有许多的限制，个人基本上不能搞社交类应用，特别是那些想要上架应用市场的，任何 UGC 都是要审查的，而且，网络上鱼龙混杂，难免有脚本小子来轰炸小网站，所以部署在自己的服务器上不是特别安全。\n\n正好没开发过 Vercel 相关的应用，nextjs 也是久闻大名，我想是时候了，该上手试试。\n\n## 物料准备\n\n本来我想着 vercel 没有配套的数据库服务，用起来会很麻烦，所以就找个 SaaS 平台放数据，于是就想到了以前用过的 LeanCloud，知名的博客评论应用 Valine 就是用的这个服务商，基本上花不了什么钱，而且他们的文档写的很丰富，相当不错。缺点是部分功能需要自己的域名，而且要是备案过的域名。\n\n当然，你也可以在自己的服务器上部署本项目，不过你仍然需要 LeanCloud 的数据库作为支撑，在下一个大版本我会提供更多的存储介质支持，并用 Vue 对项目进行重写。相关教程可以看这篇文章 https://www.tanknee.cn/2023/03/03/17。\n\n\u003e 之前我也打算做一个使用本地数据库的分支，这样就能直接部署到 railway 这样的平台上了（我是快写完了才发现有这样一个平台）。\n\n所以我们需要以下准备：\n\n*   一个 LeanCloud 账号\n\n*   一个备案过的域名\n\n*   一个 GitHub 账号\n\n## 部署步骤\n\n首先打开 [LeanCloud](https://www.leancloud.cn/) 平台，创建一个新应用：\n\n\u003e   LeanCloud 国际版已经通过测试，国际版不需要国内域名，可以直接使用 LeanCloud 提供的服务域名！\n\n![image.png](assets/image-20220613202646-ztybp4s.png)\n\n选择免费版即可，完全足够。\n\n然后前往应用的设置-应用凭证页面保存凭证信息：\n\n![image.png](assets/image-20220613202924-o3i9hfp.png)\n\n\u003e 理论上这个临时服务器地址是可以用的，不过我还是建议使用自己的域名。\n\n然后点击数据存储-结构化数据-创建 Class\n\n![image.png](assets/image-20220613203330-pecft3z.png)\n\n此处我们需要创建三个类，分别是：\n\n*   Answer：存放回答\n\n*   Question：存放提问\n\n*   Settings：存放一些设置信息，例如页面标题\n\n接下来我们可以点击[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FTankNee%2FAnonymousQuestionBox\\\u0026env=PORT,LEANCLOUD_APP_ID,LEANCLOUD_APP_KEY,LEANCLOUD_SERVER_URL,USER_KEY,MAILER_ACCOUNT,MAILER_PASSWORD,MAILER_HOST\\\u0026envDescription=%E8%AF%B7%E6%AD%A3%E7%A1%AE%E5%A1%AB%E5%86%99%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%EF%BC%8C%E8%AF%A6%E7%BB%86%E8%A7%A3%E9%87%8A%E8%AF%B7%E6%9F%A5%E7%9C%8B%E4%BB%93%E5%BA%93%20README\\\u0026envLink=https%3A%2F%2Fgithub.com%2FTankNee%2FAnonymousQuestionBox)来在 vercel 上部署提问箱。环境变量需要正确填写，否则可能引发未知错误。\n\n*   PORT（**必需**）：运行端口，直接填写 4000 就好。\n\n*   LEANCLOUD\\_APP\\_ID（**必需**）：填写上文获取到的 LeanCloud 应用 APP ID 信息。\n\n*   LEANCLOUD\\_APP\\_KEY（**必需**）：填写上文获取到的 LeanCloud 应用 APP KEY 信息。\n\n*   LEANCLOUD\\_SERVER\\_URL（**必需**）：填写上文获取到的 LeanCloud 应用服务器地址信息。\n\n*   USER\\_KEY（**必需**）：提问箱登录的密码，注意保护隐私。\n\n*   MAILER\\_ACCOUNT：SMTP 邮箱账户（为了给提问箱的主人发送邮件，所以需要一个邮箱账号）。\n\n*   MAILER\\_PASSWORD：邮箱密码。\n\n*   MAILER\\_HOST： SMTP 服务的域名（例如：`smtp.163.com`）。\n\n填写完成之后等待部署即可！\n\n示例提问箱请查看：\n\n*   \u003chttps://anonymous-question-box.vercel.app/\u003e\n\n*   \u003chttps://qb.tanknee.cn\u003e\n\n***\n\n管理员用户可以通过点击标题来进入管理页面：\n\n\u003cimg src=\"assets/password.png\" alt=\"image.png\" style=\"zoom:50%;\" /\u003e\n\n登录成功之后再次点击标题可以推出管理页面。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanknee%2Fanonymousquestionbox","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftanknee%2Fanonymousquestionbox","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanknee%2Fanonymousquestionbox/lists"}