我建造的
我有一个宠物项目,我在学习编程时就开始了。它叫Dasbot,是一个用于学习德语的人的电报机器人。
我为几百个用户的日常受众感到自豪,他们共同回答了超过300k的测验问题ð,但我必须承认:到目前为止,它的数据库一直居住在Docker容器中。就像,甚至没有在安装的卷上ðÖ。
这个哈卡顿激励我修改这个可怕的错误。
另外,现在我知道了变更流,我可以在机器人的网页上显示一些实时统计信息,是的!
类别提交:
不知道!只是想分享一些生活课程:)
应用链接
欢迎您使用机器人并回答其问题! (尤其是如果您像我一样在德语中挣扎)。如果这让您烦恼,请禁止它ð
屏幕截图
描述
德语很难!它的语法性别特别可怕,它无视任何逻辑,因此您只需要记住它们即可。
Dasbot实际上通过简单的间隔重复算法帮助您完成此操作。
它是用python写的,因为我当时正在研究python。
而且它正在使用mongoDB进行数据库,因为我在文档中不需要太多结构。
(这里应该有一张我的桌子的照片,上面覆盖着他们每天在德国两次寄给您的所有官僚论文ð©)。
在数据库中,我将每个人的分数保持在重复系统中。我还收集统计数据(用户,单词,答案,时间) - 其中可能有一些有用的见解。
链接到源代码
https://github.com/wetterkrank/dasbot-主要应用程序
https://github.com/wetterkrank/dasbot-docs-live-带有新 /统计页面的Web应用程序< /p>
允许许可证
背景
所以,我使用了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
)有所帮助。
p>
对于更改流(实时统计)练习,我必须刷新我对聚合管道的知识并编写一些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非常方便!