搬出容器| Mongodb Atlas Hackathon 2022 on Dev
#docker #mongodb #atlashackathon22

我建造的

我有一个宠物项目,我在学习编程时就开始了。它叫Dasbot,是一个用于学习德语的人的电报机器人。
我为几百个用户的日常受众感到自豪,他们共同回答了超过300k的测验问题ð,但我必须承认:到目前为止,它的数据库一直居住在Docker容器中。就像,甚至没有在安装的卷上ðÖ。
这个哈卡顿激励我修改这个可怕的错误。

另外,现在我知道了变更流,我可以在机器人的网页上显示一些实时统计信息,是的!

类别提交:

不知道!只是想分享一些生活课程:)

应用链接

https://dasbot.yak.supplies

欢迎您使用机器人并回答其问题! (尤其是如果您像我一样在德语中挣扎)。如果这让您烦恼,请禁止它ð

屏幕截图

Dasbot stats page

描述

德语很难!它的语法性别特别可怕,它无视任何逻辑,因此您只需要记住它们即可。
Dasbot实际上通过简单的间隔重复算法帮助您完成此操作。

它是用python写的,因为我当时正在研究python。
而且它正在使用mongoDB进行数据库,因为我在文档中不需要太多结构。
(这里应该有一张我的桌子的照片,上面覆盖着他们每天在德国两次寄给您的所有官僚论文ð©)。

在数据库中,我将每个人的分数保持在重复系统中。我还收集统计数据(用户,单词,答案,时间) - 其中可能有一些有用的见解。

链接到源代码

https://github.com/wetterkrank/dasbot-主要应用程序
https://github.com/wetterkrank/dasbot-docs-live-带有新 /统计页面的Web应用程序< /p>

允许许可证

MIT License

背景

所以,我使用了Docker。
这是一个很棒的工具!而且我想研究项目可以在容器中产生数据库。但是,当您在“生产”中进行此操作时,您会开始收集一些陷阱。这是我的几个:

  mongo:
    ports:
      - "0.0.0.0:27017:27017"

- 这是我的docker-compose.yml的一部分。

发布后,一切正常工作了几天,然后我发现我的数据库空!
我检查了Mongo日志,发现了一些来自未知IP的dropDatabase电话。黑客! ðª但是,但是!?我知道我的ufw规则!我不知道的是,Docker保留了自己的iptables,不会被仅被防火墙所束缚。
因此,当您使用0.0.0.0公开端口时,您可以与世界上充满端口扫描仪的人共享。

快进了今年11月。我刚刚更新了配置设置并决定手动重新启动容器。
然后我刺了机器人,对它不认识我感到有些惊讶。所以我看了DB收藏...有趣... 0文档...ð°
滚动了壳历史记录后,我注意到我输入了docker-compose down而不是docker-compose stop。这是我的数据!幸运的是,我有一个备份。

我如何建造它

至于移动到Atlas 部分:这很简单!
我本来很想使用live migration service,但我决定从M0群集开始,所以没有机会,而只是使用mongorestore

DB_CONTAINER="dasbot_db"
RESTORE_URI="mongodb+srv://$DB_USERNAME:$DB_PASSWORD@mydb.smth.mongodb.net/"

echo "Piping mongodump to mongorestore with Atlas as destination..."
docker exec $DB_CONTAINER mongodump --db=dasbot --archive | mongorestore --archive --drop --uri="$RESTORE_URI"

一个值得注意的打ic是mongorestore的速度 - 可怜的50MB数据花了几分钟才能加载!但是,增加工人人数(numInsertionWorkersPerCollection)有所帮助。

对于更改流(实时统计)练习,我必须刷新我对聚合管道的知识并编写一些JS代码。我已经提到了上面的stats Collection,它可用于构建各种报告。

因此,我添加了几个触发器,这些触发器负责汇总此数据并将更新发布到单独的数据库中,以及一个可以匿名访问此数据库的ATLAS应用程序。

// Scheduled to run twice per day
// Updates correct / incorrect counters in answers_total
exports = function() {
    const mongodb = context.services.get("DasbotData");
    const collection = mongodb.db("dasbot").collection("stats");
    const pipeline = [
      { $group: {
          _id: { $cond: [ { $eq: ["$correct", true] }, 'correct', 'incorrect' ] },
          count: { "$sum": 1 }
        }
      },
      {
        $out: { db: "dasbot-meta", coll: "answers_total" }
      }
    ]
    collection.aggregate(pipeline);
};

// This runs on every `stats` insert and updates the aggregated results
exports = function(changeEvent) {  
  const db = context.services.get("DasbotData").db("dasbot-meta");
  const answers_total = db.collection("answers_total");

  const fullDocument = changeEvent.fullDocument;
  const key = fullDocument.correct ? "correct" : "incorrect";
  const options = { "upsert": true };

  answers_total.updateOne( { "_id": key }, { "$inc": { "count": 1 } }, options); // { _id:, value: }
};

要显示数据,我制作了使用Realm Web SDK的a simple React app。现在,当有人回答机器人的问题时,您可以立即看到它。

其他资源/信息

This tutorial非常方便!