Авторизация в MongoDB 3

В /etc/mongod.conf пишем

1
2
3
4
5
6
...
security:
authorization: enabled
...

Затем делаем

1
service mongod restart

Потом заходим в шелл

1
mongo

Создаем админа в базе admin, авторизуемся админом, создаем пользователя для нужной базы.

1
2
3
4
5
use admin
db.createUser({user:"admin", pwd:"mashmash", roles:["userAdminAnyDatabase"]})
db.auth("admin", "mashmash")
db = db.getSiblingDB("newdatabase")
db.createUser({user:"root", pwd:"mashmash", roles:["readWrite","dbAdmin"]})

Удаление дубликатов из mongodb

Допустим, в коллекции domains есть записи вида

1
2
3
4
5
{
_id: ...,
domain: "test.ru",
...
}

и нам надо удалить все дубли, оставив только уникальные записи.

Делается это так:

1
2
3
4
5
6
7
8
9
10
11
db.domains.aggregate([
{ "$group": {
"_id": { "domain": "$domain"},
"dups": { "$push": "$_id" },
"count": { "$sum": 1 }
}},
{ "$match": { "count": { "$gt": 1 } }}
]).forEach(function(doc) {
doc.dups.shift();
db.domains.remove({ "_id": {"$in": doc.dups }});
});

А если есть коллекция events и в ней записи, например, типа

1
2
3
4
5
6
{
_id:...,
sid:1,
uid:2,
...
}

и надо проверять уникальность по совпадению sid и uid, оставив только одну запись с уникальным сочетанием, то делается так

1
2
3
4
5
6
7
8
9
10
11
db.events.aggregate([
{ "$group": {
"_id": { "uid": "$uid", "sid": "$sid" },
"dups": { "$push": "$_id" },
"count": { "$sum": 1 }
}},
{ "$match": { "count": { "$gt": 1 } }}
]).forEach(function(doc) {
doc.dups.shift();
db.events.remove({ "_id": {"$in": doc.dups }});
});

Как запустить крон в докере

Понадобилось мне, чтобы в docker контейнере запускался cron.

Готовим файлы

Файл crontab

в этом файле пишем задачу для крона в правильном формате. Последняя строчка должна быть пустая

1
2
00 04 * * * wget -O /dev/null -o /dev/null http://localhost:3000/davai
# пустая строчка в конце файла crontab

Файл start.sh

в этом файле команды запуска крона и запуска основного приложения ради которого замут с докером и случился:

1
2
3
4
#!/bin/sh
cron #запускаем крон
npm start #команда запуска основного приложения

Файл Dockerfile

В этом файле, кроме того, что нам нужно, вписываем слудующее:

1
2
3
4
5
6
7
8
9
10
RUN apt-get -y update && apt-get install -y cron && rm -rf /var/lib/apt/lists/*
ADD crontab /etc/cron.d/hello-cron
RUN chmod 0644 /etc/cron.d/hello-cron
RUN /usr/bin/crontab /etc/cron.d/hello-cron
ADD start.sh /usr/bin/start.sh
RUN chmod +x /usr/bin/start.sh
CMD /usr/bin/start.sh

Первая строчка - инсталл крона

Второй блок - запихиваем файл crontab как задачу в крон

Третий блок - пишем в /usr/bin файл start.sh

И последняя строчка - запускаем этот файл

Важным моментом, снесшим голову - было забыть про необходимость установки прав на файлы (chmod-ы)

Вот и всё

Как сделан этот блог?

Сейчас перед Вами - статичный сайт, созданный генератором статических сайтов Hexo.

Установка Hexo проста, требует установленного Node.js и npm, подробно инсталляция описана тут

Посты для блога пишутся в Markdown-формате, я нашел и использую на локалхосте hexo-editor - весьма удобный интерфейсик с моментальным предпросмотром того, что получается из маркдаун-разметки, с возможностью проставить теги и категории поста.

После того, как новый пост написан и сохранен, я запускаю перегенерацию блога

1
hexo generate

которая создает по новому блог в директории public, захожу в нее, и заливаю все на бесплатный хостинг surge.sh

Surge - хостинг и CDN для статических сайтов, поддерживаются собственные домены

Установить surge при наличии npm можно командой

1
npm i -g surge

а далее запуская в терминале

1
surge

после однократной регистрации (емейл-пароль, не выходя из теминала), получаем возможность публиковать содержимое какой-либо директории (по умолчанию - той, где была запущена команда) на веб-сервер.

На выходе имеем или сайт с субдоменом *.surge.sh, или, указав свой домен, и предварительно создав в DNS запись А, указывающую на 45.55.110.124, получаем сайт с собственным доменом.

Также можно просто положить в директорию, которую публикуем, файл CNAME (без расширения), в котором будет текст - название домена

1
echo moi-domen.ru > CNAME

Всё. Имеем статический блог на бесплатном хостинге.

Найти дубликаты записей в mongodb

Имеется коллекция в Монго, из такого рода элементов:

1
2
3
4
5
6
{
"name" : "ksqn291",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"channel" : "Sales"
}

Найти записи с одинаковыми name можно так:

1
2
3
4
5
db.collection.aggregate(
{"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
{"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } },
{"$project": {"name" : "$_id", "_id" : 0} }
)

Как любитель gui-админок к базам, я пользуюсь Robomongo,
а для экспорта коллекций или выборок из них в csv - Mongochef

Попытка 105

Все мои попытки вести блог так или иначе заканчивались, в основном потому, что я хотел делать блог на своем домене, выбирал wordpress или ghost, покупал хостинг, после чего рано или поздно за хостинг становилось платить влом, и блог умирал.
Пробую новую концепцию блоггерства - статический блог, генерящийся HEXO static site generator, с бесплатным хостингом от surge.sh

В следующем посте я расскажу, как все это устроено.