This guide covers advanced usage of Netmaker. If you are just looking to get started quickly, check out the Quick Start in the README.
Netmaker settings can be set via Environment Variables or Config file. There are also a couple of runtime arguments that can optionally be set.
APP_ENV: default=dev. Determines which environment file to use. Will look under config/environments/APP_ENV.yaml. For instance, you can  have different environments  for dev,  test, and prod,  and store different settinggs  accordingly.
GRPC_PORT: default=50051. The port for GRPC (node/client) communications
API_PORT: default=8081. The port for API and UI communications
MASTER_KEY: default=secretkey. The skeleton key used for authenticating with server as administrator.
MongoDB Connection Env Vars:
MONGO_USER:default=admin
MONGO_HOST:default=password
MONGO_PASS:default=localhost
MONGO_PORTS:default=27017
MONGO_OPTS:default=/?authSource=admin
BACKEND_URL: default=nil. The address of the server. Used for setting token values for client/nodes. If not set, will run a command to retrieve the server URL.
Stored as config/environments/*.yaml. Default used is dev.yaml
server:
mongoconn: (see ENV values above for explanation. ENV values override.)
clientmode: (default=on) E.x.: sudo netmaker --clientmode=off Run the Server as a client (node) as well.
defaultnet:  (default=on) E.x.: sudo netmaker --defaultnet=off Create a default network on startup.
Client config files are stored under /etc/netclient  per network as /etc/netclient/netconfig-< network name >
server:
address: The address:port of the server  
accesskey: The acceess key used to sign up with the server  
node:
name: a displayname for the node, e.g. "mycomputer" 
interface:  the network interface name, by default something like "nm-"  
network: the netmaker network being attached to  
password: the node's hashed password. Can be changed by putting a value in here and setting "postchanges" to "true"   
macaddress: the mac address of the node  
localaddress: the local network address   
wgaddress: the wireguard private address  
roamingoff: flag to update the IP address automatically based on network changes  
islocal: whether or not this is a local or public network   
allowedips: the allowedips addresses that other nodes will recieve  
localrange: the local address range if it's a local network  
postup: post up rules for gateway nodes  
postdown: post down rules for gateway nodes  
port: the wiregard port   
keepalive: the default keepalive value between this and all other nodes  
publickey: the public key other nodes will use to access this node   
privatekey: the private key of the nodes (this field does nothing)  
endpoint: the reachable endpoint of the node for routing, either local or public.  
postchanges: either "true" or "false" (with quotes). If true, will post any changes you make to the remote server. 
Install MongoDB on your server. For Ubuntu: sudo apt install -y mongodb. For more advanced installation or other operating systems, see  the MongoDB documentation.
Create a user:
mongo admin
db.createUser({ user: "mongoadmin" , pwd: "mongopass", roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]})
sudo journalctl -u netmakersudo systemctl restart netmakerDownload UI asset files: sudo wget -O /usr/share/nginx/html/netmaker-ui.zip https://github.com/gravitl/netmaker-ui/releases/download/latest/netmaker-ui.zip
Unzip: sudo unzip /usr/share/nginx/html/netmaker-ui.zip -d /usr/share/nginx/html
Copy Config to Nginx: sudo cp /usr/share/nginx/html/nginx.conf /etc/nginx/conf.d/default.conf
Modify Default Config Path: sudo sed -i 's/root \/var\/www\/html/root \/usr\/share\/nginx\/html/g' /etc/nginx/sites-available/default
Change Backend URL: sudo sh -c 'BACKEND_URL=http://<YOUR BACKEND API URL>:PORT /usr/share/nginx/html/generate_config_js.sh >/usr/share/nginx/html/config.js'
Start Nginx: sudo systemctl start nginx
On each machine you would like to add to the network, do the following:
sudo apt install wireguard-toolssysctl -w net.ipv4.ip_forward=1sudo curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/v0.2/netclient-install.sh | KEY=YOUR_TOKEN sh -sudo netclient -c install -t YOUR_TOKENThis will install [email protected] and netclient-YOUR_NET.timer in systemd, which will run periodically to call the netclient binary, which will check to see if there are any updates that it needs and update WireGuard appropriately.
Back End Compilation The backend can be compiled by running "go build" from the root of the repository, which will create an executable named "netmaker."
Client Compilation Similarly, "go build" can be run from the netclient directory to produce a netclient executable.
Protoc command for GRPC Compilation: Whenever making changes to grpc/node.proto, you will need to recompile the grpc. This can be achieved by running the following command from the root of the repository.
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative grpc/node.proto
Build binary:   go build ./
Unit Testing When making changes to Netmaker, you may wish to create nodes, networks, or keys for testing. Bash scripts have been created under the "test" directory (*.sh) which run curl commands that generate sample nodes, networks, and keys that can be used for testing purposes.
Integration Testing Similarly, several go scripts have been created under the test directory (*.go) to test out changes to the code base. These will be run automatically when PR's are submitted but can also be run manually using "go test."