Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
MongoDB systemd service unit configuration
[Unit]
Description=MongoDB Database Service
Wants=network.target
After=network.target
[Service]
Type=forking
PIDFile=/var/run/mongodb/mongod.pid
ExecStart=/usr/local/bin/mongod --config /etc/mongod.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
User=mongodb
Group=mongodb
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target
@jwilm

This comment has been minimized.

Copy link
Owner Author

jwilm commented Jun 22, 2013

Assumes mongod config file specifies pidfilepath = /var/run/mongodb/mongod.pid and is located at /etc/mongod.conf.

@eitanshapiro

This comment has been minimized.

Copy link

eitanshapiro commented Sep 5, 2017

Need to make sure you don't have forking turned on in mongos or mongodb config file !

@Genda1ph

This comment has been minimized.

Copy link

Genda1ph commented Nov 7, 2017

I stumbled upon this gist googling for mongod systemd service config. And this is not really working properly for Ubuntu 16.

Assuming following mongod.conf:

storage:
  dbPath: "/var/lib/mongodb"
  journal:
    enabled: true

net:
  port: 27017
  bindIp: "127.0.0.1"

You want something like this:

[Unit]
Description=MongoDB Database Service
Wants=network.target
After=network.target

[Service]
Type=simple
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p /var/lib/mongod
ExecStartPre=/bin/chown mongodb:mongodb /var/lib/mongod
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
User=mongodb
Group=mongodb

[Install]
WantedBy=multi-user.target

This ensures:

  • /var/lib/mongodb exists and mongod is allowed to write there
  • mongod is started with proper privileges
  • mongod does not fork and is properly monitored and maintained by systemd
  • reload is supported
@AnupRaj

This comment has been minimized.

Copy link

AnupRaj commented Dec 14, 2017

@Genda1ph works for Ubuntu 17.10

@AlexVonB

This comment has been minimized.

Copy link

AlexVonB commented Sep 14, 2018

If you have services that depend on mongodb, the config is slightly more difficult because the default mongodb service returns before the database is online. That can cause quick applications to try and fail to connect to the database. To prevent this, add the following to /etc/mongod.conf:

processManagement:
    fork: true

Next, create /etc/systemd/system/mongod.service.d/mongod.conf (which extends the existing /lib/systemd/system/mongod.service) with the following content:

[Service]
Type=oneshot
RemainAfterExit=yes

That causes sudo systemctl start mongod to start the server in a forked process and return only AFTER the database is up and ready for connections. This way, dependent services only get invoked after the db is live.

@miqmago

This comment has been minimized.

Copy link

miqmago commented Apr 5, 2019

@AlexVonB I've tried your configuration but still having the fast application in trouble. See the time of start of each service:

● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/mongod.service.d
           └─mongod.conf
   Active: active (exited) since Fri 2019-04-05 19:02:04 CEST; 3min 16s ago
     Docs: https://docs.mongodb.org/manual
  Process: 1323 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=0/SUCCESS)
 Main PID: 1323 (code=exited, status=0/SUCCESS)
    Tasks: 52
   Memory: 352.2M
      CPU: 5.884s
   CGroup: /system.slice/mongod.service
           └─1538 /usr/bin/mongod --config /etc/mongod.conf

Apr 05 19:01:51 vps100000 systemd[1]: Starting High-performance, schema-free document-oriented database...
Apr 05 19:01:52 vps100000 mongod[1323]: about to fork child process, waiting until server is ready for connections.
Apr 05 19:01:52 vps100000 mongod[1323]: forked process: 1538
Apr 05 19:02:04 vps100000 systemd[1]: Started High-performance, schema-free document-oriented database.
● widestage.service - widestage node.js server
   Loaded: loaded (/mnt/widestage/widestage.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-04-05 19:01:51 CEST; 1min 32s ago
 Main PID: 1347 (node)
    Tasks: 10
   Memory: 49.5M
      CPU: 2.195s
   CGroup: /system.slice/widestage.service
           └─1347 /home/ubuntu/.nvm/versions/node/v6.10.0/bin/node /mnt/widestage/server.js

Apr 05 19:01:51 vps100000 systemd[1]: Started widestage node.js server.
Apr 05 19:01:57 vps100000 widestage[1347]: mongo DB connection
Apr 05 19:02:01 vps100000 widestage[1347]: Server running at http://0.0.0.0:3111/ in worker 1347
Apr 05 19:02:01 vps100000 widestage[1347]: Mongoose default connection disconnected
Apr 05 19:02:01 vps100000 widestage[1347]: Mongoose default connection error: MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]

Widestage service:

[Unit]
Description=widestage node.js server
After=network.target nginx.target mongod.target

[Service]
ExecStart=/usr/bin/taskset -c 0 /home/ubuntu/.nvm/versions/node/v6.10.0/bin/node /mnt/widestage/server.js
# Required on some systems
WorkingDirectory=/mnt/widestage
Restart=always
# Restart service after 10 seconds if node service crashes
RestartSec=10
# Output to syslog
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=widestage
User=ubuntu
#Group=<alternate group>
Environment=NODE_ENV=production
Environment=FOREVER_ROOT=/mnt/widestage
Environment=PORT=3111

[Install]
WantedBy=multi-user.target
@danmutblix

This comment has been minimized.

Copy link

danmutblix commented May 5, 2020

@jwilm thanks for a nice unit file, I have one question though, how is the $MAINPID set?

Assumes mongod config file specifies pidfilepath = /var/run/mongodb/mongod.pid and is located at /etc/mongod.conf.

@danmutblix

This comment has been minimized.

Copy link

danmutblix commented May 5, 2020

@jwilm, I figured it out, it's an environment variable set by systemctl

systemctl show mongod will print the MainPID among other things 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.