prepare for docker
orbstak is free , lightweight, fast docker manage tool. easier to use than docker desktop
- go orbstack download orbstack and install
- open orbstack then you get docker development environment
- go compass download mongo compass and install
prepare for mongodb
solution 1
# create container without auth
docker run --name mongo-docker-27017 -v ~/data/mongodb-data:/data/db -p 27017:27017 -d mongodb/mongodb-community-server:latest
docker exec -it mongo-docker-27017 mongosh admin
# open mongo db shell and use admin db, create admin user
> db.createUser({user:"admin", pwd:"admin", roles:[{role:"userAdminAnyDatabase", db:"admin"}]});
>db.auth('admin', 'admin')
# ctrl + c twice exit
docker ps
docker remove mongo-docker-27017
# recreate mongo-docker-27017 container use old data
docker run --name mongo-docker-27017 -v ~/data/mongodb-data:/data/db -p 27017:27017 -d mongodb/mongodb-community-server:latest --auth
# login container if needed
docker exec -it mongo mongosh
an intresting docker log
Warning: File MONGO_INITDB_ROOT_USERNAME_FILE is deprecated. Use MONGODB_INITDB_ROOT_USERNAME_FILE instead.
Warning: File MONGO_INITDB_ROOT_PASSWORD_FILE is deprecated. Use MONGODB_INITDB_ROOT_PASSWORD_FILE instead
# mean that but i have not try
db.createUser({user:"admin", pwd:"admin", roles:[{role:"userAdminAnyDatabase", db:"admin"}]});
role权限主要有
| role | 作用 |
|---|---|
| Read | 允许用户读取指定数据库 |
| readWrite | 允许用户读写指定数据库 |
| dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
| userAdmin | 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 |
| clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 |
| readAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读权限 |
| readWriteAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读写权限 |
| userAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 |
| dbAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 |
| root | 只在admin数据库中可用。超级账号,超级权限 |
since some action can only done before authed.
solution 2
# create mongo conf
touch ~/data/mongodb-data/configdb/mongo.conf
mongo.conf
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
storage:
dbPath: /data/db
net:
port: 27017
bindIp: 0.0.0.0
# security:
#authorization: enabled
# https://yijiebuyi.com/blog/397625f0f98c87bdbc0fd6c792ee1ca3.html
docker run --name mongo-docker-27017 -v ~/data/mongodb-data/data:/data/db -v ~/data/mongodb-data/configdb/mongo.conf:/data/configdb/mongo.conf -v ~/data/mongodb-data/log:/var/log/mongodb -p 27017:27017 -d mongodb/mongodb-community-server:latest -f /data/configdb/mongo.conf
# mongodb container has create and run
# login mongodb and create a root user
docker exec -it mongo-docker-27017 mongosh admin
db.createUser({user:"admin", pwd:"admin", roles:[{role:"userAdminAnyDatabase", db:"admin"}]});
exit
docker stop mongo-docker-27017
edit ~/data/mongodb-data/configdb/mongo.conf uncoument auth config
change
# security:
#authorization: enabled
to
security:
authorization: enabled
then restart contaner
docker start mongo-docker-27017
then you have a local docker mongodb develop environment, with or without auth as you needed.
connect to monogodb
create a user for the tutorial
docker exec -it mongo-docker-27017 mongosh admin
db.createUser({user:"tutorial", pwd:"tutorial", roles:[{role:"readWrite", db:"tutorial"}]});
pnpm i dotenv
add a .env to the root directory of project
MONGO_USER=tutorial
MONGO_PASSWORD=tutorial
MONGO_DB_NAME=tutorial
# mongodb+srv://username:password@ip:port/databasename
MONGO_PATH=localhost
PORT=5000
use it in server.ts, just for a little test, will refactor later.
import express from 'express';
import * as mongoose from 'mongoose';
import 'dotenv/config';
const {
MONGO_USER,
MONGO_PASSWORD,
MONGO_PATH,
MONGO_DB_NAME,
} = process.env;
const url = `mongodb://${MONGO_USER}:${MONGO_PASSWORD}@${MONGO_PATH}/${MONGO_DB_NAME}?authSource=admin`;
console.log(url);
mongoose.connect(url);
const CatSchema = new mongoose.Schema({
name: String
})
const Cat = mongoose.model('Cat', CatSchema);
const kitty = new Cat({ name: 'Zildjian' });
kitty.save().then(() => console.log('meow'));
const app = express();
app.get('/', (request, response) => {
response.send('Hello world!');
});
app.listen(5001, () => {
console.log('Example app listening on port 5001!');
});
ref: