Sfoglia il codice sorgente

Merge pull request #211 from gravitl/feature_0.7.1_refactor

Feature 0.7.1 refactor
Alex 4 anni fa
parent
commit
ec23953193
100 ha cambiato i file con 3653 aggiunte e 3273 eliminazioni
  1. 27 25
      compose/docker-compose.nodns.yml
  2. 1 0
      compose/docker-compose.quickstart.yml
  3. 133 0
      compose/docker-compose.reference copy.yml
  4. 13 32
      compose/docker-compose.reference.yml
  5. 48 0
      compose/docker-compose.test.yml
  6. 0 12
      config/config.go
  7. 1 11
      config/environments/dev.yaml
  8. 10 8
      controllers/authGrpc.go
  9. 11 7
      controllers/common.go
  10. 2 8
      controllers/config/environments/dev.yaml
  11. 1 2
      controllers/controller.go
  12. 26 5
      controllers/extClientHttpController.go
  13. 0 205
      controllers/intClientHttpController.go
  14. 5 27
      controllers/networkHttpController.go
  15. 1 11
      controllers/nodeHttpController.go
  16. 13 24
      controllers/serverHttpController.go
  17. BIN
      docs/_build/doctrees/architecture.doctree
  18. BIN
      docs/_build/doctrees/client-installation.doctree
  19. BIN
      docs/_build/doctrees/environment.pickle
  20. BIN
      docs/_build/doctrees/getting-started.doctree
  21. BIN
      docs/_build/doctrees/index.doctree
  22. BIN
      docs/_build/doctrees/quick-start.doctree
  23. BIN
      docs/_build/doctrees/server-installation.doctree
  24. BIN
      docs/_build/doctrees/support.doctree
  25. BIN
      docs/_build/doctrees/troubleshoot.doctree
  26. BIN
      docs/_build/doctrees/usage.doctree
  27. 1 1
      docs/_build/html/.buildinfo
  28. BIN
      docs/_build/html/_images/create-net.png
  29. BIN
      docs/_build/html/_images/netmaker-node.png
  30. 7 8
      docs/_build/html/_sources/architecture.rst.txt
  31. 27 2
      docs/_build/html/_sources/client-installation.rst.txt
  32. 112 134
      docs/_build/html/_sources/getting-started.rst.txt
  33. 5 0
      docs/_build/html/_sources/index.rst.txt
  34. 131 93
      docs/_build/html/_sources/quick-start.rst.txt
  35. 200 239
      docs/_build/html/_sources/server-installation.rst.txt
  36. 6 20
      docs/_build/html/_sources/support.rst.txt
  37. 75 1
      docs/_build/html/_sources/troubleshoot.rst.txt
  38. 3 18
      docs/_build/html/_sources/usage.rst.txt
  39. 1 1
      docs/_build/html/_static/documentation_options.js
  40. 54 19
      docs/_build/html/about.html
  41. 54 19
      docs/_build/html/api.html
  42. 66 34
      docs/_build/html/architecture.html
  43. 80 72
      docs/_build/html/client-installation.html
  44. 54 19
      docs/_build/html/conduct.html
  45. 54 19
      docs/_build/html/contribute.html
  46. 40 19
      docs/_build/html/external-clients.html
  47. 40 61
      docs/_build/html/genindex.html
  48. 611 176
      docs/_build/html/getting-started.html
  49. 62 80
      docs/_build/html/index.html
  50. 54 19
      docs/_build/html/license.html
  51. BIN
      docs/_build/html/objects.inv
  52. 230 122
      docs/_build/html/quick-start.html
  53. 40 61
      docs/_build/html/search.html
  54. 0 0
      docs/_build/html/searchindex.js
  55. 321 375
      docs/_build/html/server-installation.html
  56. 60 66
      docs/_build/html/support.html
  57. 122 26
      docs/_build/html/troubleshoot.html
  58. 57 97
      docs/_build/html/usage.html
  59. 7 8
      docs/architecture.rst
  60. 27 2
      docs/client-installation.rst
  61. 1 1
      docs/conf.py
  62. 7 5
      docs/examplecode/netclient-join.txt
  63. 10 7
      docs/examplecode/netconfig-example.yml
  64. 126 0
      docs/getting-started.rst
  65. BIN
      docs/images/create-net.png
  66. BIN
      docs/images/netmaker-node.png
  67. 5 0
      docs/index.rst
  68. 70 184
      docs/quick-start.rst
  69. 154 270
      docs/server-installation.rst
  70. 6 20
      docs/support.rst
  71. 75 1
      docs/troubleshoot.rst
  72. 3 18
      docs/usage.rst
  73. 29 12
      functions/helpers.go
  74. 63 59
      functions/jwt.go
  75. 1 3
      go.mod
  76. 2 0
      go.sum
  77. 2 2
      kube/netclient-daemonset.yaml
  78. 2 2
      kube/netmaker-template.yaml
  79. 0 32
      models/extclient.go
  80. 100 51
      models/names.go
  81. 29 5
      models/node.go
  82. 1 1
      models/structs.go
  83. 0 17
      models/wglink.go
  84. 1 6
      netclient/command/commands.go
  85. 0 99
      netclient/config/config.go
  86. BIN
      netclient/functions/.logging.go.swp
  87. 26 22
      netclient/functions/checkin.go
  88. 9 4
      netclient/functions/common.go
  89. 10 9
      netclient/functions/join.go
  90. 12 0
      netclient/functions/logging.go
  91. 0 101
      netclient/functions/register.go
  92. 1 17
      netclient/local/local.go
  93. 1 24
      netclient/main.go
  94. BIN
      netclient/netclient-amd64
  95. BIN
      netclient/netclient-arm
  96. BIN
      netclient/netclient-arm64
  97. 5 5
      netclient/wireguard/kernel.go
  98. 0 96
      nginx/netmaker-nginx-dns.conf
  99. 8 2
      nginx/netmaker-nginx-template.conf
  100. 1 10
      scripts/netmaker-server.sh

+ 27 - 25
compose/docker-compose.nodns.yml

@@ -1,54 +1,56 @@
 version: "3.4"
 
-volumes:
-  dnsconfig:
-  driver: local
 services:
-  mongodb:
-    image: mongo:4.2
-    ports:
-      - "27017:27017"
-    container_name: mongodb
-    volumes:
-      - mongovol:/data/db
+  rqlite:
+    container_name: rqlite
+    image: rqlite/rqlite
+    network_mode: host
     restart: always
-    environment:
-      MONGO_INITDB_ROOT_USERNAME: mongoadmin
-      MONGO_INITDB_ROOT_PASSWORD: mongopass
+    volumes:
+      - sqldata:/rqlite/file/data
   netmaker:
+    depends_on:
+      - rqlite
     privileged: true
     container_name: netmaker
-    depends_on:
-      - mongodb
-    image: gravitl/netmaker:v0.5.7
+    image: gravitl/netmaker:v0.7
     volumes:
       - ./:/local
       - /etc/netclient:/etc/netclient
-      - dnsconfig:/root/config/dnsconfig
-      - /usr/bin/wg:/usr/bin/wg:ro
+      - /usr/bin/wg:/usr/bin/wg
       - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
       - /run/systemd/system:/run/systemd/system
       - /etc/systemd/system:/etc/systemd/system
       - /sys/fs/cgroup:/sys/fs/cgroup
-    cap_add:
+    cap_add: 
       - NET_ADMIN
       - SYS_MODULE
     restart: always
     network_mode: host
     environment:
+      SERVER_HOST: "SERVER_PUBLIC_IP"
       DNS_MODE: "off"
-      SERVER_HOST: "192.168.50.149"
+      SERVER_API_CONN_STRING: "api.NETMAKER_BASE_DOMAIN:443"
+      SERVER_GRPC_CONN_STRING: "grpc.NETMAKER_BASE_DOMAIN:443"
+      GRPC_SSL: "on"
+      SERVER_HTTP_HOST: "api.NETMAKER_BASE_DOMAIN"
+      SERVER_GRPC_HOST: "grpc.NETMAKER_BASE_DOMAIN"
+      API_PORT: "8081"
+      GRPC_PORT: "50051"
+      CLIENT_MODE: "on"
+      MASTER_KEY: "REPLACE_MASTER_KEY"
+      SERVER_GRPC_WIREGUARD: "off"
+      CORS_ALLOWED_ORIGIN: "*"
   netmaker-ui:
     container_name: netmaker-ui
     depends_on:
       - netmaker
-    image: gravitl/netmaker-ui:v0.5
+    image: gravitl/netmaker-ui:v0.7
     links:
       - "netmaker:api"
     ports:
-      - "80:80"
+      - "8082:80"
     environment:
-      BACKEND_URL: "http://192.168.50.149:8081"
+      BACKEND_URL: "https://api.NETMAKER_BASE_DOMAIN"
 volumes:
-  mongovol: {}
-  dnsconfig: {}
+  sqldata: {}

+ 1 - 0
compose/docker-compose.quickstart.yml

@@ -34,6 +34,7 @@ services:
       SERVER_GRPC_CONN_STRING: "grpc.NETMAKER_BASE_DOMAIN:1443"
       COREDNS_ADDR: "SERVER_PUBLIC_IP"
       GRPC_SSL: "on"
+      DNS_MODE: "on"
       SERVER_HTTP_HOST: "api.NETMAKER_BASE_DOMAIN"
       SERVER_GRPC_HOST: "grpc.NETMAKER_BASE_DOMAIN"
       API_PORT: "8081"

+ 133 - 0
compose/docker-compose.reference copy.yml

@@ -0,0 +1,133 @@
+services:
+  rqlite:
+    container_name: rqlite
+    image: rqlite/rqlite
+    network_mode: host
+    restart: always
+    volumes:
+      - sqldata:/rqlite/file/data
+  netmaker:
+    depends_on:
+      - rqlite
+    privileged: true
+    container_name: netmaker
+    image: gravitl/netmaker:v0.7
+    volumes:
+      - ./:/local
+      - /etc/netclient:/etc/netclient
+      - dnsconfig:/root/config/dnsconfig
+      - /usr/bin/wg:/usr/bin/wg
+      - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
+      - /run/systemd/system:/run/systemd/system
+      - /etc/systemd/system:/etc/systemd/system
+      - /sys/fs/cgroup:/sys/fs/cgroup
+    cap_add: 
+      - NET_ADMIN
+      - SYS_MODULE
+    restart: always
+    network_mode: host
+    environment:
+      SERVER_HOST: "SERVER_PUBLIC_IP"
+      SERVER_API_CONN_STRING: "api.NETMAKER_BASE_DOMAIN:443"
+      SERVER_GRPC_CONN_STRING: "grpc.NETMAKER_BASE_DOMAIN:443"
+      COREDNS_ADDR: "SERVER_PUBLIC_IP"
+      GRPC_SSL: "on"
+      SERVER_HTTP_HOST: "api.NETMAKER_BASE_DOMAIN"
+      SERVER_GRPC_HOST: "grpc.NETMAKER_BASE_DOMAIN"
+      API_PORT: "8081"
+      GRPC_PORT: "50051"
+      CLIENT_MODE: "on"
+      MASTER_KEY: "REPLACE_MASTER_KEY"
+      SERVER_GRPC_WIREGUARD: "off"
+      CORS_ALLOWED_ORIGIN: "*"
+  netmaker-ui:
+    container_name: netmaker-ui
+    depends_on:
+      - netmaker
+    image: gravitl/netmaker-ui:v0.7
+    links:
+      - "netmaker:api"
+    ports:
+      - "8082:80"
+    environment:
+      BACKEND_URL: "https://api.NETMAKER_BASE_DOMAIN"
+  coredns:
+    depends_on:
+      - netmaker 
+    image: coredns/coredns
+    command: -conf /root/dnsconfig/Corefile
+    container_name: coredns
+    restart: always
+    ports:
+      - "53:53/udp"
+    volumes:
+      - dnsconfig:/root/dnsconfig
+
+
+version: "3.4"
+
+services:
+  rqlite: # The rqlite instance that backs up Netmaker
+    container_name: rqlite
+    image: rqlite/rqlite
+    network_mode: host
+    restart: always
+    volumes:
+      - sqldata:/rqlite/file/data
+  netmaker: # The Primary Server for running Netmaker
+    privileged: true # Necessary to run sudo/root level commands on host system. Take out if not running with CLIENT_MODE=on
+    container_name: netmaker
+    depends_on:
+      - mongodb
+    image: gravitl/netmaker:v0.7
+    volumes: # Volume mounts necessary for Netmaker to control netclient, wireguard, and networking on host (except dnsconfig, which is where dns config files are stored for use by CoreDNS)
+      - ./:/local
+      - /etc/netclient:/etc/netclient
+      - dnsconfig:/root/config/dnsconfig # Netmaker writes Corefile to this location, which gets mounted by CoreDNS for DNS configuration.
+      - /usr/bin/wg:/usr/bin/wg
+      - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
+      - /run/systemd/system:/run/systemd/system
+      - /etc/systemd/system:/etc/systemd/system
+      - /sys/fs/cgroup:/sys/fs/cgroup
+    cap_add: # Necessary for CLIENT_MODE. Should be removed if turned off. 
+      - NET_ADMIN
+      - SYS_MODULE
+    restart: always
+    network_mode: host # Necessary for CLIENT_MODE. Should be removed if turned off, but then need to add port mappings
+    environment:
+      GRPC_SSL: "off" # Tells clients to use SSL to connect to GRPC. Switch to on to turn on.
+      SERVER_API_CONN_STRING: "" # Changes the api connection string. IP:PORT format. By default is empty and uses SERVER_HOST:API_PORT
+      SERVER_GRPC_CONN_STRING: "" # Changes the grpc connection string. IP:PORT format. By default is empty and uses SERVER_HOST:GRPC_PORT
+      SERVER_HOST: "" # All the Docker Compose files pre-populate this with HOST_IP, which you replace as part of the install instructions. This will set both HTTP and GRPC host.
+      API_PORT: 8081 # The HTTP API port for Netmaker. Used for API calls / communication from front end. If changed, need to change port of BACKEND_URL for netmaker-ui.
+      GRPC_PORT: 50051 # The GRPC port for Netmaker. Used for communications from nodes.
+      MASTER_KEY: "secretkey" # The admin master key for accessing the API. Change this in any production installation.
+      CORS_ALLOWED_ORIGIN: "*" # The "allowed origin" for API requests. Change to restrict where API requests can come from.
+      REST_BACKEND: "on" # Enables the REST backend (API running on API_PORT at SERVER_HTTP_HOST). Change to "off" to turn off.
+      AGENT_BACKEND: "on" # Enables the AGENT backend (GRPC running on GRPC_PORT at SERVER_GRPC_HOST). Change to "off" to turn off.
+      DNS_MODE: "on" # Enables DNS Mode, meaning config files will be generated for CoreDNS. Note, turning "off" does not remove CoreDNS. You still need to remove CoreDNS from compose file.
+  netmaker-ui: # The Netmaker UI Component
+    container_name: netmaker-ui
+    depends_on:
+      - netmaker
+    image: gravitl/netmaker-ui:v0.7
+    links:
+      - "netmaker:api"
+    ports:
+      - "8082:80"
+    environment:
+      BACKEND_URL: "http://HOST_IP:8081" # URL where UI will send API requests. Change based on SERVER_HOST, SERVER_HTTP_HOST, and API_PORT
+  coredns: # The DNS Server. Remove this section if DNS_MODE="off"
+    depends_on:
+      - netmaker 
+    image: coredns/coredns
+    command: -conf /root/dnsconfig/Corefile # Config location for Corefile. This is the path of file which is also mounted to Netmaker for modification.
+    container_name: coredns
+    restart: always
+    ports:
+      - "53:53/udp" # Likely needs to run at port 53 for adequate nameserver usage.
+    volumes:
+      - dnsconfig:/root/dnsconfig
+volumes:
+  sqldata: {}
+  dnsconfig: {}

+ 13 - 32
compose/docker-compose.reference.yml

@@ -1,23 +1,17 @@
-version: "3.4"
-
 services:
-  mongodb: # The MongoDB Instance that backs up Netmaker
-    image: mongo:4.2
-    ports:
-      - "27017:27017" # Port Mapping for MongoDB. Can be modified, but be sure to change the MONGO_PORT env var in netmaker
-    container_name: mongodb
-    volumes:
-      - mongovol:/data/db
+  rqlite:
+    container_name: rqlite
+    image: rqlite/rqlite
+    network_mode: host
     restart: always
-    environment:
-      MONGO_INITDB_ROOT_USERNAME: mongoadmin # Default username. Recommend changing for production installs. You will need to set MONGO_ADMIN netmaker env var.
-      MONGO_INITDB_ROOT_PASSWORD: mongopass # Default password. Recommend changing for production installs. You will need to set MONGO_PASS netmaker env var.
+    volumes:
+      - sqldata:/rqlite/file/data
   netmaker: # The Primary Server for running Netmaker
     privileged: true # Necessary to run sudo/root level commands on host system. Take out if not running with CLIENT_MODE=on
     container_name: netmaker
     depends_on:
-      - mongodb
-    image: gravitl/netmaker:v0.5
+      - rqlite
+    image: gravitl/netmaker:v0.7
     volumes: # Volume mounts necessary for CLIENT_MODE to control netclient, wireguard, and networking on host (except dnsconfig, which is where dns config files are stored for use by CoreDNS)
       - ./:/local
       - /etc/netclient:/etc/netclient
@@ -42,36 +36,23 @@ services:
       CORS_ALLOWED_ORIGIN: "*" # The "allowed origin" for API requests. Change to restrict where API requests can come from.
       REST_BACKEND: "on" # Enables the REST backend (API running on API_PORT at SERVER_HTTP_HOST). Change to "off" to turn off.
       AGENT_BACKEND: "on" # Enables the AGENT backend (GRPC running on GRPC_PORT at SERVER_GRPC_HOST). Change to "off" to turn off.
-      CLIENT_MODE: "on" # Enables Client Mode, meaning netclient will be deployed on server and will be manageable from UI. Change to "off" to turn off.
       DNS_MODE: "on" # Enables DNS Mode, meaning config files will be generated for CoreDNS. Note, turning "off" does not remove CoreDNS. You still need to remove CoreDNS from compose file.
       DISABLE_REMOTE_IP_CHECK: "off" # If turned "on", Server will not set Host based on remote IP check. This is already overridden if SERVER_HOST is set. Turned "off" by default.
-      MONGO_ADMIN: "mongoadmin" # Admin user for MongoDB. Change to match above MongoDB instance
-      MONGO_PASS: "mongopass" # Admin password for MongoDB. Change to match above MongoDB instance
-      MONGO_HOST: "127.0.0.1" # Address of MongoDB. Change if necessary.
-      MONGO_PORT: "27017" # Port of MongoDB. Change if necessary.
-      MONGO_OPTS: "/?authSource=admin" # Opts to enable admin login for Mongo.
-      SERVER_GRPC_WIREGUARD: "on" # Whether to run GRPC over a WireGuard network. On by default. Secures server comms. Switch to "off" to turn off.
-      SERVER_GRPC_WG_INTERFACE: "nm-grpc-wg" # Interface to use for GRPC WireGuard network if enabled
-      SERVER_GRPC_WG_ADDRESS: "10.101.0.1" # Private Address to use for GRPC WireGuard network if enabled
-      SERVER_GRPC_WG_ADDRESS_RANGE: "10.101.0.0/16" # Private Address range to use for GRPC WireGard clients if enabled
-      SERVER_GRPC_WG_PORT: "50555" # Port to use for GRPC WireGuard if enabled
-      SERVER_GRPC_WG_PUBKEY: "SERVER_GRPC_WG_PUBKEY" # PublicKey for GRPC WireGuard interface. Generated if blank.
-      SERVER_GRPC_WG_PRIVKEY: "SERVER_GRPC_WG_PRIVKEY" # PrivateKey for GRPC WireGuard interface. Generated if blank.
       GRPC_SSL: "off" # Tells clients to use SSL to connect to GRPC. Switch to on to turn on.
+      COREDNS_ADDR: "" # Address of the CoreDNS server. Defaults to SERVER_HOST
       SERVER_API_CONN_STRING: "" # Changes the api connection string. IP:PORT format. By default is empty and uses SERVER_HOST:API_PORT
       SERVER_GRPC_CONN_STRING: "" # Changes the grpc connection string. IP:PORT format. By default is empty and uses SERVER_HOST:GRPC_PORT
   netmaker-ui: # The Netmaker UI Component
     container_name: netmaker-ui
     depends_on:
       - netmaker
-    image: gravitl/netmaker-ui:v0.5
+    image: gravitl/netmaker-ui:v0.7
     links:
       - "netmaker:api"
     ports:
-      - "80:80"
+      - "8082:80"
     environment:
       BACKEND_URL: "http://HOST_IP:8081" # URL where UI will send API requests. Change based on SERVER_HOST, SERVER_HTTP_HOST, and API_PORT
-      MASTER_KEY: "secretkey" # Master Key for API calls. Will be removed in v0.3.5
   coredns: # The DNS Server. Remove this section if DNS_MODE="off"
     depends_on:
       - netmaker 
@@ -84,5 +65,5 @@ services:
     volumes:
       - dnsconfig:/root/dnsconfig
 volumes:
-  mongovol: {}
-  dnsconfig: {}
+  sqldata: {}
+  dnsconfig: {}

+ 48 - 0
compose/docker-compose.test.yml

@@ -0,0 +1,48 @@
+version: "3.4"
+
+services:
+  rqlite:
+    container_name: rqlite
+    image: rqlite/rqlite
+    network_mode: host
+    restart: always
+    volumes:
+      - sqldata:/rqlite/file/data
+  netmaker:
+    depends_on:
+      - rqlite
+    privileged: true
+    container_name: netmaker
+    image: gravitl/netmaker:v0.7
+    volumes:
+      - ./:/local
+      - /etc/netclient:/etc/netclient
+      - /usr/bin/wg:/usr/bin/wg
+      - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
+      - /run/systemd/system:/run/systemd/system
+      - /etc/systemd/system:/etc/systemd/system
+      - /sys/fs/cgroup:/sys/fs/cgroup
+    cap_add: 
+      - NET_ADMIN
+      - SYS_MODULE
+    restart: always
+    network_mode: host
+    environment:
+      GRPC_SSL: "off"
+      API_PORT: "8081"
+      GRPC_PORT: "50051"
+      DNS_MODE: "off"
+      CORS_ALLOWED_ORIGIN: "*"
+  netmaker-ui:
+    container_name: netmaker-ui
+    depends_on:
+      - netmaker
+    image: gravitl/netmaker-ui:v0.7
+    links:
+      - "netmaker:api"
+    ports:
+      - "80:80"
+    environment:
+      BACKEND_URL: "http://HOST_IP:8081"
+volumes:
+  sqldata: {}

+ 0 - 12
config/config.go

@@ -30,7 +30,6 @@ var Config *EnvironmentConfig
 // EnvironmentConfig :
 type EnvironmentConfig struct {
 	Server ServerConfig `yaml:"server"`
-	WG     WG           `yaml:"wg"`
 }
 
 // ServerConfig :
@@ -56,17 +55,6 @@ type ServerConfig struct {
 	Verbosity            int32  `yaml:"verbosity"`
 }
 
-type WG struct {
-	RegisterKeyRequired string `yaml:"keyrequired"`
-	GRPCWireGuard       string `yaml:"grpcwg"`
-	GRPCWGInterface     string `yaml:"grpciface"`
-	GRPCWGAddress       string `yaml:"grpcaddr"`
-	GRPCWGAddressRange  string `yaml:"grpcaddrrange"`
-	GRPCWGPort          string `yaml:"grpcport"`
-	GRPCWGPubKey        string `yaml:"pubkey"`
-	GRPCWGPrivKey       string `yaml:"privkey"`
-}
-
 //reading in the env file
 func readConfig() *EnvironmentConfig {
 	file := fmt.Sprintf("config/environments/%s.yaml", getEnv())

+ 1 - 11
config/environments/dev.yaml

@@ -9,14 +9,4 @@ server:
   agentbackend: "" # defaults to "on" or AGENT_BACKEND (if set)
   clientmode: "" # defaults to "on" or CLIENT_MODE (if set)
   dnsmode: "" # defaults to "on" or DNS_MODE (if set)
-  disableremoteipcheck: "" # defaults to "false" or DISABLE_REMOTE_IP_CHECK (if set)
-wg:
-  keyrequired: "" # defaults to "". If set to "yes", a key is required for signing up for the comms network 
-  grpcwg: "" # defaults to "on" or SERVER_GRPC_WIREGUARD if set
-  grpciface: "" # defaults to nm-grpc-wg or SERVER_GRPC_WG_INTERFACE if set
-  grpcaddr: "" # defaults to 10.101.0.1 or SERVER_GRPC_WG_ADDRESS if set
-  grpcaddrrange: "" # defaults to 10.101.0.0/16 or SERVER_GRPC_WG_ADDRESS_RANGE if set
-  grpcendpoint: "" # defaults to SERVER_HOST if unset
-  grpcport: "" # defaults to 50555 or SERVER_GRPC_WG_PORT if set
-  pubkey: "" # defaults to generated value or SERVER_GRPC_WG_PUBKEY if set
-  privkey: "" # defaults to generated value or SERVER_GRPC_WG_PRIVKEY if set
+  disableremoteipcheck: "" # defaults to "false" or DISABLE_REMOTE_IP_CHECK (if set)

+ 10 - 8
controllers/authGrpc.go

@@ -69,7 +69,6 @@ func grpcAuthorize(ctx context.Context) error {
 	authToken := authHeader[0]
 
 	mac, network, err := functions.VerifyToken(authToken)
-
 	if err != nil {
 		return err
 	}
@@ -78,23 +77,26 @@ func grpcAuthorize(ctx context.Context) error {
 
 	if err != nil {
 		return status.Errorf(codes.Unauthenticated, "Unauthorized. Network does not exist: "+network)
-
 	}
 	emptynode := models.Node{}
 	node, err := functions.GetNodeByMacAddress(network, mac)
+	if database.IsEmptyRecord(err) {
+		if node, err = functions.GetDeletedNodeByMacAddress(network, mac); err == nil {
+			if functions.RemoveDeletedNode(node.ID) {
+				return status.Errorf(codes.Unauthenticated, models.NODE_DELETE)
+			}
+			return status.Errorf(codes.Unauthenticated, "Node does not exist.")
+		}
+		return status.Errorf(codes.Unauthenticated, "Empty record")
+	}
 	if err != nil || node.MacAddress == emptynode.MacAddress {
 		return status.Errorf(codes.Unauthenticated, "Node does not exist.")
 	}
 
-	//check that the request is for a valid network
-	//if (networkCheck && !networkexists) || err != nil {
 	if !networkexists {
-
 		return status.Errorf(codes.Unauthenticated, "Network does not exist.")
-
-	} else {
-		return nil
 	}
+	return nil
 }
 
 //Node authenticates using its password and retrieves a JWT for authorization.

+ 11 - 7
controllers/common.go

@@ -5,6 +5,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/functions"
 	"github.com/gravitl/netmaker/models"
@@ -21,19 +22,19 @@ func GetPeersList(networkName string) ([]models.Node, error) {
 		if database.IsEmptyRecord(err) {
 			return peers, nil
 		}
-		functions.PrintUserLog("",err.Error(),2)
+		functions.PrintUserLog("", err.Error(), 2)
 		return nil, err
 	}
 	udppeers, errN := database.GetPeers(networkName)
 	if errN != nil {
-		functions.PrintUserLog("",errN.Error(),2)
+		functions.PrintUserLog("", errN.Error(), 2)
 	}
 	for _, value := range collection {
 		var node models.Node
 		var peer models.Node
 		err := json.Unmarshal([]byte(value), &node)
 		if err != nil {
-			functions.PrintUserLog("",err.Error(),2)
+			functions.PrintUserLog("", err.Error(), 2)
 			continue
 		}
 		if node.IsEgressGateway == "yes" { // handle egress stuff
@@ -122,7 +123,7 @@ func DeleteNode(key string, exterminate bool) error {
 		}
 	} else {
 		if err := database.DeleteRecord(database.DELETED_NODES_TABLE_NAME, key); err != nil {
-			functions.PrintUserLog("",err.Error(),2)
+			functions.PrintUserLog("", err.Error(), 2)
 		}
 	}
 	if err := database.DeleteRecord(database.NODES_TABLE_NAME, key); err != nil {
@@ -214,6 +215,9 @@ func CreateNode(node models.Node, networkName string) (models.Node, error) {
 		//returnErrorResponse(w, r, errorResponse)
 		return node, err
 	}
+	if servercfg.IsDNSMode() {
+		node.DNSOn = "yes"
+	}
 	err = node.Validate(false)
 	if err != nil {
 		return node, err
@@ -243,11 +247,11 @@ func CreateNode(node models.Node, networkName string) (models.Node, error) {
 func SetNetworkServerPeers(networkName string) {
 	if currentPeersList, err := serverctl.GetPeers(networkName); err == nil {
 		if database.SetPeers(currentPeersList, networkName) {
-			functions.PrintUserLog(models.NODE_SERVER_NAME,"set new peers on network "+networkName,1)
+			functions.PrintUserLog(models.NODE_SERVER_NAME, "set new peers on network "+networkName, 1)
 		}
 	} else {
-		functions.PrintUserLog(models.NODE_SERVER_NAME,"could not set peers on network "+networkName,1)
-		functions.PrintUserLog(models.NODE_SERVER_NAME,err.Error(),1)
+		functions.PrintUserLog(models.NODE_SERVER_NAME, "could not set peers on network "+networkName, 1)
+		functions.PrintUserLog(models.NODE_SERVER_NAME, err.Error(), 1)
 	}
 }
 

+ 2 - 8
controllers/config/environments/dev.yaml

@@ -2,16 +2,10 @@ server:
   host: "localhost"
   apiport: "8081"
   grpcport: "50051"
-  masterkey: "secretkey"
+  masterkey: ""
   allowedorigin: "*"
   restbackend: true            
   agentbackend: true
   defaultnetname: "default"
   defaultnetrange: "10.10.10.0/24"
-  createdefault: true
-mongoconn:
-  user: "mongoadmin"
-  pass: "mongopass"
-  host: "localhost"
-  port: "27017"
-  opts: '/?authSource=admin'
+  createdefault: true

+ 1 - 2
controllers/controller.go

@@ -30,8 +30,7 @@ func HandleRESTRequests(wg *sync.WaitGroup) {
 	fileHandlers(r)
 	serverHandlers(r)
 	extClientHandlers(r)
-	intClientHandlers(r)
-
+	
 	port := servercfg.GetAPIPort()
 
 	srv := &http.Server{Addr: ":" + port, Handler: handlers.CORS(originsOk, headersOk, methodsOk)(r)}

+ 26 - 5
controllers/extClientHttpController.go

@@ -19,7 +19,7 @@ import (
 
 func extClientHandlers(r *mux.Router) {
 
-	r.HandleFunc("/api/extclients", securityCheck(true, http.HandlerFunc(getAllExtClients))).Methods("GET")
+	r.HandleFunc("/api/extclients", securityCheck(false, http.HandlerFunc(getAllExtClients))).Methods("GET")
 	r.HandleFunc("/api/extclients/{network}", securityCheck(false, http.HandlerFunc(getNetworkExtClients))).Methods("GET")
 	r.HandleFunc("/api/extclients/{network}/{clientid}", securityCheck(false, http.HandlerFunc(getExtClient))).Methods("GET")
 	r.HandleFunc("/api/extclients/{network}/{clientid}/{type}", securityCheck(false, http.HandlerFunc(getExtClientConf))).Methods("GET")
@@ -77,15 +77,36 @@ func GetNetworkExtClients(network string) ([]models.ExtClient, error) {
 //A separate function to get all extclients, not just extclients for a particular network.
 //Not quite sure if this is necessary. Probably necessary based on front end but may want to review after iteration 1 if it's being used or not
 func getAllExtClients(w http.ResponseWriter, r *http.Request) {
+
 	w.Header().Set("Content-Type", "application/json")
-	extclients, err := functions.GetAllExtClients()
-	if err != nil {
-		returnErrorResponse(w, r, formatError(err, "internal"))
+
+	headerNetworks := r.Header.Get("networks")
+	networksSlice := []string{}
+	marshalErr := json.Unmarshal([]byte(headerNetworks), &networksSlice)
+	if marshalErr != nil {
+		returnErrorResponse(w, r, formatError(marshalErr, "internal"))
 		return
 	}
+	clients := []models.ExtClient{}
+	err := errors.New("Networks Error")
+	if networksSlice[0] == ALL_NETWORK_ACCESS {
+		clients, err = functions.GetAllExtClients()
+		if err != nil && !database.IsEmptyRecord(err){
+			returnErrorResponse(w, r, formatError(err, "internal"))
+			return
+		}
+	} else {
+		for _, network := range networksSlice {
+			extclients, err := GetNetworkExtClients(network)
+			if err == nil {
+				clients = append(clients, extclients...)
+			}
+		}
+	}
+
 	//Return all the extclients in JSON format
 	w.WriteHeader(http.StatusOK)
-	json.NewEncoder(w).Encode(extclients)
+	json.NewEncoder(w).Encode(clients)
 }
 
 //Get an individual extclient. Nothin fancy here folks.

+ 0 - 205
controllers/intClientHttpController.go

@@ -1,205 +0,0 @@
-package controller
-
-import (
-	//	"fmt"
-	// "github.com/davecgh/go-spew/spew"
-
-	"encoding/json"
-	"errors"
-	"net/http"
-
-	"github.com/gorilla/mux"
-	"github.com/gravitl/netmaker/database"
-	"github.com/gravitl/netmaker/functions"
-	"github.com/gravitl/netmaker/models"
-	"github.com/gravitl/netmaker/servercfg"
-	"github.com/gravitl/netmaker/serverctl"
-	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
-)
-
-func intClientHandlers(r *mux.Router) {
-
-	r.HandleFunc("/api/intclient/{clientid}", securityCheck(false, http.HandlerFunc(getIntClient))).Methods("GET")
-	r.HandleFunc("/api/intclients", securityCheck(false, http.HandlerFunc(getAllIntClients))).Methods("GET")
-	r.HandleFunc("/api/intclients/deleteall", securityCheck(false, http.HandlerFunc(deleteAllIntClients))).Methods("DELETE")
-	r.HandleFunc("/api/intclient/{clientid}", securityCheck(false, http.HandlerFunc(updateIntClient))).Methods("PUT")
-	r.HandleFunc("/api/intclient/register", http.HandlerFunc(registerIntClient)).Methods("POST")
-	r.HandleFunc("/api/intclient/{clientid}", http.HandlerFunc(deleteIntClient)).Methods("DELETE")
-}
-
-func getAllIntClients(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "application/json")
-	clients, err := functions.GetAllIntClients()
-	if err != nil {
-		returnErrorResponse(w, r, formatError(err, "internal"))
-		return
-	}
-	//Return all the extclients in JSON format
-	w.WriteHeader(http.StatusOK)
-	json.NewEncoder(w).Encode(clients)
-}
-
-func deleteAllIntClients(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "application/json")
-	err := functions.DeleteAllIntClients()
-	if err != nil {
-		returnErrorResponse(w, r, formatError(err, "internal"))
-		return
-	}
-	w.WriteHeader(http.StatusOK)
-}
-
-func deleteIntClient(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "application/json")
-	// get params
-	var params = mux.Vars(r)
-
-	success, err := DeleteIntClient(params["clientid"])
-
-	if err != nil {
-		returnErrorResponse(w, r, formatError(err, "internal"))
-		return
-	} else if !success {
-		err = errors.New("Could not delete intclient " + params["clientid"])
-		returnErrorResponse(w, r, formatError(err, "internal"))
-		return
-	}
-	returnSuccessResponse(w, r, params["clientid"]+" deleted.")
-}
-
-func getIntClient(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "application/json")
-	var params = mux.Vars(r)
-
-	client, err := GetIntClient(params["clientid"])
-	if err != nil {
-		returnErrorResponse(w, r, formatError(err, "internal"))
-		return
-	}
-	w.WriteHeader(http.StatusOK)
-	json.NewEncoder(w).Encode(client)
-}
-
-func updateIntClient(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "application/json")
-
-	var errorResponse = models.ErrorResponse{
-		Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
-	}
-
-	var clientreq models.IntClient
-
-	//get node from body of request
-	err := json.NewDecoder(r.Body).Decode(&clientreq)
-	if err != nil {
-		returnErrorResponse(w, r, formatError(err, "internal"))
-		return
-	}
-	if servercfg.IsRegisterKeyRequired() {
-		validKey := functions.IsKeyValidGlobal(clientreq.AccessKey)
-		if !validKey {
-			errorResponse = models.ErrorResponse{
-				Code: http.StatusUnauthorized, Message: "W1R3: Key invalid, or none provided.",
-			}
-			returnErrorResponse(w, r, errorResponse)
-			return
-		}
-	}
-	client, err := RegisterIntClient(clientreq)
-
-	if err != nil {
-		returnErrorResponse(w, r, formatError(err, "internal"))
-		return
-	}
-	w.WriteHeader(http.StatusOK)
-	json.NewEncoder(w).Encode(client)
-}
-
-func RegisterIntClient(client models.IntClient) (models.IntClient, error) {
-	if client.PrivateKey == "" {
-		privateKey, err := wgtypes.GeneratePrivateKey()
-		if err != nil {
-			return client, err
-		}
-
-		client.PrivateKey = privateKey.String()
-		client.PublicKey = privateKey.PublicKey().String()
-	}
-
-	if client.Address == "" {
-		newAddress, err := functions.UniqueAddress(client.Network)
-		if err != nil {
-			return client, err
-		}
-		if newAddress == "" {
-			return client, errors.New("Could not find an address.")
-		}
-		client.Address = newAddress
-	}
-	if client.Network == "" {
-		client.Network = "comms"
-	}
-	server, err := serverctl.GetServerWGConf()
-	//spew.Dump(server)
-	if err != nil {
-		return client, err
-	}
-	client.ServerPublicEndpoint = server.ServerPublicEndpoint
-	client.ServerAPIPort = server.ServerAPIPort
-	client.ServerPrivateAddress = server.ServerPrivateAddress
-	client.ServerWGPort = server.ServerWGPort
-	client.ServerGRPCPort = server.ServerGRPCPort
-	client.ServerKey = server.ServerKey
-
-	if client.ClientID == "" {
-		clientid := StringWithCharset(7, charset)
-		clientname := "client-" + clientid
-		client.ClientID = clientname
-	}
-
-	data, err := json.Marshal(&client)
-	if err != nil {
-		return client, err
-	}
-	if err = database.Insert(client.ClientID, string(data), database.INT_CLIENTS_TABLE_NAME); err != nil {
-		return client, err
-	}
-
-	err = serverctl.ReconfigureServerWireGuard()
-
-	return client, err
-}
-func registerIntClient(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "application/json")
-
-	var errorResponse = models.ErrorResponse{
-		Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
-	}
-
-	var clientreq models.IntClient
-
-	//get node from body of request
-	err := json.NewDecoder(r.Body).Decode(&clientreq)
-	if err != nil {
-		returnErrorResponse(w, r, formatError(err, "internal"))
-		return
-	}
-	if servercfg.IsRegisterKeyRequired() {
-		validKey := functions.IsKeyValidGlobal(clientreq.AccessKey)
-		if !validKey {
-			errorResponse = models.ErrorResponse{
-				Code: http.StatusUnauthorized, Message: "W1R3: Key invalid, or none provided.",
-			}
-			returnErrorResponse(w, r, errorResponse)
-			return
-		}
-	}
-	client, err := RegisterIntClient(clientreq)
-
-	if err != nil {
-		returnErrorResponse(w, r, formatError(err, "internal"))
-		return
-	}
-	w.WriteHeader(http.StatusOK)
-	json.NewEncoder(w).Encode(client)
-}

+ 5 - 27
controllers/networkHttpController.go

@@ -7,6 +7,7 @@ import (
 	"net/http"
 	"strings"
 	"time"
+
 	"github.com/go-playground/validator/v10"
 	"github.com/gorilla/mux"
 	"github.com/gravitl/netmaker/database"
@@ -65,7 +66,7 @@ func securityCheck(reqAdmin bool, next http.Handler) http.HandlerFunc {
 	}
 }
 
-func SecurityCheck(reqAdmin bool, netname, token string) (error, []string, string) {
+func SecurityCheck(reqAdmin bool, netname string, token string) (error, []string, string) {
 
 	var hasBearer = true
 	var tokenSplit = strings.Split(token, " ")
@@ -94,7 +95,7 @@ func SecurityCheck(reqAdmin bool, netname, token string) (error, []string, strin
 			userNetworks = []string{ALL_NETWORK_ACCESS}
 		} else {
 			networkexists, err := functions.NetworkExists(netname)
-			if err != nil {
+			if err != nil && !database.IsEmptyRecord(err) {
 				return err, nil, ""
 			}
 			if netname != "" && !networkexists {
@@ -179,7 +180,7 @@ func ValidateNetworkUpdate(network models.Network) error {
 
 	if err != nil {
 		for _, e := range err.(validator.ValidationErrors) {
-			functions.PrintUserLog("validator",e.Error(),1)
+			functions.PrintUserLog("validator", e.Error(), 1)
 		}
 	}
 	return err
@@ -416,9 +417,6 @@ func CreateNetwork(network models.Network) error {
 }
 
 // BEGIN KEY MANAGEMENT SECTION
-
-//TODO: Very little error handling
-//accesskey is created as a json string inside the Network collection item in mongo
 func createAccessKey(w http.ResponseWriter, r *http.Request) {
 	w.Header().Set("Content-Type", "application/json")
 	var params = mux.Vars(r)
@@ -478,7 +476,6 @@ func CreateAccessKey(accesskey models.AccessKey, network models.Network) (models
 
 	var accessToken models.AccessToken
 	s := servercfg.GetServerConfig()
-	w := servercfg.GetWGConfig()
 	servervals := models.ServerConfig{
 		CoreDNSAddr:    s.CoreDNSAddr,
 		APIConnString:  s.APIConnString,
@@ -489,16 +486,7 @@ func CreateAccessKey(accesskey models.AccessKey, network models.Network) (models
 		GRPCPort:       s.GRPCPort,
 		GRPCSSL:        s.GRPCSSL,
 	}
-	wgvals := models.WG{
-		GRPCWireGuard:  w.GRPCWireGuard,
-		GRPCWGAddress:  w.GRPCWGAddress,
-		GRPCWGPort:     w.GRPCWGPort,
-		GRPCWGPubKey:   w.GRPCWGPubKey,
-		GRPCWGEndpoint: s.APIHost,
-	}
-
 	accessToken.ServerConfig = servervals
-	accessToken.WG = wgvals
 	accessToken.ClientConfig.Network = netID
 	accessToken.ClientConfig.Key = accesskey.Value
 	accessToken.ClientConfig.LocalRange = privAddr
@@ -515,7 +503,7 @@ func CreateAccessKey(accesskey models.AccessKey, network models.Network) (models
 	err = v.Struct(accesskey)
 	if err != nil {
 		for _, e := range err.(validator.ValidationErrors) {
-			functions.PrintUserLog("validator",e.Error(),1)
+			functions.PrintUserLog("validator", e.Error(), 1)
 		}
 		return models.AccessKey{}, err
 	}
@@ -537,7 +525,6 @@ func GetSignupToken(netID string) (models.AccessKey, error) {
 	var accesskey models.AccessKey
 	var accessToken models.AccessToken
 	s := servercfg.GetServerConfig()
-	w := servercfg.GetWGConfig()
 	servervals := models.ServerConfig{
 		APIConnString:  s.APIConnString,
 		APIHost:        s.APIHost,
@@ -547,16 +534,7 @@ func GetSignupToken(netID string) (models.AccessKey, error) {
 		GRPCPort:       s.GRPCPort,
 		GRPCSSL:        s.GRPCSSL,
 	}
-	wgvals := models.WG{
-		GRPCWireGuard:  w.GRPCWireGuard,
-		GRPCWGAddress:  w.GRPCWGAddress,
-		GRPCWGPort:     w.GRPCWGPort,
-		GRPCWGPubKey:   w.GRPCWGPubKey,
-		GRPCWGEndpoint: s.APIHost,
-	}
-
 	accessToken.ServerConfig = servervals
-	accessToken.WG = wgvals
 
 	tokenjson, err := json.Marshal(accessToken)
 	if err != nil {

+ 1 - 11
controllers/nodeHttpController.go

@@ -6,6 +6,7 @@ import (
 	"net/http"
 	"strings"
 	"time"
+
 	"github.com/gorilla/mux"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/functions"
@@ -194,17 +195,6 @@ func authorize(networkCheck bool, authNetwork string, next http.Handler) http.Ha
 				macaddress = "mastermac"
 				isAuthorized = true
 				r.Header.Set("ismasterkey", "yes")
-			} else {
-				r.Header.Set("ismasterkey", "")
-				mac, _, err := functions.VerifyToken(authToken)
-				if err != nil {
-					errorResponse = models.ErrorResponse{
-						Code: http.StatusUnauthorized, Message: "W1R3: Error Verifying Auth Token.",
-					}
-					returnErrorResponse(w, r, errorResponse)
-					return
-				}
-				macaddress = mac
 			}
 			if !isadmin && params["network"] != "" {
 				if functions.SliceContains(networks, params["network"]) {

+ 13 - 24
controllers/serverHttpController.go

@@ -12,16 +12,15 @@ import (
 )
 
 func serverHandlers(r *mux.Router) {
-    r.HandleFunc("/api/server/addnetwork/{network}", securityCheckServer(http.HandlerFunc(addNetwork))).Methods("POST")
-    r.HandleFunc("/api/server/getconfig", securityCheckServer(http.HandlerFunc(getConfig))).Methods("GET")
-    r.HandleFunc("/api/server/getwgconfig", securityCheckServer(http.HandlerFunc(getWGConfig))).Methods("GET")
-    r.HandleFunc("/api/server/removenetwork/{network}", securityCheckServer(http.HandlerFunc(removeNetwork))).Methods("DELETE")
+    r.HandleFunc("/api/server/addnetwork/{network}", securityCheckServer(true, http.HandlerFunc(addNetwork))).Methods("POST")
+    r.HandleFunc("/api/server/getconfig", securityCheckServer(false, http.HandlerFunc(getConfig))).Methods("GET")
+    r.HandleFunc("/api/server/removenetwork/{network}", securityCheckServer(true, http.HandlerFunc(removeNetwork))).Methods("DELETE")
 }
 
 //Security check is middleware for every function and just checks to make sure that its the master calling
 //Only admin should have access to all these network-level actions
 //or maybe some Users once implemented
-func securityCheckServer(next http.Handler) http.HandlerFunc {
+func securityCheckServer(adminonly bool, next http.Handler) http.HandlerFunc {
 	return func(w http.ResponseWriter, r *http.Request) {
 		var errorResponse = models.ErrorResponse{
 			Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
@@ -42,15 +41,16 @@ func securityCheckServer(next http.Handler) http.HandlerFunc {
 		}
 		//all endpoints here require master so not as complicated
 		//still might not be a good  way of doing this
-                _, _, isadmin, _ := functions.VerifyUserToken(authToken)
-
+                user, _, isadmin, err := functions.VerifyUserToken(authToken)
+                errorResponse = models.ErrorResponse{
+                        Code: http.StatusUnauthorized, Message: "W1R3: You are unauthorized to access this endpoint.",
+                }
+                if !adminonly && (err != nil || user == "") {
+                        returnErrorResponse(w, r, errorResponse)
+                }
 		if !isadmin && !authenticateMasterServer(authToken) {
-				errorResponse = models.ErrorResponse{
-					Code: http.StatusUnauthorized, Message: "W1R3: You are unauthorized to access this endpoint.",
-				}
-				returnErrorResponse(w, r, errorResponse)
-				return
-		}
+                        returnErrorResponse(w, r, errorResponse)
+                }
 		next.ServeHTTP(w, r)
 	}
 }
@@ -90,17 +90,6 @@ func getConfig(w http.ResponseWriter, r *http.Request) {
         json.NewEncoder(w).Encode(scfg)
 }
 
-func getWGConfig(w http.ResponseWriter, r *http.Request) {
-        // Set header
-        w.Header().Set("Content-Type", "application/json")
-
-        // get params
-
-        wgcfg := servercfg.GetWGConfig()
-        w.WriteHeader(http.StatusOK)
-        json.NewEncoder(w).Encode(wgcfg)
-}
-
 /*
 func getMongoConfig(w http.ResponseWriter, r *http.Request) {
         // Set header

BIN
docs/_build/doctrees/architecture.doctree


BIN
docs/_build/doctrees/client-installation.doctree


BIN
docs/_build/doctrees/environment.pickle


BIN
docs/_build/doctrees/getting-started.doctree


BIN
docs/_build/doctrees/index.doctree


BIN
docs/_build/doctrees/quick-start.doctree


BIN
docs/_build/doctrees/server-installation.doctree


BIN
docs/_build/doctrees/support.doctree


BIN
docs/_build/doctrees/troubleshoot.doctree


BIN
docs/_build/doctrees/usage.doctree


+ 1 - 1
docs/_build/html/.buildinfo

@@ -1,4 +1,4 @@
 # Sphinx build info version 1
 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: b4f54218c96970315e0631746ba1b7fb
+config: ea2669ddaa1c21d925350f2fad6e510c
 tags: 645f666f9bcd5a90fca523b33c5a78b7

BIN
docs/_build/html/_images/create-net.png


BIN
docs/_build/html/_images/netmaker-node.png


+ 7 - 8
docs/_build/html/_sources/architecture.rst.txt

@@ -47,7 +47,7 @@ Netmaker
 
 Netmaker is a platform built off of WireGuard which enables users to create mesh networks between their devices. Netmaker can create both full and partial mesh networks depending on the use case.
 
-When we refer to Netmaker in aggregate, we are typically referring to Netmaker and the netclient, as well as other supporting services such as CoreDNS, MongoDB, and UI webserver.
+When we refer to Netmaker in aggregate, we are typically referring to Netmaker and the netclient, as well as other supporting services such as CoreDNS, rqlite, and UI webserver.
 
 From an end user perspective, they typically interact with the Netmaker UI, or even just run the install script for the netclient on their devices. The other components run in the background invisibly. 
 
@@ -81,7 +81,7 @@ Most server settings are configurable via a config file, or by environment varia
 
 These modes include client mode and dns mode. Either of these can be disabled but are enabled by default. Client mode allows you to treat the Netmaker host machine (operating system) as a network Node, installing the netclient and controlling the host network. DNS mode has the server write config settings for CoreDNS, a separate component and nameserver, which picks up the config settings to manage node DNS.
 
-The Netmaker server interacts with (as of v0.3) a MongoDB instance, which holds information about nodes, networks, users, and other important data. This data is configuration data. For the most part, Netmaker serves configuration data to Nodes, telling them how they should configure themselves. The Netclient is the agent that actually does that configuration.
+The Netmaker server interacts with rqlite, a distributed version of sqlite, which holds information about nodes, networks, users, and other important data. This data is configuration data. For the most part, Netmaker serves configuration data to Nodes, telling them how they should configure themselves. The Netclient is the agent that actually does that configuration.
 
 
 Netclient
@@ -102,10 +102,10 @@ If running in daemon mode, on a periodic basis (systemd timer), the netclient pe
 The check in process is what allows Netmaker to create dynamic mesh networks. As nodes are added to, removed from, and modified on the network, other nodes are notified, and make appropriate changes.
 
 
-MongoDB
+rqlite
 --------
 
-As of v0.5, Netmaker uses MongoDB as its database, and interacts with a MongoDB instance to store and retrieve information about nodes, networks, and users. Netmaker is rapidly evolving, and MongoDB provides a flexible database structure that accelerates development. However, MongoDB is also the heaviest component of Netmaker (high cpu/memory consumption), and is set to be replaced by a lighter-weight, SQL-based database in the future.
+As of v0.7, Netmaker uses rqlite, a distributed (RAFT consensus) database, and interacts with this database to store and retrieve information about nodes, networks, and users. With the 0.7 refactor, additional database support is very easy to implement. Netmaker uses simple key value lookups to run the networks, and the database was designed to be extensible, so support for key-value stores and other SQL-based databases can be achieved by changing a single file.
 
 Netmaker UI
 ---------------
@@ -118,7 +118,7 @@ Netmaker can be used in its entirety without the UI, but the UI makes things a l
 CoreDNS
 --------
 
-v0.3 introduced the concept of private DNS management for nodes. This requires a nameserver, and CoreDNS is the chosen nameserver. CoreDNS is lightweight and extensible. CoreDNS loads dns settings from a simple file, managed by Netmaker, and serves out DNS info for managed nodes. DNS can be tricky, and DNS management is currently only supported on a small set of devices, specifically those running systemd-resolved. However, the Netmaker CoreDNS instance can be added manually as a nameserver to other devices. DNS mode can also be turned off.
+Netmaker allows users to provide and manage Private DNS for their nodes. This requires a nameserver, and CoreDNS is the chosen nameserver. CoreDNS is lightweight and extensible. CoreDNS loads dns settings from a simple file, managed by Netmaker, and serves out DNS info for managed nodes. DNS can be tricky, and DNS management is currently only supported on a small set of devices, specifically those running systemd-resolved. However, the Netmaker CoreDNS instance can be added manually as a nameserver to other devices. DNS mode can also be turned off.
 
 Worth considering is that CoreDNS requires port 53 on the Netmaker host system, which may cause conflicts depending on your operating system. This is explained in the :doc:`Server Installation <./server-installation>` guide.
 
@@ -183,7 +183,6 @@ To manage DNS (optional), the node must have systemd-resolved. Systems that have
 Limitations
 ===========
 
-Install limitations mostly include platform-specific limitations, such as needing systemd or systemd-resolved (see above). In addition the Netmaker platform has some additional limitations:
+Install limitations mostly include platform-specific limitations, such as needing systemd or systemd-resolved (see above). 
 
-- **Double NAT**: Netmaker is currently unable to route traffic for devices behind a "double NAT".
-- **CGNAT**: Netmaker is currently unable to route traffic for for devices behind a "carrier-grade NAT".
+In addition the Netmaker is currently unable to route traffic for for devices behind a "carrier-grade NAT". This will be solved in a future release with the introduction of relay servers.

+ 27 - 2
docs/_build/html/_sources/client-installation.rst.txt

@@ -112,15 +112,40 @@ Managing Netclient
 Viewing Logs
 ---------------
 
+**to view current networks**
+  ``netclient list``
+
+**to tail logs**
+  ``journalctl -u netclient@<net name> -f``
+
+**to view all logs**
+  ``journalctl -u netclient@<net name>``
+
+**to get most recent log run**
+  ``systemctl status netclient@<net name>``
+
 Making Updates
 ----------------
 
+``vim /etc/netclient/netconfig-<network>``
+
+Change any of the variables in this file, and changes will be pushed to the server and processed locally on the next checkin.
+
+For instance, change the private address, endpoint, or name. See above example config file for details
+
+
 Adding/Removing Networks
 ---------------------------
 
+``netclient join -t <token>``
+
+Set any of the above flags (netclient join --help) to override settings for joining the network. 
+If a key is provided (-k), then a token is unnecessary, but grpc, server, ports, and network must all be provided via flags.
+
+
 Uninstalling
 ---------------
 
-Troubleshooting
------------------
+``netclient uninstall``
+
 

+ 112 - 134
docs/_build/html/_sources/getting-started.rst.txt

@@ -1,148 +1,126 @@
-===============
+=================
 Getting Started
+=================
+
+Once you have Netmaker installed via the :doc:`Quick Install <./quick-start>` guide, you can use this Getting Started guide to help create and manage your first network.
+
+Setup
+=================
+
+#. Create your admin user, with a username and password.
+#. Login with your new user
+#. Create your first network by clicking on Create Network
+
+.. image:: images/create-net.png
+   :width: 80%
+   :alt: Create Network Screen
+   :align: center
+
+This network should have a sensible name (nodes will use it to set their interfaces).
+
+More importantly, it should have a non-overlapping, private address range. 
+
+If you are running a small (less than 254 machines) network, and are unsure of which CIDR's to use, you could consider:
+
+- 10.11.12.0/24
+- 10.20.30.0/24
+- 100.99.98.0/24
+
+Once your network is created, you should see that the netmaker server has added itself to the network. From here, you can move on to adding additional nodes to the network.
+
+.. image:: images/netmaker-node.png
+   :width: 80%
+   :alt: Node Screen
+   :align: center
+
+
+Create Key
+------------
+
+Adding nodes to the network typically requires a key.
+
+#. Click on the ACCESS KEYS tab and select the network you created.
+#. Click ADD NEW ACCESS KEY
+#. Give it a name (ex: "mykey") and a number of uses (ex: 25)
+#. Click CREATE KEY (**Important:** Do not click out of the following screen until you have saved your key details. It will appear only once.)
+#. Copy the bottom command under "Your agent install command with access token" and save it somewhere locally. E.x: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -``.
+
+.. image:: images/access-key.png
+   :width: 80%
+   :alt: Access Key Screen
+   :align: center
+
+You will use this command to install the netclient on your nodes. There are three different values for three different scenarios: 
+
+* The **Access Key** value is the secret string that will allow your node to authenticate with the Netmaker network. This can be used with existing netclient installations where additional configurations (such as setting the server IP manually) may be required. This is not typical. E.g. ``netclient join -k <access key> -s grpc.myserver.com -p 50051``
+* The **Access Token** value is a base64 encoded string that contains the server IP and grpc port, as well as the access key. This is decoded by the netclient and can be used with existing netclient installations like this: ``netclient join -t <access token>``. You should use this method for adding a network to a node that is already on a network. For instance, Node A is in the **mynet** network and now you are adding it to **default**.
+* The **install command** value is a curl command that can be run on Linux systems. It is a simple script that downloads the netclient binary and runs the install command all in one.
+  
+Networks can also be enabled to allow nodes to sign up without keys at all. In this scenario, nodes enter a "pending state" and are not permitted to join the network until an admin approves them.
+
+Deploy Nodes
+=================
+
+0. Prereqisite: Every machine on which you install should have wireguard and systemd already installed.
+
+1. SSH to each machine 
+2. ``sudo su -``
+3. **Prerequisite Check:** Every Linux machine on which you run the netclient must have WireGuard and systemd installed
+4. Run the install command, Ex: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -``
+
+You should get output similar to the below. The netclient retrieves local settings, submits them to the server for processing, and retrieves updated settings. Then it sets the local network configuration. For more information about this process, see the :doc:`client installation <./client-installation>` documentation. If this process failed and you do not see your node in the console (see below), then reference the :doc:`troubleshooting <./troubleshoot>` documentation.
+
+.. image:: images/nc-install-output.png
+   :width: 80%
+   :alt: Output from Netclient Install
+   :align: center
+
+
+.. image:: images/nm-node-success.png
+   :width: 80%
+   :alt: Node Success
+   :align: center
+
+
+Repeat the above steps for every machine you would like to add to your network. You can re-use the same install command so long as you do not run out of uses on your access key (after which it will be invalidated and deleted).
+
+Once installed on all nodes, you can test the connection by pinging the private address of any node from any other node.
+
+
+.. image:: images/ping-node.png
+   :width: 80%
+   :alt: Node Success
+   :align: center
+
+Manage Nodes
 ===============
 
-Netmaker is a tool for creating and managing virtual overlay networks. If you have servers spread across multiple locations, data centers, or clouds, this platform can make life easier. Netmaker takes all those machines and puts them on a single, secure, flat network so that they can all talk to each other easily and securely. It's like a VPC but of arbitrary computers.
-
-Netmaker can be compared to and covers use cases similar to Tailscale, ZeroTier, or Nebula, but Netmaker does more than that, while being faster, more dynamic and more flexible.
-
-Netmaker uses kernel WireGuard to create encrypted tunnels between every node in your virtual network. Netmaker's `netclient` agent is self-updating and pulls any necessary changes (such as new peers) from the main server. 
-
-Use Cases
-=========
- 1. Create a flat, secure network between multiple/hybrid cloud environments
- 2. Integrate central and edge services
- 3. Secure a home or office network while providing remote connectivity
- 4. Manage cryptocurrency proof-of-stake machines
- 6. Provide an additional layer of security on an existing network
- 7. Encrypt Kubernetes inter-node communications
- 8. Secure site-to-site connections
-
-
-Compatible Systems
-==================
-
-To manage a server automatically, Netmaker requires **systemd-based linux.** Compatible systems include:
-        - Fedora
-        - Ubuntu
-        - Debian
-        - Mint
-        - SUSE
-        - RHEL
-        - Raspian.
-        - Arch
-        - CentOS
-        - CoreOS
-      
-To manage DNS (optional), the server must have systemd-resolved. Systems that have this enabled include:
-        - Arch
-        - Debian
-        - Ubuntu
-        - SUSE
-
-
-In future releases, we will support other platforms such as Windows, MacOS, iOS, Android, and more. 
-
-Video Tutorials and Articles:
-
-
-
-Quick Start
-===========
-
-[Intro/Overview Video Tutorial](https://youtu.be/PWLPT320Ybo)  
-[Site-to-Site Video Tutorial](https://youtu.be/krCKBJhwwDk)  
-
-### Note about permissions
-The default installation requires special privileges on the server side, because Netmaker will control the local kernel Wireguard. This can be turned off and run in non-privileged mode if necessary (but disables some features). For more details, see the **Usage** docs.
-
-### Prereqs
- 1. A running linux server to host Netmaker, with an IP reachable by your computers (Debian-based preferred but not required).
- 2. Linux installed on the above server (Debian-based preferred but not required).
- 3. Install Docker and Docker Compose if running in Docker Mode (see below).
- 4. System dependencies installed:
-	 - Docker (if running in default Docker mode. DO NOT use snap install for docker.)
-	 - Docker Compose
-	 - Wireguard + Resolvectl (if running in default Client mode)
-
-#### CoreDNS Preparation
-v0.3 introduces CoreDNS as a private nameserver. To run CoreDNS on your server host, you must disable systemd-resolved to open port 53: 
-1. systemctl stop systemd-resolved
-2. systemctl disable systemd-resolved
-3. vim /etc/systemd/resolved.conf
-	 - uncomment **DNS=** and add 8.8.8.8 or whatever is your preference
-	 - uncomment **DNSStubListener=** and set to **"no"**
- 4. sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
-
-
-
-### Launch Netmaker
-Note, this installs Netmaker with CoreDNS and a Netclient (privileged).  If you want to run the server non-privileged or without CoreDNS, see the advanced usage docs. 
-
-1. Clone this repo or just copy contents of "docker-compose.yml" to your Netmaker server (from prereqs).
-2. In docker-compose.yml, change BACKEND_URL to the public IP of your server.
-3. Run `sudo docker-compose up -d`
-4. Navigate to your server's IP in the browser and you should see the Netmaker UI asking to create a new admin user.
-5. Create a new admin user
-6. You are now ready to begin using Netmaker. 
-
-### Create a Network
-You can also just use the "default" network.
-1. Click "CREATE NETWORK" in the upper left of your console
-2. Enter a valid address range, e.g. 10.11.12.0/24
-3. Enter a name such as "homenet"
-4. Additional options:
-	- **Dual Stack**: Machines will recieve a private IPv6 address in addition to their IPv4 address.
-	- **Local:** Will use local address range for endpoints instead of public. Use Case: Home or Office network where most devices do not have public IP's. In this case you can create a gateway into the network after creating the Local Network.
-
-After Network creation, you can edit the network in the NETWORK DETAILS pane, modifying the address range and default options. You can also toggle on **Allow Node Signup Without Keys**, which makes the next step unnecessary, but allows anyone to create a node in your network, which will be cordoned in pending state.
-
-### Create Keys
-1. Click the "ACCESS KEYS" tab
-2. Click "ADD NEW ACCESSS KEY"
-3. Give your key a name and number of uses
-4. Several values will be displayed. Save these somewhere, as they will only be displayed once:
-	- **Access Key:** Use only in special edge cases where server connection string must be modified
-	- **Access Token:** Use on machines that already have the netclient utility
-	- **Install Command:** Use on machines that do not have the netclient utility
-
-### Install Agent:
-For machines **without** netclient, run the install command (from above): `curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/v0.3/netclient-install.sh | KEY=<your access key> sh -`  
-For machines **with** netclient run the following (with access token from above): `sudo netclient -c install -t <access token>`
-For networks with **manual signup** enabled (see above), install using the network name: `sudo netclient -c install -n <network name>`
-
-### Manage Nodes
 Your machines should now be visible in the control pane. 
-**Modify nodes:** Click the pencil icon in the NODES pane to modify details like WireGuard port, address, and node name. You can also **DELETE** nodes here and they will lose network access.
-**Approve nodes:** If a node is in pending state (signed up without key), you can approve it. An icon will appear for pending nodes that need approval.
 
-**Gateway Mode:** Click the Gateway icon to enable gateway mode on a given node. A popup will allow you to choose an existing network, or enter a custom address range.
-*Example: You create a network in netmaker called Homenet. It has several machines on your home server. You create another network called Cloudnet. It has several machines in AWS. You have one server (server X) which is added to both networks. On Cloudnet, you make Server X a gateway to Homenet. Now, the cloudnet machines have access to your homenet machines. via  Server X.*
+.. image:: images/nodes.png
+   :width: 80%
+   :alt: Node Success
+   :align: center
+
+You can view/modify/delete any node by selecting it in the NODES tab. For instance, you can change the name to something more sensible like "workstation" or "api server". You can also modify network settings here, such as keys or the WireGuard port. These settings will be picked up by the node on its next check in. For more information, see Advanced Configuration in the :doc:`Using Netmaker <./usage>` docs.
 
-*On Homenet, you add Server Y, a machine in AWS, and make it a gateway to a custom address range 172.16.0.0/16. The machines on your home network now have access to any AWS machines in that address range via Server Y*
+.. image:: images/node-details.png
+   :width: 80%
+   :alt: Node Success
+   :align: center
 
-### Manage DNS
-On the DNS tab you can create custom DNS entries for a given network.
 
- 1. All dns entries will be *postfixed* with a private TLD of the network name, for example, ".mynet"
- 2. Default DNS is created for node name + TLD, for instance, node-c42wt.mynet. This is not editable.
- 3. Click ADD ENTRY to add custom DNS
-	 - You can click CHOOSE NODE to direct DNS to a specific node in the network
-	 - You can also specify any custom address you would like, which can be outside the network (for instance, the IP for google.com)
-	 - Add a dns entry name, which will be postfixed with the network TLD. E.g. if you enter "privateapi.com", it will become "privateapi.com.networkname" 
 
-### Uninstalling Client
-To uninstall the client from a network: `sudo netclient -c remove -n < networkname >`
-To uninstall entirely, run the above for each network,  and then run `sudo rm -rf /etc/netclient`
+Nodes can be added/removed/modified on the network at any time. Nodes can also be added to multiple Netmaker networks. Any changes will get picked up by any nodes on a given network, and will take aboue ~30 seconds to take effect.
 
-### Uninstralling Netmaker
-To uninstall the netmaker server, simply run `docker-compose down`
+Uninstalling the netclient
+=============================
 
-#### LICENSE
+1. To remove your nodes from the default network, run the following on each node: ``sudo netclient leave -n default``
+2. To remove the netclient entirely from each node, run ``sudo rm -rf /etc/netclient`` (after running the first step)
 
-Netmaker's source code and all artifacts in this repository are freely available. All versions are published under the Server Side Public License (SSPL), version 1, which can be found here: [LICENSE.txt](./LICENSE.txt).
+Uninstalling Netmaker
+===========================
 
-#### CONTACT
+To uninstall Netmaker from the server, simply run ``docker-compose down`` or ``docker-compose down --volumes`` to remove the docker volumes for a future installation.
 
-Email: [email protected]  
-Discord: https://discord.gg/zRb9Vfhk8A

+ 5 - 0
docs/_build/html/_sources/index.rst.txt

@@ -58,6 +58,11 @@ A quick start guide to getting up and running with Netmaker and WireGuard as qui
 
    quick-start
 
+.. toctree::
+   :maxdepth: 2
+
+   getting-started
+
 Server Installation
 --------------------
 

+ 131 - 93
docs/_build/html/_sources/quick-start.rst.txt

@@ -1,137 +1,175 @@
-===========
-Quick Start
-===========
+===============
+Quick Install
+===============
+
+This quick start guide is an **opinionated** guide for getting up and running with Netmaker as quickly as possible.
+
+0. Introduction
+==================
+
+We assume for this installation that you want all of the Netmaker features enabled, want your server to be secure, and want it to be accessible from anywhere. 
+
+This instance will not be HA. However, it should comfortably handle around one hundred concurrent clients and support most use cases.
 
-Introduction
-==============
+If you are deploying for an enterprise use case, please contact [email protected] for support.
 
-This is a guide to getting up and running with Netmaker as quickly as possible. 
+By the end of this guide, you will have Netmaker installed on a public VM linked to your custom domain, secured behind an Nginx reverse proxy.
 
-By default, Netmaker ships with DNS Mode, Client Mode, and Secure GRPC enabled. However, these features require special permissions and are not necessary for a simple setup, so we are going to deploy without them. To learn more about enabling these features, check out the :doc:`installation docs <./server-installation>`.
+If this configuration does not fit your use case, see the :doc:`Advanced Installation <./server-installation>` docs. 
 
-Prerequisites
+
+
+1. Prerequisites
 ==================
- #. A Linux server to host Netmaker, with an external IP reachable by your nodes (will be referred to as **your-host** in  document).
- #. Docker and Docker Compose installed on the above server. Follow the official `Docker instructions <https://docs.docker.com/engine/install/>`_ for installing Docker and Docker Compose on your system.
- #. All network nodes should be systemd-based (see Compatibility under :doc:`Architecture <./architecture>` docs)
+-  **Virtual Machine**
+   
+   - Preferably from a cloud provider (e.x: DigitalOcean, Linode, AWS, GCP, etc.)
+   - Public, static IP 
+   - Min 2GB RAM, 1 CPU (4GB RAM, 2CPU preferred)
+   - 5GB+ of storage
+   - Ubuntu  20.04 Installed
 
-Install
-==============
-#. ``ssh root@your-host``
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/compose/docker-compose.slim.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
-#. ``docker-compose up -d``
+- **Domain**
 
-Navigate to the IP address of your host in the browser. You should see the below screen. If not, please see the Quick Start section of the :doc:`troubleshooting <./support>` docs.
+  - A publicly owned domain (e.x. example.com, mysite.biz) 
+  - Permission and access to modify DNS records via DNS service (e.x: Route53)
 
-.. image:: images/create-user.png
-   :width: 80%
-   :alt: Create User Screen
-   :align: center
+2. Install Dependencies
+========================
 
-Setup
-=================
+``ssh root@your-host``
 
-#. Create your admin user, with a username and password.
-#. Login with your new user
-#. Examine the **default** network. Click on DEFAULT under NETWORK DETAILS
+Install Docker
+---------------
+Begin by installing the community version of Docker and docker-compose (there are issues with the snap version). You can follow the official `Docker instructions here <https://docs.docker.com/engine/install/>`_. Or, you can use the below series of commands which should work on Ubuntu 20.04.
 
-.. image:: images/default-net.png
-   :width: 80%
-   :alt: Create User Screen
-   :align: center
+.. code-block::
 
-This displays information about the **default** network, which is created on server startup. You can delete this network if you do not need it, but for standard use cases this network should be enough to get started. Nodes will get an address from the network address range (ADDRESSRANGE). If the range conflicts with a pre-existing private network on your devices, you may want to change this, or make a new network instead. Nodes will also get default settings from here for unset configurations. For instance, the DEFAULTKEEPALIVE field will set the PersistenKeepAlive for nodes.
+  sudo apt-get remove docker docker-engine docker.io containerd runc
+  sudo apt-get update
+  sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
+  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  
+  echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
+  sudo apt-get update
+  sudo apt-get install docker-ce docker-ce-cli containerd.io
+  sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+  sudo chmod +x /usr/local/bin/docker-compose
+  docker --version
+  docker-compose --version
 
-To get started quickly, we can just use the existing default network.
+At this point Docker should be installed.
 
-Create Key
-------------
+Install Dependencies
+-----------------------------
 
-#. Click on the ACCESS KEYS tab and select the DEFAULT network.
-#. Click ADD NEW ACCESS KEY
-#. Give it a name (ex: "mykey") and a number of uses (ex: 25)
-#. Click CREATE KEY (**Important:** Do not click out of the following screen until you have saved your key details. It will appear only once.)
-#. Copy the bottom command under "Your agent install command with access token" and save it somewhere locally. E.x: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -``
+In addition to Docker, this installation requires WireGuard, Nginx, and Certbot.
 
-.. image:: images/access-key.png
-   :width: 80%
-   :alt: Access Key Screen
-   :align: center
+``sudo apt install wireguard wireguard-tools nginx certbot python3-certbot-nginx net-tools``
 
-You will use this command to install the netclient on your nodes. There are three different values for three different scenarios: 
+ 
+3. Prepare VM
+===============================
 
-* The **Access Key** value is the secret string that will allow your node to authenticate with the Netmaker network. This can be used with existing netclient installations where additional configurations (such as setting the server IP manually) may be required. This is not typical. E.g. ``netclient -c install -k <access key> -s 1.2.3.4 -p 50052``
-* The **Access Token** value is a base64 encoded string that contains the server IP and grpc port, as well as the access key. This is decoded by the netclient and can be used with existing netclient installations like this: ``netclient -c install -t <access token>``. You should use this method for adding a network to a node that is already on a network. For instance, Node A is in the **mynet** network and now you are adding it to **default**.
-* The **install command** value is a curl command that can be run on Linux systems. It is a simple script that downloads the netclient binary and runs the install command all in one. However, this script is tailored for Secure GRPC Mode and contains an additional (unnecessary) command: **netclient register -k keyvalue**. This command will not work without secure GRPC enabled and will return a 500 error.
-  
-Networks can also be enabled to allow nodes to sign up without keys at all. In this scenario, nodes enter a "pending state" and are not permitted to join the network until an admin approves them.
+Prepare Domain
+----------------------------
+1. Choose a base domain or subdomain for Netmaker. If you own **example.com**, this should be something like **netmaker.example.com**
 
-Deploy Nodes
-=================
+- You must point your wildcard domain to the public IP of your VM, e.x: *.example.com --> <your public ip>
 
-1. SSH to each machine 
-2. ``sudo su -``
-3. **Prerequisite Check:** Every Linux machine on which you run the netclient must have WireGuard and systemd installed
+2. Add an A record pointing to your VM using your DNS service provider for *.netmaker.example.com (inserting your own subdomain of course).
+3. Netmaker will create three subdomains on top of this. For the example above those subdomains would be:
 
-  * ``which wg`` (should show wg binary present)
-  * ``pidof systemd && echo "systemd found" || echo "systemd not found"``
+- dashboard.netmaker.example.com
 
-4. Run the install command, Ex: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -``
+- api.netmaker.example.com
 
-You should get output similar to the below. The netclient retrieves local settings, submits them to the server for processing, and retrieves updated settings. Then it sets the local network configuration. For more information about this process, see the :doc:`client installation <./client-installation>` documentation. If this process failed and you do not see your node in the console (see below), then reference the :doc:`troubleshooting <./troubleshoot>` documentation.
+- grpc.netmaker.example.com
 
-.. image:: images/nc-install-output.png
-   :width: 80%
-   :alt: Output from Netclient Install
-   :align: center
+Moving forward we will refer to your base domain using **<your base domain>**. Replace these references with your domain (e.g. netmaker.example.com).
 
+4. ``nslookup host.<your base domain>`` (inserting your domain) should now return the IP of your VM.
 
-.. image:: images/nm-node-success.png
-   :width: 80%
-   :alt: Node Success
-   :align: center
+5. Generate SSL Certificates using certbot:
 
+``sudo certbot certonly --manual --preferred-challenges=dns --email [email protected] --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --manual-public-ip-logging-ok -d "*.<your base domain>"``
 
-Repeat the above steps for every machine you would like to add to your network. You can re-use the same install command so long as you do not run out of uses on your access key (after which it will be invalidated and deleted).
+The above command (using your domain instead of <your base domain>), will prompt you to enter a TXT record in your DNS service provider. Do this, and **wait one  minute** before clicking enter, or it may fail and you will have to run the command again.
 
-Once installed on all nodes, you can test the connection by pinging the private address of any node from any other node.
+Prepare Firewall
+-----------------
 
+Make sure firewall settings are appropriate for Netmaker. You need ports 53 and 443. On the server you can run:
 
-.. image:: images/ping-node.png
-   :width: 80%
-   :alt: Node Success
-   :align: center
 
-Manage Nodes
-===============
+.. code-block::
+
+  sudo ufw allow proto tcp from any to any port 443 && sudo ufw allow dns
+
+**Based on your cloud provider, you may also need to set inbound security rules for your server. This will be dependent on your cloud provider. Be sure to check before moving on:**
+  - allow 443/tcp from all
+  - allow 53/udp from all
+
+Prepare for DNS
+----------------------------------------------------------------
+
+On Ubuntu 20.04, by default there is a service consuming port 53 related to DNS resolution. We need port 53 open in order to run our own DNS server. The below steps will disable systemd-resolved, and insert a generic DNS nameserver for local resolution.
+
+.. code-block::
+
+  systemctl stop systemd-resolved
+  systemctl disable systemd-resolved 
+  vim /etc/systemd/resolved.conf
+    *  uncomment DNS and add 8.8.8.8 or whatever reachable nameserver is your preference  *
+    *  uncomment DNSStubListener and set to "no"  *
+  ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
+
+
+Prepare Nginx
+-----------------
+
+Nginx will serve the SSL certificate with your chosen domain and forward traffic to netmaker.
+
+Get the nginx configuration file:
+
+``wget https://raw.githubusercontent.com/gravitl/netmaker/develop/nginx/netmaker-nginx-template.conf``
+
+Insert your domain in the configuration file and add to nginx:
+
+.. code-block::
+
+  sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' netmaker-nginx-template.conf
+  sudo cp netmaker-nginx-template.conf /etc/nginx/conf.d/<your base domain>.conf
+  nginx -t && nginx -s reload
+  systemctl restart nginx
+
+4. Install Netmaker
+====================
 
-Your machines should now be visible in the control pane. 
+Prepare Templates
+------------------
 
-.. image:: images/nodes.png
-   :width: 80%
-   :alt: Node Success
-   :align: center
+.. code-block::
 
-You can view/modify/delete any node by selecting it in the NODES tab. For instance, you can change the name to something more sensible like "workstation" or "api server". You can also modify network settings here, such as keys or the WireGuard port. These settings will be picked up by the node on its next check in. For more information, see Advanced Configuration in the :doc:`Using Netmaker <./usage>` docs.
+  wget https://raw.githubusercontent.com/gravitl/netmaker/develop/compose/docker-compose.quickstart.yml
+  sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' docker-compose.quickstart.yml
+  sed -i 's/SERVER_PUBLIC_IP/<your server ip>/g' docker-compose.quickstart.yml
 
-.. image:: images/node-details.png
-   :width: 80%
-   :alt: Node Success
-   :align: center
+Generate a unique master key and insert it:
 
+.. code-block::
 
+  tr -dc A-Za-z0-9 </dev/urandom | head -c 30 ; echo ''
+  sed -i 's/REPLACE_MASTER_KEY/<your generated key>/g' docker-compose.quickstart.yml
 
-Nodes can be added/removed/modified on the network at any time. Nodes can also be added to multiple Netmaker networks. Any changes will get picked up by any nodes on a given network, and will take aboue ~30 seconds to take effect.
+Start Netmaker
+----------------
 
-Uninstalling the netclient
-=============================
+``sudo docker-compose -f docker-compose.quickstart.yml up -d``
 
-1. To remove your nodes from the default network, run the following on each node: ``sudo netclient leave -n default``
-2. To remove the netclient entirely from each node, run ``sudo rm -rf /etc/netclient`` (after running the first step)
+navigate to dashboard.<your base domain> to see your nginx instance.
 
-Uninstalling Netmaker
-===========================
+To troubleshoot issues, start with:
 
-To uninstall Netmaker from the server, simply run ``docker-compose down`` or ``docker-compose down --volumes`` to remove the docker volumes for a future installation.
+``docker logs netmaker``
 
+Or check out the :doc:`troubleshoooting docs <./troubleshoot>`.

+ 200 - 239
docs/_build/html/_sources/server-installation.rst.txt

@@ -1,176 +1,175 @@
-====================
-Server Installation
+=================================
+Advanced Server Installation
+=================================
+
+This section outlines installing the Netmaker server, including Netmaker, Netmaker UI, rqlite, and CoreDNS
+
+System Compatibility
 ====================
 
-This section outlines installing the Netmaker server, including Netmaker, Netmaker UI, MongoDB, and CoreDNS
+Netmaker will require elevated privileges to perform network operations. Netmaker has similar limitations to :doc:`netclient <./client-installation>` (client networking agent). 
 
-Notes on Optional Features
-============================
+Typically, Netmaker is run inside of containers (Docker). To run a non-docker installation, you must run the Netmaker binary, CoreDNS binary, rqlite, and a web server directly on the host. Each of these components have their own individual requirements.
 
-There are a few key options to keep in mind when deploying Netmaker. All of the following options are enabled by default but can be disabled with a single flag at runtime (see Customization). In addition to these options, there are many more Customizable components which will be discussed later on and help to solve for special challenges and use cases.
+The quick install guide is recommended for first-time installs. 
 
-**Client Mode:** Client Mode enables Netmaker to control the underlying host server's Network. This can make management a bit easier, because Netmaker can be added into networks via a button click in the UI. This is especially useful for things like Gateways, and will open up additional options in future versions, for instance, allowing Netmaker to easily become a relay server.
+The following documents are meant for special cases like Kubernetes and LXC, or for more advanced setups. 
 
-Client Mode requires many additional privileges on the host machine, since Netmaker needs to control kernel WireGuard. Because of this, if running in Client Mode, you must run with root privileges and mount many system directories to the Netmaker container. Running without Client Mode allows you to install without privilege escalation and increases the number of compatible systems substantially.
 
-**DNS Mode:** DNS Mode enables Netmaker to write configuration files for CoreDNS, which can be set as a DNS Server for nodes. DNS Mode, paired with a CoreDNS deployment, requires use of port 53. On many linux systems (such as Ubuntu), port 53 is already in use to support local DNS, via systemd-resolved. Running in DNS Mode may require making modifications on the host machine.
+Server Configuration Reference
+==========================================
 
-**Secure GRPC**: Secure GRPC ensures all communications between nodes and the server are encrypted. Netmaker sets up a default "comms" network that exists only for nodes to connect to the server. It acts as a hub-and-spoke WireGuard network. In the below installation instructions, when port 50555 needs to be open, this is referring to the WireGuard port for Netmaker's GRPC comms. When it is port 50051, secure comms is not enabled. 
+Netmaker sets its configuration in the following order of precendence:
 
-When Secure GRPC is enabled, before any nodes can join a Netmaker network, they request to join the comms network, and are given the appropriate WireGuard configs to connect to the server. Then they are able to make requests against the private netmaker endpoint specified for the comms network (10.101.0.1 by default). If switched off, communications are not secure between the hub and nodes over GRPC (it is like http vs https), and likewise, certificates must be added to gain secure communications.
+1. Defaults
+2. Config File
+3. Environment Variables
 
-**Agent Backend:** The Agent Backend is the GRPC server (by default running on port 50051). This port is not needed for the admin server. If your use case requires special access configuration, you can run two Netmaker instances, one for the admin server, and one for node access.
+Variable Description
+----------------------
+VERBOSITY:
+    **Default:** 0
 
-**REST Backend:** Similar to the above, the REST backend runs by default on port 8081, and is used for admin API and UI access. By enabling the REST backend while disabling the Agent backend, you can separate the two functions for more restricted environments.
+    **Description:** Specify level of logging you would like on the server. Goes up to 3 for debugging.
 
 
-System Compatibility
-====================
+GRPC_SSL:
+    **Default:** "off"
 
-Both **Client Mode** and **Secure GRPC** require WireGuard to be installed on the host system, and will require elevated privileges to perform network operations..
+    **Description:** Specifies if GRPC is going over secure GRPC or SSL. This is a setting for the clients and is passed through the access token. Can be set to "on" and "off". Set to on if SSL is configured for GRPC.
 
-When both of these features are **disabled**, Netmaker can be run on any system that supports Docker, including Windows, Mac, and Linux, and other systems. With these features disabled, no special privileges are required. Netmaker will only need ports for GRPC (50051 by default), the API (8081 by default), and CoreDNS (53, if enabled).
+SERVER_API_CONN_STRING
+    **Default:** ""
 
-With Client Mode and/or Secure GRPC **enabled** (the default), Netmaker has the same limitations as the :doc:`netclient <./client-installation>` (client networking agent), because client mode just means that the Netmaker server is also running a netclient. 
+    **Description:**  Allows specification of the string used to connect to the server api. Format: IP:PORT or DOMAIN:PORT. Defaults to SERVER_HOST if not specified.
 
-These modes require privileged (root) access to the host machine. In addition, Client Mode requires multiple host directory mounts. WireGuard must be installed, the system must be systemd Linux (see :doc:`compatible systems <./architecture>` for more details).
+SERVER_GRPC_CONN_STRING
+    **Default:** ""
 
-To run a non-docker installation, you must run the Netmaker binary, CoreDNS binary, MongoDB, and a web server directly on the host. This requires all the requirements for those individual components. Our guided install assumes systemd-based linux, but there are many other ways to install Netmaker's individual components onto machines that do not support Docker. 
+    **Description:**  Allows specification of the string used to connect to grpc. Format: IP:PORT or DOMAIN:PORT. Defaults to SERVER_HOST if not specified.
 
-DNS Mode Prereqisite Setup
-====================================
+SERVER_HOST: *(depreciated, use SERVER_API_CONN_STRING and SERVER_GRPC_CONN_STRING)* 
+    **Default:** Server will perform an IP check and set automatically unless explicitly set, or DISABLE_REMOTE_IP_CHECK is set to true, in which case it defaults to 127.0.0.1
 
-If you plan on running the server in DNS Mode, know that a `CoreDNS Server <https://coredns.io/manual/toc/>`_ will be installed. CoreDNS is a light-weight, fast, and easy-to-configure DNS server. It is recommended to bind CoreDNS to port 53 of the host system, and it will do so by default. The clients will expect the nameserver to be on port 53, and many systems have issues resolving a different port.
+    **Description:** Sets the SERVER_HTTP_HOST and SERVER_GRPC_HOST variables if they are unset. The address where traffic comes in. 
 
-However, on your host system (for Netmaker), this may conflict with an existing process. On linux systems running systemd-resolved, there is likely a service consuming port 53. The below steps will disable systemd-resolved, and replace it with a generic (e.g. Google) nameserver. Be warned that this may have consequences for any existing private DNS configuration. The following was tested on Ubuntu 20.04 and should be run prior to deploying the docker containers.
+SERVER_HTTP_HOST: *(depreciated, use SERVER_API_CONN_STRING and SERVER_GRPC_CONN_STRING)*
+    **Default:** Equals SERVER_HOST if set, "127.0.0.1" if SERVER_HOST is unset.
+    
+    **Description:** Set to make the HTTP and GRPC functions available via different interfaces/networks.
 
-1. ``systemctl stop systemd-resolved`` 
-2. ``systemctl disable systemd-resolved`` 
-3. ``vim /etc/systemd/resolved.conf``
-    * uncomment DNS and add 8.8.8.8 or whatever reachable nameserver is your preference
-    * uncomment DNSStubListener and set to "no"
-4. ``ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf``
+SERVER_GRPC_HOST: *(depreciated, use SERVER_API_CONN_STRING and SERVER_GRPC_CONN_STRING)*
+    **Default:** Equals SERVER_HOST if set, "127.0.0.1" if SERVER_HOST is unset.
 
-Port 53 should now be available for CoreDNS to use.
+    **Description:** Set to make the HTTP and GRPC functions available via different interfaces/networks.
 
-Docker Compose Install
-=======================
+API_PORT:
+    **Default:** 8081 
 
-The most simple (and recommended) way of installing Netmaker is to use one of the provided `Docker Compose files <https://github.com/gravitl/netmaker/tree/feature_v0.3.5_docs/compose>`_. Below are instructions for several different options to install Netmaker via Docker Compose, followed by an annotated reference Docker Compose in case your use case requires additional customization.
+    **Description:** The HTTP API port for Netmaker. Used for API calls / communication from front end.
 
-Slim Install - No DNS, No Client Mode, No Secure GRPC
---------------------------------------------------------
+GRPC_PORT:  
+    **Default:** 50051
 
-This is the same docker compose covered in the :doc:`quick start <./quick-start>`. It requires no special privileges and can run on any system with Docker and Docker Compose. However, it also does not have the full feature set, and lacks Client Mode and DNS Mode.
+    **Description:** The GRPC port for Netmaker. Used for communications from nodes.
 
-**Prerequisites:**
-  * ports 80, 8081, and 50051 are not blocked by firewall
-  * ports 80, 8081, 50051, and 27017 are not in use 
+MASTER_KEY:  
+    **Default:** "secretkey" 
 
-**Notes:** 
-  * You can still run the netclient on the host system even if Client Mode is not enabled. It will just be managed like the netclient on any other nodes, and will not be automatically managed by thhe server/UI.
-  * You can change the port mappings in the Docker Compose if the listed ports are already in use.
+    **Description:** The admin master key for accessing the API. Change this in any production installation.
 
-Assuming you have Docker and Docker Compose installed, you can just run the following, replacing **< Insert your-host IP Address Here >** with your host IP (or domain):
+CORS_ALLOWED_ORIGIN:  
+    **Default:** "*"
 
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.slim.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
-#. ``docker-compose up -d``
+    **Description:** The "allowed origin" for API requests. Change to restrict where API requests can come from.
 
-Full Install - DNS, Client Mode, and Secure GRPC Enabled
-----------------------------------------------------------
+REST_BACKEND:  
+    **Default:** "on" 
 
-This installation gives you the fully-featured product with Client Mode and DNS Mode. 
+    **Description:** Enables the REST backend (API running on API_PORT at SERVER_HTTP_HOST). Change to "off" to turn off.
 
-**Prerequisites:**
-  * systemd linux (Debian or Ubuntu reccommended)
-  * sudo privileges
-  * DNS Mode Prerequisite Setup (see above)
-  * WireGuard installed
-  * ports 80, 8081, 53, and 50555 are not blocked by firewall
-  * ports 80, 8081, 53, 50555, and 27017 are not in use
+AGENT_BACKEND:  
+    **Default:** "on" 
 
-**Notes:** 
-  * You can change the port mappings in the Docker Compose if the listed ports are already in use.
-  * You can run CoreDNS on a non-53 port, but this likely will cause issues on the client side (DNS on non-standard port). We do not recommend this and do not cover how to manage running CoreDNS on a different port for clients, which will likely have problems resolving a nameserver on a non-53 port.
+    **Description:** Enables the AGENT backend (GRPC running on GRPC_PORT at SERVER_GRPC_HOST). Change to "off" to turn off.
 
-Assuming you have Docker and Docker Compose installed, you can just run the following, replacing **< Insert your-host IP Address Here >** with your host IP (or domain):
+DNS_MODE:  
+    **Default:** "off"
 
-#. ``sudo su -``
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
-#. ``docker-compose up -d``
+    **Description:** Enables DNS Mode, meaning config files will be generated for CoreDNS.
 
+Config File Reference
+----------------------
+A config file may be placed under config/environments/<env-name>.yml. To read this file at runtime, provide the environment variable NETMAKER_ENV at runtime. For instance, dev.yml paired with ENV=dev. Netmaker will load the specified Config file. This allows you to store and manage configurations for different environments. Below is a reference Config File you may use.
 
-Server Only Install - UI, DNS, Client Disabled
-------------------------------------------------
+.. literalinclude:: ../config/environments/dev.yaml
+  :language: YAML
 
-A "Server Only" install can be helpful for scenarios in which you do not want to run the UI. the UI is not mandatory for running a Netmaker network, but it makes the process easier. This mode also diables DNS and Client Modes, though you can add those back in if needed. There is no UI dependency on Client Mode or DNS Mode.
+Compose File - Annotated
+--------------------------------------
 
-**Prerequisites:**
-  * ports 8081 and 50051 are not blocked by firewall
-  * ports 8081, 50051, and 27017 are not in use
+All environment variables and options are enabled in this file. It is the equivalent to running the "full install" from the above section. However, all environment variables are included, and are set to the default values provided by Netmaker (if the environment variable was left unset, it would not change the installation). Comments are added to each option to show how you might use it to modify your installation.
 
-**Notes:**
-  * You can still run the netclient on the host system even if Client Mode is not enabled. It will just be managed like the netclient on any other nodes, and will not be automatically managed by thhe server/UI.
-  * You can change the port mappings in the Docker Compose if the listed ports are already in use.
+.. literalinclude:: ../compose/docker-compose.reference.yml
+  :language: YAML
 
-Assuming you have Docker and Docker Compose installed, you can just run the following, replacing **< Insert your-host IP Address Here >** with your host IP (or domain):
 
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.server-only.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
+DNS Mode Setup
+====================================
 
-No DNS - CoreDNS Disabled, Client Enabled
-----------------------------------------------
+If you plan on running the server in DNS Mode, know that a `CoreDNS Server <https://coredns.io/manual/toc/>`_ will be installed. CoreDNS is a light-weight, fast, and easy-to-configure DNS server. It is recommended to bind CoreDNS to port 53 of the host system, and it will do so by default. The clients will expect the nameserver to be on port 53, and many systems have issues resolving a different port.
 
-DNS Mode is currently limited to clients that can run resolvectl (systemd-resolved, see :doc:`Architecture docs <./architecture>` for more info). You may wish to disable DNS mode for various reasons. This installation option gives you the full feature set minus CoreDNS.
+However, on your host system (for Netmaker), this may conflict with an existing process. On linux systems running systemd-resolved, there is likely a service consuming port 53. The below steps will disable systemd-resolved, and replace it with a generic (e.g. Google) nameserver. Be warned that this may have consequences for any existing private DNS configuration. The following was tested on Ubuntu 20.04 and should be run prior to deploying the docker containers.
 
-**Prerequisites:**
-  * systemd linux (Debian or Ubuntu reccommended)
-  * sudo privileges
-  * WireGuard installed
-  * ports 80, 8081, and 50555 are not blocked by firewall
-  * ports 80, 8081, 50555, and 27017 are not in use
+.. code-block::
 
-**Notes:** 
-  * You can change the port mappings in the Docker Compose if the listed ports are already in use.
-  * If you would like to run DNS Mode, but disable it on some clients, this is also an option. See the :doc:`client installation <./client-installation>` documentation for more details.
+  systemctl stop systemd-resolved
+  systemctl disable systemd-resolved 
+  vim /etc/systemd/resolved.conf
+    *  uncomment DNS and add 8.8.8.8 or whatever reachable nameserver is your preference  *
+    *  uncomment DNSStubListener and set to "no"  *
+  ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
 
-Assuming you have Docker and Docker Compose installed, you can just run the following, replacing **< Insert your-host IP Address Here >** with your host IP (or domain):
+Port 53 should now be available for CoreDNS to use.
 
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.nodns.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
 
-No DNS - CoreDNS Disabled, Client Enabled
+Docker Compose Install
+=======================
+
+The most simple (and recommended) way of installing Netmaker is to use one of the provided `Docker Compose files <https://github.com/gravitl/netmaker/tree/master/compose>`_. Below are instructions for several different options to install Netmaker via Docker Compose, followed by an annotated reference Docker Compose in case your use case requires additional customization.
 
-No Client - DNS Enabled, Client Disabled
----------------------------------------------
+Test Install - No DNS, No Secure GRPC
+--------------------------------------------------------
+
+This install will run Netmaker on a server without HTTPS using an IP address. This is not secure and not recommended, but can be helpful for testing.
 
-You may want to provide DNS, but do not want to run the server with special privileges, in which case you can run with just Client Mode disabled. It requires no special privileges and can run on any system with Docker and Docker Compose. 
+It also does not run the CoreDNS server, to simplify the deployment
 
 **Prerequisites:**
-  * ports 80, 8081, 53, and 50051 are not blocked by firewall
-  * ports 80, 8081, 53, 50051, and 27017 are not in use
-  * DNS Mode Prerequisite Setup (see above)
+  * server ports 80, 8081, and 50051 are not blocked by firewall
 
 **Notes:** 
-  * You can still run the netclient on the host system even if Client Mode is not enabled. It will just be managed like the netclient on any other nodes, and will not be automatically managed by thhe server/UI.
   * You can change the port mappings in the Docker Compose if the listed ports are already in use.
 
 Assuming you have Docker and Docker Compose installed, you can just run the following, replacing **< Insert your-host IP Address Here >** with your host IP (or domain):
 
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.noclient.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
-#. ``docker-compose up -d``
+.. code-block::
 
+  wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.test.yml
+  sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml
+  docker-compose up -d`
 
-Reference Compose File - Annotated
---------------------------------------
 
-All environment variables and options are enabled in this file. It is the equivalent to running the "full install" from the above section. However, all environment variables are included, and are set to the default values provided by Netmaker (if the environment variable was left unset, it would not change the installation). Comments are added to each option to show how you might use it to modify your installation.
+No DNS - CoreDNS Disabled
+----------------------------------------------
 
-.. literalinclude:: ../compose/docker-compose.reference.yml
-  :language: YAML
+DNS Mode is currently limited to clients that can run resolvectl (systemd-resolved, see :doc:`Architecture docs <./architecture>` for more info). You may wish to disable DNS mode for various reasons. This installation option gives you the full feature set minus CoreDNS.
+
+To run without DNS, follow the :doc:`Quick Install <./quick-start>` guide, omitting the steps for DNS setup. In addition, when the guide has you pull (wget) the Netmaker docker-compose template, use the following link instead:
+
+#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.nodns.yml``
+
+This template is equivalent but omits CoreDNS.
 
 
 Linux Install without Docker
@@ -178,35 +177,44 @@ Linux Install without Docker
 
 Most systems support Docker, but some, such as LXC, do not. In such environments, there are many options for installing Netmaker. Netmaker is available as a binary file, and there is a zip file of the Netmaker UI static HTML on GitHub. Beyond the UI and Server, you need to install MongoDB and CoreDNS (optional). 
 
-Below is a guided set of instructions for installing without Docker on Ubuntu 20.04. Depending on your system, the steps may vary.
+To start, we recommend following the Nginx instructions in the :doc:`Quick Install <./quick-start>` guide to enable SSL for your environment.
+
+Once this is enabled and configured for a domain, you can continue with the below. The recommended server runs Ubuntu 20.04.
 
-MongoDB Setup
+rqlite Setup
 ----------------
-1. Install MongoDB on your server:
-    * For Ubuntu: `sudo apt install -y mongodb`
-    * For more advanced installation or other operating systems, see  the `MongoDB documentation <https://docs.mongodb.com/manual/administration/install-community/>`_.
+1. Install rqlite on your server: https://github.com/rqlite/rqlite
 
-2. Create a user:
-    * ``mongo admin``  
-    * > `db.createUser({ user: "mongoadmin" , pwd: "mongopass", roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]})`
+2. Run rqlite: rqlited -node-id 1 ~/node.1
 
 Server Setup
 -------------
-1. **Run the install script:** ``sudo curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/v0.3.5/scripts/netmaker-server.sh | sh -``
+1. **Run the install script:** 
+
+``sudo curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netmaker-server.sh | sh -``
+
 2. Check status:  ``sudo journalctl -u netmaker``
 3. If any settings are incorrect such as host or mongo credentials, change them under /etc/netmaker/config/environments/< your env >.yaml and then run ``sudo systemctl restart netmaker``
 
 UI Setup
 -----------
 
-The following uses NGinx as an http server. You may alternatively use Apache or any other web server that serves static web files.
+The following uses Nginx as an http server. You may alternatively use Apache or any other web server that serves static web files.
 
-1. **Download 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``
-2. **Unzip:** ``sudo unzip /usr/share/nginx/html/netmaker-ui.zip -d /usr/share/nginx/html``
-3. **Copy Config to Nginx:** ``sudo cp /usr/share/nginx/html/nginx.conf /etc/nginx/conf.d/default.conf``
-4. **Modify Default Config Path:** ``sudo sed -i 's/root \/var\/www\/html/root \/usr\/share\/nginx\/html/g' /etc/nginx/sites-available/default``
-5. **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'``
-6. **Start Nginx:** ``sudo systemctl start nginx``
+1. Download and Unzip UI asset files
+2. Copy Config to Nginx
+3. Modify Default Config Path
+4. Change Backend URL
+5. Start Nginx
+
+.. code-block::
+  
+  sudo wget -O /usr/share/nginx/html/netmaker-ui.zip https://github.com/gravitl/netmaker-ui/releases/download/latest/netmaker-ui.zip
+  sudo unzip /usr/share/nginx/html/netmaker-ui.zip -d /usr/share/nginx/html
+  sudo cp /usr/share/nginx/html/nginx.conf /etc/nginx/conf.d/default.conf
+  sudo sed -i 's/root \/var\/www\/html/root \/usr\/share\/nginx\/html/g' /etc/nginx/sites-available/default
+  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'
+  sudo systemctl start nginx
 
 CoreDNS Setup
 ----------------
@@ -214,150 +222,103 @@ CoreDNS Setup
 Kubernetes Install
 =======================
 
-**This configuration is coming soon.** It will allow you to deploy Netmaker on a Kubernetes cluster.
-
-Configuration Reference
-=========================
+Server Install
+--------------------------
 
-The "Reference Compose File" (above) explains many of these options. However, it is important to understand fundamentally how Netmaker sets its configuration:
+This template assumes your cluster uses Nginx for ingress with valid wildcard certificates. If using an ingress controller other than Nginx (ex: Traefik), you will need to manually modify the Ingress entries in this template to match your environment.
 
-1. Defaults
-2. Config File
-3. Environment Variables
+This template also requires RWX storage. Please change references to storageClassName in this template to your cluster's Storage Class.
 
-Variable Description
-----------------------
+``wget https://raw.githubusercontent.com/gravitl/netmaker/develop/kube/netmaker-template.yaml``
 
-SERVER_HOST: 
-    **Default:** Server will perform an IP check and set automatically unless explicitly set, or DISABLE_REMOTE_IP_CHECK is set to true, in which case it defaults to 127.0.0.1
+Replace the NETMAKER_BASE_DOMAIN references to the base domain you would like for your Netmaker services (ui,api,grpc). Typically this will be something like **netmaker.yourwildcard.com**.
 
-    **Description:** Sets the SERVER_HTTP_HOST and SERVER_GRPC_HOST variables if they are unset. The address where traffic comes in. 
+``sed -i ‘s/NETMAKER_BASE_DOMAIN/<your base domain>/g’ netmaker-template.yaml``
 
-SERVER_HTTP_HOST: 
-    **Default:** Equals SERVER_HOST if set, "127.0.0.1" if SERVER_HOST is unset.
-    
-    **Description:** Set to make the HTTP and GRPC functions available via different interfaces/networks.
+Now, assuming Ingress and Storage match correctly with your cluster configuration, you can install Netmaker.
 
-SERVER_GRPC_HOST: 
-    **Default:** Equals SERVER_HOST if set, "127.0.0.1" if SERVER_HOST is unset.
+.. code-block::
 
-    **Description:** Set to make the HTTP and GRPC functions available via different interfaces/networks.
+  kubectl create ns nm
+  kubectl config set-context --current --namespace=nm
+  kubectl apply -f netmaker-template.yaml -n nm
 
-API_PORT:  
-    **Default:** 8081 
+In about 3 minutes, everything should be up and running:
 
-    **Description:** The HTTP API port for Netmaker. Used for API calls / communication from front end.
+``kubectl get ingress nm-ui-ingress-nginx``
 
-GRPC_PORT:  
-    **Default:** 50051
+Netclient Daemonset
+--------------------------
 
-    **Description:** The GRPC port for Netmaker. Used for communications from nodes.
+The following instructions assume you have Netmaker running and a network you would like to add your cluster into. The Netmaker server does not need to be running inside of a cluster for this.
 
-MASTER_KEY:  
-    **Default:** "secretkey" 
+.. code-block::
 
-    **Description:** The admin master key for accessing the API. Change this in any production installation.
+  wget https://raw.githubusercontent.com/gravitl/netmaker/develop/kube/netclient-template.yaml
+  sed -i ‘s/ACCESS_TOKEN_VALUE/< your access token value>/g’ netclient-template.yaml
+  kubectl apply -f netclient-template.yaml
 
-CORS_ALLOWED_ORIGIN:  
-    **Default:** "*"
+For a more detailed guide on integrating Netmaker with MicroK8s, `check out this guide <https://itnext.io/how-to-deploy-a-cross-cloud-kubernetes-cluster-with-built-in-disaster-recovery-bbce27fcc9d7>`_. 
 
-    **Description:** The "allowed origin" for API requests. Change to restrict where API requests can come from.
-
-REST_BACKEND:  
-    **Default:** "on" 
-
-    **Description:** Enables the REST backend (API running on API_PORT at SERVER_HTTP_HOST). Change to "off" to turn off.
-
-AGENT_BACKEND:  
-    **Default:** "on" 
-
-    **Description:** Enables the AGENT backend (GRPC running on GRPC_PORT at SERVER_GRPC_HOST). Change to "off" to turn off.
-
-CLIENT_MODE:  
-    **Default:** "on" 
-
-    **Description:** Enables Client Mode, meaning netclient will be deployed on server and will be manageable from UI. Change to "off" to turn off.
-
-DNS_MODE:  
-    **Default:** "on"
-
-    **Description:** Enables DNS Mode, meaning config files will be generated for CoreDNS.
-
-DISABLE_REMOTE_IP_CHECK:  
-    **Default:** "off" 
-
-    **Description:** If turned "on", Server will not set Host based on remote IP check. This is already overridden if SERVER_HOST is set. Turned "off" by default.
-
-MONGO_ADMIN:  
-    **Default:** "mongoadmin" 
-
-    **Description:** Admin user for MongoDB.
-
-MONGO_PASS:  
-    **Default:** "mongopass" 
-
-    **Description:** Admin password for MongoDB.
-
-MONGO_HOST:  
-    **Default:** "127.0.0.1"
-
-    **Description:** Address of MongoDB.
-
-MONGO_PORT:  
-    **Default:** "27017"
-
-    **Description:** Port of MongoDB.
-
-MONGO_OPTS:  
-    **Default:** "/?authSource=admin"
-
-    **Description:** Opts to enable admin login for Mongo.
-
-SERVER_GRPC_WIREGUARD: 
-    **Default:** "on"
-
-    **Description:** Whether to run GRPC over a WireGuard network. On by default. Secures the server comms. Switch to "off" to turn off. If off and running in production, make sure to have certificates installed to secure GRPC communications. 
+Nginx Reverse Proxy Setup with https
+====================================
 
-SERVER_GRPC_WG_INTERFACE: 
-    **Default:** "nm-grpc-wg"
+The `Swag Proxy <https://github.com/linuxserver/docker-swag>`_ makes it easy to generate a valid ssl certificate for the config bellow. Here is the `documentation <https://docs.linuxserver.io/general/swag>`_ for the installation.
 
-    **Description:** Interface to use for GRPC WireGuard network if enabled
+The following file configures Netmaker as a subdomain. This config is an adaption from the swag proxy project.
 
-SERVER_GRPC_WG_ADDRESS:
-    **Default:** "10.101.0.1"
+./netmaker.subdomain.conf:
 
-    **Description:** Private Address to use for GRPC WireGuard network if enabled
+.. code-block:: nginx
 
-SERVER_GRPC_WG_ADDRESS_RANGE:
-    **Default:** "10.101.0.0/16"
+    server {
+        listen 443 ssl;
+        listen [::]:443 ssl;
 
-    **Description:** Private Address range to use for GRPC WireGard clients if enabled. Gives 65,534 total addresses for all of netmaker. If running a larger network, will need to configure addresses differently, for instance using ipv6, or use certificates instead.
+        server_name netmaker.*; # The external URL
+        client_max_body_size 0;
 
-SERVER_GRPC_WG_PORT:
-    **Default:** 50555
+        # A valid https certificate is needed.
+        include /config/nginx/ssl.conf;
 
-    **Description:** Port to use for GRPC WireGuard if enabled
+        location / {
+            # This config file can be found at:
+            # https://github.com/linuxserver/docker-swag/blob/master/root/defaults/proxy.conf
+            include /config/nginx/proxy.conf;
 
-SERVER_GRPC_WG_PUBKEY:
-    **Default:** < generated at startup >
+            # if you use a custom resolver to find your app, needed with swag proxy
+            # resolver 127.0.0.11 valid=30s;
+            set $upstream_app netmaker-ui;                             # The internal URL
+            set $upstream_port 80;                                     # The internal Port
+            set $upstream_proto http;                                  # the protocol that is being used
+            proxy_pass $upstream_proto://$upstream_app:$upstream_port; # combine the set variables from above
+            }
+        }
 
-    **Description:** PublicKey for GRPC WireGuard interface. Generated if left blank.
+    server {
+        listen 443 ssl;
+        listen [::]:443 ssl;
 
-SERVER_GRPC_WG_PRIVKEY:
-    **Default:** < generated at startup >
+        server_name backend-netmaker.*; # The external URL
+        client_max_body_size 0;
+        underscores_in_headers on;
 
-    **Description:** PrivateKey for GRPC WireGuard interface. Generated if left blank.
+        # A valid https certificate is needed.
+        include /config/nginx/ssl.conf;
 
-SERVER_GRPC_WG_KEYREQUIRED
-    **Default:** ""
+        location / {
+            # if you use a custom resolver to find your app, needed with swag proxy
+            # resolver 127.0.0.11 valid=30s;
 
-    **Description:** Determines if an Access Key is required to join the Comms network. Blank (meaning 'no') by default. Set to "yes" to turn on.
+            set $upstream_app netmaker;                                # The internal URL
+            set $upstream_port 8081;                                   # The internal Port
+            set $upstream_proto http;                                  # the protocol that is being used
+            proxy_pass $upstream_proto://$upstream_app:$upstream_port; # combine the set variables from above
 
+            # Forces the header to be the one that is visible from the outside
+            proxy_set_header                Host backend.netmaker.example.org; # Please cange to your URL
 
-Config File Reference
-----------------------
-A config file may be placed under config/environments/<env-name>.yml. To read this file at runtime, provide the environment variable ENV at runtime. For instance, dev.yml paired with ENV=dev. Netmaker will load the specified Config file. This allows you to store and manage configurations for different environments. Below is a reference Config File you may use.
-
-.. literalinclude:: ../config/environments/dev.yaml
-  :language: YAML
-
+            # Pass all headers through to the backend
+            proxy_pass_request_headers      on;
+            }
+        }

+ 6 - 20
docs/_build/html/_sources/support.rst.txt

@@ -10,22 +10,15 @@ Does/Will Netmaker Support X Operating System?
 
 Netmaker is initially available on a limited number of operating systems for good reason: Every operating system is designed differently. With a small team, we can either focus on making Netmaker do a lot on a few number of operating systems, or a little on a bunch of operating systems. We chose the first option. You can view the System Compatibility docs for more info, but in general, you should only be using Netmaker on systemd linux right now.
 
-However, as of v0.4, we will technically be able to bring any operating system into the network. This is a bit of a hack. v0.4 introduces Ingress Gateways. Think of it this way. You set up a private network. You want devices to access it. You set up a single node as an "Ingress Gateway" and generate config files for "external clients." These clients are unmanaged and unmeshed, meaning they can access the network but only via the gateway. It also means they will not automatically account for changes to the network, and the user will have to update the configs manually.
+However, via "external clients", any device that supports WireGuard can be added to the network. 
 
-This lets us immediately "support" any device which can run WireGuard, which includes most operating systems at this point including phones and Windows.
-
-As we stabilize the design and feature set of Netmaker, we will expand the operating system support for Netclient which configures dynamic, fully-meshed devices. Expect to see updates about new OS support every few weeks, until eventually the Ingress Gateway becomes unnecessary (though you will still want it for certain use cases).
+In future iterations will expand the operating system support for Netclient, and devices that must use the "external client" feature can switch to Netclient.
 
 How do I install the Netclient on X?
 ---------------------------------------
 
 As per the above, there are many unsupported operating systems. You are still welcome to try, it is just an executable binary file after all. If the system is unix-based and has kernel WireGuard installed, netclient may very well mesh the device into the network. However, the service likely will encounter problems retrieving updates.
 
-Why MongoDB? SQL is better and smaller.
-----------------------------------------
-
-We are in a phase of rapid iteration. Every week the database schema changes. MongoDB makes our development process much more flexible. That said, we agree! SQL will be better for production, and indeed, we plan to switch over to SQL before v1.0, so please be patient with the resource consumption of MongoDB for the time being; it is helping to support a rapid pace of development. 
-
 
 Is Netmaker a VPN like NordNPN?
 --------------------------------
@@ -41,10 +34,11 @@ https://github.com/pivpn/pivpn
 https://github.com/subspacecloud/subspace
 https://github.com/mullvad/mullvadvpn-app
 
-Do you offer any paid support?
----------------------------------
+Do you offer any enterprise support?
+--------------------------------------
+
+If you are interested in enterprise support for your project, please contact [email protected].
 
-Not at this time, but eventually we will. If you are interested, or if you are interested in sponsoring the project generally, please contact Alex Feiszli ([email protected]).
 
 Why the SSPL License?
 ----------------------
@@ -57,14 +51,6 @@ If you have concerns about the license leading to project restrictions down the
 
 All that said, we will re-evaluate the license on a regular basis and determine if an OSI-approved license makes more sense. It's just easier to move from SSPL to another license than vice-versa.
 
-Issues, Bugs, and Feature Requests
-=====================================
-
-Issues / Bugs
-----------------
-
-Feature Requests
--------------------
 
 Contact
 ===========

+ 75 - 1
docs/_build/html/_sources/troubleshoot.rst.txt

@@ -3,17 +3,91 @@ Troubleshooting
 =================
 
 Common Issues
----------------
+--------------
+**How can I connect my Android, IOS, MacOS or Windows device to my Netmaker VPN?**
+  Currently meshing one of these devices is not supported, however it will be soon. 
+  For now you can connect to your VPN by making one of the nodes an Ingressgateway, then 
+  create an Ext Client for each device. Finally, use the official WG app or another 
+  WG configuration app to connect via QR or downloading the device's WireGuard configuration. 
+
+**I've made changes to my nodes but the nodes themselves haven't updated yet, why?**
+  Please allow your nodes to complete a check in or two, in order to reconfigure themselves.
+  In some cases, it could take up to a minute or so.
+
+**Do I have to use access keys to join a network?**
+  Although keys are the preferred way to join a network, Netmaker does allow for manual node sign-ups.
+  Simply turn on "allow manual signups" on your network and nodes will not connect until you manually aprove each one.
+
+**Is there a community or forum to ask questions about Netmaker?**
+  Yes, we have an active `discord <https://discord.gg/Pt4T9y9XK8>`_ community and issues on our `github <https://github.com/gravitl/netmaker/issues>`_ are answered frequently!
+  You can also sign-up for updates at our `gravitl site <https://gravitl.com/>`_!
 
 Server
 -------
+**Can I secure/encrypt all the traffic to my server and UI?**
+  This can fairly simple to achieve assuming you have access to a domain and are familiar with Nginx.
+  Please refer to the quick-start guide to see!
+
+**Can I connect multiple nodes (mesh clients) behind a single firewall/router?**
+  Yes! As of version 0.7 Netmaker supports UDP Hole Punching to allow this, without the use of a third party STUN server!
+  Is UDP hole punching a risk for you? Well you can turn it off and make static nodes/ports for the server to refer to as well.
+
+**What are the minimum specs to run the server?**
+  We recommend at least 1 CPU and 2 GB Memory.
+
+**Does this support IPv6 addressing?**
+  Yes, Netmaker supports IPv6 addressing. When you create a network, just make sure to turn on Dual Stack.
+  Nodes will be given IPv6 addresses along with their IPv4 address. It does not currently support IPv6 only.
+
+**Does Netmaker support Raft Consensus?**
+  Netmaker does not directly support it, but it uses `rqlite <https://github.com/rqlite/rqlite>`_ (which supports Raft) as the database.
+
+**How do I uninstall Netmaker?**
+  There is no official uninstall script for the Netmaker server at this time. If you followed the quick-start guide, simply run ``sudo docker-compose -f docker-compose.quickstart.yml down --volumes``
+  to completely wipe your server. Otherwise kill the running binary and it's up to you to remove database records/volumes.
 
 UI
 ----
+**I want to make a seperate network and give my friend access to only that network.**
+  Simply navigate to the UI (as an admin account). Select users in the top left and create them an account.
+  Select the network(s) to give them and they should be good to go! They are an admin of that network(s) only now.
+
+**I'm done with an access key, can I delete it?**
+  Simply navigate to the UI (as an admin account). Select your network of interest, then the select the ``Access Keys`` tab.
+  Then delete the rogue access key.
+
+**I can't delete my network, why?**
+  You **MUST** remove all nodes in a network before you can delete it.
+
+**Can I have multiple nodes with the same name?**
+  Yes, nodes can share names without issue. It may just be harder on you to know which is which.
 
 Agent
 -------
+**How do I connect a node to my Netmaker network with Netclient?**
+  First get your access token (not just access key), then run ``sudo netclient join -t <access token>``.
+  **NOTE:** netclient may be under /etc/netclient/, i.e run ``sudo /etc/netclient/netclient join -t <access token>``
+
+**How do I disconnect a node on a Netmaker network?**
+  In order to leave a Netmaker network, run ``sudo netclient leave -n <network-name>``
+
+**How do I check the logs of my agent on a node?**
+  You will need sudo/root permissions, but you can run ``sudo systemctl status netclient@<insert network name>``
+  or you may also run ``sudo journalctl -u netclient@<network name>``. 
+  Note for journalctl: you should hit the ``end`` key to get to view the most recent logs quickly or use ``journalctl -u netclient@<network name> -f`` instead.
+
+**Can I check the configuration of my node on the node?**
+  **A:** Yes, on the node simply run ``sudo cat /etc/netclient/netconfig-<network name>`` and you should see what your current configuration is! 
+  You can also see the current WireGuard configuration with ``sudo wg show``
+
+**I am done with the agent on my machine, can I uninstall it?**
+  Yes, on the node simply run ``sudo /etc/netclient/netclient uninstall``. 
+
 
 CoreDNS
 --------
+**Is CoreDNS required to use Netmaker?**
+  CoreDNS is not required. Simply start your server with ``DNS_MODE="off"``.
 
+**What is the minimum DNS entry value I can use?**
+  Netmaker supports down to two characters for DNS names for your networks domains**

+ 3 - 18
docs/_build/html/_sources/usage.rst.txt

@@ -19,21 +19,6 @@ Video Tutorials
 
 Written Tutorials
 -----------------
-* `Kubernetes Cross-cloud cluster <https://itnext.io/how-to-deploy-a-single-kubernetes-cluster-across-multiple-clouds-using-k3s-and-wireguard-a5ae176a6e81>`_: Tutorial on setting up cross-cloud Kubernetes clusters using Netmaker.
-
-Basic
-=====
-
-Local Network
-=============
-  
-Site-to-Site
-============
-
-Dual Stack with IPv6
-====================
-
-Kubernetes Node Network
-========================
-
-
+* `K3s Cross-cloud cluster <https://itnext.io/how-to-deploy-a-single-kubernetes-cluster-across-multiple-clouds-using-k3s-and-wireguard-a5ae176a6e81>`_: Tutorial on setting up cross-cloud K3s clusters using Netmaker.
+* `MicroK8s Cross-cloud cluster <https://itnext.io/how-to-deploy-a-cross-cloud-kubernetes-cluster-with-built-in-disaster-recovery-bbce27fcc9d7>`_: Tutorial on setting up cross-cloud MicroK8s clusters using Netmaker.
+* `Secure access to private services <https://afeiszli.medium.com/how-to-enable-secure-access-to-your-hosted-services-using-netmaker-and-wireguard-1b3282d4b7aa>`_: Tutorial on setting up secure Nextcloud with Netmaker.

+ 1 - 1
docs/_build/html/_static/documentation_options.js

@@ -1,6 +1,6 @@
 var DOCUMENTATION_OPTIONS = {
     URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
-    VERSION: '0.5',
+    VERSION: '0.7',
     LANGUAGE: 'None',
     COLLAPSE_INDEX: false,
     BUILDER: 'html',

+ 54 - 19
docs/_build/html/about.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>About &#8212; Netmaker 0.5 documentation</title>
+    <title>About &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -299,81 +299,95 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstralling-netmaker" class="md-nav__link">Uninstralling Netmaker</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
-    </li></ul>
-    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
-      <ul class="md-nav__list"> 
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
       <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
@@ -412,6 +426,13 @@
       <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
+      
+    
     </li></ul>
     
     </li>
@@ -475,6 +496,20 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
     </li></ul>
     
     </li>

+ 54 - 19
docs/_build/html/api.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>API Reference &#8212; Netmaker 0.5 documentation</title>
+    <title>API Reference &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -279,81 +279,95 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstralling-netmaker" class="md-nav__link">Uninstralling Netmaker</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
-    </li></ul>
-    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
-      <ul class="md-nav__list"> 
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
       <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
@@ -392,6 +406,13 @@
       <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
+      
+    
     </li></ul>
     
     </li>
@@ -455,6 +476,20 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
     </li></ul>
     
     </li>

+ 66 - 34
docs/_build/html/architecture.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Architecture &#8212; Netmaker 0.5 documentation</title>
+    <title>Architecture &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -56,7 +56,7 @@
     <link rel="author" title="About these documents" href="about.html" />
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" />
-    <link rel="next" title="Quick Start" href="quick-start.html" />
+    <link rel="next" title="Quick Install" href="quick-start.html" />
     <link rel="prev" title="About" href="about.html" />
   
    
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -268,7 +268,7 @@
         </li>
         <li class="md-nav__item"><a href="#netclient" class="md-nav__link">Netclient</a>
         </li>
-        <li class="md-nav__item"><a href="#mongodb" class="md-nav__link">MongoDB</a>
+        <li class="md-nav__item"><a href="#rqlite" class="md-nav__link">rqlite</a>
         </li>
         <li class="md-nav__item"><a href="#netmaker-ui" class="md-nav__link">Netmaker UI</a>
         </li>
@@ -329,81 +329,95 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstralling-netmaker" class="md-nav__link">Uninstralling Netmaker</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
-    </li></ul>
-    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
-      <ul class="md-nav__list"> 
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
       <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
@@ -442,6 +456,13 @@
       <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
+      
+    
     </li></ul>
     
     </li>
@@ -505,6 +526,20 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
     </li></ul>
     
     </li>
@@ -782,7 +817,7 @@
         </li>
         <li class="md-nav__item"><a href="#netclient" class="md-nav__link">Netclient</a>
         </li>
-        <li class="md-nav__item"><a href="#mongodb" class="md-nav__link">MongoDB</a>
+        <li class="md-nav__item"><a href="#rqlite" class="md-nav__link">rqlite</a>
         </li>
         <li class="md-nav__item"><a href="#netmaker-ui" class="md-nav__link">Netmaker UI</a>
         </li>
@@ -833,7 +868,7 @@
 
 <h3 id="netmaker">Netmaker<a class="headerlink" href="#netmaker" title="Permalink to this headline">¶</a></h3>
 <p>Netmaker is a platform built off of WireGuard which enables users to create mesh networks between their devices. Netmaker can create both full and partial mesh networks depending on the use case.</p>
-<p>When we refer to Netmaker in aggregate, we are typically referring to Netmaker and the netclient, as well as other supporting services such as CoreDNS, MongoDB, and UI webserver.</p>
+<p>When we refer to Netmaker in aggregate, we are typically referring to Netmaker and the netclient, as well as other supporting services such as CoreDNS, rqlite, and UI webserver.</p>
 <p>From an end user perspective, they typically interact with the Netmaker UI, or even just run the install script for the netclient on their devices. The other components run in the background invisibly.</p>
 <p>Netmaker does a lot of work to set configurations for you, so that you don’t have to. This includes things like WireGuard ports, endpoints, public IPs, keys, and peers. Netmaker works to abstract away as much of the network management as possible, so that you can just click to create a network, and click to add a machine to a network. That said, every machine (node) is different, and may require special configuration. That is why, while Netmaker sets practical default settings, everything within Netmaker is fully configurable.</p>
 
@@ -856,7 +891,7 @@
 <p>The Netmaker server acts as an API to the front end, and as a GRPC server to the machines in the network. GRPC is much faster and more efficient than standard API calls, which increases the speed of transactions. For this reason, the Netmaker server exposes two ports: The default for the API is 8081, and the default for GRPC is 50051. Either the API or the GRPC server can be disabled on any given Netmaker instance can be disabled, allowing you to deploy two different servers for managing the API (which is largely for the admin’s use) and GRPC (which is largely for the nodes’ use).</p>
 <p>Most server settings are configurable via a config file, or by environment variables (which take precedence). If the server finds neither of these, it sets sensible defaults, including things like the server’s reachable IP, ports, and which “modes” to run in.</p>
 <p>These modes include client mode and dns mode. Either of these can be disabled but are enabled by default. Client mode allows you to treat the Netmaker host machine (operating system) as a network Node, installing the netclient and controlling the host network. DNS mode has the server write config settings for CoreDNS, a separate component and nameserver, which picks up the config settings to manage node DNS.</p>
-<p>The Netmaker server interacts with (as of v0.3) a MongoDB instance, which holds information about nodes, networks, users, and other important data. This data is configuration data. For the most part, Netmaker serves configuration data to Nodes, telling them how they should configure themselves. The Netclient is the agent that actually does that configuration.</p>
+<p>The Netmaker server interacts with rqlite, a distributed version of sqlite, which holds information about nodes, networks, users, and other important data. This data is configuration data. For the most part, Netmaker serves configuration data to Nodes, telling them how they should configure themselves. The Netclient is the agent that actually does that configuration.</p>
 
 
 <h3 id="netclient">Netclient<a class="headerlink" href="#netclient" title="Permalink to this headline">¶</a></h3>
@@ -869,8 +904,8 @@
 <p>The check in process is what allows Netmaker to create dynamic mesh networks. As nodes are added to, removed from, and modified on the network, other nodes are notified, and make appropriate changes.</p>
 
 
-<h3 id="mongodb">MongoDB<a class="headerlink" href="#mongodb" title="Permalink to this headline">¶</a></h3>
-<p>As of v0.5, Netmaker uses MongoDB as its database, and interacts with a MongoDB instance to store and retrieve information about nodes, networks, and users. Netmaker is rapidly evolving, and MongoDB provides a flexible database structure that accelerates development. However, MongoDB is also the heaviest component of Netmaker (high cpu/memory consumption), and is set to be replaced by a lighter-weight, SQL-based database in the future.</p>
+<h3 id="rqlite">rqlite<a class="headerlink" href="#rqlite" title="Permalink to this headline">¶</a></h3>
+<p>As of v0.7, Netmaker uses rqlite, a distributed (RAFT consensus) database, and interacts with this database to store and retrieve information about nodes, networks, and users. With the 0.7 refactor, additional database support is very easy to implement. Netmaker uses simple key value lookups to run the networks, and the database was designed to be extensible, so support for key-value stores and other SQL-based databases can be achieved by changing a single file.</p>
 
 
 <h3 id="netmaker-ui">Netmaker UI<a class="headerlink" href="#netmaker-ui" title="Permalink to this headline">¶</a></h3>
@@ -879,7 +914,7 @@
 
 
 <h3 id="coredns">CoreDNS<a class="headerlink" href="#coredns" title="Permalink to this headline">¶</a></h3>
-<p>v0.3 introduced the concept of private DNS management for nodes. This requires a nameserver, and CoreDNS is the chosen nameserver. CoreDNS is lightweight and extensible. CoreDNS loads dns settings from a simple file, managed by Netmaker, and serves out DNS info for managed nodes. DNS can be tricky, and DNS management is currently only supported on a small set of devices, specifically those running systemd-resolved. However, the Netmaker CoreDNS instance can be added manually as a nameserver to other devices. DNS mode can also be turned off.</p>
+<p>Netmaker allows users to provide and manage Private DNS for their nodes. This requires a nameserver, and CoreDNS is the chosen nameserver. CoreDNS is lightweight and extensible. CoreDNS loads dns settings from a simple file, managed by Netmaker, and serves out DNS info for managed nodes. DNS can be tricky, and DNS management is currently only supported on a small set of devices, specifically those running systemd-resolved. However, the Netmaker CoreDNS instance can be added manually as a nameserver to other devices. DNS mode can also be turned off.</p>
 <p>Worth considering is that CoreDNS requires port 53 on the Netmaker host system, which may cause conflicts depending on your operating system. This is explained in the <a class="reference internal" href="server-installation.html"><span class="doc">Server Installation</span></a> guide.</p>
 
 
@@ -941,11 +976,8 @@
 
 
 <h2 id="limitations">Limitations<a class="headerlink" href="#limitations" title="Permalink to this headline">¶</a></h2>
-<p>Install limitations mostly include platform-specific limitations, such as needing systemd or systemd-resolved (see above). In addition the Netmaker platform has some additional limitations:</p>
-<ul class="simple">
-<li><p><strong>Double NAT</strong>: Netmaker is currently unable to route traffic for devices behind a “double NAT”.</p></li>
-<li><p><strong>CGNAT</strong>: Netmaker is currently unable to route traffic for for devices behind a “carrier-grade NAT”.</p></li>
-</ul>
+<p>Install limitations mostly include platform-specific limitations, such as needing systemd or systemd-resolved (see above).</p>
+<p>In addition the Netmaker is currently unable to route traffic for for devices behind a “carrier-grade NAT”. This will be solved in a future release with the introduction of relay servers.</p>
 
 
 
@@ -973,12 +1005,12 @@
             </a>
           
           
-            <a href="quick-start.html" title="Quick Start"
+            <a href="quick-start.html" title="Quick Install"
                class="md-flex md-footer-nav__link md-footer-nav__link--next"
                rel="next">
             <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title"><span
                 class="md-flex__ellipsis"> <span
-                class="md-footer-nav__direction"> Next </span> Quick Start </span>
+                class="md-footer-nav__direction"> Next </span> Quick Install </span>
             </div>
             <div class="md-flex__cell md-flex__cell--shrink"><i
                 class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>

+ 80 - 72
docs/_build/html/client-installation.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Client Installation &#8212; Netmaker 0.5 documentation</title>
+    <title>Client Installation &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -57,7 +57,7 @@
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" />
     <link rel="next" title="External Clients" href="external-clients.html" />
-    <link rel="prev" title="Server Installation" href="server-installation.html" />
+    <link rel="prev" title="Advanced Server Installation" href="server-installation.html" />
   
    
 
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -279,61 +279,82 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstralling-netmaker" class="md-nav__link">Uninstralling Netmaker</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
     </li></ul>
@@ -342,26 +363,26 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
+      <a href="server-installation.html#server-configuration-reference" class="md-nav__link">Server Configuration Reference</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#dns-mode-prereqisite-setup" class="md-nav__link">DNS Mode Prereqisite Setup</a>
+      <a href="server-installation.html#dns-mode-setup" class="md-nav__link">DNS Mode Setup</a>
       
     
     </li>
@@ -389,7 +410,7 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
       
     
     </li></ul>
@@ -442,8 +463,6 @@
         <li class="md-nav__item"><a href="#adding-removing-networks" class="md-nav__link">Adding/Removing Networks</a>
         </li>
         <li class="md-nav__item"><a href="#uninstalling" class="md-nav__link">Uninstalling</a>
-        </li>
-        <li class="md-nav__item"><a href="#troubleshooting" class="md-nav__link">Troubleshooting</a>
         </li></ul>
             </nav>
         </li></ul>
@@ -507,53 +526,32 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
-    </li></ul>
-    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="usage.html" class="md-nav__link">Using Netmaker</a>
-      <ul class="md-nav__list"> 
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#external-tutorials" class="md-nav__link">External Tutorials</a>
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="usage.html#basic" class="md-nav__link">Basic</a>
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#local-network" class="md-nav__link">Local Network</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#site-to-site" class="md-nav__link">Site-to-Site</a>
-      
+    </li></ul>
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="usage.html#dual-stack-with-ipv6" class="md-nav__link">Dual Stack with IPv6</a>
-      
-    
-    </li>
+      <a href="usage.html" class="md-nav__link">Using Netmaker</a>
+      <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="usage.html#kubernetes-node-network" class="md-nav__link">Kubernetes Node Network</a>
+      <a href="usage.html#external-tutorials" class="md-nav__link">External Tutorials</a>
       
     
     </li></ul>
@@ -647,13 +645,6 @@
       <a href="support.html#faq" class="md-nav__link">FAQ</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="support.html#issues-bugs-and-feature-requests" class="md-nav__link">Issues, Bugs, and Feature Requests</a>
-      
-    
     </li>
     <li class="md-nav__item">
     
@@ -797,8 +788,6 @@
         <li class="md-nav__item"><a href="#adding-removing-networks" class="md-nav__link">Adding/Removing Networks</a>
         </li>
         <li class="md-nav__item"><a href="#uninstalling" class="md-nav__link">Uninstalling</a>
-        </li>
-        <li class="md-nav__item"><a href="#troubleshooting" class="md-nav__link">Troubleshooting</a>
         </li></ul>
             </nav>
         </li></ul>
@@ -882,7 +871,8 @@
 </pre></div>
 </div>
 <p><code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">netclient</span> <span class="pre">join</span> <span class="pre">--help</span></code></p>
-<div class="highlight-YAML notranslate"><div class="highlight"><pre><span></span><span class="nt">NAME</span><span class="p">:</span>
+<div class="highlight-YAML notranslate"><div class="highlight"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">alex@workstation:~$ sudo netclient join --help</span>
+<span class="l l-Scalar l-Scalar-Plain">NAME</span><span class="p p-Indicator">:</span>
    <span class="l l-Scalar l-Scalar-Plain">netclient join - Join a Netmaker network.</span>
 
 <span class="nt">USAGE</span><span class="p">:</span>
@@ -890,7 +880,7 @@
 
 <span class="nt">OPTIONS</span><span class="p">:</span>
    <span class="l l-Scalar l-Scalar-Plain">--network value, -n value            Network to perform specified action against. (default</span><span class="p p-Indicator">:</span> <span class="s">"all"</span><span class="l l-Scalar l-Scalar-Plain">) [$NETCLIENT_NETWORK]</span>
-   <span class="l l-Scalar l-Scalar-Plain">--password value, -p value           Password for authenticating with netmaker. (default</span><span class="p p-Indicator">:</span> <span class="s">"badpassword"</span><span class="l l-Scalar l-Scalar-Plain">) [$NETCLIENT_PASSWORD]</span>
+   <span class="l l-Scalar l-Scalar-Plain">--password value, -p value           Password for authenticating with netmaker. [$NETCLIENT_PASSWORD]</span>
    <span class="l l-Scalar l-Scalar-Plain">--endpoint value, -e value           Reachable (usually public) address for WireGuard (not the private WG address). [$NETCLIENT_ENDPOINT]</span>
    <span class="l l-Scalar l-Scalar-Plain">--macaddress value, -m value         Mac Address for this machine. Used as a unique identifier within Netmaker network. [$NETCLIENT_MACADDRESS]</span>
    <span class="l l-Scalar l-Scalar-Plain">--publickey value, --pubkey value    Public Key for WireGuard Interface. [$NETCLIENT_PUBLICKEY]</span>
@@ -908,9 +898,10 @@
    <span class="l l-Scalar l-Scalar-Plain">--key value, -k value                Access Key for signing up machine with Netmaker server during initial 'add'. [$NETCLIENT_ACCESSKEY]</span>
    <span class="l l-Scalar l-Scalar-Plain">--token value, -t value              Access Token for signing up machine with Netmaker server during initial 'add'. [$NETCLIENT_ACCESSTOKEN]</span>
    <span class="l l-Scalar l-Scalar-Plain">--localrange value                   Local Range if network is local, for instance 192.168.1.0/24. [$NETCLIENT_LOCALRANGE]</span>
-   <span class="l l-Scalar l-Scalar-Plain">--dns value                          Sets private dns if 'on'. Ignores if 'off'. Will retrieve from network if unset. [$NETCLIENT_DNS]</span>
+   <span class="l l-Scalar l-Scalar-Plain">--dns value                          Sets private dns if 'on'. Ignores if 'off'. Will retrieve from network if unset. (default</span><span class="p p-Indicator">:</span> <span class="s">"on"</span><span class="l l-Scalar l-Scalar-Plain">) [$NETCLIENT_DNS]</span>
    <span class="l l-Scalar l-Scalar-Plain">--islocal value                      Sets endpoint to local address if 'yes'. Ignores if 'no'. Will retrieve from network if unset. [$NETCLIENT_IS_LOCAL]</span>
    <span class="l l-Scalar l-Scalar-Plain">--isdualstack value                  Sets ipv6 address if 'yes'. Ignores if 'no'. Will retrieve from network if unset. [$NETCLIENT_IS_DUALSTACK]</span>
+   <span class="l l-Scalar l-Scalar-Plain">--udpholepunch value                 Turns on udp holepunching if 'yes'. Ignores if 'no'. Will retrieve from network if unset. [$NETCLIENT_UDP_HOLEPUNCH]</span>
    <span class="l l-Scalar l-Scalar-Plain">--ipforwarding value                 Sets ip forwarding on if 'on'. Ignores if 'off'. On by default. (default</span><span class="p p-Indicator">:</span> <span class="s">"on"</span><span class="l l-Scalar l-Scalar-Plain">) [$NETCLIENT_IPFORWARDING]</span>
    <span class="l l-Scalar l-Scalar-Plain">--postup value                       Sets PostUp command for WireGuard. [$NETCLIENT_POSTUP]</span>
    <span class="l l-Scalar l-Scalar-Plain">--postdown value                     Sets PostDown command for WireGuard. [$NETCLIENT_POSTDOWN]</span>
@@ -924,6 +915,7 @@
 <h3 id="config-file-reference">Config File Reference<a class="headerlink" href="#config-file-reference" title="Permalink to this headline">¶</a></h3>
 <p>There is a config file for each node under /etc/netconfig-&lt;network name&gt;. You can change these values and then set “postchanges” to “true”, or go to the CLI and run <code class="docutils literal notranslate"><span class="pre">netclient</span> <span class="pre">push</span> <span class="pre">-n</span> <span class="pre">&lt;network&gt;</span></code></p>
 <div class="highlight-YAML notranslate"><div class="highlight"><pre><span></span><span class="nt">server</span><span class="p">:</span>
+    <span class="nt">corednsaddr</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">147.182.251.203</span> <span class="c1"># Address of CoreDNS Server (set locally with resolvectl)</span>
     <span class="nt">grpcaddress</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">10.101.0.1:50051</span> <span class="c1"># Address of GRPC Server (used for all interaction with server after registration)</span>
     <span class="nt">apiaddress</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">1.2.3.4:8081</span> <span class="c1"># Address of API Server (used only for registration/unregistration)</span>
     <span class="nt">accesskey</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">5qKTbTgsvb45y3qyRmWft</span> <span class="c1"># Key used to sign up with server. Used only during registration</span>
@@ -936,12 +928,12 @@
     <span class="nt">localaddress</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">192.168.1.32</span> <span class="c1"># Address on local network, used as endpoint for other local nodes for faster comms</span>
     <span class="nt">wgaddress</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">10.7.11.2</span> <span class="c1"># Private WG addres on network</span>
     <span class="nt">wgaddress6</span><span class="p">:</span> <span class="s">"f8:34:41:77:5c:15"</span> <span class="c1"># Private ipv6 address if network is dual stack</span>
-    <span class="nt">roaming</span><span class="p">:</span> <span class="s">"on"</span> <span class="c1"># Whether or not to grab new endpoint value automatically</span>
-    <span class="nt">dns</span><span class="p">:</span> <span class="s">"off"</span> <span class="c1"># Whether or not to set local DNS based on Netmaker's Private DNS server</span>
+    <span class="nt">roaming</span><span class="p">:</span> <span class="s">"yes"</span> <span class="c1"># Whether or not to grab new endpoint value automatically</span>
+    <span class="nt">dnson</span><span class="p">:</span> <span class="s">"no"</span> <span class="c1"># Whether or not to set local DNS based on Netmaker's Private DNS server</span>
     <span class="nt">islocal</span><span class="p">:</span> <span class="s">"no"</span> <span class="c1"># Based on network. If yes, will use local IP as endpoint.</span>
     <span class="nt">isdualstack</span><span class="p">:</span> <span class="s">"yes"</span> <span class="c1"># Use IPv6 in addition to IPv4</span>
     <span class="nt">isingressgateway</span><span class="p">:</span> <span class="s">"no"</span> <span class="c1"># whether or not node is an ingress gateway (will set iptables forwarding rules)</span>
-    <span class="nt">allowedips</span><span class="p">:</span> <span class="s">""</span> <span class="c1"># not currently used</span>
+    <span class="nt">allowedips</span><span class="p">:</span> <span class="s">""</span> <span class="c1"># additional IP's to add to client</span>
     <span class="nt">localrange</span><span class="p">:</span> <span class="s">""</span> <span class="c1"># local range if it's a local network. For instance, 192.168.1.0/24</span>
     <span class="nt">postup</span><span class="p">:</span> <span class="s">""</span> <span class="c1"># postup command, used by ingress/egress gateways to set iptables</span>
     <span class="nt">postdown</span><span class="p">:</span> <span class="s">""</span> <span class="c1"># postdown command, used by ingress/egress gateways to set iptables</span>
@@ -951,9 +943,11 @@
     <span class="nt">privatekey</span><span class="p">:</span> <span class="s">""</span> <span class="c1"># private key, set only for changing and then will revert to blank in config</span>
     <span class="nt">endpoint</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">78.170.22.168</span> <span class="c1"># public endpoint for reaching node </span>
     <span class="nt">postchanges</span><span class="p">:</span> <span class="s">"false"</span> <span class="c1"># if true, will post and config file changes on next checkin and then revert to false</span>
-    <span class="nt">ipforwarding</span><span class="p">:</span> <span class="s">"on"</span> <span class="c1"># set ip forwarding; highly recommended to leave on</span>
-<span class="nt">network</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">home</span> <span class="c1"># the network (duplicate of node.network)</span>
-<span class="nt">daemon</span><span class="p">:</span> <span class="s">"on"</span> <span class="c1"># whether or not to manage systemd</span>
+    <span class="nt">ipforwarding</span><span class="p">:</span> <span class="s">"yes"</span> <span class="c1"># set ip forwarding; highly recommended to leave on</span>
+    <span class="nt">isstatic</span><span class="p">:</span> <span class="s">"no"</span> <span class="c1"># if yes, daemon will not change pubkey, endpoint, or address</span>
+    <span class="nt">udpholepunch</span><span class="p">:</span> <span class="s">"yes"</span> <span class="c1"># run UDP hole punching (will ignore port above, e.g. 51821)</span>
+    <span class="nt">network</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">home</span> <span class="c1"># the network (duplicate of node.network)</span>
+<span class="nt">daemon</span><span class="p">:</span> <span class="s">"yes"</span> <span class="c1"># whether or not to manage systemd</span>
 <span class="nt">operatingsystem</span><span class="p">:</span> <span class="s">""</span> <span class="c1"># not currently in use</span>
 </pre></div>
 </div>
@@ -972,18 +966,32 @@
 <h2 id="managing-netclient">Managing Netclient<a class="headerlink" href="#managing-netclient" title="Permalink to this headline">¶</a></h2>
 
 <h3 id="viewing-logs">Viewing Logs<a class="headerlink" href="#viewing-logs" title="Permalink to this headline">¶</a></h3>
+<dl class="simple">
+<dt><strong>to view current networks</strong></dt><dd><p><code class="docutils literal notranslate"><span class="pre">netclient</span> <span class="pre">list</span></code></p>
+</dd>
+<dt><strong>to tail logs</strong></dt><dd><p><code class="docutils literal notranslate"><span class="pre">journalctl</span> <span class="pre">-u</span> <span class="pre">netclient@&lt;net</span> <span class="pre">name&gt;</span> <span class="pre">-f</span></code></p>
+</dd>
+<dt><strong>to view all logs</strong></dt><dd><p><code class="docutils literal notranslate"><span class="pre">journalctl</span> <span class="pre">-u</span> <span class="pre">netclient@&lt;net</span> <span class="pre">name&gt;</span></code></p>
+</dd>
+<dt><strong>to get most recent log run</strong></dt><dd><p><code class="docutils literal notranslate"><span class="pre">systemctl</span> <span class="pre">status</span> <span class="pre">netclient@&lt;net</span> <span class="pre">name&gt;</span></code></p>
+</dd>
+</dl>
 
 
 <h3 id="making-updates">Making Updates<a class="headerlink" href="#making-updates" title="Permalink to this headline">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">vim</span> <span class="pre">/etc/netclient/netconfig-&lt;network&gt;</span></code></p>
+<p>Change any of the variables in this file, and changes will be pushed to the server and processed locally on the next checkin.</p>
+<p>For instance, change the private address, endpoint, or name. See above example config file for details</p>
 
 
 <h3 id="adding-removing-networks">Adding/Removing Networks<a class="headerlink" href="#adding-removing-networks" title="Permalink to this headline">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">netclient</span> <span class="pre">join</span> <span class="pre">-t</span> <span class="pre">&lt;token&gt;</span></code></p>
+<p>Set any of the above flags (netclient join –help) to override settings for joining the network.
+If a key is provided (-k), then a token is unnecessary, but grpc, server, ports, and network must all be provided via flags.</p>
 
 
 <h3 id="uninstalling">Uninstalling<a class="headerlink" href="#uninstalling" title="Permalink to this headline">¶</a></h3>
-
-
-<h3 id="troubleshooting">Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permalink to this headline">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">netclient</span> <span class="pre">uninstall</span></code></p>
 
 
 
@@ -998,7 +1006,7 @@
     <div class="md-footer-nav">
       <nav class="md-footer-nav__inner md-grid">
           
-            <a href="server-installation.html" title="Server Installation"
+            <a href="server-installation.html" title="Advanced Server Installation"
                class="md-flex md-footer-nav__link md-footer-nav__link--prev"
                rel="prev">
               <div class="md-flex__cell md-flex__cell--shrink">
@@ -1007,7 +1015,7 @@
               <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
                 <span class="md-flex__ellipsis">
                   <span
-                      class="md-footer-nav__direction"> Previous </span> Server Installation </span>
+                      class="md-footer-nav__direction"> Previous </span> Advanced Server Installation </span>
               </div>
             </a>
           

+ 54 - 19
docs/_build/html/conduct.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Code of Conduct &#8212; Netmaker 0.5 documentation</title>
+    <title>Code of Conduct &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -279,81 +279,95 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstralling-netmaker" class="md-nav__link">Uninstralling Netmaker</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
-    </li></ul>
-    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
-      <ul class="md-nav__list"> 
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
       <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
@@ -392,6 +406,13 @@
       <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
+      
+    
     </li></ul>
     
     </li>
@@ -455,6 +476,20 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
     </li></ul>
     
     </li>

+ 54 - 19
docs/_build/html/contribute.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Contribute &#8212; Netmaker 0.5 documentation</title>
+    <title>Contribute &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -279,81 +279,95 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstralling-netmaker" class="md-nav__link">Uninstralling Netmaker</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
-    </li></ul>
-    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
-      <ul class="md-nav__list"> 
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
       <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
@@ -392,6 +406,13 @@
       <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
+      
+    
     </li></ul>
     
     </li>
@@ -455,6 +476,20 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
     </li></ul>
     
     </li>

+ 40 - 19
docs/_build/html/external-clients.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>External Clients &#8212; Netmaker 0.5 documentation</title>
+    <title>External Clients &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -279,81 +279,95 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
-    </li></ul>
-    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
-      <ul class="md-nav__list"> 
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
       <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
@@ -392,6 +406,13 @@
       <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
+      
+    
     </li></ul>
     
     </li>

+ 40 - 61
docs/_build/html/genindex.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Index &#8212; Netmaker 0.5 documentation</title>
+    <title>Index &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -79,7 +79,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -165,7 +165,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -177,13 +177,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -277,61 +277,82 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
     </li></ul>
@@ -340,26 +361,26 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
+      <a href="server-installation.html#server-configuration-reference" class="md-nav__link">Server Configuration Reference</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#dns-mode-prereqisite-setup" class="md-nav__link">DNS Mode Prereqisite Setup</a>
+      <a href="server-installation.html#dns-mode-setup" class="md-nav__link">DNS Mode Setup</a>
       
     
     </li>
@@ -387,7 +408,7 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
       
     
     </li></ul>
@@ -481,41 +502,6 @@
       <a href="usage.html#external-tutorials" class="md-nav__link">External Tutorials</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#basic" class="md-nav__link">Basic</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#local-network" class="md-nav__link">Local Network</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#site-to-site" class="md-nav__link">Site-to-Site</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#dual-stack-with-ipv6" class="md-nav__link">Dual Stack with IPv6</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#kubernetes-node-network" class="md-nav__link">Kubernetes Node Network</a>
-      
-    
     </li></ul>
     
     </li>
@@ -607,13 +593,6 @@
       <a href="support.html#faq" class="md-nav__link">FAQ</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="support.html#issues-bugs-and-feature-requests" class="md-nav__link">Issues, Bugs, and Feature Requests</a>
-      
-    
     </li>
     <li class="md-nav__item">
     

+ 611 - 176
docs/_build/html/getting-started.html

@@ -46,16 +46,18 @@
   
   
   
-    <title>Getting Started &#8212; Netmaker 0.3.5 documentation</title>
+    <title>Getting Started &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
     <script src="_static/jquery.js"></script>
     <script src="_static/underscore.js"></script>
     <script src="_static/doctools.js"></script>
+    <link rel="author" title="About these documents" href="about.html" />
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" />
-    <link rel="prev" title="Welcome to Netmaker’s documentation!" href="index.html" />
+    <link rel="next" title="Advanced Server Installation" href="server-installation.html" />
+    <link rel="prev" title="Quick Install" href="quick-start.html" />
   
    
 
@@ -79,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.3.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -127,7 +129,7 @@
       
         <div class="md-flex__cell md-flex__cell--shrink">
           <div class="md-header-nav__source">
-            <a href="https://github.com/bashtage/sphinx-material/" title="Go to repository" class="md-source" data-md-source="github">
+            <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
 
     <div class="md-source__icon">
       <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="28" height="28">
@@ -136,7 +138,7 @@
     </div>
   
   <div class="md-source__repository">
-    Material for Sphinx
+    Netmaker
   </div>
 </a>
           </div>
@@ -165,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.3.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -177,16 +179,16 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.3.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.3.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
-      <a href="https://github.com/bashtage/sphinx-material/" title="Go to repository" class="md-source" data-md-source="github">
+      <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
 
     <div class="md-source__icon">
       <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="28" height="28">
@@ -195,7 +197,7 @@
     </div>
   
   <div class="md-source__repository">
-    Material for Sphinx
+    Netmaker
   </div>
 </a>
     </div>
@@ -207,6 +209,118 @@
     <li class="md-nav__item">
     
     
+      <a href="about.html" class="md-nav__link">About</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="about.html#what-is-netmaker" class="md-nav__link">What is Netmaker?</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="about.html#how-does-netmaker-work" class="md-nav__link">How Does Netmaker Work?</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="about.html#use-cases-for-netmaker" class="md-nav__link">Use Cases for Netmaker</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="architecture.html" class="md-nav__link">Architecture</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="architecture.html#core-concepts" class="md-nav__link">Core Concepts</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="architecture.html#components" class="md-nav__link">Components</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="architecture.html#technical-process" class="md-nav__link">Technical Process</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="architecture.html#compatible-systems-for-netclient" class="md-nav__link">Compatible Systems for Netclient</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="architecture.html#limitations" class="md-nav__link">Limitations</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
     <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
     <label class="md-nav__link md-nav__link--active" for="__toc"> Getting Started </label>
     
@@ -218,42 +332,432 @@
   <ul class="md-nav__list" data-md-scrollfix="">
         <li class="md-nav__item"><a href="#getting-started--page-root" class="md-nav__link">Getting Started</a><nav class="md-nav">
               <ul class="md-nav__list">
-        <li class="md-nav__item"><a href="#use-cases" class="md-nav__link">Use Cases</a>
+        <li class="md-nav__item"><a href="#setup" class="md-nav__link">Setup</a><nav class="md-nav">
+              <ul class="md-nav__list">
+        <li class="md-nav__item"><a href="#create-key" class="md-nav__link">Create Key</a>
+        </li></ul>
+            </nav>
         </li>
-        <li class="md-nav__item"><a href="#compatible-systems" class="md-nav__link">Compatible Systems</a>
+        <li class="md-nav__item"><a href="#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
         </li>
-        <li class="md-nav__item"><a href="#quick-start" class="md-nav__link">Quick Start</a>
+        <li class="md-nav__item"><a href="#manage-nodes" class="md-nav__link">Manage Nodes</a>
+        </li>
+        <li class="md-nav__item"><a href="#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+        </li>
+        <li class="md-nav__item"><a href="#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
         </li></ul>
             </nav>
         </li>
-    
-<li class="md-nav__item"><a class="md-nav__extra_link" href="_sources/getting-started.rst.txt">Show Source</a> </li>
-
   </ul>
 </nav>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="#use-cases" class="md-nav__link">Use Cases</a>
+      <a href="#setup" class="md-nav__link">Setup</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#dns-mode-prereqisite-setup" class="md-nav__link">DNS Mode Prereqisite Setup</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#docker-compose-install" class="md-nav__link">Docker Compose Install</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#linux-install-without-docker" class="md-nav__link">Linux Install without Docker</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#kubernetes-install" class="md-nav__link">Kubernetes Install</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="client-installation.html" class="md-nav__link">Client Installation</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="client-installation.html#introduction-to-netclient" class="md-nav__link">Introduction to Netclient</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="client-installation.html#modes-and-system-compatibility" class="md-nav__link">Modes and System Compatibility</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="client-installation.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="client-installation.html#configuration" class="md-nav__link">Configuration</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="client-installation.html#installation" class="md-nav__link">Installation</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="client-installation.html#managing-netclient" class="md-nav__link">Managing Netclient</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html" class="md-nav__link">External Clients</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="usage.html" class="md-nav__link">Using Netmaker</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="usage.html#external-tutorials" class="md-nav__link">External Tutorials</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="usage.html#basic" class="md-nav__link">Basic</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="usage.html#local-network" class="md-nav__link">Local Network</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="usage.html#site-to-site" class="md-nav__link">Site-to-Site</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="usage.html#dual-stack-with-ipv6" class="md-nav__link">Dual Stack with IPv6</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="usage.html#kubernetes-node-network" class="md-nav__link">Kubernetes Node Network</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="api.html" class="md-nav__link">API Reference</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="api.html#api-usage" class="md-nav__link">API Usage</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="api.html#authentication" class="md-nav__link">Authentication</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="api.html#format-of-calls-for-curl" class="md-nav__link">Format of Calls for Curl</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="api.html#api-documentation" class="md-nav__link">API Documentation</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="troubleshoot.html" class="md-nav__link">Troubleshooting</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="troubleshoot.html#common-issues" class="md-nav__link">Common Issues</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="troubleshoot.html#server" class="md-nav__link">Server</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="troubleshoot.html#ui" class="md-nav__link">UI</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="troubleshoot.html#agent" class="md-nav__link">Agent</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="troubleshoot.html#coredns" class="md-nav__link">CoreDNS</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="support.html" class="md-nav__link">Support</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="support.html#faq" class="md-nav__link">FAQ</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="support.html#issues-bugs-and-feature-requests" class="md-nav__link">Issues, Bugs, and Feature Requests</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="support.html#contact" class="md-nav__link">Contact</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="contribute.html" class="md-nav__link">Contribute</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="contribute.html#submitting-an-issue" class="md-nav__link">Submitting an Issue</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="contribute.html#submitting-an-enhancement" class="md-nav__link">Submitting an Enhancement</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="contribute.html#contributing-code" class="md-nav__link">Contributing Code</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="conduct.html" class="md-nav__link">Code of Conduct</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="conduct.html#our-pledge" class="md-nav__link">Our Pledge</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="conduct.html#our-standards" class="md-nav__link">Our Standards</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="conduct.html#our-responsibilities" class="md-nav__link">Our Responsibilities</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="#compatible-systems" class="md-nav__link">Compatible Systems</a>
+      <a href="conduct.html#scope" class="md-nav__link">Scope</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="#quick-start" class="md-nav__link">Quick Start</a>
+      <a href="conduct.html#enforcement" class="md-nav__link">Enforcement</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="conduct.html#attribution" class="md-nav__link">Attribution</a>
       
     
     </li></ul>
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="license.html" class="md-nav__link">License</a>
+      
+    
     </li>
   </ul>
   
@@ -271,19 +775,22 @@
   <ul class="md-nav__list" data-md-scrollfix="">
         <li class="md-nav__item"><a href="#getting-started--page-root" class="md-nav__link">Getting Started</a><nav class="md-nav">
               <ul class="md-nav__list">
-        <li class="md-nav__item"><a href="#use-cases" class="md-nav__link">Use Cases</a>
+        <li class="md-nav__item"><a href="#setup" class="md-nav__link">Setup</a><nav class="md-nav">
+              <ul class="md-nav__list">
+        <li class="md-nav__item"><a href="#create-key" class="md-nav__link">Create Key</a>
+        </li></ul>
+            </nav>
+        </li>
+        <li class="md-nav__item"><a href="#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
         </li>
-        <li class="md-nav__item"><a href="#compatible-systems" class="md-nav__link">Compatible Systems</a>
+        <li class="md-nav__item"><a href="#manage-nodes" class="md-nav__link">Manage Nodes</a>
         </li>
-        <li class="md-nav__item"><a href="#quick-start" class="md-nav__link">Quick Start</a>
+        <li class="md-nav__item"><a href="#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+        </li>
+        <li class="md-nav__item"><a href="#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
         </li></ul>
             </nav>
         </li>
-    
-<li class="md-nav__item"><a class="md-nav__extra_link" href="_sources/getting-started.rst.txt">Show Source</a> </li>
-
-<li id="searchbox" class="md-nav__item"></li>
-
   </ul>
 </nav>
               </div>
@@ -295,162 +802,79 @@
             
   
 <h1 id="getting-started--page-root">Getting Started<a class="headerlink" href="#getting-started--page-root" title="Permalink to this headline">¶</a></h1>
-<p>Netmaker is a tool for creating and managing virtual overlay networks. If you have servers spread across multiple locations, data centers, or clouds, this platform can make life easier. Netmaker takes all those machines and puts them on a single, secure, flat network so that they can all talk to each other easily and securely. It’s like a VPC but of arbitrary computers.</p>
-<p>Netmaker can be compared to and covers use cases similar to Tailscale, ZeroTier, or Nebula, but Netmaker does more than that, while being faster, more dynamic and more flexible.</p>
-<p>Netmaker uses kernel WireGuard to create encrypted tunnels between every node in your virtual network. Netmaker’s <cite>netclient</cite> agent is self-updating and pulls any necessary changes (such as new peers) from the main server.</p>
+<p>Once you have Netmaker installed via the <a class="reference internal" href="quick-start.html"><span class="doc">Quick Install</span></a> guide, you can use this Getting Started guide to help create and manage your first network.</p>
 
-<h2 id="use-cases">Use Cases<a class="headerlink" href="#use-cases" title="Permalink to this headline">¶</a></h2>
-<blockquote>
-<div><ol class="arabic simple">
-<li><p>Create a flat, secure network between multiple/hybrid cloud environments</p></li>
-<li><p>Integrate central and edge services</p></li>
-<li><p>Secure a home or office network while providing remote connectivity</p></li>
+<h2 id="setup">Setup<a class="headerlink" href="#setup" title="Permalink to this headline">¶</a></h2>
+<ol class="arabic simple">
+<li><p>Create your admin user, with a username and password.</p></li>
+<li><p>Login with your new user</p></li>
+<li><p>Create your first network by clicking on Create Network</p></li>
 </ol>
-<p>4. Manage cryptocurrency proof-of-stake machines
-6. Provide an additional layer of security on an existing network
-7. Encrypt Kubernetes inter-node communications
-8. Secure site-to-site connections</p>
-</div></blockquote>
-
-
-<h2 id="compatible-systems">Compatible Systems<a class="headerlink" href="#compatible-systems" title="Permalink to this headline">¶</a></h2>
-<dl class="simple">
-<dt>To manage a server automatically, Netmaker requires <strong>systemd-based linux.</strong> Compatible systems include:</dt><dd><ul class="simple">
-<li><p>Fedora</p></li>
-<li><p>Ubuntu</p></li>
-<li><p>Debian</p></li>
-<li><p>Mint</p></li>
-<li><p>SUSE</p></li>
-<li><p>RHEL</p></li>
-<li><p>Raspian.</p></li>
-<li><p>Arch</p></li>
-<li><p>CentOS</p></li>
-<li><p>CoreOS</p></li>
-</ul>
-</dd>
-<dt>To manage DNS (optional), the server must have systemd-resolved. Systems that have this enabled include:</dt><dd><ul class="simple">
-<li><p>Arch</p></li>
-<li><p>Debian</p></li>
-<li><p>Ubuntu</p></li>
-<li><p>SUSE</p></li>
+<a class="reference internal image-reference" href="_images/create-net.png"><img alt="Create Network Screen" class="align-center" src="_images/create-net.png" style="width: 80%;"/></a>
+<p>This network should have a sensible name (nodes will use it to set their interfaces).</p>
+<p>More importantly, it should have a non-overlapping, private address range.</p>
+<p>If you are running a small (less than 254 machines) network, and are unsure of which CIDR’s to use, you could consider:</p>
+<ul class="simple">
+<li><p>10.11.12.0/24</p></li>
+<li><p>10.20.30.0/24</p></li>
+<li><p>100.99.98.0/24</p></li>
 </ul>
-</dd>
-</dl>
-<p>In future releases, we will support other platforms such as Windows, MacOS, iOS, Android, and more.</p>
-<p>Video Tutorials and Articles:</p>
+<p>Once your network is created, you should see that the netmaker server has added itself to the network. From here, you can move on to adding additional nodes to the network.</p>
+<a class="reference internal image-reference" href="_images/netmaker-node.png"><img alt="Node Screen" class="align-center" src="_images/netmaker-node.png" style="width: 80%;"/></a>
 
-
-<h2 id="quick-start">Quick Start<a class="headerlink" href="#quick-start" title="Permalink to this headline">¶</a></h2>
-<p>[Intro/Overview Video Tutorial](<a class="reference external" href="https://youtu.be/PWLPT320Ybo">https://youtu.be/PWLPT320Ybo</a>)
-[Site-to-Site Video Tutorial](<a class="reference external" href="https://youtu.be/krCKBJhwwDk">https://youtu.be/krCKBJhwwDk</a>)</p>
-<p>### Note about permissions
-The default installation requires special privileges on the server side, because Netmaker will control the local kernel Wireguard. This can be turned off and run in non-privileged mode if necessary (but disables some features). For more details, see the <strong>Usage</strong> docs.</p>
-<dl class="simple">
-<dt>### Prereqs</dt><dd><ol class="arabic simple">
-<li><p>A running linux server to host Netmaker, with an IP reachable by your computers (Debian-based preferred but not required).</p></li>
-<li><p>Linux installed on the above server (Debian-based preferred but not required).</p></li>
-<li><p>Install Docker and Docker Compose if running in Docker Mode (see below).</p></li>
-<li><dl class="simple">
-<dt>System dependencies installed:</dt><dd><ul class="simple">
-<li><p>Docker (if running in default Docker mode. DO NOT use snap install for docker.)</p></li>
-<li><p>Docker Compose</p></li>
-<li><p>Wireguard + Resolvectl (if running in default Client mode)</p></li>
-</ul>
-</dd>
-</dl>
-</li>
+<h3 id="create-key">Create Key<a class="headerlink" href="#create-key" title="Permalink to this headline">¶</a></h3>
+<p>Adding nodes to the network typically requires a key.</p>
+<ol class="arabic simple">
+<li><p>Click on the ACCESS KEYS tab and select the network you created.</p></li>
+<li><p>Click ADD NEW ACCESS KEY</p></li>
+<li><p>Give it a name (ex: “mykey”) and a number of uses (ex: 25)</p></li>
+<li><p>Click CREATE KEY (<strong>Important:</strong> Do not click out of the following screen until you have saved your key details. It will appear only once.)</p></li>
+<li><p>Copy the bottom command under “Your agent install command with access token” and save it somewhere locally. E.x: <code class="docutils literal notranslate"><span class="pre">curl</span> <span class="pre">-sfL</span> <span class="pre">https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh</span> <span class="pre">|</span> <span class="pre">KEY=vm3ow4thatogiwnsla3thsl3894ths</span> <span class="pre">sh</span> <span class="pre">-</span></code>.</p></li>
 </ol>
-</dd>
-</dl>
-<p>#### CoreDNS Preparation
-v0.3 introduces CoreDNS as a private nameserver. To run CoreDNS on your server host, you must disable systemd-resolved to open port 53:
-1. systemctl stop systemd-resolved
-2. systemctl disable systemd-resolved
-3. vim /etc/systemd/resolved.conf</p>
-<blockquote>
-<div><blockquote>
-<div><ul class="simple">
-<li><p>uncomment <strong>DNS=</strong> and add 8.8.8.8 or whatever is your preference</p></li>
-<li><p>uncomment <strong>DNSStubListener=</strong> and set to <strong>“no”</strong></p></li>
+<a class="reference internal image-reference" href="_images/access-key.png"><img alt="Access Key Screen" class="align-center" src="_images/access-key.png" style="width: 80%;"/></a>
+<p>You will use this command to install the netclient on your nodes. There are three different values for three different scenarios:</p>
+<ul class="simple">
+<li><p>The <strong>Access Key</strong> value is the secret string that will allow your node to authenticate with the Netmaker network. This can be used with existing netclient installations where additional configurations (such as setting the server IP manually) may be required. This is not typical. E.g. <code class="docutils literal notranslate"><span class="pre">netclient</span> <span class="pre">join</span> <span class="pre">-k</span> <span class="pre">&lt;access</span> <span class="pre">key&gt;</span> <span class="pre">-s</span> <span class="pre">grpc.myserver.com</span> <span class="pre">-p</span> <span class="pre">50051</span></code></p></li>
+<li><p>The <strong>Access Token</strong> value is a base64 encoded string that contains the server IP and grpc port, as well as the access key. This is decoded by the netclient and can be used with existing netclient installations like this: <code class="docutils literal notranslate"><span class="pre">netclient</span> <span class="pre">join</span> <span class="pre">-t</span> <span class="pre">&lt;access</span> <span class="pre">token&gt;</span></code>. You should use this method for adding a network to a node that is already on a network. For instance, Node A is in the <strong>mynet</strong> network and now you are adding it to <strong>default</strong>.</p></li>
+<li><p>The <strong>install command</strong> value is a curl command that can be run on Linux systems. It is a simple script that downloads the netclient binary and runs the install command all in one.</p></li>
 </ul>
-</div></blockquote>
-<ol class="arabic simple" start="4">
-<li><p>sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf</p></li>
+<p>Networks can also be enabled to allow nodes to sign up without keys at all. In this scenario, nodes enter a “pending state” and are not permitted to join the network until an admin approves them.</p>
+
+
+
+<h2 id="deploy-nodes">Deploy Nodes<a class="headerlink" href="#deploy-nodes" title="Permalink to this headline">¶</a></h2>
+<ol class="arabic simple" start="0">
+<li><p>Prereqisite: Every machine on which you install should have wireguard and systemd already installed.</p></li>
+<li><p>SSH to each machine</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">su</span> <span class="pre">-</span></code></p></li>
+<li><p><strong>Prerequisite Check:</strong> Every Linux machine on which you run the netclient must have WireGuard and systemd installed</p></li>
+<li><p>Run the install command, Ex: <code class="docutils literal notranslate"><span class="pre">curl</span> <span class="pre">-sfL</span> <span class="pre">https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh</span> <span class="pre">|</span> <span class="pre">KEY=vm3ow4thatogiwnsla3thsl3894ths</span> <span class="pre">sh</span> <span class="pre">-</span></code></p></li>
 </ol>
-</div></blockquote>
-<p>### Launch Netmaker
-Note, this installs Netmaker with CoreDNS and a Netclient (privileged).  If you want to run the server non-privileged or without CoreDNS, see the advanced usage docs.</p>
+<p>You should get output similar to the below. The netclient retrieves local settings, submits them to the server for processing, and retrieves updated settings. Then it sets the local network configuration. For more information about this process, see the <a class="reference internal" href="client-installation.html"><span class="doc">client installation</span></a> documentation. If this process failed and you do not see your node in the console (see below), then reference the <a class="reference internal" href="troubleshoot.html"><span class="doc">troubleshooting</span></a> documentation.</p>
+<a class="reference internal image-reference" href="_images/nc-install-output.png"><img alt="Output from Netclient Install" class="align-center" src="_images/nc-install-output.png" style="width: 80%;"/></a>
+<a class="reference internal image-reference" href="_images/nm-node-success.png"><img alt="Node Success" class="align-center" src="_images/nm-node-success.png" style="width: 80%;"/></a>
+<p>Repeat the above steps for every machine you would like to add to your network. You can re-use the same install command so long as you do not run out of uses on your access key (after which it will be invalidated and deleted).</p>
+<p>Once installed on all nodes, you can test the connection by pinging the private address of any node from any other node.</p>
+<a class="reference internal image-reference" href="_images/ping-node.png"><img alt="Node Success" class="align-center" src="_images/ping-node.png" style="width: 80%;"/></a>
+
+
+<h2 id="manage-nodes">Manage Nodes<a class="headerlink" href="#manage-nodes" title="Permalink to this headline">¶</a></h2>
+<p>Your machines should now be visible in the control pane.</p>
+<a class="reference internal image-reference" href="_images/nodes.png"><img alt="Node Success" class="align-center" src="_images/nodes.png" style="width: 80%;"/></a>
+<p>You can view/modify/delete any node by selecting it in the NODES tab. For instance, you can change the name to something more sensible like “workstation” or “api server”. You can also modify network settings here, such as keys or the WireGuard port. These settings will be picked up by the node on its next check in. For more information, see Advanced Configuration in the <a class="reference internal" href="usage.html"><span class="doc">Using Netmaker</span></a> docs.</p>
+<a class="reference internal image-reference" href="_images/node-details.png"><img alt="Node Success" class="align-center" src="_images/node-details.png" style="width: 80%;"/></a>
+<p>Nodes can be added/removed/modified on the network at any time. Nodes can also be added to multiple Netmaker networks. Any changes will get picked up by any nodes on a given network, and will take aboue ~30 seconds to take effect.</p>
+
+
+<h2 id="uninstalling-the-netclient">Uninstalling the netclient<a class="headerlink" href="#uninstalling-the-netclient" title="Permalink to this headline">¶</a></h2>
 <ol class="arabic simple">
-<li><p>Clone this repo or just copy contents of “docker-compose.yml” to your Netmaker server (from prereqs).</p></li>
-<li><p>In docker-compose.yml, change BACKEND_URL to the public IP of your server.</p></li>
-<li><p>Run <cite>sudo docker-compose up -d</cite></p></li>
-<li><p>Navigate to your server’s IP in the browser and you should see the Netmaker UI asking to create a new admin user.</p></li>
-<li><p>Create a new admin user</p></li>
-<li><p>You are now ready to begin using Netmaker.</p></li>
-</ol>
-<p>### Create a Network
-You can also just use the “default” network.
-1. Click “CREATE NETWORK” in the upper left of your console
-2. Enter a valid address range, e.g. 10.11.12.0/24
-3. Enter a name such as “homenet”
-4. Additional options:</p>
-<blockquote>
-<div><ul class="simple">
-<li><p><strong>Dual Stack</strong>: Machines will recieve a private IPv6 address in addition to their IPv4 address.</p></li>
-<li><p><strong>Local:</strong> Will use local address range for endpoints instead of public. Use Case: Home or Office network where most devices do not have public IP’s. In this case you can create a gateway into the network after creating the Local Network.</p></li>
-</ul>
-</div></blockquote>
-<p>After Network creation, you can edit the network in the NETWORK DETAILS pane, modifying the address range and default options. You can also toggle on <strong>Allow Node Signup Without Keys</strong>, which makes the next step unnecessary, but allows anyone to create a node in your network, which will be cordoned in pending state.</p>
-<p>### Create Keys
-1. Click the “ACCESS KEYS” tab
-2. Click “ADD NEW ACCESSS KEY”
-3. Give your key a name and number of uses
-4. Several values will be displayed. Save these somewhere, as they will only be displayed once:</p>
-<blockquote>
-<div><ul class="simple">
-<li><p><strong>Access Key:</strong> Use only in special edge cases where server connection string must be modified</p></li>
-<li><p><strong>Access Token:</strong> Use on machines that already have the netclient utility</p></li>
-<li><p><strong>Install Command:</strong> Use on machines that do not have the netclient utility</p></li>
-</ul>
-</div></blockquote>
-<p>### Install Agent:
-For machines <strong>without</strong> netclient, run the install command (from above): <cite>curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/v0.3/netclient-install.sh | KEY=&lt;your access key&gt; sh -</cite>
-For machines <strong>with</strong> netclient run the following (with access token from above): <cite>sudo netclient -c install -t &lt;access token&gt;</cite>
-For networks with <strong>manual signup</strong> enabled (see above), install using the network name: <cite>sudo netclient -c install -n &lt;network name&gt;</cite></p>
-<p>### Manage Nodes
-Your machines should now be visible in the control pane.
-<strong>Modify nodes:</strong> Click the pencil icon in the NODES pane to modify details like WireGuard port, address, and node name. You can also <strong>DELETE</strong> nodes here and they will lose network access.
-<strong>Approve nodes:</strong> If a node is in pending state (signed up without key), you can approve it. An icon will appear for pending nodes that need approval.</p>
-<p><strong>Gateway Mode:</strong> Click the Gateway icon to enable gateway mode on a given node. A popup will allow you to choose an existing network, or enter a custom address range.
-<em>Example: You create a network in netmaker called Homenet. It has several machines on your home server. You create another network called Cloudnet. It has several machines in AWS. You have one server (server X) which is added to both networks. On Cloudnet, you make Server X a gateway to Homenet. Now, the cloudnet machines have access to your homenet machines. via  Server X.</em></p>
-<p><em>On Homenet, you add Server Y, a machine in AWS, and make it a gateway to a custom address range 172.16.0.0/16. The machines on your home network now have access to any AWS machines in that address range via Server Y</em></p>
-<p>### Manage DNS
-On the DNS tab you can create custom DNS entries for a given network.</p>
-<blockquote>
-<div><ol class="arabic simple">
-<li><p>All dns entries will be <em>postfixed</em> with a private TLD of the network name, for example, “.mynet”</p></li>
-<li><p>Default DNS is created for node name + TLD, for instance, node-c42wt.mynet. This is not editable.</p></li>
-<li><dl class="simple">
-<dt>Click ADD ENTRY to add custom DNS</dt><dd><ul class="simple">
-<li><p>You can click CHOOSE NODE to direct DNS to a specific node in the network</p></li>
-<li><p>You can also specify any custom address you would like, which can be outside the network (for instance, the IP for google.com)</p></li>
-<li><p>Add a dns entry name, which will be postfixed with the network TLD. E.g. if you enter “privateapi.com”, it will become “privateapi.com.networkname”</p></li>
-</ul>
-</dd>
-</dl>
-</li>
+<li><p>To remove your nodes from the default network, run the following on each node: <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">netclient</span> <span class="pre">leave</span> <span class="pre">-n</span> <span class="pre">default</span></code></p></li>
+<li><p>To remove the netclient entirely from each node, run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">rm</span> <span class="pre">-rf</span> <span class="pre">/etc/netclient</span></code> (after running the first step)</p></li>
 </ol>
-</div></blockquote>
-<p>### Uninstalling Client
-To uninstall the client from a network: <cite>sudo netclient -c remove -n &lt; networkname &gt;</cite>
-To uninstall entirely, run the above for each network,  and then run <cite>sudo rm -rf /etc/netclient</cite></p>
-<p>### Uninstralling Netmaker
-To uninstall the netmaker server, simply run <cite>docker-compose down</cite></p>
-<p>#### LICENSE</p>
-<p>Netmaker’s source code and all artifacts in this repository are freely available. All versions are published under the Server Side Public License (SSPL), version 1, which can be found here: [LICENSE.txt](./LICENSE.txt).</p>
-<p>#### CONTACT</p>
-<p>Email: <a class="reference external" href="mailto:alex%40gravitl.com">alex<span>@</span>gravitl<span>.</span>com</a>
-Discord: <a class="reference external" href="https://discord.gg/zRb9Vfhk8A">https://discord.gg/zRb9Vfhk8A</a></p>
+
+
+<h2 id="uninstalling-netmaker">Uninstalling Netmaker<a class="headerlink" href="#uninstalling-netmaker" title="Permalink to this headline">¶</a></h2>
+<p>To uninstall Netmaker from the server, simply run <code class="docutils literal notranslate"><span class="pre">docker-compose</span> <span class="pre">down</span></code> or <code class="docutils literal notranslate"><span class="pre">docker-compose</span> <span class="pre">down</span> <span class="pre">--volumes</span></code> to remove the docker volumes for a future installation.</p>
 
 
 
@@ -464,7 +888,7 @@ Discord: <a class="reference external" href="https://discord.gg/zRb9Vfhk8A">http
     <div class="md-footer-nav">
       <nav class="md-footer-nav__inner md-grid">
           
-            <a href="index.html" title="Welcome to Netmaker’s documentation!"
+            <a href="quick-start.html" title="Quick Install"
                class="md-flex md-footer-nav__link md-footer-nav__link--prev"
                rel="prev">
               <div class="md-flex__cell md-flex__cell--shrink">
@@ -473,11 +897,22 @@ Discord: <a class="reference external" href="https://discord.gg/zRb9Vfhk8A">http
               <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
                 <span class="md-flex__ellipsis">
                   <span
-                      class="md-footer-nav__direction"> Previous </span> Welcome to Netmaker’s documentation! </span>
+                      class="md-footer-nav__direction"> Previous </span> Quick Install </span>
               </div>
             </a>
           
           
+            <a href="server-installation.html" title="Advanced Server Installation"
+               class="md-flex md-footer-nav__link md-footer-nav__link--next"
+               rel="next">
+            <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title"><span
+                class="md-flex__ellipsis"> <span
+                class="md-footer-nav__direction"> Next </span> Advanced Server Installation </span>
+            </div>
+            <div class="md-flex__cell md-flex__cell--shrink"><i
+                class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+            </div>
+          
         </a>
         
       </nav>

+ 62 - 80
docs/_build/html/index.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Welcome to the Netmaker Documentation &#8212; Netmaker 0.5 documentation</title>
+    <title>Welcome to the Netmaker Documentation &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -80,7 +80,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="#" title="Netmaker 0.5 documentation"
+        <a href="#" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -166,7 +166,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="#" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="#" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -178,13 +178,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="#" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="#" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="#"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -278,61 +278,82 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
     </li></ul>
@@ -341,26 +362,26 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
+      <a href="server-installation.html#server-configuration-reference" class="md-nav__link">Server Configuration Reference</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#dns-mode-prereqisite-setup" class="md-nav__link">DNS Mode Prereqisite Setup</a>
+      <a href="server-installation.html#dns-mode-setup" class="md-nav__link">DNS Mode Setup</a>
       
     
     </li>
@@ -388,7 +409,7 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
       
     
     </li></ul>
@@ -482,41 +503,6 @@
       <a href="usage.html#external-tutorials" class="md-nav__link">External Tutorials</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#basic" class="md-nav__link">Basic</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#local-network" class="md-nav__link">Local Network</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#site-to-site" class="md-nav__link">Site-to-Site</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#dual-stack-with-ipv6" class="md-nav__link">Dual Stack with IPv6</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#kubernetes-node-network" class="md-nav__link">Kubernetes Node Network</a>
-      
-    
     </li></ul>
     
     </li>
@@ -608,13 +594,6 @@
       <a href="support.html#faq" class="md-nav__link">FAQ</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="support.html#issues-bugs-and-feature-requests" class="md-nav__link">Issues, Bugs, and Feature Requests</a>
-      
-    
     </li>
     <li class="md-nav__item">
     
@@ -803,15 +782,24 @@
 <p>A quick start guide to getting up and running with Netmaker and WireGuard as quickly as possible.</p>
 <div class="toctree-wrapper compound">
 <ul>
-<li class="toctree-l1"><a class="reference internal" href="quick-start.html">Quick Start</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="quick-start.html#introduction">Introduction</a></li>
-<li class="toctree-l2"><a class="reference internal" href="quick-start.html#prerequisites">Prerequisites</a></li>
-<li class="toctree-l2"><a class="reference internal" href="quick-start.html#install">Install</a></li>
-<li class="toctree-l2"><a class="reference internal" href="quick-start.html#setup">Setup</a></li>
-<li class="toctree-l2"><a class="reference internal" href="quick-start.html#deploy-nodes">Deploy Nodes</a></li>
-<li class="toctree-l2"><a class="reference internal" href="quick-start.html#manage-nodes">Manage Nodes</a></li>
-<li class="toctree-l2"><a class="reference internal" href="quick-start.html#uninstalling-the-netclient">Uninstalling the netclient</a></li>
-<li class="toctree-l2"><a class="reference internal" href="quick-start.html#uninstalling-netmaker">Uninstalling Netmaker</a></li>
+<li class="toctree-l1"><a class="reference internal" href="quick-start.html">Quick Install</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="quick-start.html#introduction">0. Introduction</a></li>
+<li class="toctree-l2"><a class="reference internal" href="quick-start.html#prerequisites">1. Prerequisites</a></li>
+<li class="toctree-l2"><a class="reference internal" href="quick-start.html#install-dependencies">2. Install Dependencies</a></li>
+<li class="toctree-l2"><a class="reference internal" href="quick-start.html#prepare-vm">3. Prepare VM</a></li>
+<li class="toctree-l2"><a class="reference internal" href="quick-start.html#install-netmaker">4. Install Netmaker</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="getting-started.html">Getting Started</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="getting-started.html#setup">Setup</a></li>
+<li class="toctree-l2"><a class="reference internal" href="getting-started.html#deploy-nodes">Deploy Nodes</a></li>
+<li class="toctree-l2"><a class="reference internal" href="getting-started.html#manage-nodes">Manage Nodes</a></li>
+<li class="toctree-l2"><a class="reference internal" href="getting-started.html#uninstalling-the-netclient">Uninstalling the netclient</a></li>
+<li class="toctree-l2"><a class="reference internal" href="getting-started.html#uninstalling-netmaker">Uninstalling Netmaker</a></li>
 </ul>
 </li>
 </ul>
@@ -822,14 +810,14 @@
 <p>A detailed guide to installing the Netmaker server (API, DB, UI, DNS), and configuration options.</p>
 <div class="toctree-wrapper compound">
 <ul>
-<li class="toctree-l1"><a class="reference internal" href="server-installation.html">Server Installation</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="server-installation.html#notes-on-optional-features">Notes on Optional Features</a></li>
+<li class="toctree-l1"><a class="reference internal" href="server-installation.html">Advanced Server Installation</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="server-installation.html#system-compatibility">System Compatibility</a></li>
-<li class="toctree-l2"><a class="reference internal" href="server-installation.html#dns-mode-prereqisite-setup">DNS Mode Prereqisite Setup</a></li>
+<li class="toctree-l2"><a class="reference internal" href="server-installation.html#server-configuration-reference">Server Configuration Reference</a></li>
+<li class="toctree-l2"><a class="reference internal" href="server-installation.html#dns-mode-setup">DNS Mode Setup</a></li>
 <li class="toctree-l2"><a class="reference internal" href="server-installation.html#docker-compose-install">Docker Compose Install</a></li>
 <li class="toctree-l2"><a class="reference internal" href="server-installation.html#linux-install-without-docker">Linux Install without Docker</a></li>
 <li class="toctree-l2"><a class="reference internal" href="server-installation.html#kubernetes-install">Kubernetes Install</a></li>
-<li class="toctree-l2"><a class="reference internal" href="server-installation.html#configuration-reference">Configuration Reference</a></li>
+<li class="toctree-l2"><a class="reference internal" href="server-installation.html#nginx-reverse-proxy-setup-with-https">Nginx Reverse Proxy Setup with https</a></li>
 </ul>
 </li>
 </ul>
@@ -873,11 +861,6 @@
 <ul>
 <li class="toctree-l1"><a class="reference internal" href="usage.html">Using Netmaker</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="usage.html#external-tutorials">External Tutorials</a></li>
-<li class="toctree-l2"><a class="reference internal" href="usage.html#basic">Basic</a></li>
-<li class="toctree-l2"><a class="reference internal" href="usage.html#local-network">Local Network</a></li>
-<li class="toctree-l2"><a class="reference internal" href="usage.html#site-to-site">Site-to-Site</a></li>
-<li class="toctree-l2"><a class="reference internal" href="usage.html#dual-stack-with-ipv6">Dual Stack with IPv6</a></li>
-<li class="toctree-l2"><a class="reference internal" href="usage.html#kubernetes-node-network">Kubernetes Node Network</a></li>
 </ul>
 </li>
 </ul>
@@ -916,7 +899,6 @@
 <ul>
 <li class="toctree-l1"><a class="reference internal" href="support.html">Support</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="support.html#faq">FAQ</a></li>
-<li class="toctree-l2"><a class="reference internal" href="support.html#issues-bugs-and-feature-requests">Issues, Bugs, and Feature Requests</a></li>
 <li class="toctree-l2"><a class="reference internal" href="support.html#contact">Contact</a></li>
 </ul>
 </li>

+ 54 - 19
docs/_build/html/license.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>License &#8212; Netmaker 0.5 documentation</title>
+    <title>License &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -80,7 +80,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -166,7 +166,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -178,13 +178,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -278,81 +278,95 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstralling-netmaker" class="md-nav__link">Uninstralling Netmaker</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
-    </li></ul>
-    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
-      <ul class="md-nav__list"> 
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
       <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
@@ -391,6 +405,13 @@
       <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
+      
+    
     </li></ul>
     
     </li>
@@ -454,6 +475,20 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
     </li></ul>
     
     </li>

BIN
docs/_build/html/objects.inv


+ 230 - 122
docs/_build/html/quick-start.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Quick Start &#8212; Netmaker 0.5 documentation</title>
+    <title>Quick Install &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -56,7 +56,7 @@
     <link rel="author" title="About these documents" href="about.html" />
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" />
-    <link rel="next" title="Server Installation" href="server-installation.html" />
+    <link rel="next" title="Getting Started" href="getting-started.html" />
     <link rel="prev" title="Architecture" href="architecture.html" />
   
    
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -94,7 +94,7 @@
       <div class="md-flex__cell md-flex__cell--stretch">
         <div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
           <span class="md-header-nav__topic">Netmaker Docs</span>
-          <span class="md-header-nav__topic"> Quick Start </span>
+          <span class="md-header-nav__topic"> Quick Install </span>
         </div>
       </div>
       <div class="md-flex__cell md-flex__cell--shrink">
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -280,35 +280,47 @@
     
     
     <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
-    <label class="md-nav__link md-nav__link--active" for="__toc"> Quick Start </label>
+    <label class="md-nav__link md-nav__link--active" for="__toc"> Quick Install </label>
     
-      <a href="#" class="md-nav__link md-nav__link--active">Quick Start</a>
+      <a href="#" class="md-nav__link md-nav__link--active">Quick Install</a>
       
         
 <nav class="md-nav md-nav--secondary">
     <label class="md-nav__title" for="__toc">Contents</label>
   <ul class="md-nav__list" data-md-scrollfix="">
-        <li class="md-nav__item"><a href="#quick-start--page-root" class="md-nav__link">Quick Start</a><nav class="md-nav">
+        <li class="md-nav__item"><a href="#quick-start--page-root" class="md-nav__link">Quick Install</a><nav class="md-nav">
               <ul class="md-nav__list">
-        <li class="md-nav__item"><a href="#introduction" class="md-nav__link">Introduction</a>
+        <li class="md-nav__item"><a href="#introduction" class="md-nav__link">0. Introduction</a>
         </li>
-        <li class="md-nav__item"><a href="#prerequisites" class="md-nav__link">Prerequisites</a>
+        <li class="md-nav__item"><a href="#prerequisites" class="md-nav__link">1. Prerequisites</a>
         </li>
-        <li class="md-nav__item"><a href="#install" class="md-nav__link">Install</a>
-        </li>
-        <li class="md-nav__item"><a href="#setup" class="md-nav__link">Setup</a><nav class="md-nav">
+        <li class="md-nav__item"><a href="#install-dependencies" class="md-nav__link">2. Install Dependencies</a><nav class="md-nav">
               <ul class="md-nav__list">
-        <li class="md-nav__item"><a href="#create-key" class="md-nav__link">Create Key</a>
+        <li class="md-nav__item"><a href="#install-docker" class="md-nav__link">Install Docker</a>
+        </li>
+        <li class="md-nav__item"><a href="#id1" class="md-nav__link">Install Dependencies</a>
         </li></ul>
             </nav>
         </li>
-        <li class="md-nav__item"><a href="#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+        <li class="md-nav__item"><a href="#prepare-vm" class="md-nav__link">3. Prepare VM</a><nav class="md-nav">
+              <ul class="md-nav__list">
+        <li class="md-nav__item"><a href="#prepare-domain" class="md-nav__link">Prepare Domain</a>
         </li>
-        <li class="md-nav__item"><a href="#manage-nodes" class="md-nav__link">Manage Nodes</a>
+        <li class="md-nav__item"><a href="#prepare-firewall" class="md-nav__link">Prepare Firewall</a>
         </li>
-        <li class="md-nav__item"><a href="#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+        <li class="md-nav__item"><a href="#prepare-for-dns" class="md-nav__link">Prepare for DNS</a>
         </li>
-        <li class="md-nav__item"><a href="#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
+        <li class="md-nav__item"><a href="#prepare-nginx" class="md-nav__link">Prepare Nginx</a>
+        </li></ul>
+            </nav>
+        </li>
+        <li class="md-nav__item"><a href="#install-netmaker" class="md-nav__link">4. Install Netmaker</a><nav class="md-nav">
+              <ul class="md-nav__list">
+        <li class="md-nav__item"><a href="#prepare-templates" class="md-nav__link">Prepare Templates</a>
+        </li>
+        <li class="md-nav__item"><a href="#start-netmaker" class="md-nav__link">Start Netmaker</a>
+        </li></ul>
+            </nav>
         </li></ul>
             </nav>
         </li>
@@ -318,56 +330,77 @@
     <li class="md-nav__item">
     
     
-      <a href="#introduction" class="md-nav__link">Introduction</a>
+      <a href="#introduction" class="md-nav__link">0. Introduction</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="#install" class="md-nav__link">Install</a>
+      <a href="#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="#setup" class="md-nav__link">Setup</a>
+      <a href="#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
     </li></ul>
@@ -376,26 +409,26 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
+      <a href="server-installation.html#server-configuration-reference" class="md-nav__link">Server Configuration Reference</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#dns-mode-prereqisite-setup" class="md-nav__link">DNS Mode Prereqisite Setup</a>
+      <a href="server-installation.html#dns-mode-setup" class="md-nav__link">DNS Mode Setup</a>
       
     
     </li>
@@ -423,7 +456,7 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
       
     
     </li></ul>
@@ -489,6 +522,20 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
     </li></ul>
     
     </li>
@@ -744,27 +791,39 @@
 <nav class="md-nav md-nav--secondary">
     <label class="md-nav__title" for="__toc">Contents</label>
   <ul class="md-nav__list" data-md-scrollfix="">
-        <li class="md-nav__item"><a href="#quick-start--page-root" class="md-nav__link">Quick Start</a><nav class="md-nav">
+        <li class="md-nav__item"><a href="#quick-start--page-root" class="md-nav__link">Quick Install</a><nav class="md-nav">
               <ul class="md-nav__list">
-        <li class="md-nav__item"><a href="#introduction" class="md-nav__link">Introduction</a>
-        </li>
-        <li class="md-nav__item"><a href="#prerequisites" class="md-nav__link">Prerequisites</a>
+        <li class="md-nav__item"><a href="#introduction" class="md-nav__link">0. Introduction</a>
         </li>
-        <li class="md-nav__item"><a href="#install" class="md-nav__link">Install</a>
+        <li class="md-nav__item"><a href="#prerequisites" class="md-nav__link">1. Prerequisites</a>
         </li>
-        <li class="md-nav__item"><a href="#setup" class="md-nav__link">Setup</a><nav class="md-nav">
+        <li class="md-nav__item"><a href="#install-dependencies" class="md-nav__link">2. Install Dependencies</a><nav class="md-nav">
               <ul class="md-nav__list">
-        <li class="md-nav__item"><a href="#create-key" class="md-nav__link">Create Key</a>
+        <li class="md-nav__item"><a href="#install-docker" class="md-nav__link">Install Docker</a>
+        </li>
+        <li class="md-nav__item"><a href="#id1" class="md-nav__link">Install Dependencies</a>
         </li></ul>
             </nav>
         </li>
-        <li class="md-nav__item"><a href="#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+        <li class="md-nav__item"><a href="#prepare-vm" class="md-nav__link">3. Prepare VM</a><nav class="md-nav">
+              <ul class="md-nav__list">
+        <li class="md-nav__item"><a href="#prepare-domain" class="md-nav__link">Prepare Domain</a>
         </li>
-        <li class="md-nav__item"><a href="#manage-nodes" class="md-nav__link">Manage Nodes</a>
+        <li class="md-nav__item"><a href="#prepare-firewall" class="md-nav__link">Prepare Firewall</a>
         </li>
-        <li class="md-nav__item"><a href="#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+        <li class="md-nav__item"><a href="#prepare-for-dns" class="md-nav__link">Prepare for DNS</a>
         </li>
-        <li class="md-nav__item"><a href="#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
+        <li class="md-nav__item"><a href="#prepare-nginx" class="md-nav__link">Prepare Nginx</a>
+        </li></ul>
+            </nav>
+        </li>
+        <li class="md-nav__item"><a href="#install-netmaker" class="md-nav__link">4. Install Netmaker</a><nav class="md-nav">
+              <ul class="md-nav__list">
+        <li class="md-nav__item"><a href="#prepare-templates" class="md-nav__link">Prepare Templates</a>
+        </li>
+        <li class="md-nav__item"><a href="#start-netmaker" class="md-nav__link">Start Netmaker</a>
+        </li></ul>
+            </nav>
         </li></ul>
             </nav>
         </li>
@@ -778,104 +837,153 @@
           <article class="md-content__inner md-typeset" role="main">
             
   
-<h1 id="quick-start--page-root">Quick Start<a class="headerlink" href="#quick-start--page-root" title="Permalink to this headline">¶</a></h1>
+<h1 id="quick-start--page-root">Quick Install<a class="headerlink" href="#quick-start--page-root" title="Permalink to this headline">¶</a></h1>
+<p>This quick start guide is an <strong>opinionated</strong> guide for getting up and running with Netmaker as quickly as possible.</p>
 
-<h2 id="introduction">Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
-<p>This is a guide to getting up and running with Netmaker as quickly as possible.</p>
-<p>By default, Netmaker ships with DNS Mode, Client Mode, and Secure GRPC enabled. However, these features require special permissions and are not necessary for a simple setup, so we are going to deploy without them. To learn more about enabling these features, check out the <a class="reference internal" href="server-installation.html"><span class="doc">installation docs</span></a>.</p>
+<h2 id="introduction">0. Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
+<p>We assume for this installation that you want all of the Netmaker features enabled, want your server to be secure, and want it to be accessible from anywhere.</p>
+<p>This instance will not be HA. However, it should comfortably handle around one hundred concurrent clients and support most use cases.</p>
+<p>If you are deploying for an enterprise use case, please contact <a class="reference external" href="mailto:info%40gravitl.com">info<span>@</span>gravitl<span>.</span>com</a> for support.</p>
+<p>By the end of this guide, you will have Netmaker installed on a public VM linked to your custom domain, secured behind an Nginx reverse proxy.</p>
+<p>If this configuration does not fit your use case, see the <a class="reference internal" href="server-installation.html"><span class="doc">Advanced Installation</span></a> docs.</p>
 
 
-<h2 id="prerequisites">Prerequisites<a class="headerlink" href="#prerequisites" title="Permalink to this headline">¶</a></h2>
-<blockquote>
-<div><ol class="arabic simple">
-<li><p>A Linux server to host Netmaker, with an external IP reachable by your nodes (will be referred to as <strong>your-host</strong> in  document).</p></li>
-<li><p>Docker and Docker Compose installed on the above server. Follow the official <a class="reference external" href="https://docs.docker.com/engine/install/">Docker instructions</a> for installing Docker and Docker Compose on your system.</p></li>
-<li><p>All network nodes should be systemd-based (see Compatibility under <a class="reference internal" href="architecture.html"><span class="doc">Architecture</span></a> docs)</p></li>
-</ol>
-</div></blockquote>
+<h2 id="prerequisites">1. Prerequisites<a class="headerlink" href="#prerequisites" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li><p><strong>Virtual Machine</strong></p>
+<ul>
+<li><p>Preferably from a cloud provider (e.x: DigitalOcean, Linode, AWS, GCP, etc.)</p></li>
+<li><p>Public, static IP</p></li>
+<li><p>Min 2GB RAM, 1 CPU (4GB RAM, 2CPU preferred)</p></li>
+<li><p>5GB+ of storage</p></li>
+<li><p>Ubuntu  20.04 Installed</p></li>
+</ul>
+</li>
+<li><p><strong>Domain</strong></p>
+<ul>
+<li><p>A publicly owned domain (e.x. example.com, mysite.biz)</p></li>
+<li><p>Permission and access to modify DNS records via DNS service (e.x: Route53)</p></li>
+</ul>
+</li>
+</ul>
 
 
-<h2 id="install">Install<a class="headerlink" href="#install" title="Permalink to this headline">¶</a></h2>
-<ol class="arabic simple">
-<li><p><code class="docutils literal notranslate"><span class="pre">ssh</span> <span class="pre">root@your-host</span></code></p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">wget</span> <span class="pre">-O</span> <span class="pre">docker-compose.yml</span> <span class="pre">https://raw.githubusercontent.com/gravitl/netmaker/master/compose/docker-compose.slim.yml</span></code></p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">sed</span> <span class="pre">-i</span> <span class="pre">‘s/HOST_IP/&lt;</span> <span class="pre">Insert</span> <span class="pre">your-host</span> <span class="pre">IP</span> <span class="pre">Address</span> <span class="pre">Here</span> <span class="pre">&gt;/g’</span> <span class="pre">docker-compose.yml</span></code></p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">docker-compose</span> <span class="pre">up</span> <span class="pre">-d</span></code></p></li>
-</ol>
-<p>Navigate to the IP address of your host in the browser. You should see the below screen. If not, please see the Quick Start section of the <a class="reference internal" href="support.html"><span class="doc">troubleshooting</span></a> docs.</p>
-<a class="reference internal image-reference" href="_images/create-user.png"><img alt="Create User Screen" class="align-center" src="_images/create-user.png" style="width: 80%;"/></a>
+<h2 id="install-dependencies">2. Install Dependencies<a class="headerlink" href="#install-dependencies" title="Permalink to this headline">¶</a></h2>
+<p><code class="docutils literal notranslate"><span class="pre">ssh</span> <span class="pre">root@your-host</span></code></p>
 
+<h3 id="install-docker">Install Docker<a class="headerlink" href="#install-docker" title="Permalink to this headline">¶</a></h3>
+<p>Begin by installing the community version of Docker and docker-compose (there are issues with the snap version). You can follow the official <a class="reference external" href="https://docs.docker.com/engine/install/">Docker instructions here</a>. Or, you can use the below series of commands which should work on Ubuntu 20.04.</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">remove</span> <span class="n">docker</span> <span class="n">docker</span><span class="o">-</span><span class="n">engine</span> <span class="n">docker</span><span class="o">.</span><span class="n">io</span> <span class="n">containerd</span> <span class="n">runc</span>
+<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">update</span>
+<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">apt</span><span class="o">-</span><span class="n">transport</span><span class="o">-</span><span class="n">https</span> <span class="n">ca</span><span class="o">-</span><span class="n">certificates</span> <span class="n">curl</span> <span class="n">gnupg</span> <span class="n">lsb</span><span class="o">-</span><span class="n">release</span>
+<span class="n">curl</span> <span class="o">-</span><span class="n">fsSL</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">download</span><span class="o">.</span><span class="n">docker</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">linux</span><span class="o">/</span><span class="n">ubuntu</span><span class="o">/</span><span class="n">gpg</span> <span class="o">|</span> <span class="n">sudo</span> <span class="n">gpg</span> <span class="o">--</span><span class="n">dearmor</span> <span class="o">-</span><span class="n">o</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">share</span><span class="o">/</span><span class="n">keyrings</span><span class="o">/</span><span class="n">docker</span><span class="o">-</span><span class="n">archive</span><span class="o">-</span><span class="n">keyring</span><span class="o">.</span><span class="n">gpg</span>
+<span class="n">echo</span> <span class="s2">"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"</span> <span class="o">|</span> <span class="n">sudo</span> <span class="n">tee</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">apt</span><span class="o">/</span><span class="n">sources</span><span class="o">.</span><span class="n">list</span><span class="o">.</span><span class="n">d</span><span class="o">/</span><span class="n">docker</span><span class="o">.</span><span class="n">list</span> <span class="o">&gt;</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">null</span>
+<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">update</span>
+<span class="n">sudo</span> <span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">docker</span><span class="o">-</span><span class="n">ce</span> <span class="n">docker</span><span class="o">-</span><span class="n">ce</span><span class="o">-</span><span class="n">cli</span> <span class="n">containerd</span><span class="o">.</span><span class="n">io</span>
+<span class="n">sudo</span> <span class="n">curl</span> <span class="o">-</span><span class="n">L</span> <span class="s2">"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)"</span> <span class="o">-</span><span class="n">o</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">docker</span><span class="o">-</span><span class="n">compose</span>
+<span class="n">sudo</span> <span class="n">chmod</span> <span class="o">+</span><span class="n">x</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">docker</span><span class="o">-</span><span class="n">compose</span>
+<span class="n">docker</span> <span class="o">--</span><span class="n">version</span>
+<span class="n">docker</span><span class="o">-</span><span class="n">compose</span> <span class="o">--</span><span class="n">version</span>
+</pre></div>
+</div>
+<p>At this point Docker should be installed.</p>
 
-<h2 id="setup">Setup<a class="headerlink" href="#setup" title="Permalink to this headline">¶</a></h2>
-<ol class="arabic simple">
-<li><p>Create your admin user, with a username and password.</p></li>
-<li><p>Login with your new user</p></li>
-<li><p>Examine the <strong>default</strong> network. Click on DEFAULT under NETWORK DETAILS</p></li>
-</ol>
-<a class="reference internal image-reference" href="_images/default-net.png"><img alt="Create User Screen" class="align-center" src="_images/default-net.png" style="width: 80%;"/></a>
-<p>This displays information about the <strong>default</strong> network, which is created on server startup. You can delete this network if you do not need it, but for standard use cases this network should be enough to get started. Nodes will get an address from the network address range (ADDRESSRANGE). If the range conflicts with a pre-existing private network on your devices, you may want to change this, or make a new network instead. Nodes will also get default settings from here for unset configurations. For instance, the DEFAULTKEEPALIVE field will set the PersistenKeepAlive for nodes.</p>
-<p>To get started quickly, we can just use the existing default network.</p>
 
-<h3 id="create-key">Create Key<a class="headerlink" href="#create-key" title="Permalink to this headline">¶</a></h3>
-<ol class="arabic simple">
-<li><p>Click on the ACCESS KEYS tab and select the DEFAULT network.</p></li>
-<li><p>Click ADD NEW ACCESS KEY</p></li>
-<li><p>Give it a name (ex: “mykey”) and a number of uses (ex: 25)</p></li>
-<li><p>Click CREATE KEY (<strong>Important:</strong> Do not click out of the following screen until you have saved your key details. It will appear only once.)</p></li>
-<li><p>Copy the bottom command under “Your agent install command with access token” and save it somewhere locally. E.x: <code class="docutils literal notranslate"><span class="pre">curl</span> <span class="pre">-sfL</span> <span class="pre">https://raw.githubusercontent.com/gravitl/netmaker/v0.5/scripts/netclient-install.sh</span> <span class="pre">|</span> <span class="pre">KEY=vm3ow4thatogiwnsla3thsl3894ths</span> <span class="pre">sh</span> <span class="pre">-</span></code>. <strong>A change is required here. Change netclient-install.sh in this command to netclient-install.slim.sh, EX:</strong></p></li>
-</ol>
-<p><code class="docutils literal notranslate"><span class="pre">curl</span> <span class="pre">-sfL</span> <span class="pre">https://raw.githubusercontent.com/gravitl/netmaker/v0.5/scripts/netclient-install.slim.sh</span> <span class="pre">|</span> <span class="pre">KEY=vm3ow4thatogiwnsla3thsl3894ths</span> <span class="pre">sh</span> <span class="pre">-</span></code></p>
-<a class="reference internal image-reference" href="_images/access-key.png"><img alt="Access Key Screen" class="align-center" src="_images/access-key.png" style="width: 80%;"/></a>
-<p>You will use this command to install the netclient on your nodes. There are three different values for three different scenarios:</p>
-<ul class="simple">
-<li><p>The <strong>Access Key</strong> value is the secret string that will allow your node to authenticate with the Netmaker network. This can be used with existing netclient installations where additional configurations (such as setting the server IP manually) may be required. This is not typical. E.g. <code class="docutils literal notranslate"><span class="pre">netclient</span> <span class="pre">-c</span> <span class="pre">install</span> <span class="pre">-k</span> <span class="pre">&lt;access</span> <span class="pre">key&gt;</span> <span class="pre">-s</span> <span class="pre">1.2.3.4</span> <span class="pre">-p</span> <span class="pre">50052</span></code></p></li>
-<li><p>The <strong>Access Token</strong> value is a base64 encoded string that contains the server IP and grpc port, as well as the access key. This is decoded by the netclient and can be used with existing netclient installations like this: <code class="docutils literal notranslate"><span class="pre">netclient</span> <span class="pre">-c</span> <span class="pre">install</span> <span class="pre">-t</span> <span class="pre">&lt;access</span> <span class="pre">token&gt;</span></code>. You should use this method for adding a network to a node that is already on a network. For instance, Node A is in the <strong>mynet</strong> network and now you are adding it to <strong>default</strong>.</p></li>
-<li><p>The <strong>install command</strong> value is a curl command that can be run on Linux systems. It is a simple script that downloads the netclient binary and runs the install command all in one. However, this script is tailored for Secure GRPC Mode and contains an additional (unnecessary) command: <strong>netclient register -k keyvalue</strong>. This command will not work without secure GRPC enabled and will return a 500 error.</p></li>
-</ul>
-<p>Networks can also be enabled to allow nodes to sign up without keys at all. In this scenario, nodes enter a “pending state” and are not permitted to join the network until an admin approves them.</p>
+<h3 id="id1">Install Dependencies<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3>
+<p>In addition to Docker, this installation requires WireGuard, Nginx, and Certbot.</p>
+<p><code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">apt</span> <span class="pre">install</span> <span class="pre">wireguard</span> <span class="pre">wireguard-tools</span> <span class="pre">nginx</span> <span class="pre">certbot</span> <span class="pre">python3-certbot-nginx</span> <span class="pre">net-tools</span></code></p>
+
 
 
+<h2 id="prepare-vm">3. Prepare VM<a class="headerlink" href="#prepare-vm" title="Permalink to this headline">¶</a></h2>
 
-<h2 id="deploy-nodes">Deploy Nodes<a class="headerlink" href="#deploy-nodes" title="Permalink to this headline">¶</a></h2>
+<h3 id="prepare-domain">Prepare Domain<a class="headerlink" href="#prepare-domain" title="Permalink to this headline">¶</a></h3>
 <ol class="arabic simple">
-<li><p>SSH to each machine</p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">su</span> <span class="pre">-</span></code></p></li>
-<li><p><strong>Prerequisite Check:</strong> Every Linux machine on which you run the netclient must have WireGuard and systemd installed</p></li>
+<li><p>Choose a base domain or subdomain for Netmaker. If you own <strong>example.com</strong>, this should be something like <strong>netmaker.example.com</strong></p></li>
+</ol>
+<ul class="simple">
+<li><p>You must point your wildcard domain to the public IP of your VM, e.x: <a href="#id2"><span class="problematic" id="id3">*</span></a>.example.com –&gt; &lt;your public ip&gt;</p></li>
+</ul>
+<ol class="arabic simple" start="2">
+<li><p>Add an A record pointing to your VM using your DNS service provider for <a href="#id4"><span class="problematic" id="id5">*</span></a>.netmaker.example.com (inserting your own subdomain of course).</p></li>
+<li><p>Netmaker will create three subdomains on top of this. For the example above those subdomains would be:</p></li>
 </ol>
-<blockquote>
-<div><ul class="simple">
-<li><p><code class="docutils literal notranslate"><span class="pre">which</span> <span class="pre">wg</span></code> (should show wg binary present)</p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">pidof</span> <span class="pre">systemd</span> <span class="pre">&amp;&amp;</span> <span class="pre">echo</span> <span class="pre">"systemd</span> <span class="pre">found"</span> <span class="pre">||</span> <span class="pre">echo</span> <span class="pre">"systemd</span> <span class="pre">not</span> <span class="pre">found"</span></code></p></li>
+<ul class="simple">
+<li><p>dashboard.netmaker.example.com</p></li>
+<li><p>api.netmaker.example.com</p></li>
+<li><p>grpc.netmaker.example.com</p></li>
 </ul>
-</div></blockquote>
+<p>Moving forward we will refer to your base domain using <strong>&lt;your base domain&gt;</strong>. Replace these references with your domain (e.g. netmaker.example.com).</p>
 <ol class="arabic simple" start="4">
-<li><p>Run the install command, Ex: <code class="docutils literal notranslate"><span class="pre">curl</span> <span class="pre">-sfL</span> <span class="pre">https://raw.githubusercontent.com/gravitl/netmaker/v0.5/scripts/netclient-install.slim.sh</span> <span class="pre">|</span> <span class="pre">KEY=vm3ow4thatogiwnsla3thsl3894ths</span> <span class="pre">sh</span> <span class="pre">-</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">nslookup</span> <span class="pre">host.&lt;your</span> <span class="pre">base</span> <span class="pre">domain&gt;</span></code> (inserting your domain) should now return the IP of your VM.</p></li>
+<li><p>Generate SSL Certificates using certbot:</p></li>
 </ol>
-<p>You should get output similar to the below. The netclient retrieves local settings, submits them to the server for processing, and retrieves updated settings. Then it sets the local network configuration. For more information about this process, see the <a class="reference internal" href="client-installation.html"><span class="doc">client installation</span></a> documentation. If this process failed and you do not see your node in the console (see below), then reference the <a class="reference internal" href="troubleshoot.html"><span class="doc">troubleshooting</span></a> documentation.</p>
-<a class="reference internal image-reference" href="_images/nc-install-output.png"><img alt="Output from Netclient Install" class="align-center" src="_images/nc-install-output.png" style="width: 80%;"/></a>
-<a class="reference internal image-reference" href="_images/nm-node-success.png"><img alt="Node Success" class="align-center" src="_images/nm-node-success.png" style="width: 80%;"/></a>
-<p>Repeat the above steps for every machine you would like to add to your network. You can re-use the same install command so long as you do not run out of uses on your access key (after which it will be invalidated and deleted).</p>
-<p>Once installed on all nodes, you can test the connection by pinging the private address of any node from any other node.</p>
-<a class="reference internal image-reference" href="_images/ping-node.png"><img alt="Node Success" class="align-center" src="_images/ping-node.png" style="width: 80%;"/></a>
+<p><code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">certbot</span> <span class="pre">certonly</span> <span class="pre">--manual</span> <span class="pre">--preferred-challenges=dns</span> <span class="pre">--email</span> <span class="pre">[email protected]</span> <span class="pre">--server</span> <span class="pre">https://acme-v02.api.letsencrypt.org/directory</span> <span class="pre">--agree-tos</span> <span class="pre">--manual-public-ip-logging-ok</span> <span class="pre">-d</span> <span class="pre">"*.&lt;your</span> <span class="pre">base</span> <span class="pre">domain&gt;"</span></code></p>
+<p>The above command (using your domain instead of &lt;your base domain&gt;), will prompt you to enter a TXT record in your DNS service provider. Do this, and <strong>wait one  minute</strong> before clicking enter, or it may fail and you will have to run the command again.</p>
 
 
-<h2 id="manage-nodes">Manage Nodes<a class="headerlink" href="#manage-nodes" title="Permalink to this headline">¶</a></h2>
-<p>Your machines should now be visible in the control pane.</p>
-<a class="reference internal image-reference" href="_images/nodes.png"><img alt="Node Success" class="align-center" src="_images/nodes.png" style="width: 80%;"/></a>
-<p>You can view/modify/delete any node by selecting it in the NODES tab. For instance, you can change the name to something more sensible like “workstation” or “api server”. You can also modify network settings here, such as keys or the WireGuard port. These settings will be picked up by the node on its next check in. For more information, see Advanced Configuration in the <a class="reference internal" href="usage.html"><span class="doc">Using Netmaker</span></a> docs.</p>
-<a class="reference internal image-reference" href="_images/node-details.png"><img alt="Node Success" class="align-center" src="_images/node-details.png" style="width: 80%;"/></a>
-<p>Nodes can be added/removed/modified on the network at any time. Nodes can also be added to multiple Netmaker networks. Any changes will get picked up by any nodes on a given network, and will take aboue ~30 seconds to take effect.</p>
+<h3 id="prepare-firewall">Prepare Firewall<a class="headerlink" href="#prepare-firewall" title="Permalink to this headline">¶</a></h3>
+<p>Make sure firewall settings are appropriate for Netmaker. You need ports 53 and 443. On the server you can run:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">ufw</span> <span class="n">allow</span> <span class="n">proto</span> <span class="n">tcp</span> <span class="kn">from</span> <span class="nn">any</span> <span class="n">to</span> <span class="nb">any</span> <span class="n">port</span> <span class="mi">443</span> <span class="o">&amp;&amp;</span> <span class="n">sudo</span> <span class="n">ufw</span> <span class="n">allow</span> <span class="n">dns</span>
+</pre></div>
+</div>
+<dl class="simple">
+<dt><strong>Based on your cloud provider, you may also need to set inbound security rules for your server. This will be dependent on your cloud provider. Be sure to check before moving on:</strong></dt><dd><ul class="simple">
+<li><p>allow 443/tcp from all</p></li>
+<li><p>allow 53/udp from all</p></li>
+</ul>
+</dd>
+</dl>
 
 
-<h2 id="uninstalling-the-netclient">Uninstalling the netclient<a class="headerlink" href="#uninstalling-the-netclient" title="Permalink to this headline">¶</a></h2>
-<ol class="arabic simple">
-<li><p>To remove your nodes from the default network, run the following on each node: <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">netclient</span> <span class="pre">leave</span> <span class="pre">-n</span> <span class="pre">default</span></code></p></li>
-<li><p>To remove the netclient entirely from each node, run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">rm</span> <span class="pre">-rf</span> <span class="pre">/etc/netclient</span></code> (after running the first step)</p></li>
-</ol>
+<h3 id="prepare-for-dns">Prepare for DNS<a class="headerlink" href="#prepare-for-dns" title="Permalink to this headline">¶</a></h3>
+<p>On Ubuntu 20.04, by default there is a service consuming port 53 related to DNS resolution. We need port 53 open in order to run our own DNS server. The below steps will disable systemd-resolved, and insert a generic DNS nameserver for local resolution.</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">systemctl</span> <span class="n">stop</span> <span class="n">systemd</span><span class="o">-</span><span class="n">resolved</span>
+<span class="n">systemctl</span> <span class="n">disable</span> <span class="n">systemd</span><span class="o">-</span><span class="n">resolved</span>
+<span class="n">vim</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">systemd</span><span class="o">/</span><span class="n">resolved</span><span class="o">.</span><span class="n">conf</span>
+  <span class="o">*</span>  <span class="n">uncomment</span> <span class="n">DNS</span> <span class="ow">and</span> <span class="n">add</span> <span class="mf">8.8.8.8</span> <span class="ow">or</span> <span class="n">whatever</span> <span class="n">reachable</span> <span class="n">nameserver</span> <span class="ow">is</span> <span class="n">your</span> <span class="n">preference</span>  <span class="o">*</span>
+  <span class="o">*</span>  <span class="n">uncomment</span> <span class="n">DNSStubListener</span> <span class="ow">and</span> <span class="nb">set</span> <span class="n">to</span> <span class="s2">"no"</span>  <span class="o">*</span>
+<span class="n">ln</span> <span class="o">-</span><span class="n">sf</span> <span class="o">/</span><span class="n">run</span><span class="o">/</span><span class="n">systemd</span><span class="o">/</span><span class="n">resolve</span><span class="o">/</span><span class="n">resolv</span><span class="o">.</span><span class="n">conf</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">resolv</span><span class="o">.</span><span class="n">conf</span>
+</pre></div>
+</div>
+
+
+<h3 id="prepare-nginx">Prepare Nginx<a class="headerlink" href="#prepare-nginx" title="Permalink to this headline">¶</a></h3>
+<p>Nginx will serve the SSL certificate with your chosen domain and forward traffic to netmaker.</p>
+<p>Get the nginx configuration file:</p>
+<p><code class="docutils literal notranslate"><span class="pre">wget</span> <span class="pre">https://raw.githubusercontent.com/gravitl/netmaker/develop/nginx/netmaker-nginx-template.conf</span></code></p>
+<p>Insert your domain in the configuration file and add to nginx:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sed</span> <span class="o">-</span><span class="n">i</span> <span class="s1">'s/NETMAKER_BASE_DOMAIN/&lt;your base domain&gt;/g'</span> <span class="n">netmaker</span><span class="o">-</span><span class="n">nginx</span><span class="o">-</span><span class="n">template</span><span class="o">.</span><span class="n">conf</span>
+<span class="n">sudo</span> <span class="n">cp</span> <span class="n">netmaker</span><span class="o">-</span><span class="n">nginx</span><span class="o">-</span><span class="n">template</span><span class="o">.</span><span class="n">conf</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">nginx</span><span class="o">/</span><span class="n">conf</span><span class="o">.</span><span class="n">d</span><span class="o">/&lt;</span><span class="n">your</span> <span class="n">base</span> <span class="n">domain</span><span class="o">&gt;.</span><span class="n">conf</span>
+<span class="n">nginx</span> <span class="o">-</span><span class="n">t</span> <span class="o">&amp;&amp;</span> <span class="n">nginx</span> <span class="o">-</span><span class="n">s</span> <span class="n">reload</span>
+<span class="n">systemctl</span> <span class="n">restart</span> <span class="n">nginx</span>
+</pre></div>
+</div>
+
+
+
+<h2 id="install-netmaker">4. Install Netmaker<a class="headerlink" href="#install-netmaker" title="Permalink to this headline">¶</a></h2>
+
+<h3 id="prepare-templates">Prepare Templates<a class="headerlink" href="#prepare-templates" title="Permalink to this headline">¶</a></h3>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">wget</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">raw</span><span class="o">.</span><span class="n">githubusercontent</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">gravitl</span><span class="o">/</span><span class="n">netmaker</span><span class="o">/</span><span class="n">develop</span><span class="o">/</span><span class="n">compose</span><span class="o">/</span><span class="n">docker</span><span class="o">-</span><span class="n">compose</span><span class="o">.</span><span class="n">quickstart</span><span class="o">.</span><span class="n">yml</span>
+<span class="n">sed</span> <span class="o">-</span><span class="n">i</span> <span class="s1">'s/NETMAKER_BASE_DOMAIN/&lt;your base domain&gt;/g'</span> <span class="n">docker</span><span class="o">-</span><span class="n">compose</span><span class="o">.</span><span class="n">quickstart</span><span class="o">.</span><span class="n">yml</span>
+<span class="n">sed</span> <span class="o">-</span><span class="n">i</span> <span class="s1">'s/SERVER_PUBLIC_IP/&lt;your server ip&gt;/g'</span> <span class="n">docker</span><span class="o">-</span><span class="n">compose</span><span class="o">.</span><span class="n">quickstart</span><span class="o">.</span><span class="n">yml</span>
+</pre></div>
+</div>
+<p>Generate a unique master key and insert it:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">tr</span> <span class="o">-</span><span class="n">dc</span> <span class="n">A</span><span class="o">-</span><span class="n">Za</span><span class="o">-</span><span class="n">z0</span><span class="o">-</span><span class="mi">9</span> <span class="o">&lt;/</span><span class="n">dev</span><span class="o">/</span><span class="n">urandom</span> <span class="o">|</span> <span class="n">head</span> <span class="o">-</span><span class="n">c</span> <span class="mi">30</span> <span class="p">;</span> <span class="n">echo</span> <span class="s1">''</span>
+<span class="n">sed</span> <span class="o">-</span><span class="n">i</span> <span class="s1">'s/REPLACE_MASTER_KEY/&lt;your generated key&gt;/g'</span> <span class="n">docker</span><span class="o">-</span><span class="n">compose</span><span class="o">.</span><span class="n">quickstart</span><span class="o">.</span><span class="n">yml</span>
+</pre></div>
+</div>
+
 
+<h3 id="start-netmaker">Start Netmaker<a class="headerlink" href="#start-netmaker" title="Permalink to this headline">¶</a></h3>
+<p><code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">docker-compose</span> <span class="pre">-f</span> <span class="pre">docker-compose.quickstart.yml</span> <span class="pre">up</span> <span class="pre">-d</span></code></p>
+<p>navigate to dashboard.&lt;your base domain&gt; to see your nginx instance.</p>
+<p>To troubleshoot issues, start with:</p>
+<p><code class="docutils literal notranslate"><span class="pre">docker</span> <span class="pre">logs</span> <span class="pre">netmaker</span></code></p>
+<p>Or check out the <a class="reference internal" href="troubleshoot.html"><span class="doc">troubleshoooting docs</span></a>.</p>
 
-<h2 id="uninstalling-netmaker">Uninstalling Netmaker<a class="headerlink" href="#uninstalling-netmaker" title="Permalink to this headline">¶</a></h2>
-<p>To uninstall Netmaker from the server, simply run <code class="docutils literal notranslate"><span class="pre">docker-compose</span> <span class="pre">down</span></code> or <code class="docutils literal notranslate"><span class="pre">docker-compose</span> <span class="pre">down</span> <span class="pre">--volumes</span></code> to remove the docker volumes for a future installation.</p>
 
 
 
@@ -903,12 +1011,12 @@
             </a>
           
           
-            <a href="server-installation.html" title="Server Installation"
+            <a href="getting-started.html" title="Getting Started"
                class="md-flex md-footer-nav__link md-footer-nav__link--next"
                rel="next">
             <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title"><span
                 class="md-flex__ellipsis"> <span
-                class="md-footer-nav__direction"> Next </span> Server Installation </span>
+                class="md-footer-nav__direction"> Next </span> Getting Started </span>
             </div>
             <div class="md-flex__cell md-flex__cell--shrink"><i
                 class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>

+ 40 - 61
docs/_build/html/search.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Search &#8212; Netmaker 0.5 documentation</title>
+    <title>Search &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     
@@ -85,7 +85,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -171,7 +171,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -183,13 +183,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -283,61 +283,82 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
     </li></ul>
@@ -346,26 +367,26 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
+      <a href="server-installation.html#server-configuration-reference" class="md-nav__link">Server Configuration Reference</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#dns-mode-prereqisite-setup" class="md-nav__link">DNS Mode Prereqisite Setup</a>
+      <a href="server-installation.html#dns-mode-setup" class="md-nav__link">DNS Mode Setup</a>
       
     
     </li>
@@ -393,7 +414,7 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
       
     
     </li></ul>
@@ -487,41 +508,6 @@
       <a href="usage.html#external-tutorials" class="md-nav__link">External Tutorials</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#basic" class="md-nav__link">Basic</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#local-network" class="md-nav__link">Local Network</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#site-to-site" class="md-nav__link">Site-to-Site</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#dual-stack-with-ipv6" class="md-nav__link">Dual Stack with IPv6</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="usage.html#kubernetes-node-network" class="md-nav__link">Kubernetes Node Network</a>
-      
-    
     </li></ul>
     
     </li>
@@ -613,13 +599,6 @@
       <a href="support.html#faq" class="md-nav__link">FAQ</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="support.html#issues-bugs-and-feature-requests" class="md-nav__link">Issues, Bugs, and Feature Requests</a>
-      
-    
     </li>
     <li class="md-nav__item">
     

File diff suppressed because it is too large
+ 0 - 0
docs/_build/html/searchindex.js


File diff suppressed because it is too large
+ 321 - 375
docs/_build/html/server-installation.html


+ 60 - 66
docs/_build/html/support.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Support &#8212; Netmaker 0.5 documentation</title>
+    <title>Support &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -279,61 +279,82 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstralling-netmaker" class="md-nav__link">Uninstralling Netmaker</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
     </li></ul>
@@ -342,26 +363,26 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
+      <a href="server-installation.html#server-configuration-reference" class="md-nav__link">Server Configuration Reference</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#dns-mode-prereqisite-setup" class="md-nav__link">DNS Mode Prereqisite Setup</a>
+      <a href="server-installation.html#dns-mode-setup" class="md-nav__link">DNS Mode Setup</a>
       
     
     </li>
@@ -389,7 +410,7 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
       
     
     </li></ul>
@@ -455,6 +476,20 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
     </li></ul>
     
     </li>
@@ -604,24 +639,14 @@
         </li>
         <li class="md-nav__item"><a href="#how-do-i-install-the-netclient-on-x" class="md-nav__link">How do I install the Netclient on X?</a>
         </li>
-        <li class="md-nav__item"><a href="#why-mongodb-sql-is-better-and-smaller" class="md-nav__link">Why MongoDB? SQL is better and smaller.</a>
-        </li>
         <li class="md-nav__item"><a href="#is-netmaker-a-vpn-like-nordnpn" class="md-nav__link">Is Netmaker a VPN like NordNPN?</a>
         </li>
-        <li class="md-nav__item"><a href="#do-you-offer-any-paid-support" class="md-nav__link">Do you offer any paid support?</a>
+        <li class="md-nav__item"><a href="#do-you-offer-any-enterprise-support" class="md-nav__link">Do you offer any enterprise support?</a>
         </li>
         <li class="md-nav__item"><a href="#why-the-sspl-license" class="md-nav__link">Why the SSPL License?</a>
         </li></ul>
             </nav>
         </li>
-        <li class="md-nav__item"><a href="#issues-bugs-and-feature-requests" class="md-nav__link">Issues, Bugs, and Feature Requests</a><nav class="md-nav">
-              <ul class="md-nav__list">
-        <li class="md-nav__item"><a href="#issues-bugs" class="md-nav__link">Issues / Bugs</a>
-        </li>
-        <li class="md-nav__item"><a href="#feature-requests" class="md-nav__link">Feature Requests</a>
-        </li></ul>
-            </nav>
-        </li>
         <li class="md-nav__item"><a href="#contact" class="md-nav__link">Contact</a>
         </li></ul>
             </nav>
@@ -635,13 +660,6 @@
       <a href="#faq" class="md-nav__link">FAQ</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="#issues-bugs-and-feature-requests" class="md-nav__link">Issues, Bugs, and Feature Requests</a>
-      
-    
     </li>
     <li class="md-nav__item">
     
@@ -758,24 +776,14 @@
         </li>
         <li class="md-nav__item"><a href="#how-do-i-install-the-netclient-on-x" class="md-nav__link">How do I install the Netclient on X?</a>
         </li>
-        <li class="md-nav__item"><a href="#why-mongodb-sql-is-better-and-smaller" class="md-nav__link">Why MongoDB? SQL is better and smaller.</a>
-        </li>
         <li class="md-nav__item"><a href="#is-netmaker-a-vpn-like-nordnpn" class="md-nav__link">Is Netmaker a VPN like NordNPN?</a>
         </li>
-        <li class="md-nav__item"><a href="#do-you-offer-any-paid-support" class="md-nav__link">Do you offer any paid support?</a>
+        <li class="md-nav__item"><a href="#do-you-offer-any-enterprise-support" class="md-nav__link">Do you offer any enterprise support?</a>
         </li>
         <li class="md-nav__item"><a href="#why-the-sspl-license" class="md-nav__link">Why the SSPL License?</a>
         </li></ul>
             </nav>
         </li>
-        <li class="md-nav__item"><a href="#issues-bugs-and-feature-requests" class="md-nav__link">Issues, Bugs, and Feature Requests</a><nav class="md-nav">
-              <ul class="md-nav__list">
-        <li class="md-nav__item"><a href="#issues-bugs" class="md-nav__link">Issues / Bugs</a>
-        </li>
-        <li class="md-nav__item"><a href="#feature-requests" class="md-nav__link">Feature Requests</a>
-        </li></ul>
-            </nav>
-        </li>
         <li class="md-nav__item"><a href="#contact" class="md-nav__link">Contact</a>
         </li></ul>
             </nav>
@@ -796,19 +804,14 @@
 
 <h3 id="does-will-netmaker-support-x-operating-system">Does/Will Netmaker Support X Operating System?<a class="headerlink" href="#does-will-netmaker-support-x-operating-system" title="Permalink to this headline">¶</a></h3>
 <p>Netmaker is initially available on a limited number of operating systems for good reason: Every operating system is designed differently. With a small team, we can either focus on making Netmaker do a lot on a few number of operating systems, or a little on a bunch of operating systems. We chose the first option. You can view the System Compatibility docs for more info, but in general, you should only be using Netmaker on systemd linux right now.</p>
-<p>However, as of v0.4, we will technically be able to bring any operating system into the network. This is a bit of a hack. v0.4 introduces Ingress Gateways. Think of it this way. You set up a private network. You want devices to access it. You set up a single node as an “Ingress Gateway” and generate config files for “external clients.” These clients are unmanaged and unmeshed, meaning they can access the network but only via the gateway. It also means they will not automatically account for changes to the network, and the user will have to update the configs manually.</p>
-<p>This lets us immediately “support” any device which can run WireGuard, which includes most operating systems at this point including phones and Windows.</p>
-<p>As we stabilize the design and feature set of Netmaker, we will expand the operating system support for Netclient which configures dynamic, fully-meshed devices. Expect to see updates about new OS support every few weeks, until eventually the Ingress Gateway becomes unnecessary (though you will still want it for certain use cases).</p>
+<p>However, via “external clients”, any device that supports WireGuard can be added to the network.</p>
+<p>In future iterations will expand the operating system support for Netclient, and devices that must use the “external client” feature can switch to Netclient.</p>
 
 
 <h3 id="how-do-i-install-the-netclient-on-x">How do I install the Netclient on X?<a class="headerlink" href="#how-do-i-install-the-netclient-on-x" title="Permalink to this headline">¶</a></h3>
 <p>As per the above, there are many unsupported operating systems. You are still welcome to try, it is just an executable binary file after all. If the system is unix-based and has kernel WireGuard installed, netclient may very well mesh the device into the network. However, the service likely will encounter problems retrieving updates.</p>
 
 
-<h3 id="why-mongodb-sql-is-better-and-smaller">Why MongoDB? SQL is better and smaller.<a class="headerlink" href="#why-mongodb-sql-is-better-and-smaller" title="Permalink to this headline">¶</a></h3>
-<p>We are in a phase of rapid iteration. Every week the database schema changes. MongoDB makes our development process much more flexible. That said, we agree! SQL will be better for production, and indeed, we plan to switch over to SQL before v1.0, so please be patient with the resource consumption of MongoDB for the time being; it is helping to support a rapid pace of development.</p>
-
-
 <h3 id="is-netmaker-a-vpn-like-nordnpn">Is Netmaker a VPN like NordNPN?<a class="headerlink" href="#is-netmaker-a-vpn-like-nordnpn" title="Permalink to this headline">¶</a></h3>
 <p>No. Netmaker makes Virtual Networks, which are technically VPNs, but different. It’s more like a corporate VPN, or a VPC (if you’re familiar with AWS).</p>
 <p>If you’re looking to achieve self-hosted web browsing, with functionality similar to NordVPN, ExpressVPN, Surfshark, Tunnelbear, or Private Internet Access, this is probably not the project for you. Technically, you can accomplish this with Netmaker, but it would be a little like using a all-terrain vehicle for stock car racing.</p>
@@ -819,8 +822,8 @@
 <a class="reference external" href="https://github.com/mullvad/mullvadvpn-app">https://github.com/mullvad/mullvadvpn-app</a></p>
 
 
-<h3 id="do-you-offer-any-paid-support">Do you offer any paid support?<a class="headerlink" href="#do-you-offer-any-paid-support" title="Permalink to this headline">¶</a></h3>
-<p>Not at this time, but eventually we will. If you are interested, or if you are interested in sponsoring the project generally, please contact Alex Feiszli (<a class="reference external" href="mailto:alex%40gravitl.com">alex<span>@</span>gravitl<span>.</span>com</a>).</p>
+<h3 id="do-you-offer-any-enterprise-support">Do you offer any enterprise support?<a class="headerlink" href="#do-you-offer-any-enterprise-support" title="Permalink to this headline">¶</a></h3>
+<p>If you are interested in enterprise support for your project, please contact <a class="reference external" href="mailto:info%40gravitl.com">info<span>@</span>gravitl<span>.</span>com</a>.</p>
 
 
 <h3 id="why-the-sspl-license">Why the SSPL License?<a class="headerlink" href="#why-the-sspl-license" title="Permalink to this headline">¶</a></h3>
@@ -831,15 +834,6 @@
 
 
 
-<h2 id="issues-bugs-and-feature-requests">Issues, Bugs, and Feature Requests<a class="headerlink" href="#issues-bugs-and-feature-requests" title="Permalink to this headline">¶</a></h2>
-
-<h3 id="issues-bugs">Issues / Bugs<a class="headerlink" href="#issues-bugs" title="Permalink to this headline">¶</a></h3>
-
-
-<h3 id="feature-requests">Feature Requests<a class="headerlink" href="#feature-requests" title="Permalink to this headline">¶</a></h3>
-
-
-
 <h2 id="contact">Contact<a class="headerlink" href="#contact" title="Permalink to this headline">¶</a></h2>
 <p>If you need help, try the discord or open a GitHub ticket.</p>
 <p>Email: <a class="reference external" href="mailto:info%40gravitl.com">info<span>@</span>gravitl<span>.</span>com</a></p>

+ 122 - 26
docs/_build/html/troubleshoot.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Troubleshooting &#8212; Netmaker 0.5 documentation</title>
+    <title>Troubleshooting &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -279,61 +279,82 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
       
     
+    </li></ul>
+    
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstralling-netmaker" class="md-nav__link">Uninstralling Netmaker</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
     </li></ul>
@@ -342,26 +363,26 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
+      <a href="server-installation.html#server-configuration-reference" class="md-nav__link">Server Configuration Reference</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#dns-mode-prereqisite-setup" class="md-nav__link">DNS Mode Prereqisite Setup</a>
+      <a href="server-installation.html#dns-mode-setup" class="md-nav__link">DNS Mode Setup</a>
       
     
     </li>
@@ -389,7 +410,7 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
       
     
     </li></ul>
@@ -455,6 +476,20 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
     </li></ul>
     
     </li>
@@ -619,13 +654,6 @@
       <a href="support.html#faq" class="md-nav__link">FAQ</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="support.html#issues-bugs-and-feature-requests" class="md-nav__link">Issues, Bugs, and Feature Requests</a>
-      
-    
     </li>
     <li class="md-nav__item">
     
@@ -761,18 +789,86 @@
 <h1 id="troubleshoot--page-root">Troubleshooting<a class="headerlink" href="#troubleshoot--page-root" title="Permalink to this headline">¶</a></h1>
 
 <h2 id="common-issues">Common Issues<a class="headerlink" href="#common-issues" title="Permalink to this headline">¶</a></h2>
+<dl class="simple">
+<dt><strong>How can I connect my Android, IOS, MacOS or Windows device to my Netmaker VPN?</strong></dt><dd><p>Currently meshing one of these devices is not supported, however it will be soon.
+For now you can connect to your VPN by making one of the nodes an Ingressgateway, then
+create an Ext Client for each device. Finally, use the official WG app or another
+WG configuration app to connect via QR or downloading the device’s WireGuard configuration.</p>
+</dd>
+<dt><strong>I’ve made changes to my nodes but the nodes themselves haven’t updated yet, why?</strong></dt><dd><p>Please allow your nodes to complete a check in or two, in order to reconfigure themselves.
+In some cases, it could take up to a minute or so.</p>
+</dd>
+<dt><strong>Do I have to use access keys to join a network?</strong></dt><dd><p>Although keys are the preferred way to join a network, Netmaker does allow for manual node sign-ups.
+Simply turn on “allow manual signups” on your network and nodes will not connect until you manually aprove each one.</p>
+</dd>
+<dt><strong>Is there a community or forum to ask questions about Netmaker?</strong></dt><dd><p>Yes, we have an active <a class="reference external" href="https://discord.gg/Pt4T9y9XK8">discord</a> community and issues on our <a class="reference external" href="https://github.com/gravitl/netmaker/issues">github</a> are answered frequently!
+You can also sign-up for updates at our <a class="reference external" href="https://gravitl.com/">gravitl site</a>!</p>
+</dd>
+</dl>
 
 
 <h2 id="server">Server<a class="headerlink" href="#server" title="Permalink to this headline">¶</a></h2>
+<dl class="simple">
+<dt><strong>Can I secure/encrypt all the traffic to my server and UI?</strong></dt><dd><p>This can fairly simple to achieve assuming you have access to a domain and are familiar with Nginx.
+Please refer to the quick-start guide to see!</p>
+</dd>
+<dt><strong>Can I connect multiple nodes (mesh clients) behind a single firewall/router?</strong></dt><dd><p>Yes! As of version 0.7 Netmaker supports UDP Hole Punching to allow this, without the use of a third party STUN server!
+Is UDP hole punching a risk for you? Well you can turn it off and make static nodes/ports for the server to refer to as well.</p>
+</dd>
+<dt><strong>What are the minimum specs to run the server?</strong></dt><dd><p>We recommend at least 1 CPU and 2 GB Memory.</p>
+</dd>
+<dt><strong>Does this support IPv6 addressing?</strong></dt><dd><p>Yes, Netmaker supports IPv6 addressing. When you create a network, just make sure to turn on Dual Stack.
+Nodes will be given IPv6 addresses along with their IPv4 address. It does not currently support IPv6 only.</p>
+</dd>
+<dt><strong>Does Netmaker support Raft Consensus?</strong></dt><dd><p>Netmaker does not directly support it, but it uses <a class="reference external" href="https://github.com/rqlite/rqlite">rqlite</a> (which supports Raft) as the database.</p>
+</dd>
+<dt><strong>How do I uninstall Netmaker?</strong></dt><dd><p>There is no official uninstall script for the Netmaker server at this time. If you followed the quick-start guide, simply run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">docker-compose</span> <span class="pre">-f</span> <span class="pre">docker-compose.quickstart.yml</span> <span class="pre">down</span> <span class="pre">--volumes</span></code>
+to completely wipe your server. Otherwise kill the running binary and it’s up to you to remove database records/volumes.</p>
+</dd>
+</dl>
 
 
 <h2 id="ui">UI<a class="headerlink" href="#ui" title="Permalink to this headline">¶</a></h2>
+<dl class="simple">
+<dt><strong>I want to make a seperate network and give my friend access to only that network.</strong></dt><dd><p>Simply navigate to the UI (as an admin account). Select users in the top left and create them an account.
+Select the network(s) to give them and they should be good to go! They are an admin of that network(s) only now.</p>
+</dd>
+<dt><strong>I’m done with an access key, can I delete it?</strong></dt><dd><p>Simply navigate to the UI (as an admin account). Select your network of interest, then the select the <code class="docutils literal notranslate"><span class="pre">Access</span> <span class="pre">Keys</span></code> tab.
+Then delete the rogue access key.</p>
+</dd>
+<dt><strong>I can’t delete my network, why?</strong></dt><dd><p>You <strong>MUST</strong> remove all nodes in a network before you can delete it.</p>
+</dd>
+<dt><strong>Can I have multiple nodes with the same name?</strong></dt><dd><p>Yes, nodes can share names without issue. It may just be harder on you to know which is which.</p>
+</dd>
+</dl>
 
 
 <h2 id="agent">Agent<a class="headerlink" href="#agent" title="Permalink to this headline">¶</a></h2>
+<dl class="simple">
+<dt><strong>How do I connect a node to my Netmaker network with Netclient?</strong></dt><dd><p>First get your access token (not just access key), then run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">netclient</span> <span class="pre">join</span> <span class="pre">-t</span> <span class="pre">&lt;access</span> <span class="pre">token&gt;</span></code>.
+<strong>NOTE:</strong> netclient may be under /etc/netclient/, i.e run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">/etc/netclient/netclient</span> <span class="pre">join</span> <span class="pre">-t</span> <span class="pre">&lt;access</span> <span class="pre">token&gt;</span></code></p>
+</dd>
+<dt><strong>How do I disconnect a node on a Netmaker network?</strong></dt><dd><p>In order to leave a Netmaker network, run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">netclient</span> <span class="pre">leave</span> <span class="pre">-n</span> <span class="pre">&lt;network-name&gt;</span></code></p>
+</dd>
+<dt><strong>How do I check the logs of my agent on a node?</strong></dt><dd><p>You will need sudo/root permissions, but you can run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">systemctl</span> <span class="pre">status</span> <span class="pre">netclient@&lt;insert</span> <span class="pre">network</span> <span class="pre">name&gt;</span></code>
+or you may also run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">journalctl</span> <span class="pre">-u</span> <span class="pre">netclient@&lt;network</span> <span class="pre">name&gt;</span></code>.
+Note for journalctl: you should hit the <code class="docutils literal notranslate"><span class="pre">end</span></code> key to get to view the most recent logs quickly or use <code class="docutils literal notranslate"><span class="pre">journalctl</span> <span class="pre">-u</span> <span class="pre">netclient@&lt;network</span> <span class="pre">name&gt;</span> <span class="pre">-f</span></code> instead.</p>
+</dd>
+<dt><strong>Can I check the configuration of my node on the node?</strong></dt><dd><p><strong>A:</strong> Yes, on the node simply run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">cat</span> <span class="pre">/etc/netclient/netconfig-&lt;network</span> <span class="pre">name&gt;</span></code> and you should see what your current configuration is!
+You can also see the current WireGuard configuration with <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">wg</span> <span class="pre">show</span></code></p>
+</dd>
+<dt><strong>I am done with the agent on my machine, can I uninstall it?</strong></dt><dd><p>Yes, on the node simply run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">/etc/netclient/netclient</span> <span class="pre">uninstall</span></code>.</p>
+</dd>
+</dl>
 
 
 <h2 id="coredns">CoreDNS<a class="headerlink" href="#coredns" title="Permalink to this headline">¶</a></h2>
+<dl class="simple">
+<dt><strong>Is CoreDNS required to use Netmaker?</strong></dt><dd><p>CoreDNS is not required. Simply start your server with <code class="docutils literal notranslate"><span class="pre">DNS_MODE="off"</span></code>.</p>
+</dd>
+<dt><strong>What is the minimum DNS entry value I can use?</strong></dt><dd><p>Netmaker supports down to two characters for DNS names for your networks domains**</p>
+</dd>
+</dl>
 
 
 

+ 57 - 97
docs/_build/html/usage.html

@@ -46,7 +46,7 @@
   
   
   
-    <title>Using Netmaker &#8212; Netmaker 0.5 documentation</title>
+    <title>Using Netmaker &#8212; Netmaker 0.7 documentation</title>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" href="_static/material.css" type="text/css" />
     <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
@@ -81,7 +81,7 @@
   <nav class="md-header-nav md-grid">
     <div class="md-flex navheader">
       <div class="md-flex__cell md-flex__cell--shrink">
-        <a href="index.html" title="Netmaker 0.5 documentation"
+        <a href="index.html" title="Netmaker 0.7 documentation"
            class="md-header-nav__button md-logo">
           
             <i class="md-icon">&#xe869</i>
@@ -167,7 +167,7 @@
   <nav class="md-tabs" data-md-component="tabs">
     <div class="md-tabs__inner md-grid">
       <ul class="md-tabs__list">
-          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.5 documentation</a></li>
+          <li class="md-tabs__item"><a href="index.html" class="md-tabs__link">Netmaker 0.7 documentation</a></li>
       </ul>
     </div>
   </nav>
@@ -179,13 +179,13 @@
               <div class="md-sidebar__inner">
                 <nav class="md-nav md-nav--primary" data-md-level="0">
   <label class="md-nav__title md-nav__title--site" for="__drawer">
-    <a href="index.html" title="Netmaker 0.5 documentation" class="md-nav__button md-logo">
+    <a href="index.html" title="Netmaker 0.7 documentation" class="md-nav__button md-logo">
       
         <i class="md-icon">&#xe869</i>
       
     </a>
     <a href="index.html"
-       title="Netmaker 0.5 documentation">Netmaker Docs</a>
+       title="Netmaker 0.7 documentation">Netmaker Docs</a>
   </label>
     <div class="md-nav__source">
       <a href="https://github.com/gravitl/netmaker/" title="Go to repository" class="md-source" data-md-source="github">
@@ -279,61 +279,82 @@
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html" class="md-nav__link">Quick Start</a>
+      <a href="quick-start.html" class="md-nav__link">Quick Install</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#introduction" class="md-nav__link">Introduction</a>
+      <a href="quick-start.html#introduction" class="md-nav__link">0. Introduction</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#prerequisites" class="md-nav__link">Prerequisites</a>
+      <a href="quick-start.html#prerequisites" class="md-nav__link">1. Prerequisites</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#install" class="md-nav__link">Install</a>
+      <a href="quick-start.html#install-dependencies" class="md-nav__link">2. Install Dependencies</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#setup" class="md-nav__link">Setup</a>
+      <a href="quick-start.html#prepare-vm" class="md-nav__link">3. Prepare VM</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
+      <a href="quick-start.html#install-netmaker" class="md-nav__link">4. Install Netmaker</a>
+      
+    
+    </li></ul>
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html" class="md-nav__link">Getting Started</a>
+      <ul class="md-nav__list"> 
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#setup" class="md-nav__link">Setup</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
+      <a href="getting-started.html#deploy-nodes" class="md-nav__link">Deploy Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      <a href="getting-started.html#manage-nodes" class="md-nav__link">Manage Nodes</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="quick-start.html#uninstralling-netmaker" class="md-nav__link">Uninstralling Netmaker</a>
+      <a href="getting-started.html#uninstalling-the-netclient" class="md-nav__link">Uninstalling the netclient</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="getting-started.html#uninstalling-netmaker" class="md-nav__link">Uninstalling Netmaker</a>
       
     
     </li></ul>
@@ -342,26 +363,26 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html" class="md-nav__link">Server Installation</a>
+      <a href="server-installation.html" class="md-nav__link">Advanced Server Installation</a>
       <ul class="md-nav__list"> 
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#notes-on-optional-features" class="md-nav__link">Notes on Optional Features</a>
+      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#system-compatibility" class="md-nav__link">System Compatibility</a>
+      <a href="server-installation.html#server-configuration-reference" class="md-nav__link">Server Configuration Reference</a>
       
     
     </li>
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#dns-mode-prereqisite-setup" class="md-nav__link">DNS Mode Prereqisite Setup</a>
+      <a href="server-installation.html#dns-mode-setup" class="md-nav__link">DNS Mode Setup</a>
       
     
     </li>
@@ -389,7 +410,7 @@
     <li class="md-nav__item">
     
     
-      <a href="server-installation.html#configuration-reference" class="md-nav__link">Configuration Reference</a>
+      <a href="server-installation.html#nginx-reverse-proxy-setup-with-https" class="md-nav__link">Nginx Reverse Proxy Setup with https</a>
       
     
     </li></ul>
@@ -455,6 +476,20 @@
       <a href="external-clients.html#introduction" class="md-nav__link">Introduction</a>
       
     
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#configuring-an-ingress-gateway" class="md-nav__link">Configuring an Ingress Gateway</a>
+      
+    
+    </li>
+    <li class="md-nav__item">
+    
+    
+      <a href="external-clients.html#adding-clients-to-a-gateway" class="md-nav__link">Adding Clients to a Gateway</a>
+      
+    
     </li></ul>
     
     </li>
@@ -479,16 +514,6 @@
         <li class="md-nav__item"><a href="#written-tutorials" class="md-nav__link">Written Tutorials</a>
         </li></ul>
             </nav>
-        </li>
-        <li class="md-nav__item"><a href="#basic" class="md-nav__link">Basic</a>
-        </li>
-        <li class="md-nav__item"><a href="#local-network" class="md-nav__link">Local Network</a>
-        </li>
-        <li class="md-nav__item"><a href="#site-to-site" class="md-nav__link">Site-to-Site</a>
-        </li>
-        <li class="md-nav__item"><a href="#dual-stack-with-ipv6" class="md-nav__link">Dual Stack with IPv6</a>
-        </li>
-        <li class="md-nav__item"><a href="#kubernetes-node-network" class="md-nav__link">Kubernetes Node Network</a>
         </li></ul>
             </nav>
         </li>
@@ -501,41 +526,6 @@
       <a href="#external-tutorials" class="md-nav__link">External Tutorials</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="#basic" class="md-nav__link">Basic</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="#local-network" class="md-nav__link">Local Network</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="#site-to-site" class="md-nav__link">Site-to-Site</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="#dual-stack-with-ipv6" class="md-nav__link">Dual Stack with IPv6</a>
-      
-    
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="#kubernetes-node-network" class="md-nav__link">Kubernetes Node Network</a>
-      
-    
     </li></ul>
     
     </li>
@@ -627,13 +617,6 @@
       <a href="support.html#faq" class="md-nav__link">FAQ</a>
       
     
-    </li>
-    <li class="md-nav__item">
-    
-    
-      <a href="support.html#issues-bugs-and-feature-requests" class="md-nav__link">Issues, Bugs, and Feature Requests</a>
-      
-    
     </li>
     <li class="md-nav__item">
     
@@ -751,16 +734,6 @@
         <li class="md-nav__item"><a href="#written-tutorials" class="md-nav__link">Written Tutorials</a>
         </li></ul>
             </nav>
-        </li>
-        <li class="md-nav__item"><a href="#basic" class="md-nav__link">Basic</a>
-        </li>
-        <li class="md-nav__item"><a href="#local-network" class="md-nav__link">Local Network</a>
-        </li>
-        <li class="md-nav__item"><a href="#site-to-site" class="md-nav__link">Site-to-Site</a>
-        </li>
-        <li class="md-nav__item"><a href="#dual-stack-with-ipv6" class="md-nav__link">Dual Stack with IPv6</a>
-        </li>
-        <li class="md-nav__item"><a href="#kubernetes-node-network" class="md-nav__link">Kubernetes Node Network</a>
         </li></ul>
             </nav>
         </li>
@@ -791,26 +764,13 @@
 
 <h3 id="written-tutorials">Written Tutorials<a class="headerlink" href="#written-tutorials" title="Permalink to this headline">¶</a></h3>
 <ul class="simple">
-<li><p><a class="reference external" href="https://itnext.io/how-to-deploy-a-single-kubernetes-cluster-across-multiple-clouds-using-k3s-and-wireguard-a5ae176a6e81">Kubernetes Cross-cloud cluster</a>: Tutorial on setting up cross-cloud Kubernetes clusters using Netmaker.</p></li>
+<li><p><a class="reference external" href="https://itnext.io/how-to-deploy-a-single-kubernetes-cluster-across-multiple-clouds-using-k3s-and-wireguard-a5ae176a6e81">K3s Cross-cloud cluster</a>: Tutorial on setting up cross-cloud K3s clusters using Netmaker.</p></li>
+<li><p><a class="reference external" href="https://itnext.io/how-to-deploy-a-cross-cloud-kubernetes-cluster-with-built-in-disaster-recovery-bbce27fcc9d7">MicroK8s Cross-cloud cluster</a>: Tutorial on setting up cross-cloud MicroK8s clusters using Netmaker.</p></li>
+<li><p><a class="reference external" href="https://afeiszli.medium.com/how-to-enable-secure-access-to-your-hosted-services-using-netmaker-and-wireguard-1b3282d4b7aa">Secure access to private services</a>: Tutorial on setting up secure Nextcloud with Netmaker.</p></li>
 </ul>
 
 
 
-<h2 id="basic">Basic<a class="headerlink" href="#basic" title="Permalink to this headline">¶</a></h2>
-
-
-<h2 id="local-network">Local Network<a class="headerlink" href="#local-network" title="Permalink to this headline">¶</a></h2>
-
-
-<h2 id="site-to-site">Site-to-Site<a class="headerlink" href="#site-to-site" title="Permalink to this headline">¶</a></h2>
-
-
-<h2 id="dual-stack-with-ipv6">Dual Stack with IPv6<a class="headerlink" href="#dual-stack-with-ipv6" title="Permalink to this headline">¶</a></h2>
-
-
-<h2 id="kubernetes-node-network">Kubernetes Node Network<a class="headerlink" href="#kubernetes-node-network" title="Permalink to this headline">¶</a></h2>
-
-
 
 
           </article>

+ 7 - 8
docs/architecture.rst

@@ -47,7 +47,7 @@ Netmaker
 
 Netmaker is a platform built off of WireGuard which enables users to create mesh networks between their devices. Netmaker can create both full and partial mesh networks depending on the use case.
 
-When we refer to Netmaker in aggregate, we are typically referring to Netmaker and the netclient, as well as other supporting services such as CoreDNS, MongoDB, and UI webserver.
+When we refer to Netmaker in aggregate, we are typically referring to Netmaker and the netclient, as well as other supporting services such as CoreDNS, rqlite, and UI webserver.
 
 From an end user perspective, they typically interact with the Netmaker UI, or even just run the install script for the netclient on their devices. The other components run in the background invisibly. 
 
@@ -81,7 +81,7 @@ Most server settings are configurable via a config file, or by environment varia
 
 These modes include client mode and dns mode. Either of these can be disabled but are enabled by default. Client mode allows you to treat the Netmaker host machine (operating system) as a network Node, installing the netclient and controlling the host network. DNS mode has the server write config settings for CoreDNS, a separate component and nameserver, which picks up the config settings to manage node DNS.
 
-The Netmaker server interacts with (as of v0.3) a MongoDB instance, which holds information about nodes, networks, users, and other important data. This data is configuration data. For the most part, Netmaker serves configuration data to Nodes, telling them how they should configure themselves. The Netclient is the agent that actually does that configuration.
+The Netmaker server interacts with rqlite, a distributed version of sqlite, which holds information about nodes, networks, users, and other important data. This data is configuration data. For the most part, Netmaker serves configuration data to Nodes, telling them how they should configure themselves. The Netclient is the agent that actually does that configuration.
 
 
 Netclient
@@ -102,10 +102,10 @@ If running in daemon mode, on a periodic basis (systemd timer), the netclient pe
 The check in process is what allows Netmaker to create dynamic mesh networks. As nodes are added to, removed from, and modified on the network, other nodes are notified, and make appropriate changes.
 
 
-MongoDB
+rqlite
 --------
 
-As of v0.5, Netmaker uses MongoDB as its database, and interacts with a MongoDB instance to store and retrieve information about nodes, networks, and users. Netmaker is rapidly evolving, and MongoDB provides a flexible database structure that accelerates development. However, MongoDB is also the heaviest component of Netmaker (high cpu/memory consumption), and is set to be replaced by a lighter-weight, SQL-based database in the future.
+As of v0.7, Netmaker uses rqlite, a distributed (RAFT consensus) database, and interacts with this database to store and retrieve information about nodes, networks, and users. With the 0.7 refactor, additional database support is very easy to implement. Netmaker uses simple key value lookups to run the networks, and the database was designed to be extensible, so support for key-value stores and other SQL-based databases can be achieved by changing a single file.
 
 Netmaker UI
 ---------------
@@ -118,7 +118,7 @@ Netmaker can be used in its entirety without the UI, but the UI makes things a l
 CoreDNS
 --------
 
-v0.3 introduced the concept of private DNS management for nodes. This requires a nameserver, and CoreDNS is the chosen nameserver. CoreDNS is lightweight and extensible. CoreDNS loads dns settings from a simple file, managed by Netmaker, and serves out DNS info for managed nodes. DNS can be tricky, and DNS management is currently only supported on a small set of devices, specifically those running systemd-resolved. However, the Netmaker CoreDNS instance can be added manually as a nameserver to other devices. DNS mode can also be turned off.
+Netmaker allows users to provide and manage Private DNS for their nodes. This requires a nameserver, and CoreDNS is the chosen nameserver. CoreDNS is lightweight and extensible. CoreDNS loads dns settings from a simple file, managed by Netmaker, and serves out DNS info for managed nodes. DNS can be tricky, and DNS management is currently only supported on a small set of devices, specifically those running systemd-resolved. However, the Netmaker CoreDNS instance can be added manually as a nameserver to other devices. DNS mode can also be turned off.
 
 Worth considering is that CoreDNS requires port 53 on the Netmaker host system, which may cause conflicts depending on your operating system. This is explained in the :doc:`Server Installation <./server-installation>` guide.
 
@@ -183,7 +183,6 @@ To manage DNS (optional), the node must have systemd-resolved. Systems that have
 Limitations
 ===========
 
-Install limitations mostly include platform-specific limitations, such as needing systemd or systemd-resolved (see above). In addition the Netmaker platform has some additional limitations:
+Install limitations mostly include platform-specific limitations, such as needing systemd or systemd-resolved (see above). 
 
-- **Double NAT**: Netmaker is currently unable to route traffic for devices behind a "double NAT".
-- **CGNAT**: Netmaker is currently unable to route traffic for for devices behind a "carrier-grade NAT".
+In addition the Netmaker is currently unable to route traffic for for devices behind a "carrier-grade NAT". This will be solved in a future release with the introduction of relay servers.

+ 27 - 2
docs/client-installation.rst

@@ -112,15 +112,40 @@ Managing Netclient
 Viewing Logs
 ---------------
 
+**to view current networks**
+  ``netclient list``
+
+**to tail logs**
+  ``journalctl -u netclient@<net name> -f``
+
+**to view all logs**
+  ``journalctl -u netclient@<net name>``
+
+**to get most recent log run**
+  ``systemctl status netclient@<net name>``
+
 Making Updates
 ----------------
 
+``vim /etc/netclient/netconfig-<network>``
+
+Change any of the variables in this file, and changes will be pushed to the server and processed locally on the next checkin.
+
+For instance, change the private address, endpoint, or name. See above example config file for details
+
+
 Adding/Removing Networks
 ---------------------------
 
+``netclient join -t <token>``
+
+Set any of the above flags (netclient join --help) to override settings for joining the network. 
+If a key is provided (-k), then a token is unnecessary, but grpc, server, ports, and network must all be provided via flags.
+
+
 Uninstalling
 ---------------
 
-Troubleshooting
------------------
+``netclient uninstall``
+
 

+ 1 - 1
docs/conf.py

@@ -22,7 +22,7 @@ copyright = '2021, Alex Feiszli'
 author = 'Alex Feiszli'
 
 # The full version, including alpha/beta/rc tags
-release = '0.5'
+release = '0.7'
 
 
 # -- General configuration ---------------------------------------------------

+ 7 - 5
docs/examplecode/netclient-join.txt

@@ -1,3 +1,4 @@
+alex@workstation:~$ sudo netclient join --help
 NAME:
    netclient join - Join a Netmaker network.
 
@@ -6,7 +7,7 @@ USAGE:
 
 OPTIONS:
    --network value, -n value            Network to perform specified action against. (default: "all") [$NETCLIENT_NETWORK]
-   --password value, -p value           Password for authenticating with netmaker. (default: "badpassword") [$NETCLIENT_PASSWORD]
+   --password value, -p value           Password for authenticating with netmaker. [$NETCLIENT_PASSWORD]
    --endpoint value, -e value           Reachable (usually public) address for WireGuard (not the private WG address). [$NETCLIENT_ENDPOINT]
    --macaddress value, -m value         Mac Address for this machine. Used as a unique identifier within Netmaker network. [$NETCLIENT_MACADDRESS]
    --publickey value, --pubkey value    Public Key for WireGuard Interface. [$NETCLIENT_PUBLICKEY]
@@ -19,17 +20,18 @@ OPTIONS:
    --address value, -a value            WireGuard address for machine within Netmaker network. [$NETCLIENT_ADDRESS]
    --addressIPv6 value, --a6 value      WireGuard address for machine within Netmaker network. [$NETCLIENT_ADDRESSIPV6]
    --interface value, -i value          WireGuard local network interface name. [$NETCLIENT_INTERFACE]
-   --apiserver value                    Address + API Port (e.g. 1.2.3.4:8081) of Netmaker server. [$NETCLIENT_API_SERVER]
-   --grpcserver value                   Address + GRPC Port (e.g. 1.2.3.4:50051) of Netmaker server. [$NETCLIENT_GRPC_SERVER]
+   --apiserver value                    Address + GRPC Port (e.g. 1.2.3.4:50051) of Netmaker server. [$NETCLIENT_API_SERVER]
+   --grpcserver value                   Address + API Port (e.g. 1.2.3.4:8081) of Netmaker server. [$NETCLIENT_GRPC_SERVER]
    --key value, -k value                Access Key for signing up machine with Netmaker server during initial 'add'. [$NETCLIENT_ACCESSKEY]
    --token value, -t value              Access Token for signing up machine with Netmaker server during initial 'add'. [$NETCLIENT_ACCESSTOKEN]
    --localrange value                   Local Range if network is local, for instance 192.168.1.0/24. [$NETCLIENT_LOCALRANGE]
-   --dns value                          Sets private dns if 'on'. Ignores if 'off'. Will retrieve from network if unset. [$NETCLIENT_DNS]
+   --dns value                          Sets private dns if 'on'. Ignores if 'off'. Will retrieve from network if unset. (default: "on") [$NETCLIENT_DNS]
    --islocal value                      Sets endpoint to local address if 'yes'. Ignores if 'no'. Will retrieve from network if unset. [$NETCLIENT_IS_LOCAL]
    --isdualstack value                  Sets ipv6 address if 'yes'. Ignores if 'no'. Will retrieve from network if unset. [$NETCLIENT_IS_DUALSTACK]
+   --udpholepunch value                 Turns on udp holepunching if 'yes'. Ignores if 'no'. Will retrieve from network if unset. [$NETCLIENT_UDP_HOLEPUNCH]
    --ipforwarding value                 Sets ip forwarding on if 'on'. Ignores if 'off'. On by default. (default: "on") [$NETCLIENT_IPFORWARDING]
    --postup value                       Sets PostUp command for WireGuard. [$NETCLIENT_POSTUP]
    --postdown value                     Sets PostDown command for WireGuard. [$NETCLIENT_POSTDOWN]
    --daemon value                       Installs daemon if 'on'. Ignores if 'off'. On by default. (default: "on") [$NETCLIENT_DAEMON]
    --roaming value                      Checks for IP changes if 'on'. Ignores if 'off'. On by default. (default: "on") [$NETCLIENT_ROAMING]
-   --help, -h                           show help (default: false)
+   --help, -h                           show help (default: false)

+ 10 - 7
docs/examplecode/netconfig-example.yml

@@ -1,4 +1,5 @@
 server:
+    corednsaddr: 147.182.251.203 # Address of CoreDNS Server (set locally with resolvectl)
     grpcaddress: 10.101.0.1:50051 # Address of GRPC Server (used for all interaction with server after registration)
     apiaddress: 1.2.3.4:8081 # Address of API Server (used only for registration/unregistration)
     accesskey: 5qKTbTgsvb45y3qyRmWft # Key used to sign up with server. Used only during registration
@@ -11,12 +12,12 @@ node:
     localaddress: 192.168.1.32 # Address on local network, used as endpoint for other local nodes for faster comms
     wgaddress: 10.7.11.2 # Private WG addres on network
     wgaddress6: "f8:34:41:77:5c:15" # Private ipv6 address if network is dual stack
-    roaming: "on" # Whether or not to grab new endpoint value automatically
-    dns: "off" # Whether or not to set local DNS based on Netmaker's Private DNS server
+    roaming: "yes" # Whether or not to grab new endpoint value automatically
+    dnson: "no" # Whether or not to set local DNS based on Netmaker's Private DNS server
     islocal: "no" # Based on network. If yes, will use local IP as endpoint.
     isdualstack: "yes" # Use IPv6 in addition to IPv4
     isingressgateway: "no" # whether or not node is an ingress gateway (will set iptables forwarding rules)
-    allowedips: "" # not currently used
+    allowedips: "" # additional IP's to add to client
     localrange: "" # local range if it's a local network. For instance, 192.168.1.0/24
     postup: "" # postup command, used by ingress/egress gateways to set iptables
     postdown: "" # postdown command, used by ingress/egress gateways to set iptables
@@ -26,7 +27,9 @@ node:
     privatekey: "" # private key, set only for changing and then will revert to blank in config
     endpoint: 78.170.22.168 # public endpoint for reaching node 
     postchanges: "false" # if true, will post and config file changes on next checkin and then revert to false
-    ipforwarding: "on" # set ip forwarding; highly recommended to leave on
-network: home # the network (duplicate of node.network)
-daemon: "on" # whether or not to manage systemd
-operatingsystem: "" # not currently in use
+    ipforwarding: "yes" # set ip forwarding; highly recommended to leave on
+    isstatic: "no" # if yes, daemon will not change pubkey, endpoint, or address
+    udpholepunch: "yes" # run UDP hole punching (will ignore port above, e.g. 51821)
+    network: home # the network (duplicate of node.network)
+daemon: "yes" # whether or not to manage systemd
+operatingsystem: "" # not currently in use

+ 126 - 0
docs/getting-started.rst

@@ -0,0 +1,126 @@
+=================
+Getting Started
+=================
+
+Once you have Netmaker installed via the :doc:`Quick Install <./quick-start>` guide, you can use this Getting Started guide to help create and manage your first network.
+
+Setup
+=================
+
+#. Create your admin user, with a username and password.
+#. Login with your new user
+#. Create your first network by clicking on Create Network
+
+.. image:: images/create-net.png
+   :width: 80%
+   :alt: Create Network Screen
+   :align: center
+
+This network should have a sensible name (nodes will use it to set their interfaces).
+
+More importantly, it should have a non-overlapping, private address range. 
+
+If you are running a small (less than 254 machines) network, and are unsure of which CIDR's to use, you could consider:
+
+- 10.11.12.0/24
+- 10.20.30.0/24
+- 100.99.98.0/24
+
+Once your network is created, you should see that the netmaker server has added itself to the network. From here, you can move on to adding additional nodes to the network.
+
+.. image:: images/netmaker-node.png
+   :width: 80%
+   :alt: Node Screen
+   :align: center
+
+
+Create Key
+------------
+
+Adding nodes to the network typically requires a key.
+
+#. Click on the ACCESS KEYS tab and select the network you created.
+#. Click ADD NEW ACCESS KEY
+#. Give it a name (ex: "mykey") and a number of uses (ex: 25)
+#. Click CREATE KEY (**Important:** Do not click out of the following screen until you have saved your key details. It will appear only once.)
+#. Copy the bottom command under "Your agent install command with access token" and save it somewhere locally. E.x: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -``.
+
+.. image:: images/access-key.png
+   :width: 80%
+   :alt: Access Key Screen
+   :align: center
+
+You will use this command to install the netclient on your nodes. There are three different values for three different scenarios: 
+
+* The **Access Key** value is the secret string that will allow your node to authenticate with the Netmaker network. This can be used with existing netclient installations where additional configurations (such as setting the server IP manually) may be required. This is not typical. E.g. ``netclient join -k <access key> -s grpc.myserver.com -p 50051``
+* The **Access Token** value is a base64 encoded string that contains the server IP and grpc port, as well as the access key. This is decoded by the netclient and can be used with existing netclient installations like this: ``netclient join -t <access token>``. You should use this method for adding a network to a node that is already on a network. For instance, Node A is in the **mynet** network and now you are adding it to **default**.
+* The **install command** value is a curl command that can be run on Linux systems. It is a simple script that downloads the netclient binary and runs the install command all in one.
+  
+Networks can also be enabled to allow nodes to sign up without keys at all. In this scenario, nodes enter a "pending state" and are not permitted to join the network until an admin approves them.
+
+Deploy Nodes
+=================
+
+0. Prereqisite: Every machine on which you install should have wireguard and systemd already installed.
+
+1. SSH to each machine 
+2. ``sudo su -``
+3. **Prerequisite Check:** Every Linux machine on which you run the netclient must have WireGuard and systemd installed
+4. Run the install command, Ex: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -``
+
+You should get output similar to the below. The netclient retrieves local settings, submits them to the server for processing, and retrieves updated settings. Then it sets the local network configuration. For more information about this process, see the :doc:`client installation <./client-installation>` documentation. If this process failed and you do not see your node in the console (see below), then reference the :doc:`troubleshooting <./troubleshoot>` documentation.
+
+.. image:: images/nc-install-output.png
+   :width: 80%
+   :alt: Output from Netclient Install
+   :align: center
+
+
+.. image:: images/nm-node-success.png
+   :width: 80%
+   :alt: Node Success
+   :align: center
+
+
+Repeat the above steps for every machine you would like to add to your network. You can re-use the same install command so long as you do not run out of uses on your access key (after which it will be invalidated and deleted).
+
+Once installed on all nodes, you can test the connection by pinging the private address of any node from any other node.
+
+
+.. image:: images/ping-node.png
+   :width: 80%
+   :alt: Node Success
+   :align: center
+
+Manage Nodes
+===============
+
+Your machines should now be visible in the control pane. 
+
+.. image:: images/nodes.png
+   :width: 80%
+   :alt: Node Success
+   :align: center
+
+You can view/modify/delete any node by selecting it in the NODES tab. For instance, you can change the name to something more sensible like "workstation" or "api server". You can also modify network settings here, such as keys or the WireGuard port. These settings will be picked up by the node on its next check in. For more information, see Advanced Configuration in the :doc:`Using Netmaker <./usage>` docs.
+
+.. image:: images/node-details.png
+   :width: 80%
+   :alt: Node Success
+   :align: center
+
+
+
+Nodes can be added/removed/modified on the network at any time. Nodes can also be added to multiple Netmaker networks. Any changes will get picked up by any nodes on a given network, and will take aboue ~30 seconds to take effect.
+
+Uninstalling the netclient
+=============================
+
+1. To remove your nodes from the default network, run the following on each node: ``sudo netclient leave -n default``
+2. To remove the netclient entirely from each node, run ``sudo rm -rf /etc/netclient`` (after running the first step)
+
+Uninstalling Netmaker
+===========================
+
+To uninstall Netmaker from the server, simply run ``docker-compose down`` or ``docker-compose down --volumes`` to remove the docker volumes for a future installation.
+

BIN
docs/images/create-net.png


BIN
docs/images/netmaker-node.png


+ 5 - 0
docs/index.rst

@@ -58,6 +58,11 @@ A quick start guide to getting up and running with Netmaker and WireGuard as qui
 
    quick-start
 
+.. toctree::
+   :maxdepth: 2
+
+   getting-started
+
 Server Installation
 --------------------
 

+ 70 - 184
docs/quick-start.rst

@@ -1,20 +1,25 @@
-====================
+===============
 Quick Install
-=====================
+===============
 
-Introduction
-==============
+This quick start guide is an **opinionated** guide for getting up and running with Netmaker as quickly as possible.
+
+0. Introduction
+==================
 
-This is an **opinionated** guide for getting up and running with Netmaker as quickly as possible. If this configuration does not fit your use case, see the Advanced Installation docs. 
+We assume for this installation that you want all of the Netmaker features enabled, want your server to be secure, and want it to be accessible from anywhere. 
 
-We assume for this installation that you want all of the features, want your server to be secure, and want it to be accessible from anywhere. 
+This instance will not be HA. However, it should comfortably handle around one hundred concurrent clients and support most use cases.
 
-This instance will not be HA, and is not horizontally scalable. However, it should comfortably handle several hundred clients and most average use cases. If you are deploying for an enterprise use case, please contact [email protected] for support.
+If you are deploying for an enterprise use case, please contact [email protected] for support.
 
 By the end of this guide, you will have Netmaker installed on a public VM linked to your custom domain, secured behind an Nginx reverse proxy.
 
+If this configuration does not fit your use case, see the :doc:`Advanced Installation <./server-installation>` docs. 
 
-0. Prerequisites
+
+
+1. Prerequisites
 ==================
 -  **Virtual Machine**
    
@@ -29,67 +34,56 @@ By the end of this guide, you will have Netmaker installed on a public VM linked
   - A publicly owned domain (e.x. example.com, mysite.biz) 
   - Permission and access to modify DNS records via DNS service (e.x: Route53)
 
-
-
- #. Docker and Docker Compose installed on the above server. Follow the official `Docker instructions <https://docs.docker.com/engine/install/>`_ for installing Docker and Docker Compose on your system.
- #. All network nodes should be systemd-based (see Compatibility under :doc:`Architecture <./architecture>` docs)
-
-1. Install Dependencies
+2. Install Dependencies
 ========================
 
-  ``ssh root@your-host``
+``ssh root@your-host``
 
 Install Docker
 ---------------
-Begin by installing the community version of Docker and docker-compose (there are issues with the snap version).
-
-``sudo apt-get remove docker docker-engine docker.io containerd runc``
- 
-``sudo apt-get update``
- 
-    ``sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release``
-
-``curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg``
-  
-  ``echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null``
-  
-``sudo apt-get update``
-  
-``sudo apt-get install docker-ce docker-ce-cli containerd.io``
-
-``sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose``
-
-``sudo chmod +x /usr/local/bin/docker-compose``
-
-``docker --version``
-
-``docker-compose --version``
+Begin by installing the community version of Docker and docker-compose (there are issues with the snap version). You can follow the official `Docker instructions here <https://docs.docker.com/engine/install/>`_. Or, you can use the below series of commands which should work on Ubuntu 20.04.
+
+.. code-block::
+
+  sudo apt-get remove docker docker-engine docker.io containerd runc
+  sudo apt-get update
+  sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
+  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  
+  echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
+  sudo apt-get update
+  sudo apt-get install docker-ce docker-ce-cli containerd.io
+  sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+  sudo chmod +x /usr/local/bin/docker-compose
+  docker --version
+  docker-compose --version
 
 At this point Docker should be installed.
 
 Install Dependencies
 -----------------------------
 
+In addition to Docker, this installation requires WireGuard, Nginx, and Certbot.
+
 ``sudo apt install wireguard wireguard-tools nginx certbot python3-certbot-nginx net-tools``
 
  
-2. Prepare VM
+3. Prepare VM
 ===============================
 
 Prepare Domain
 ----------------------------
 1. Choose a base domain or subdomain for Netmaker. If you own **example.com**, this should be something like **netmaker.example.com**
 
-    - You must point your wildcard domain to the public IP of your VM, e.x: *.example.com --> <your public ip>
+- You must point your wildcard domain to the public IP of your VM, e.x: *.example.com --> <your public ip>
 
 2. Add an A record pointing to your VM using your DNS service provider for *.netmaker.example.com (inserting your own subdomain of course).
 3. Netmaker will create three subdomains on top of this. For the example above those subdomains would be:
 
-    - dashboard.netmaker.example.com
+- dashboard.netmaker.example.com
 
-    - api.netmaker.example.com
+- api.netmaker.example.com
 
-    - grpc.netmaker.example.com
+- grpc.netmaker.example.com
 
 Moving forward we will refer to your base domain using **<your base domain>**. Replace these references with your domain (e.g. netmaker.example.com).
 
@@ -97,7 +91,7 @@ Moving forward we will refer to your base domain using **<your base domain>**. R
 
 5. Generate SSL Certificates using certbot:
 
-  ``sudo certbot certonly --manual --preferred-challenges=dns --email [email protected] --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --manual-public-ip-logging-ok -d "*.<your base domain>"``
+``sudo certbot certonly --manual --preferred-challenges=dns --email [email protected] --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --manual-public-ip-logging-ok -d "*.<your base domain>"``
 
 The above command (using your domain instead of <your base domain>), will prompt you to enter a TXT record in your DNS service provider. Do this, and **wait one  minute** before clicking enter, or it may fail and you will have to run the command again.
 
@@ -106,11 +100,13 @@ Prepare Firewall
 
 Make sure firewall settings are appropriate for Netmaker. You need ports 53 and 443. On the server you can run:
 
-``sudo ufw allow proto tcp from any to any port 443 && sudo ufw allow dns && ``
+
+.. code-block::
+
+  sudo ufw allow proto tcp from any to any port 443 && sudo ufw allow dns
 
 **Based on your cloud provider, you may also need to set inbound security rules for your server. This will be dependent on your cloud provider. Be sure to check before moving on:**
   - allow 443/tcp from all
-  - allow 1443/tcp from all
   - allow 53/udp from all
 
 Prepare for DNS
@@ -118,172 +114,62 @@ Prepare for DNS
 
 On Ubuntu 20.04, by default there is a service consuming port 53 related to DNS resolution. We need port 53 open in order to run our own DNS server. The below steps will disable systemd-resolved, and insert a generic DNS nameserver for local resolution.
 
-1. ``sudo systemctl stop systemd-resolved``
-2. ``sudo systemctl disable systemd-resolved``
-3. ``sudo vim /etc/systemd/resolved.conf``
-    * uncomment DNS and add 8.8.8.8 or whatever reachable nameserver is your preference
-    * uncomment DNSStubListener and set to "no"
-4. ``sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf``
+.. code-block::
+
+  systemctl stop systemd-resolved
+  systemctl disable systemd-resolved 
+  vim /etc/systemd/resolved.conf
+    *  uncomment DNS and add 8.8.8.8 or whatever reachable nameserver is your preference  *
+    *  uncomment DNSStubListener and set to "no"  *
+  ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
+
 
 Prepare Nginx
 -----------------
 
 Nginx will serve the SSL certificate with your chosen domain and forward traffic to netmaker.
 
-Add the nginx configuration files:
+Get the nginx configuration file:
 
 ``wget https://raw.githubusercontent.com/gravitl/netmaker/develop/nginx/netmaker-nginx-template.conf``
 
-``wget https://raw.githubusercontent.com/gravitl/netmaker/develop/nginx/netmaker-nginx-dns.conf``
-
 Insert your domain in the configuration file and add to nginx:
 
-``sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' netmaker-nginx-template.conf ``
-
-``sudo cp netmaker-nginx-template.conf /etc/nginx/conf.d/<your base domain>.conf && sudo cp netmaker-nginx-dns.conf /etc/nginx/nginx.conf``
+.. code-block::
 
-``nginx -t && nginx -s reload``
+  sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' netmaker-nginx-template.conf
+  sudo cp netmaker-nginx-template.conf /etc/nginx/conf.d/<your base domain>.conf
+  nginx -t && nginx -s reload
+  systemctl restart nginx
 
-``systemctl restart nginx``
-
-
-Install Netmaker
-=================
+4. Install Netmaker
+====================
 
 Prepare Templates
 ------------------
 
-``wget https://raw.githubusercontent.com/gravitl/netmaker/develop/compose/docker-compose.quickstart.yml``
-
-``sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' docker-compose.quickstart.yml``
+.. code-block::
 
-``sed -i 's/SERVER_PUBLIC_IP/<your server ip>/g' docker-compose.quickstart.yml``
+  wget https://raw.githubusercontent.com/gravitl/netmaker/develop/compose/docker-compose.quickstart.yml
+  sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' docker-compose.quickstart.yml
+  sed -i 's/SERVER_PUBLIC_IP/<your server ip>/g' docker-compose.quickstart.yml
 
 Generate a unique master key and insert it:
 
-``tr -dc A-Za-z0-9 </dev/urandom | head -c 30 ; echo ''``
+.. code-block::
 
-``sed -i 's/REPLACE_MASTER_KEY/<your generated key>/g' docker-compose.quickstart.yml``
+  tr -dc A-Za-z0-9 </dev/urandom | head -c 30 ; echo ''
+  sed -i 's/REPLACE_MASTER_KEY/<your generated key>/g' docker-compose.quickstart.yml
 
 Start Netmaker
 ----------------
 
 ``sudo docker-compose -f docker-compose.quickstart.yml up -d``
 
-===========
-Quick Start
-===========
-
-Setup
-=================
-
-#. Create your admin user, with a username and password.
-#. Login with your new user
-#. Examine the **default** network. Click on DEFAULT under NETWORK DETAILS
-
-.. image:: images/default-net.png
-   :width: 80%
-   :alt: Create User Screen
-   :align: center
-
-This displays information about the **default** network, which is created on server startup. You can delete this network if you do not need it, but for standard use cases this network should be enough to get started. Nodes will get an address from the network address range (ADDRESSRANGE). If the range conflicts with a pre-existing private network on your devices, you may want to change this, or make a new network instead. Nodes will also get default settings from here for unset configurations. For instance, the DEFAULTKEEPALIVE field will set the PersistenKeepAlive for nodes.
-
-To get started quickly, we can just use the existing default network.
-
-Create Key
-------------
-
-#. Click on the ACCESS KEYS tab and select the DEFAULT network.
-#. Click ADD NEW ACCESS KEY
-#. Give it a name (ex: "mykey") and a number of uses (ex: 25)
-#. Click CREATE KEY (**Important:** Do not click out of the following screen until you have saved your key details. It will appear only once.)
-#. Copy the bottom command under "Your agent install command with access token" and save it somewhere locally. E.x: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/v0.5/scripts/netclient-install.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -``. **A change is required here. Change netclient-install.sh in this command to netclient-install.slim.sh, EX:**
-
-
-``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/v0.5/scripts/netclient-install.slim.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -``
-
-.. image:: images/access-key.png
-   :width: 80%
-   :alt: Access Key Screen
-   :align: center
-
-You will use this command to install the netclient on your nodes. There are three different values for three different scenarios: 
-
-* The **Access Key** value is the secret string that will allow your node to authenticate with the Netmaker network. This can be used with existing netclient installations where additional configurations (such as setting the server IP manually) may be required. This is not typical. E.g. ``netclient -c install -k <access key> -s 1.2.3.4 -p 50052``
-* The **Access Token** value is a base64 encoded string that contains the server IP and grpc port, as well as the access key. This is decoded by the netclient and can be used with existing netclient installations like this: ``netclient -c install -t <access token>``. You should use this method for adding a network to a node that is already on a network. For instance, Node A is in the **mynet** network and now you are adding it to **default**.
-<<<<<<< HEAD
-
-=======
-* The **install command** value is a curl command that can be run on Linux systems. It is a simple script that downloads the netclient binary and runs the install command all in one. However, this script is tailored for Secure GRPC Mode and contains an additional (unnecessary) command: **netclient register -k keyvalue**. This command will not work without secure GRPC enabled and will return a 500 error.
-  
->>>>>>> c360eb1878a4fe89538235ab240da6f6890934a1
-Networks can also be enabled to allow nodes to sign up without keys at all. In this scenario, nodes enter a "pending state" and are not permitted to join the network until an admin approves them.
-
-Deploy Nodes
-=================
-
-1. SSH to each machine 
-2. ``sudo su -``
-3. **Prerequisite Check:** Every Linux machine on which you run the netclient must have WireGuard and systemd installed
-
-  * ``which wg`` (should show wg binary present)
-  * ``pidof systemd && echo "systemd found" || echo "systemd not found"``
-
-4. Run the install command, Ex: ``curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/v0.5/scripts/netclient-install.slim.sh | KEY=vm3ow4thatogiwnsla3thsl3894ths sh -``
-
-You should get output similar to the below. The netclient retrieves local settings, submits them to the server for processing, and retrieves updated settings. Then it sets the local network configuration. For more information about this process, see the :doc:`client installation <./client-installation>` documentation. If this process failed and you do not see your node in the console (see below), then reference the :doc:`troubleshooting <./troubleshoot>` documentation.
-
-.. image:: images/nc-install-output.png
-   :width: 80%
-   :alt: Output from Netclient Install
-   :align: center
-
-
-.. image:: images/nm-node-success.png
-   :width: 80%
-   :alt: Node Success
-   :align: center
-
-
-Repeat the above steps for every machine you would like to add to your network. You can re-use the same install command so long as you do not run out of uses on your access key (after which it will be invalidated and deleted).
-
-Once installed on all nodes, you can test the connection by pinging the private address of any node from any other node.
-
-
-.. image:: images/ping-node.png
-   :width: 80%
-   :alt: Node Success
-   :align: center
-
-Manage Nodes
-===============
-
-Your machines should now be visible in the control pane. 
-
-.. image:: images/nodes.png
-   :width: 80%
-   :alt: Node Success
-   :align: center
-
-You can view/modify/delete any node by selecting it in the NODES tab. For instance, you can change the name to something more sensible like "workstation" or "api server". You can also modify network settings here, such as keys or the WireGuard port. These settings will be picked up by the node on its next check in. For more information, see Advanced Configuration in the :doc:`Using Netmaker <./usage>` docs.
-
-.. image:: images/node-details.png
-   :width: 80%
-   :alt: Node Success
-   :align: center
-
-
-
-Nodes can be added/removed/modified on the network at any time. Nodes can also be added to multiple Netmaker networks. Any changes will get picked up by any nodes on a given network, and will take aboue ~30 seconds to take effect.
-
-Uninstalling the netclient
-=============================
-
-1. To remove your nodes from the default network, run the following on each node: ``sudo netclient leave -n default``
-2. To remove the netclient entirely from each node, run ``sudo rm -rf /etc/netclient`` (after running the first step)
+navigate to dashboard.<your base domain> to see your nginx instance.
 
-Uninstalling Netmaker
-===========================
+To troubleshoot issues, start with:
 
-To uninstall Netmaker from the server, simply run ``docker-compose down`` or ``docker-compose down --volumes`` to remove the docker volumes for a future installation.
+``docker logs netmaker``
 
+Or check out the :doc:`troubleshoooting docs <./troubleshoot>`.

+ 154 - 270
docs/server-installation.rst

@@ -1,176 +1,175 @@
-====================
-Server Installation
+=================================
+Advanced Server Installation
+=================================
+
+This section outlines installing the Netmaker server, including Netmaker, Netmaker UI, rqlite, and CoreDNS
+
+System Compatibility
 ====================
 
-This section outlines installing the Netmaker server, including Netmaker, Netmaker UI, MongoDB, and CoreDNS
+Netmaker will require elevated privileges to perform network operations. Netmaker has similar limitations to :doc:`netclient <./client-installation>` (client networking agent). 
 
-Notes on Optional Features
-============================
+Typically, Netmaker is run inside of containers (Docker). To run a non-docker installation, you must run the Netmaker binary, CoreDNS binary, rqlite, and a web server directly on the host. Each of these components have their own individual requirements.
 
-There are a few key options to keep in mind when deploying Netmaker. All of the following options are enabled by default but can be disabled with a single flag at runtime (see Customization). In addition to these options, there are many more Customizable components which will be discussed later on and help to solve for special challenges and use cases.
+The quick install guide is recommended for first-time installs. 
 
-**Client Mode:** Client Mode enables Netmaker to control the underlying host server's Network. This can make management a bit easier, because Netmaker can be added into networks via a button click in the UI. This is especially useful for things like Gateways, and will open up additional options in future versions, for instance, allowing Netmaker to easily become a relay server.
+The following documents are meant for special cases like Kubernetes and LXC, or for more advanced setups. 
 
-Client Mode requires many additional privileges on the host machine, since Netmaker needs to control kernel WireGuard. Because of this, if running in Client Mode, you must run with root privileges and mount many system directories to the Netmaker container. Running without Client Mode allows you to install without privilege escalation and increases the number of compatible systems substantially.
 
-**DNS Mode:** DNS Mode enables Netmaker to write configuration files for CoreDNS, which can be set as a DNS Server for nodes. DNS Mode, paired with a CoreDNS deployment, requires use of port 53. On many linux systems (such as Ubuntu), port 53 is already in use to support local DNS, via systemd-resolved. Running in DNS Mode may require making modifications on the host machine.
+Server Configuration Reference
+==========================================
 
-**Secure GRPC**: Secure GRPC ensures all communications between nodes and the server are encrypted. Netmaker sets up a default "comms" network that exists only for nodes to connect to the server. It acts as a hub-and-spoke WireGuard network. In the below installation instructions, when port 50555 needs to be open, this is referring to the WireGuard port for Netmaker's GRPC comms. When it is port 50051, secure comms is not enabled. 
+Netmaker sets its configuration in the following order of precendence:
 
-When Secure GRPC is enabled, before any nodes can join a Netmaker network, they request to join the comms network, and are given the appropriate WireGuard configs to connect to the server. Then they are able to make requests against the private netmaker endpoint specified for the comms network (10.101.0.1 by default). If switched off, communications are not secure between the hub and nodes over GRPC (it is like http vs https), and likewise, certificates must be added to gain secure communications.
+1. Defaults
+2. Config File
+3. Environment Variables
 
-**Agent Backend:** The Agent Backend is the GRPC server (by default running on port 50051). This port is not needed for the admin server. If your use case requires special access configuration, you can run two Netmaker instances, one for the admin server, and one for node access.
+Variable Description
+----------------------
+VERBOSITY:
+    **Default:** 0
 
-**REST Backend:** Similar to the above, the REST backend runs by default on port 8081, and is used for admin API and UI access. By enabling the REST backend while disabling the Agent backend, you can separate the two functions for more restricted environments.
+    **Description:** Specify level of logging you would like on the server. Goes up to 3 for debugging.
 
 
-System Compatibility
-====================
+GRPC_SSL:
+    **Default:** "off"
 
-Both **Client Mode** and **Secure GRPC** require WireGuard to be installed on the host system, and will require elevated privileges to perform network operations..
+    **Description:** Specifies if GRPC is going over secure GRPC or SSL. This is a setting for the clients and is passed through the access token. Can be set to "on" and "off". Set to on if SSL is configured for GRPC.
 
-When both of these features are **disabled**, Netmaker can be run on any system that supports Docker, including Windows, Mac, and Linux, and other systems. With these features disabled, no special privileges are required. Netmaker will only need ports for GRPC (50051 by default), the API (8081 by default), and CoreDNS (53, if enabled).
+SERVER_API_CONN_STRING
+    **Default:** ""
 
-With Client Mode and/or Secure GRPC **enabled** (the default), Netmaker has the same limitations as the :doc:`netclient <./client-installation>` (client networking agent), because client mode just means that the Netmaker server is also running a netclient. 
+    **Description:**  Allows specification of the string used to connect to the server api. Format: IP:PORT or DOMAIN:PORT. Defaults to SERVER_HOST if not specified.
 
-These modes require privileged (root) access to the host machine. In addition, Client Mode requires multiple host directory mounts. WireGuard must be installed, the system must be systemd Linux (see :doc:`compatible systems <./architecture>` for more details).
+SERVER_GRPC_CONN_STRING
+    **Default:** ""
 
-To run a non-docker installation, you must run the Netmaker binary, CoreDNS binary, MongoDB, and a web server directly on the host. This requires all the requirements for those individual components. Our guided install assumes systemd-based linux, but there are many other ways to install Netmaker's individual components onto machines that do not support Docker. 
+    **Description:**  Allows specification of the string used to connect to grpc. Format: IP:PORT or DOMAIN:PORT. Defaults to SERVER_HOST if not specified.
 
-DNS Mode Prereqisite Setup
-====================================
+SERVER_HOST: *(depreciated, use SERVER_API_CONN_STRING and SERVER_GRPC_CONN_STRING)* 
+    **Default:** Server will perform an IP check and set automatically unless explicitly set, or DISABLE_REMOTE_IP_CHECK is set to true, in which case it defaults to 127.0.0.1
 
-If you plan on running the server in DNS Mode, know that a `CoreDNS Server <https://coredns.io/manual/toc/>`_ will be installed. CoreDNS is a light-weight, fast, and easy-to-configure DNS server. It is recommended to bind CoreDNS to port 53 of the host system, and it will do so by default. The clients will expect the nameserver to be on port 53, and many systems have issues resolving a different port.
+    **Description:** Sets the SERVER_HTTP_HOST and SERVER_GRPC_HOST variables if they are unset. The address where traffic comes in. 
 
-However, on your host system (for Netmaker), this may conflict with an existing process. On linux systems running systemd-resolved, there is likely a service consuming port 53. The below steps will disable systemd-resolved, and replace it with a generic (e.g. Google) nameserver. Be warned that this may have consequences for any existing private DNS configuration. The following was tested on Ubuntu 20.04 and should be run prior to deploying the docker containers.
+SERVER_HTTP_HOST: *(depreciated, use SERVER_API_CONN_STRING and SERVER_GRPC_CONN_STRING)*
+    **Default:** Equals SERVER_HOST if set, "127.0.0.1" if SERVER_HOST is unset.
+    
+    **Description:** Set to make the HTTP and GRPC functions available via different interfaces/networks.
 
-1. ``systemctl stop systemd-resolved`` 
-2. ``systemctl disable systemd-resolved`` 
-3. ``vim /etc/systemd/resolved.conf``
-    * uncomment DNS and add 8.8.8.8 or whatever reachable nameserver is your preference
-    * uncomment DNSStubListener and set to "no"
-4. ``ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf``
+SERVER_GRPC_HOST: *(depreciated, use SERVER_API_CONN_STRING and SERVER_GRPC_CONN_STRING)*
+    **Default:** Equals SERVER_HOST if set, "127.0.0.1" if SERVER_HOST is unset.
 
-Port 53 should now be available for CoreDNS to use.
+    **Description:** Set to make the HTTP and GRPC functions available via different interfaces/networks.
 
-Docker Compose Install
-=======================
+API_PORT:
+    **Default:** 8081 
 
-The most simple (and recommended) way of installing Netmaker is to use one of the provided `Docker Compose files <https://github.com/gravitl/netmaker/tree/feature_v0.3.5_docs/compose>`_. Below are instructions for several different options to install Netmaker via Docker Compose, followed by an annotated reference Docker Compose in case your use case requires additional customization.
+    **Description:** The HTTP API port for Netmaker. Used for API calls / communication from front end.
 
-Slim Install - No DNS, No Client Mode, No Secure GRPC
---------------------------------------------------------
+GRPC_PORT:  
+    **Default:** 50051
 
-This is the same docker compose covered in the :doc:`quick start <./quick-start>`. It requires no special privileges and can run on any system with Docker and Docker Compose. However, it also does not have the full feature set, and lacks Client Mode and DNS Mode.
+    **Description:** The GRPC port for Netmaker. Used for communications from nodes.
 
-**Prerequisites:**
-  * ports 80, 8081, and 50051 are not blocked by firewall
-  * ports 80, 8081, 50051, and 27017 are not in use 
+MASTER_KEY:  
+    **Default:** "secretkey" 
 
-**Notes:** 
-  * You can still run the netclient on the host system even if Client Mode is not enabled. It will just be managed like the netclient on any other nodes, and will not be automatically managed by thhe server/UI.
-  * You can change the port mappings in the Docker Compose if the listed ports are already in use.
+    **Description:** The admin master key for accessing the API. Change this in any production installation.
 
-Assuming you have Docker and Docker Compose installed, you can just run the following, replacing **< Insert your-host IP Address Here >** with your host IP (or domain):
+CORS_ALLOWED_ORIGIN:  
+    **Default:** "*"
+
+    **Description:** The "allowed origin" for API requests. Change to restrict where API requests can come from.
 
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.slim.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
-#. ``docker-compose up -d``
+REST_BACKEND:  
+    **Default:** "on" 
 
-Full Install - DNS, Client Mode, and Secure GRPC Enabled
-----------------------------------------------------------
+    **Description:** Enables the REST backend (API running on API_PORT at SERVER_HTTP_HOST). Change to "off" to turn off.
 
-This installation gives you the fully-featured product with Client Mode and DNS Mode. 
+AGENT_BACKEND:  
+    **Default:** "on" 
 
-**Prerequisites:**
-  * systemd linux (Debian or Ubuntu reccommended)
-  * sudo privileges
-  * DNS Mode Prerequisite Setup (see above)
-  * WireGuard installed
-  * ports 80, 8081, 53, and 50555 are not blocked by firewall
-  * ports 80, 8081, 53, 50555, and 27017 are not in use
+    **Description:** Enables the AGENT backend (GRPC running on GRPC_PORT at SERVER_GRPC_HOST). Change to "off" to turn off.
 
-**Notes:** 
-  * You can change the port mappings in the Docker Compose if the listed ports are already in use.
-  * You can run CoreDNS on a non-53 port, but this likely will cause issues on the client side (DNS on non-standard port). We do not recommend this and do not cover how to manage running CoreDNS on a different port for clients, which will likely have problems resolving a nameserver on a non-53 port.
+DNS_MODE:  
+    **Default:** "off"
 
-Assuming you have Docker and Docker Compose installed, you can just run the following, replacing **< Insert your-host IP Address Here >** with your host IP (or domain):
+    **Description:** Enables DNS Mode, meaning config files will be generated for CoreDNS.
 
-#. ``sudo su -``
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
-#. ``docker-compose up -d``
+Config File Reference
+----------------------
+A config file may be placed under config/environments/<env-name>.yml. To read this file at runtime, provide the environment variable NETMAKER_ENV at runtime. For instance, dev.yml paired with ENV=dev. Netmaker will load the specified Config file. This allows you to store and manage configurations for different environments. Below is a reference Config File you may use.
 
+.. literalinclude:: ../config/environments/dev.yaml
+  :language: YAML
 
-Server Only Install - UI, DNS, Client Disabled
-------------------------------------------------
+Compose File - Annotated
+--------------------------------------
 
-A "Server Only" install can be helpful for scenarios in which you do not want to run the UI. the UI is not mandatory for running a Netmaker network, but it makes the process easier. This mode also diables DNS and Client Modes, though you can add those back in if needed. There is no UI dependency on Client Mode or DNS Mode.
+All environment variables and options are enabled in this file. It is the equivalent to running the "full install" from the above section. However, all environment variables are included, and are set to the default values provided by Netmaker (if the environment variable was left unset, it would not change the installation). Comments are added to each option to show how you might use it to modify your installation.
 
-**Prerequisites:**
-  * ports 8081 and 50051 are not blocked by firewall
-  * ports 8081, 50051, and 27017 are not in use
+.. literalinclude:: ../compose/docker-compose.reference.yml
+  :language: YAML
 
-**Notes:**
-  * You can still run the netclient on the host system even if Client Mode is not enabled. It will just be managed like the netclient on any other nodes, and will not be automatically managed by thhe server/UI.
-  * You can change the port mappings in the Docker Compose if the listed ports are already in use.
 
-Assuming you have Docker and Docker Compose installed, you can just run the following, replacing **< Insert your-host IP Address Here >** with your host IP (or domain):
+DNS Mode Setup
+====================================
 
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.server-only.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
+If you plan on running the server in DNS Mode, know that a `CoreDNS Server <https://coredns.io/manual/toc/>`_ will be installed. CoreDNS is a light-weight, fast, and easy-to-configure DNS server. It is recommended to bind CoreDNS to port 53 of the host system, and it will do so by default. The clients will expect the nameserver to be on port 53, and many systems have issues resolving a different port.
 
-No DNS - CoreDNS Disabled, Client Enabled
-----------------------------------------------
+However, on your host system (for Netmaker), this may conflict with an existing process. On linux systems running systemd-resolved, there is likely a service consuming port 53. The below steps will disable systemd-resolved, and replace it with a generic (e.g. Google) nameserver. Be warned that this may have consequences for any existing private DNS configuration. The following was tested on Ubuntu 20.04 and should be run prior to deploying the docker containers.
 
-DNS Mode is currently limited to clients that can run resolvectl (systemd-resolved, see :doc:`Architecture docs <./architecture>` for more info). You may wish to disable DNS mode for various reasons. This installation option gives you the full feature set minus CoreDNS.
+.. code-block::
 
-**Prerequisites:**
-  * systemd linux (Debian or Ubuntu reccommended)
-  * sudo privileges
-  * WireGuard installed
-  * ports 80, 8081, and 50555 are not blocked by firewall
-  * ports 80, 8081, 50555, and 27017 are not in use
+  systemctl stop systemd-resolved
+  systemctl disable systemd-resolved 
+  vim /etc/systemd/resolved.conf
+    *  uncomment DNS and add 8.8.8.8 or whatever reachable nameserver is your preference  *
+    *  uncomment DNSStubListener and set to "no"  *
+  ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
 
-**Notes:** 
-  * You can change the port mappings in the Docker Compose if the listed ports are already in use.
-  * If you would like to run DNS Mode, but disable it on some clients, this is also an option. See the :doc:`client installation <./client-installation>` documentation for more details.
+Port 53 should now be available for CoreDNS to use.
 
-Assuming you have Docker and Docker Compose installed, you can just run the following, replacing **< Insert your-host IP Address Here >** with your host IP (or domain):
 
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.nodns.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
+Docker Compose Install
+=======================
 
-No DNS - CoreDNS Disabled, Client Enabled
+The most simple (and recommended) way of installing Netmaker is to use one of the provided `Docker Compose files <https://github.com/gravitl/netmaker/tree/master/compose>`_. Below are instructions for several different options to install Netmaker via Docker Compose, followed by an annotated reference Docker Compose in case your use case requires additional customization.
 
-No Client - DNS Enabled, Client Disabled
----------------------------------------------
+Test Install - No DNS, No Secure GRPC
+--------------------------------------------------------
+
+This install will run Netmaker on a server without HTTPS using an IP address. This is not secure and not recommended, but can be helpful for testing.
 
-You may want to provide DNS, but do not want to run the server with special privileges, in which case you can run with just Client Mode disabled. It requires no special privileges and can run on any system with Docker and Docker Compose. 
+It also does not run the CoreDNS server, to simplify the deployment
 
 **Prerequisites:**
-  * ports 80, 8081, 53, and 50051 are not blocked by firewall
-  * ports 80, 8081, 53, 50051, and 27017 are not in use
-  * DNS Mode Prerequisite Setup (see above)
+  * server ports 80, 8081, and 50051 are not blocked by firewall
 
 **Notes:** 
-  * You can still run the netclient on the host system even if Client Mode is not enabled. It will just be managed like the netclient on any other nodes, and will not be automatically managed by thhe server/UI.
   * You can change the port mappings in the Docker Compose if the listed ports are already in use.
 
 Assuming you have Docker and Docker Compose installed, you can just run the following, replacing **< Insert your-host IP Address Here >** with your host IP (or domain):
 
-#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.noclient.yml``
-#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml``
-#. ``docker-compose up -d``
+.. code-block::
 
+  wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.test.yml
+  sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml
+  docker-compose up -d`
 
-Reference Compose File - Annotated
---------------------------------------
 
-All environment variables and options are enabled in this file. It is the equivalent to running the "full install" from the above section. However, all environment variables are included, and are set to the default values provided by Netmaker (if the environment variable was left unset, it would not change the installation). Comments are added to each option to show how you might use it to modify your installation.
+No DNS - CoreDNS Disabled
+----------------------------------------------
 
-.. literalinclude:: ../compose/docker-compose.reference.yml
-  :language: YAML
+DNS Mode is currently limited to clients that can run resolvectl (systemd-resolved, see :doc:`Architecture docs <./architecture>` for more info). You may wish to disable DNS mode for various reasons. This installation option gives you the full feature set minus CoreDNS.
+
+To run without DNS, follow the :doc:`Quick Install <./quick-start>` guide, omitting the steps for DNS setup. In addition, when the guide has you pull (wget) the Netmaker docker-compose template, use the following link instead:
+
+#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.nodns.yml``
+
+This template is equivalent but omits CoreDNS.
 
 
 Linux Install without Docker
@@ -178,35 +177,44 @@ Linux Install without Docker
 
 Most systems support Docker, but some, such as LXC, do not. In such environments, there are many options for installing Netmaker. Netmaker is available as a binary file, and there is a zip file of the Netmaker UI static HTML on GitHub. Beyond the UI and Server, you need to install MongoDB and CoreDNS (optional). 
 
-Below is a guided set of instructions for installing without Docker on Ubuntu 20.04. Depending on your system, the steps may vary.
+To start, we recommend following the Nginx instructions in the :doc:`Quick Install <./quick-start>` guide to enable SSL for your environment.
 
-MongoDB Setup
+Once this is enabled and configured for a domain, you can continue with the below. The recommended server runs Ubuntu 20.04.
+
+rqlite Setup
 ----------------
-1. Install MongoDB on your server:
-    * For Ubuntu: `sudo apt install -y mongodb`
-    * For more advanced installation or other operating systems, see  the `MongoDB documentation <https://docs.mongodb.com/manual/administration/install-community/>`_.
+1. Install rqlite on your server: https://github.com/rqlite/rqlite
 
-2. Create a user:
-    * ``mongo admin``  
-    * > `db.createUser({ user: "mongoadmin" , pwd: "mongopass", roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]})`
+2. Run rqlite: rqlited -node-id 1 ~/node.1
 
 Server Setup
 -------------
-1. **Run the install script:** ``sudo curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/v0.3.5/scripts/netmaker-server.sh | sh -``
+1. **Run the install script:** 
+
+``sudo curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netmaker-server.sh | sh -``
+
 2. Check status:  ``sudo journalctl -u netmaker``
 3. If any settings are incorrect such as host or mongo credentials, change them under /etc/netmaker/config/environments/< your env >.yaml and then run ``sudo systemctl restart netmaker``
 
 UI Setup
 -----------
 
-The following uses NGinx as an http server. You may alternatively use Apache or any other web server that serves static web files.
+The following uses Nginx as an http server. You may alternatively use Apache or any other web server that serves static web files.
 
-1. **Download 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``
-2. **Unzip:** ``sudo unzip /usr/share/nginx/html/netmaker-ui.zip -d /usr/share/nginx/html``
-3. **Copy Config to Nginx:** ``sudo cp /usr/share/nginx/html/nginx.conf /etc/nginx/conf.d/default.conf``
-4. **Modify Default Config Path:** ``sudo sed -i 's/root \/var\/www\/html/root \/usr\/share\/nginx\/html/g' /etc/nginx/sites-available/default``
-5. **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'``
-6. **Start Nginx:** ``sudo systemctl start nginx``
+1. Download and Unzip UI asset files
+2. Copy Config to Nginx
+3. Modify Default Config Path
+4. Change Backend URL
+5. Start Nginx
+
+.. code-block::
+  
+  sudo wget -O /usr/share/nginx/html/netmaker-ui.zip https://github.com/gravitl/netmaker-ui/releases/download/latest/netmaker-ui.zip
+  sudo unzip /usr/share/nginx/html/netmaker-ui.zip -d /usr/share/nginx/html
+  sudo cp /usr/share/nginx/html/nginx.conf /etc/nginx/conf.d/default.conf
+  sudo sed -i 's/root \/var\/www\/html/root \/usr\/share\/nginx\/html/g' /etc/nginx/sites-available/default
+  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'
+  sudo systemctl start nginx
 
 CoreDNS Setup
 ----------------
@@ -214,167 +222,43 @@ CoreDNS Setup
 Kubernetes Install
 =======================
 
-**This configuration is coming soon.** It will allow you to deploy Netmaker on a Kubernetes cluster.
-
-Configuration Reference
-=========================
-
-The "Reference Compose File" (above) explains many of these options. However, it is important to understand fundamentally how Netmaker sets its configuration:
-
-1. Defaults
-2. Config File
-3. Environment Variables
-
-Variable Description
-----------------------
-
-SERVER_HOST: 
-    **Default:** Server will perform an IP check and set automatically unless explicitly set, or DISABLE_REMOTE_IP_CHECK is set to true, in which case it defaults to 127.0.0.1
-
-    **Description:** Sets the SERVER_HTTP_HOST and SERVER_GRPC_HOST variables if they are unset. The address where traffic comes in. 
-
-SERVER_HTTP_HOST: 
-    **Default:** Equals SERVER_HOST if set, "127.0.0.1" if SERVER_HOST is unset.
-    
-    **Description:** Set to make the HTTP and GRPC functions available via different interfaces/networks.
-
-SERVER_GRPC_HOST: 
-    **Default:** Equals SERVER_HOST if set, "127.0.0.1" if SERVER_HOST is unset.
-
-    **Description:** Set to make the HTTP and GRPC functions available via different interfaces/networks.
-
-API_PORT:  
-    **Default:** 8081 
-
-    **Description:** The HTTP API port for Netmaker. Used for API calls / communication from front end.
-
-GRPC_PORT:  
-    **Default:** 50051
-
-    **Description:** The GRPC port for Netmaker. Used for communications from nodes.
-
-MASTER_KEY:  
-    **Default:** "secretkey" 
-
-    **Description:** The admin master key for accessing the API. Change this in any production installation.
-
-CORS_ALLOWED_ORIGIN:  
-    **Default:** "*"
-
-    **Description:** The "allowed origin" for API requests. Change to restrict where API requests can come from.
-
-REST_BACKEND:  
-    **Default:** "on" 
-
-    **Description:** Enables the REST backend (API running on API_PORT at SERVER_HTTP_HOST). Change to "off" to turn off.
-
-AGENT_BACKEND:  
-    **Default:** "on" 
-
-    **Description:** Enables the AGENT backend (GRPC running on GRPC_PORT at SERVER_GRPC_HOST). Change to "off" to turn off.
-
-CLIENT_MODE:  
-    **Default:** "on" 
-
-    **Description:** Enables Client Mode, meaning netclient will be deployed on server and will be manageable from UI. Change to "off" to turn off.
-
-DNS_MODE:  
-    **Default:** "on"
-
-    **Description:** Enables DNS Mode, meaning config files will be generated for CoreDNS.
-
-DISABLE_REMOTE_IP_CHECK:  
-    **Default:** "off" 
-
-    **Description:** If turned "on", Server will not set Host based on remote IP check. This is already overridden if SERVER_HOST is set. Turned "off" by default.
-
-MONGO_ADMIN:  
-    **Default:** "mongoadmin" 
-
-    **Description:** Admin user for MongoDB.
-
-MONGO_PASS:  
-    **Default:** "mongopass" 
-
-    **Description:** Admin password for MongoDB.
-
-MONGO_HOST:  
-    **Default:** "127.0.0.1"
-
-    **Description:** Address of MongoDB.
-
-MONGO_PORT:  
-    **Default:** "27017"
-
-    **Description:** Port of MongoDB.
-
-MONGO_OPTS:  
-    **Default:** "/?authSource=admin"
+Server Install
+--------------------------
 
-    **Description:** Opts to enable admin login for Mongo.
+This template assumes your cluster uses Nginx for ingress with valid wildcard certificates. If using an ingress controller other than Nginx (ex: Traefik), you will need to manually modify the Ingress entries in this template to match your environment.
 
-SERVER_GRPC_WIREGUARD: 
-    **Default:** "on"
+This template also requires RWX storage. Please change references to storageClassName in this template to your cluster's Storage Class.
 
-    **Description:** Whether to run GRPC over a WireGuard network. On by default. Secures the server comms. Switch to "off" to turn off. If off and running in production, make sure to have certificates installed to secure GRPC communications. 
+``wget https://raw.githubusercontent.com/gravitl/netmaker/develop/kube/netmaker-template.yaml``
 
-SERVER_GRPC_WG_INTERFACE: 
-    **Default:** "nm-grpc-wg"
+Replace the NETMAKER_BASE_DOMAIN references to the base domain you would like for your Netmaker services (ui,api,grpc). Typically this will be something like **netmaker.yourwildcard.com**.
 
-    **Description:** Interface to use for GRPC WireGuard network if enabled
+``sed -i ‘s/NETMAKER_BASE_DOMAIN/<your base domain>/g’ netmaker-template.yaml``
 
-SERVER_GRPC_WG_ADDRESS:
-    **Default:** "10.101.0.1"
+Now, assuming Ingress and Storage match correctly with your cluster configuration, you can install Netmaker.
 
-    **Description:** Private Address to use for GRPC WireGuard network if enabled
+.. code-block::
 
-SERVER_GRPC_WG_ADDRESS_RANGE:
-    **Default:** "10.101.0.0/16"
+  kubectl create ns nm
+  kubectl config set-context --current --namespace=nm
+  kubectl apply -f netmaker-template.yaml -n nm
 
-    **Description:** Private Address range to use for GRPC WireGard clients if enabled. Gives 65,534 total addresses for all of netmaker. If running a larger network, will need to configure addresses differently, for instance using ipv6, or use certificates instead.
+In about 3 minutes, everything should be up and running:
 
-SERVER_GRPC_WG_PORT:
-    **Default:** 50555
+``kubectl get ingress nm-ui-ingress-nginx``
 
-    **Description:** Port to use for GRPC WireGuard if enabled
+Netclient Daemonset
+--------------------------
 
-SERVER_GRPC_WG_PUBKEY:
-    **Default:** < generated at startup >
+The following instructions assume you have Netmaker running and a network you would like to add your cluster into. The Netmaker server does not need to be running inside of a cluster for this.
 
-    **Description:** PublicKey for GRPC WireGuard interface. Generated if left blank.
+.. code-block::
 
-SERVER_GRPC_WG_PRIVKEY:
-    **Default:** < generated at startup >
-
-    **Description:** PrivateKey for GRPC WireGuard interface. Generated if left blank.
-
-SERVER_GRPC_WG_KEYREQUIRED
-    **Default:** ""
-
-    **Description:** Determines if an Access Key is required to join the Comms network. Blank (meaning 'no') by default. Set to "yes" to turn on.
-
-GRPC_SSL
-    **Default:** ""
-
-    **Description:** Specifies if GRPC is going over secure GRPC or SSL. This is a setting for the clients and is passed through the access token. Can be set to "on" and "off". Set to on if SSL is configured for GRPC.
-
-SERVER_API_CONN_STRING
-    **Default:** ""
-
-    **Description:**  Allows specification of the string used to connect to the server api. Format: IP:PORT or DOMAIN:PORT. Defaults to SERVER_HOST if not specified.
-
-SERVER_GRPC_CONN_STRING
-    **Default:** ""
-
-    **Description:**  Allows specification of the string used to connect to grpc. Format: IP:PORT or DOMAIN:PORT. Defaults to SERVER_HOST if not specified.
-
-Config File Reference
-----------------------
-A config file may be placed under config/environments/<env-name>.yml. To read this file at runtime, provide the environment variable ENV at runtime. For instance, dev.yml paired with ENV=dev. Netmaker will load the specified Config file. This allows you to store and manage configurations for different environments. Below is a reference Config File you may use.
-
-.. literalinclude:: ../config/environments/dev.yaml
-  :language: YAML
+  wget https://raw.githubusercontent.com/gravitl/netmaker/develop/kube/netclient-template.yaml
+  sed -i ‘s/ACCESS_TOKEN_VALUE/< your access token value>/g’ netclient-template.yaml
+  kubectl apply -f netclient-template.yaml
 
+For a more detailed guide on integrating Netmaker with MicroK8s, `check out this guide <https://itnext.io/how-to-deploy-a-cross-cloud-kubernetes-cluster-with-built-in-disaster-recovery-bbce27fcc9d7>`_. 
 
 Nginx Reverse Proxy Setup with https
 ====================================

+ 6 - 20
docs/support.rst

@@ -10,22 +10,15 @@ Does/Will Netmaker Support X Operating System?
 
 Netmaker is initially available on a limited number of operating systems for good reason: Every operating system is designed differently. With a small team, we can either focus on making Netmaker do a lot on a few number of operating systems, or a little on a bunch of operating systems. We chose the first option. You can view the System Compatibility docs for more info, but in general, you should only be using Netmaker on systemd linux right now.
 
-However, as of v0.4, we will technically be able to bring any operating system into the network. This is a bit of a hack. v0.4 introduces Ingress Gateways. Think of it this way. You set up a private network. You want devices to access it. You set up a single node as an "Ingress Gateway" and generate config files for "external clients." These clients are unmanaged and unmeshed, meaning they can access the network but only via the gateway. It also means they will not automatically account for changes to the network, and the user will have to update the configs manually.
+However, via "external clients", any device that supports WireGuard can be added to the network. 
 
-This lets us immediately "support" any device which can run WireGuard, which includes most operating systems at this point including phones and Windows.
-
-As we stabilize the design and feature set of Netmaker, we will expand the operating system support for Netclient which configures dynamic, fully-meshed devices. Expect to see updates about new OS support every few weeks, until eventually the Ingress Gateway becomes unnecessary (though you will still want it for certain use cases).
+In future iterations will expand the operating system support for Netclient, and devices that must use the "external client" feature can switch to Netclient.
 
 How do I install the Netclient on X?
 ---------------------------------------
 
 As per the above, there are many unsupported operating systems. You are still welcome to try, it is just an executable binary file after all. If the system is unix-based and has kernel WireGuard installed, netclient may very well mesh the device into the network. However, the service likely will encounter problems retrieving updates.
 
-Why MongoDB? SQL is better and smaller.
-----------------------------------------
-
-We are in a phase of rapid iteration. Every week the database schema changes. MongoDB makes our development process much more flexible. That said, we agree! SQL will be better for production, and indeed, we plan to switch over to SQL before v1.0, so please be patient with the resource consumption of MongoDB for the time being; it is helping to support a rapid pace of development. 
-
 
 Is Netmaker a VPN like NordNPN?
 --------------------------------
@@ -41,10 +34,11 @@ https://github.com/pivpn/pivpn
 https://github.com/subspacecloud/subspace
 https://github.com/mullvad/mullvadvpn-app
 
-Do you offer any paid support?
----------------------------------
+Do you offer any enterprise support?
+--------------------------------------
+
+If you are interested in enterprise support for your project, please contact [email protected].
 
-Not at this time, but eventually we will. If you are interested, or if you are interested in sponsoring the project generally, please contact Alex Feiszli ([email protected]).
 
 Why the SSPL License?
 ----------------------
@@ -57,14 +51,6 @@ If you have concerns about the license leading to project restrictions down the
 
 All that said, we will re-evaluate the license on a regular basis and determine if an OSI-approved license makes more sense. It's just easier to move from SSPL to another license than vice-versa.
 
-Issues, Bugs, and Feature Requests
-=====================================
-
-Issues / Bugs
-----------------
-
-Feature Requests
--------------------
 
 Contact
 ===========

+ 75 - 1
docs/troubleshoot.rst

@@ -3,17 +3,91 @@ Troubleshooting
 =================
 
 Common Issues
----------------
+--------------
+**How can I connect my Android, IOS, MacOS or Windows device to my Netmaker VPN?**
+  Currently meshing one of these devices is not supported, however it will be soon. 
+  For now you can connect to your VPN by making one of the nodes an Ingressgateway, then 
+  create an Ext Client for each device. Finally, use the official WG app or another 
+  WG configuration app to connect via QR or downloading the device's WireGuard configuration. 
+
+**I've made changes to my nodes but the nodes themselves haven't updated yet, why?**
+  Please allow your nodes to complete a check in or two, in order to reconfigure themselves.
+  In some cases, it could take up to a minute or so.
+
+**Do I have to use access keys to join a network?**
+  Although keys are the preferred way to join a network, Netmaker does allow for manual node sign-ups.
+  Simply turn on "allow manual signups" on your network and nodes will not connect until you manually aprove each one.
+
+**Is there a community or forum to ask questions about Netmaker?**
+  Yes, we have an active `discord <https://discord.gg/Pt4T9y9XK8>`_ community and issues on our `github <https://github.com/gravitl/netmaker/issues>`_ are answered frequently!
+  You can also sign-up for updates at our `gravitl site <https://gravitl.com/>`_!
 
 Server
 -------
+**Can I secure/encrypt all the traffic to my server and UI?**
+  This can fairly simple to achieve assuming you have access to a domain and are familiar with Nginx.
+  Please refer to the quick-start guide to see!
+
+**Can I connect multiple nodes (mesh clients) behind a single firewall/router?**
+  Yes! As of version 0.7 Netmaker supports UDP Hole Punching to allow this, without the use of a third party STUN server!
+  Is UDP hole punching a risk for you? Well you can turn it off and make static nodes/ports for the server to refer to as well.
+
+**What are the minimum specs to run the server?**
+  We recommend at least 1 CPU and 2 GB Memory.
+
+**Does this support IPv6 addressing?**
+  Yes, Netmaker supports IPv6 addressing. When you create a network, just make sure to turn on Dual Stack.
+  Nodes will be given IPv6 addresses along with their IPv4 address. It does not currently support IPv6 only.
+
+**Does Netmaker support Raft Consensus?**
+  Netmaker does not directly support it, but it uses `rqlite <https://github.com/rqlite/rqlite>`_ (which supports Raft) as the database.
+
+**How do I uninstall Netmaker?**
+  There is no official uninstall script for the Netmaker server at this time. If you followed the quick-start guide, simply run ``sudo docker-compose -f docker-compose.quickstart.yml down --volumes``
+  to completely wipe your server. Otherwise kill the running binary and it's up to you to remove database records/volumes.
 
 UI
 ----
+**I want to make a seperate network and give my friend access to only that network.**
+  Simply navigate to the UI (as an admin account). Select users in the top left and create them an account.
+  Select the network(s) to give them and they should be good to go! They are an admin of that network(s) only now.
+
+**I'm done with an access key, can I delete it?**
+  Simply navigate to the UI (as an admin account). Select your network of interest, then the select the ``Access Keys`` tab.
+  Then delete the rogue access key.
+
+**I can't delete my network, why?**
+  You **MUST** remove all nodes in a network before you can delete it.
+
+**Can I have multiple nodes with the same name?**
+  Yes, nodes can share names without issue. It may just be harder on you to know which is which.
 
 Agent
 -------
+**How do I connect a node to my Netmaker network with Netclient?**
+  First get your access token (not just access key), then run ``sudo netclient join -t <access token>``.
+  **NOTE:** netclient may be under /etc/netclient/, i.e run ``sudo /etc/netclient/netclient join -t <access token>``
+
+**How do I disconnect a node on a Netmaker network?**
+  In order to leave a Netmaker network, run ``sudo netclient leave -n <network-name>``
+
+**How do I check the logs of my agent on a node?**
+  You will need sudo/root permissions, but you can run ``sudo systemctl status netclient@<insert network name>``
+  or you may also run ``sudo journalctl -u netclient@<network name>``. 
+  Note for journalctl: you should hit the ``end`` key to get to view the most recent logs quickly or use ``journalctl -u netclient@<network name> -f`` instead.
+
+**Can I check the configuration of my node on the node?**
+  **A:** Yes, on the node simply run ``sudo cat /etc/netclient/netconfig-<network name>`` and you should see what your current configuration is! 
+  You can also see the current WireGuard configuration with ``sudo wg show``
+
+**I am done with the agent on my machine, can I uninstall it?**
+  Yes, on the node simply run ``sudo /etc/netclient/netclient uninstall``. 
+
 
 CoreDNS
 --------
+**Is CoreDNS required to use Netmaker?**
+  CoreDNS is not required. Simply start your server with ``DNS_MODE="off"``.
 
+**What is the minimum DNS entry value I can use?**
+  Netmaker supports down to two characters for DNS names for your networks domains**

+ 3 - 18
docs/usage.rst

@@ -19,21 +19,6 @@ Video Tutorials
 
 Written Tutorials
 -----------------
-* `Kubernetes Cross-cloud cluster <https://itnext.io/how-to-deploy-a-single-kubernetes-cluster-across-multiple-clouds-using-k3s-and-wireguard-a5ae176a6e81>`_: Tutorial on setting up cross-cloud Kubernetes clusters using Netmaker.
-
-Basic
-=====
-
-Local Network
-=============
-  
-Site-to-Site
-============
-
-Dual Stack with IPv6
-====================
-
-Kubernetes Node Network
-========================
-
-
+* `K3s Cross-cloud cluster <https://itnext.io/how-to-deploy-a-single-kubernetes-cluster-across-multiple-clouds-using-k3s-and-wireguard-a5ae176a6e81>`_: Tutorial on setting up cross-cloud K3s clusters using Netmaker.
+* `MicroK8s Cross-cloud cluster <https://itnext.io/how-to-deploy-a-cross-cloud-kubernetes-cluster-with-built-in-disaster-recovery-bbce27fcc9d7>`_: Tutorial on setting up cross-cloud MicroK8s clusters using Netmaker.
+* `Secure access to private services <https://afeiszli.medium.com/how-to-enable-secure-access-to-your-hosted-services-using-netmaker-and-wireguard-1b3282d4b7aa>`_: Tutorial on setting up secure Nextcloud with Netmaker.

+ 29 - 12
functions/helpers.go

@@ -264,7 +264,7 @@ func NetworkNodesUpdateAction(networkName string, action string) error {
 			node.SetID()
 			database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
 		}
- 	}
+	}
 	return nil
 }
 
@@ -546,6 +546,31 @@ func GetNodeByMacAddress(network string, macaddress string) (models.Node, error)
 	return node, nil
 }
 
+func GetDeletedNodeByMacAddress(network string, macaddress string) (models.Node, error) {
+
+	var node models.Node
+
+	key, err := GetRecordKey(macaddress, network)
+	if err != nil {
+		return node, err
+	}
+
+	record, err := database.FetchRecord(database.DELETED_NODES_TABLE_NAME, key)
+	if err != nil {
+		return models.Node{}, err
+	}
+
+	if err = json.Unmarshal([]byte(record), &node); err != nil {
+		return models.Node{}, err
+	}
+
+	return node, nil
+}
+
+func RemoveDeletedNode(nodeid string) bool {
+	return database.DeleteRecord(database.DELETED_NODES_TABLE_NAME, nodeid) == nil
+}
+
 func DeleteAllIntClients() error {
 	err := database.DeleteAllRecords(database.INT_CLIENTS_TABLE_NAME)
 	if err != nil {
@@ -646,9 +671,7 @@ func UniqueAddress6(networkName string) (string, error) {
 		return "", err
 	}
 	if network.IsDualStack == "no" {
-		if networkName != "comms" {
-			return "", nil
-		}
+		return "", nil
 	}
 
 	offset := true
@@ -662,14 +685,8 @@ func UniqueAddress6(networkName string) (string, error) {
 			offset = false
 			continue
 		}
-		if networkName == "comms" {
-			if IsIPUnique(networkName, ip.String(), database.INT_CLIENTS_TABLE_NAME, true) {
-				return ip.String(), err
-			}
-		} else {
-			if IsIPUnique(networkName, ip.String(), database.NODES_TABLE_NAME, true) {
-				return ip.String(), err
-			}
+		if IsIPUnique(networkName, ip.String(), database.NODES_TABLE_NAME, true) {
+			return ip.String(), err
 		}
 	}
 	//TODO

+ 63 - 59
functions/jwt.go

@@ -1,87 +1,91 @@
 package functions
 
 import (
-    "time"
-    "github.com/gravitl/netmaker/models"
-    "github.com/gravitl/netmaker/servercfg"
-    "github.com/dgrijalva/jwt-go"
+	"errors"
+	"time"
+	"github.com/golang-jwt/jwt/v4"
+	"github.com/gravitl/netmaker/models"
+	"github.com/gravitl/netmaker/servercfg"
 )
 
 var jwtSecretKey = []byte("(BytesOverTheWire)")
 
 // CreateJWT func will used to create the JWT while signing in and signing out
 func CreateJWT(macaddress string, network string) (response string, err error) {
-    expirationTime := time.Now().Add(5 * time.Minute)
-    claims := &models.Claims{
-        MacAddress: macaddress,
-        Network: network,
-        StandardClaims: jwt.StandardClaims{
-            ExpiresAt: expirationTime.Unix(),
-        },
-    }
+	expirationTime := time.Now().Add(5 * time.Minute)
+	claims := &models.Claims{
+		MacAddress: macaddress,
+		Network:    network,
+		StandardClaims: jwt.StandardClaims{
+			ExpiresAt: expirationTime.Unix(),
+		},
+	}
 
-    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
-    tokenString, err := token.SignedString(jwtSecretKey)
-    if err == nil {
-        return tokenString, nil
-    }
-    return "", err
+	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
+	tokenString, err := token.SignedString(jwtSecretKey)
+	if err == nil {
+		return tokenString, nil
+	}
+	return "", err
 }
 
 func CreateUserJWT(username string, networks []string, isadmin bool) (response string, err error) {
-    expirationTime := time.Now().Add(60 * time.Minute)
-    claims := &models.UserClaims{
-        UserName: username,
-	Networks: networks,
-	IsAdmin: isadmin,
-        StandardClaims: jwt.StandardClaims{
-            ExpiresAt: expirationTime.Unix(),
-        },
-    }
+	expirationTime := time.Now().Add(60 * 12 * time.Minute)
+	claims := &models.UserClaims{
+		UserName: username,
+		Networks: networks,
+		IsAdmin:  isadmin,
+		StandardClaims: jwt.StandardClaims{
+			ExpiresAt: expirationTime.Unix(),
+		},
+	}
 
-    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
-    tokenString, err := token.SignedString(jwtSecretKey)
-    if err == nil {
-        return tokenString, nil
-    }
-    return "", err
+	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
+	tokenString, err := token.SignedString(jwtSecretKey)
+	if err == nil {
+		return tokenString, nil
+	}
+	return "", err
 }
 
 // VerifyToken func will used to Verify the JWT Token while using APIS
 func VerifyUserToken(tokenString string) (username string, networks []string, isadmin bool, err error) {
-    claims := &models.UserClaims{}
+	claims := &models.UserClaims{}
 
-    if tokenString == servercfg.GetMasterKey() {
-        return "masteradministrator", nil, true, nil
-    }
+	if tokenString == servercfg.GetMasterKey() {
+		return "masteradministrator", nil, true, nil
+	}
 
-    token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
-        return jwtSecretKey, nil
-    })
+	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
+		return jwtSecretKey, nil
+	})
 
-    if token != nil {
-        return claims.UserName, claims.Networks, claims.IsAdmin, nil
-    }
-    return "", nil, false, err
+	if token != nil && token.Valid {
+		// check that user exists
+		if user, err := GetUser(claims.UserName); user.UserName != "" && err == nil {
+			return claims.UserName, claims.Networks, claims.IsAdmin, nil
+		}
+		err = errors.New("user does not exist")
+	}
+	return "", nil, false, err
 }
 
-// VerifyToken func will used to Verify the JWT Token while using APIS
+// GRPC [nodes] Only
 func VerifyToken(tokenString string) (macaddress string, network string, err error) {
-    claims := &models.Claims{}
+	claims := &models.Claims{}
 
-    //this may be a stupid way of serving up a master key
-    //TODO: look into a different method. Encryption?
-    if tokenString == servercfg.GetMasterKey() {
-        return "mastermac", "", nil
-    }
+	//this may be a stupid way of serving up a master key
+	//TODO: look into a different method. Encryption?
+	if tokenString == servercfg.GetMasterKey() {
+		return "mastermac", "", nil
+	}
 
-    token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
-        return jwtSecretKey, nil
-    })
+	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
+		return jwtSecretKey, nil
+	})
 
-    if token != nil {
-        return claims.MacAddress, claims.Network, nil
-    }
-    return "", "", err
+	if token != nil {
+		return claims.MacAddress, claims.Network, nil
+	}
+	return "", "", err
 }
-

+ 1 - 3
go.mod

@@ -5,9 +5,9 @@ go 1.15
 require (
 	github.com/aws/aws-sdk-go v1.34.28
 	github.com/davecgh/go-spew v1.1.1
-	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/go-playground/validator/v10 v10.5.0
 	github.com/go-sql-driver/mysql v1.6.0 // indirect
+	github.com/golang-jwt/jwt/v4 v4.0.0
 	github.com/golang/protobuf v1.5.2
 	github.com/gorilla/handlers v1.5.1
 	github.com/gorilla/mux v1.8.0
@@ -19,8 +19,6 @@ require (
 	github.com/txn2/txeh v1.3.0
 	github.com/urfave/cli v1.22.5 // indirect
 	github.com/urfave/cli/v2 v2.3.0
-	github.com/vishvananda/netlink v1.1.0
-	go.mongodb.org/mongo-driver v1.4.3
 	golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
 	golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect
 	golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 // indirect

+ 2 - 0
go.sum

@@ -62,6 +62,8 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe
 github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
 github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
 github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
+github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o=
+github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=

+ 2 - 2
kube/netclient-daemonset.yaml

@@ -17,7 +17,7 @@ spec:
       hostNetwork: true
       containers:
       - name: netclient
-        image: gravitl/netclient:v0.5.5
+        image: gravitl/netclient:v0.7
         command: ['bash', '-c', "netclient checkin -n $NETWORK; sleep $SLEEP"]
         env:
         - name: ACCESS_TOKEN
@@ -35,7 +35,7 @@ spec:
           privileged: true
       initContainers:
       - name: netclient-join
-        image: gravitl/netclient:v0.5.5
+        image: gravitl/netclient:v0.7
         command: ['bash', '-c', "netclient join -t $ACCESS_TOKEN --daemon off"]
         env:
         - name: ACCESS_TOKEN

+ 2 - 2
kube/netmaker-template.yaml

@@ -76,7 +76,7 @@ spec:
     spec:
       containers:
       - name: netmaker-backend
-        image: gravitl/netmaker:v0.5.8
+        image: gravitl/netmaker:v0.7
         ports:
         - containerPort: 8081
         volumeMounts:
@@ -256,7 +256,7 @@ spec:
     spec:
       containers:
       - name: netmaker-ui
-        image: gravitl/netmaker-ui:v0.5
+        image: gravitl/netmaker-ui:v0.7
         ports:
         - containerPort: 80
         env:

+ 0 - 32
models/extclient.go

@@ -1,38 +1,6 @@
 package models
 
-import (
-	"go.mongodb.org/mongo-driver/bson/primitive"
-)
-//What the client needs to get
-/*
-
-[Interface]
-# The address their computer will use on the network
-Address = 10.0.0.8/32 # The Address they'll use on the network
-PrivateKey = XXXXXXXXXXXXXXXX # The private key they'll use
-
-
-# All of this info can come from the node!!
-[Peer]
-# Ingress Gateway's wireguard public key
-PublicKey = CcZHeaO08z55/x3FXdsSGmOQvZG32SvHlrwHnsWlGTs=
-
-# Public IP address of the Ingress Gateway
-# Use the floating IP address if you created one for your VPN server
-Endpoint = 123.123.123.123:51820
-
-# 10.0.0.0/24 is the VPN sub
-
-*/
-
-
-// External Struct
-// == BACKEND FIELDS ==
-// PrivateKey, PublicKey, Address (Private), LastModified, IngressEndpoint
-// == FRONTEND FIELDS ==
-// ClientID, Network, IngressGateway
 type ExtClient struct {
-	ID             primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
 	ClientID       string             `json:"clientid" bson:"clientid"`
 	Description       string             `json:"description" bson:"description"`
 	PrivateKey     string             `json:"privatekey" bson:"privatekey"`

+ 100 - 51
models/names.go

@@ -5,7 +5,7 @@ import (
 	"time"
 )
 
-// 5-7 chars only
+// 4-7 chars only
 var NAMES = []string{
 	"logic",
 	"warrant",
@@ -32,7 +32,6 @@ var NAMES = []string{
 	"python",
 	"mohawk",
 	"arctic",
-	"linear",
 	"rival",
 	"vibes",
 	"delay",
@@ -65,7 +64,6 @@ var NAMES = []string{
 	"clutch",
 	"shark",
 	"leader",
-	"smelly",
 	"young",
 	"robot",
 	"squish",
@@ -73,7 +71,7 @@ var NAMES = []string{
 	"rocket",
 	"space",
 	"queen",
-	"royal",
+	"royalty",
 	"flush",
 	"earth",
 	"planet",
@@ -92,31 +90,71 @@ var NAMES = []string{
 	"goose",
 	"pepper",
 	"melissa",
+	"alex",
+	"elon",
+	"yeet",
+	"meh",
+	"walrus",
+	"avatar",
+	"chicken",
+	"proton",
+	"mohawk",
+	"tattoo",
+	"zebra",
+	"star",
+	"butter",
+	"tango",
+	"homie",
+	"rambo",
+	"cosmo",
+	"bubbles",
+	"hulk",
+	"pluto",
+	"scooby",
+	"thanos",
+	"yoda",
+	"draco",
+	"goofy",
+	"ditto",
+	"puff",
+	"duck",
+	"mouse",
+	"akita",
+	"water",
+	"hound",
+	"baby",
+	"spider",
+	"squid",
+	"roach",
+	"crab",
+	"cougar",
+	"cyborg",
+	"android",
+	"being",
+	"ninja",
+	"unicorn",
+	"zombie",
+	"warrior",
+	"zamboni",
+	"life",
+	"marine",
+	"node",
+	"mother",
+	"father",
+	"tesla",
 }
 
 // must be 4 chars or less
 var SMALL_NAMES = []string{
 	"ace",
-	"tank",
-	"alex",
-	"dude",
+	"odd",
+	"hot",
+	"ill",
 	"root",
 	"sudo",
-	"mars",
-	"meow",
-	"elon",
-	"musk",
 	"moon",
 	"beef",
-	"tack",
-	"matt",
-	"soon",
-	"man",
-	"sup",
-	"yo",
 	"bro",
-	"john",
-	"drop",
 	"dank",
 	"red",
 	"gold",
@@ -128,7 +166,6 @@ var SMALL_NAMES = []string{
 	"lil",
 	"mom",
 	"bot",
-	"farm",
 	"evil",
 	"good",
 	"holy",
@@ -137,53 +174,65 @@ var SMALL_NAMES = []string{
 	"sad",
 	"mad",
 	"chad",
-	"hat",
 	"pre",
 	"post",
 	"foot",
 	"soft",
 	"hard",
-	"bob",
-	"tree",
 	"lite",
-	"fish",
 	"dark",
 	"true",
-	"cat",
-	"dog",
-	"wow",
-	"yay",
-	"yeet",
-	"zoo",
 	"toy",
-	"boy",
 	"soy",
 	"rude",
 	"nice",
-	"cow",
-	"meh",
-	"shoe",
-	"sock",
-	"toe",
-	"nail",
-	"hair",
-	"nose",
-	"ear",
-	"tear",
-	"lad",
-	"taco",
-	"star",
-	"sun",
-	"ship",
-	"pack",
-	"mule",
-	"drag",
-	"king",
+	"fun",
+	"fat",
+	"pro",
+	"sly",
+	"tan",
+	"pet",
+	"fine",
+	"main",
+	"last",
+	"wide",
+	"free",
+	"open",
+	"poor",
+	"rich",
+	"next",
+	"real",
+	"long",
+	"huge",
+	"wild",
+	"sick",
+	"weak",
+	"firm",
+	"pink",
+	"okay",
+	"dull",
+	"loud",
+	"lazy",
+	"dumb",
+	"tidy",
+	"idle",
+	"bony",
+	"cute",
+	"oily",
+	"lame",
+	"mega",
+	"limp",
+	"wavy",
+	"edgy",
+	"nosy",
+	"zany",
+	"base",
+	"cold",
 }
 
 func GenerateNodeName() string {
 	rand.Seed(time.Now().UnixNano())
-	return NAMES[rand.Intn(len(SMALL_NAMES))] + "-" + NAMES[seededRand.Intn(len(NAMES))]
+	return SMALL_NAMES[rand.Intn(len(SMALL_NAMES))] + "-" + NAMES[seededRand.Intn(len(NAMES))]
 }
 
 func RetrieveLogo() string {

+ 29 - 5
models/node.go

@@ -57,7 +57,7 @@ type Node struct {
 	IsIngressGateway    string   `json:"isingressgateway" bson:"isingressgateway" yaml:"isingressgateway"`
 	EgressGatewayRanges []string `json:"egressgatewayranges" bson:"egressgatewayranges" yaml:"egressgatewayranges"`
 	IngressGatewayRange string   `json:"ingressgatewayrange" bson:"ingressgatewayrange" yaml:"ingressgatewayrange"`
-	IsStatic	        string   `json:"isstatic" bson:"isstatic" yaml:"isstatic" validate:"checkyesorno"`
+	IsStatic            string   `json:"isstatic" bson:"isstatic" yaml:"isstatic" validate:"checkyesorno"`
 	UDPHolePunch        string   `json:"udpholepunch" bson:"udpholepunch" yaml:"udpholepunch" validate:"checkyesorno"`
 	PullChanges         string   `json:"pullchanges" bson:"pullchanges" yaml:"pullchanges" validate:"checkyesorno"`
 	DNSOn               string   `json:"dnson" bson:"dnson" yaml:"dnson" validate:"checkyesorno"`
@@ -70,6 +70,24 @@ type Node struct {
 	IPForwarding        string   `json:"ipforwarding" bson:"ipforwarding" yaml:"ipforwarding" validate:"checkyesorno"`
 }
 
+func (node *Node) SetDefaulIsPending() {
+	if node.IsPending == "" {
+		node.IsPending = "no"
+	}
+}
+
+func (node *Node) SetDefaultEgressGateway() {
+	if node.IsEgressGateway == "" {
+		node.IsEgressGateway = "no"
+	}
+}
+
+func (node *Node) SetDefaultIngressGateway() {
+	if node.IsIngressGateway == "" {
+		node.IsIngressGateway = "no"
+	}
+}
+
 func (node *Node) SetDefaultAction() {
 	if node.Action == "" {
 		node.Action = NODE_NOOP
@@ -220,7 +238,10 @@ func (node *Node) SetDefaults() {
 			node.UDPHolePunch = "yes"
 		}
 	}
+	// == Parent Network settings ==
 	node.CheckInInterval = parentNetwork.DefaultCheckInInterval
+	node.IsDualStack = parentNetwork.IsDualStack
+	// == node defaults if not set by parent ==
 	node.SetIPForwardingDefault()
 	node.SetDNSOnDefault()
 	node.SetIsLocalDefault()
@@ -235,6 +256,9 @@ func (node *Node) SetDefaults() {
 	node.SetID()
 	node.SetIsServerDefault()
 	node.SetIsStaticDefault()
+	node.SetDefaultEgressGateway()
+	node.SetDefaultIngressGateway()
+	node.SetDefaulIsPending()
 	node.KeyUpdateTimeStamp = time.Now().Unix()
 }
 
@@ -242,10 +266,10 @@ func (newNode *Node) Fill(currentNode *Node) {
 	if newNode.ID == "" {
 		newNode.ID = currentNode.ID
 	}
-	if newNode.Address == ""  && newNode.IsStatic != "yes"{
+	if newNode.Address == "" && newNode.IsStatic != "yes" {
 		newNode.Address = currentNode.Address
 	}
-	if newNode.Address6 == ""  && newNode.IsStatic != "yes"{
+	if newNode.Address6 == "" && newNode.IsStatic != "yes" {
 		newNode.Address6 = currentNode.Address6
 	}
 	if newNode.LocalAddress == "" {
@@ -254,7 +278,7 @@ func (newNode *Node) Fill(currentNode *Node) {
 	if newNode.Name == "" {
 		newNode.Name = currentNode.Name
 	}
-	if newNode.ListenPort == 0  && newNode.IsStatic != "yes"{
+	if newNode.ListenPort == 0 && newNode.IsStatic != "yes" {
 		newNode.ListenPort = currentNode.ListenPort
 	}
 	if newNode.PublicKey == "" && newNode.IsStatic != "yes" {
@@ -262,7 +286,7 @@ func (newNode *Node) Fill(currentNode *Node) {
 	} else {
 		newNode.KeyUpdateTimeStamp = time.Now().Unix()
 	}
-	if newNode.Endpoint == ""  && newNode.IsStatic != "yes"{
+	if newNode.Endpoint == "" && newNode.IsStatic != "yes" {
 		newNode.Endpoint = currentNode.Endpoint
 	}
 	if newNode.PostUp == "" {

+ 1 - 1
models/structs.go

@@ -1,6 +1,6 @@
 package models
 
-import jwt "github.com/dgrijalva/jwt-go"
+import jwt "github.com/golang-jwt/jwt/v4"
 
 type AuthParams struct {
 	MacAddress string `json:"macaddress"`

+ 0 - 17
models/wglink.go

@@ -1,17 +0,0 @@
-package models
-
-import (
-        "github.com/vishvananda/netlink"
-)
-
-type WireGuardLink struct {
-	LinkAttrs *netlink.LinkAttrs
-}
-
-func (link *WireGuardLink) Type() string {
-	return "wireguard"
-}
-
-func (link *WireGuardLink) Attrs() *netlink.LinkAttrs {
-	return link.LinkAttrs
-}

+ 1 - 6
netclient/command/commands.go

@@ -121,13 +121,8 @@ func List(cfg config.ClientConfig) error {
 	return err
 }
 
-func Uninstall(cfg config.GlobalConfig) error {
+func Uninstall() error {
 	log.Println("Uninstalling netclient")
 	err := functions.Uninstall()
-	err = functions.Unregister(cfg)
-	return err
-}
-func Unregister(cfg config.GlobalConfig) error {
-	err := functions.Unregister(cfg)
 	return err
 }

+ 0 - 99
netclient/config/config.go

@@ -60,29 +60,6 @@ func Write(config *ClientConfig, network string) error {
 	return err
 }
 
-//reading in the env file
-func WriteGlobal(config *GlobalConfig) error {
-	_, err := os.Stat("/etc/netclient")
-	if os.IsNotExist(err) {
-		os.Mkdir("/etc/netclient", 744)
-	} else if err != nil {
-		return err
-	}
-	home := "/etc/netclient"
-
-	if err != nil {
-		log.Fatal(err)
-	}
-	file := fmt.Sprintf(home + "/netconfig-global-001")
-	f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm)
-	defer f.Close()
-
-	err = yaml.NewEncoder(f).Encode(config)
-	if err != nil {
-		return err
-	}
-	return err
-}
 func WriteServer(server string, accesskey string, network string) error {
 	if network == "" {
 		err := errors.New("No network provided. Exiting.")
@@ -197,58 +174,6 @@ func (config *ClientConfig) ReadConfig() {
 		}
 	}
 }
-func ModGlobalConfig(cfg models.IntClient) error {
-	var modconfig GlobalConfig
-	var err error
-	if FileExists("/etc/netclient/netconfig-global-001") {
-		useconfig, err := ReadGlobalConfig()
-		if err != nil {
-			return err
-		}
-		modconfig = *useconfig
-	}
-	if cfg.ServerWGPort != "" {
-		modconfig.Client.ServerWGPort = cfg.ServerWGPort
-	}
-	if cfg.ServerGRPCPort != "" {
-		modconfig.Client.ServerGRPCPort = cfg.ServerGRPCPort
-	}
-	if cfg.ServerAPIPort != "" {
-		modconfig.Client.ServerAPIPort = cfg.ServerAPIPort
-	}
-	if cfg.PublicKey != "" {
-		modconfig.Client.PublicKey = cfg.PublicKey
-	}
-	if cfg.PrivateKey != "" {
-		modconfig.Client.PrivateKey = cfg.PrivateKey
-	}
-	if cfg.ServerPublicEndpoint != "" {
-		modconfig.Client.ServerPublicEndpoint = cfg.ServerPublicEndpoint
-	}
-	if cfg.ServerPrivateAddress != "" {
-		modconfig.Client.ServerPrivateAddress = cfg.ServerPrivateAddress
-	}
-	if cfg.Address != "" {
-		modconfig.Client.Address = cfg.Address
-	}
-	if cfg.Address6 != "" {
-		modconfig.Client.Address6 = cfg.Address6
-	}
-	if cfg.Network != "" {
-		modconfig.Client.Network = cfg.Network
-	}
-	if cfg.ServerKey != "" {
-		modconfig.Client.ServerKey = cfg.ServerKey
-	}
-	if cfg.AccessKey != "" {
-		modconfig.Client.AccessKey = cfg.AccessKey
-	}
-	if cfg.ClientID != "" {
-		modconfig.Client.ClientID = cfg.ClientID
-	}
-	err = WriteGlobal(&modconfig)
-	return err
-}
 
 func ModConfig(node *models.Node) error {
 	network := node.Network
@@ -397,30 +322,6 @@ func ReadConfig(network string) (*ClientConfig, error) {
 	return &cfg, err
 }
 
-func ReadGlobalConfig() (*GlobalConfig, error) {
-	nofile := false
-	home := "/etc/netclient"
-	file := fmt.Sprintf(home + "/netconfig-global-001")
-	f, err := os.Open(file)
-
-	if err != nil {
-		nofile = true
-	}
-	defer f.Close()
-
-	var cfg GlobalConfig
-
-	if !nofile {
-		decoder := yaml.NewDecoder(f)
-		err = decoder.Decode(&cfg)
-		if err != nil {
-			fmt.Println("trouble decoding file")
-			return nil, err
-		}
-	}
-	return &cfg, err
-}
-
 func FileExists(f string) bool {
 	info, err := os.Stat(f)
 	if os.IsNotExist(err) {

BIN
netclient/functions/.logging.go.swp


+ 26 - 22
netclient/functions/checkin.go

@@ -5,6 +5,7 @@ import (
 	"encoding/json"
 	"errors"
 	"log"
+	"strings"
 
 	nodepb "github.com/gravitl/netmaker/grpc"
 	"github.com/gravitl/netmaker/models"
@@ -19,12 +20,15 @@ import (
 	//homedir "github.com/mitchellh/go-homedir"
 )
 
+func isDeleteError(err error) bool {
+	return err != nil && strings.Contains(err.Error(), models.NODE_DELETE)
+}
+
 func checkIP(node *models.Node, servercfg config.ServerConfig, cliconf config.ClientConfig, network string) bool {
 	ipchange := false
 	var err error
 	if node.Roaming == "yes" && node.IsStatic != "yes" {
 		if node.IsLocal == "no" {
-			log.Println("Checking to see if public addresses have changed")
 			extIP, err := getPublicIP()
 			if err != nil {
 				log.Println("error encountered checking ip addresses:", err)
@@ -48,7 +52,6 @@ func checkIP(node *models.Node, servercfg config.ServerConfig, cliconf config.Cl
 				ipchange = true
 			}
 		} else {
-			log.Println("Checking to see if local addresses have changed")
 			localIP, err := getLocalIP(node.LocalRange)
 			if err != nil {
 				log.Println("error encountered checking ip addresses:", err)
@@ -80,28 +83,26 @@ func checkIP(node *models.Node, servercfg config.ServerConfig, cliconf config.Cl
 
 func setDNS(node *models.Node, servercfg config.ServerConfig, nodecfg *models.Node) {
 	if nodecfg.DNSOn == "yes" {
-		log.Println("setting dns")
 		ifacename := node.Interface
 		nameserver := servercfg.CoreDNSAddr
 		network := node.Network
-		_ = local.UpdateDNS(ifacename, network, nameserver)
+		local.UpdateDNS(ifacename, network, nameserver)
 	}
 }
 
-func checkNodeActions(node *models.Node, network string, servercfg config.ServerConfig, localNode *models.Node) string {
-	if (node.Action == models.NODE_UPDATE_KEY || localNode.Action == models.NODE_UPDATE_KEY) && 
+func checkNodeActions(node *models.Node, networkName string, servercfg config.ServerConfig, localNode *models.Node, cfg *config.ClientConfig) string {
+	if (node.Action == models.NODE_UPDATE_KEY || localNode.Action == models.NODE_UPDATE_KEY) &&
 		node.IsStatic != "yes" {
-		err := wireguard.SetWGKeyConfig(network, servercfg.GRPCAddress)
+		err := wireguard.SetWGKeyConfig(networkName, servercfg.GRPCAddress)
 		if err != nil {
 			log.Println("Unable to process reset keys request:", err)
 			return ""
 		}
 	}
 	if node.Action == models.NODE_DELETE || localNode.Action == models.NODE_DELETE {
-		err := LeaveNetwork(network)
+		err := RemoveLocalInstance(cfg, networkName)
 		if err != nil {
 			log.Println("Error:", err)
-			return ""
 		}
 		return models.NODE_DELETE
 	}
@@ -127,6 +128,9 @@ func CheckConfig(cliconf config.ClientConfig) error {
 	currentNode := cfg.Node
 
 	newNode, err := Pull(network, false)
+	if isDeleteError(err) {
+		return RemoveLocalInstance(cfg, network)
+	}
 	if err != nil {
 		return err
 	}
@@ -134,7 +138,7 @@ func CheckConfig(cliconf config.ClientConfig) error {
 		return errors.New("node is pending")
 	}
 
-	actionCompleted := checkNodeActions(newNode, network, servercfg, &currentNode)
+	actionCompleted := checkNodeActions(newNode, network, servercfg, &currentNode, cfg)
 	if actionCompleted == models.NODE_DELETE {
 		return errors.New("node has been removed")
 	}
@@ -258,19 +262,19 @@ func Push(network string) error {
 		log.Println("Failed to authenticate:", err)
 		return err
 	}
-
-	privateKey, err := wireguard.RetrievePrivKey(network)
-	if err != nil {
-		return err
-	}
-	privateKeyWG, err := wgtypes.ParseKey(privateKey)
-	if err != nil {
-		return err
-	}
-	if postnode.PublicKey != privateKeyWG.PublicKey().String() {
-		postnode.PublicKey = privateKeyWG.PublicKey().String()
+	if postnode.IsPending != "yes" {
+		privateKey, err := wireguard.RetrievePrivKey(network)
+		if err != nil {
+			return err
+		}
+		privateKeyWG, err := wgtypes.ParseKey(privateKey)
+		if err != nil {
+			return err
+		}
+		if postnode.PublicKey != privateKeyWG.PublicKey().String() {
+			postnode.PublicKey = privateKeyWG.PublicKey().String()
+		}
 	}
-
 	postnode.SetLastCheckIn()
 	nodeData, err := json.Marshal(&postnode)
 	if err != nil {

+ 9 - 4
netclient/functions/common.go

@@ -278,6 +278,7 @@ func LeaveNetwork(network string) error {
 		if err != nil {
 			log.Printf("Failed to authenticate: %v", err)
 		} else {
+			node.SetID()
 			var header metadata.MD
 			_, err = wcclient.DeleteNode(
 				ctx,
@@ -295,14 +296,18 @@ func LeaveNetwork(network string) error {
 			}
 		}
 	}
-	err = local.WipeLocal(network)
+	return RemoveLocalInstance(cfg, network)
+}
+
+func RemoveLocalInstance(cfg *config.ClientConfig, networkName string) error {
+	err := local.WipeLocal(networkName)
 	if err != nil {
 		log.Printf("Unable to wipe local config: %v", err)
 	} else {
-		log.Println("Removed " + node.Network + " network locally")
+		log.Println("Removed " + networkName + " network locally")
 	}
 	if cfg.Daemon != "off" {
-		err = local.RemoveSystemDServices(network)
+		err = local.RemoveSystemDServices(networkName)
 	}
 	return err
 }
@@ -362,7 +367,7 @@ func GetNetworks() ([]string, error) {
 		return networks, err
 	}
 	for _, f := range files {
-		if strings.Contains(f.Name(), "netconfig-") && !strings.Contains(f.Name(), "global-001") {
+		if strings.Contains(f.Name(), "netconfig-") {
 			networkname := stringAfter(f.Name(), "netconfig-")
 			networks = append(networks, networkname)
 		}

+ 10 - 9
netclient/functions/join.go

@@ -11,6 +11,7 @@ import (
 	"net"
 	"time"
 
+	"github.com/gravitl/netmaker/database"
 	nodepb "github.com/gravitl/netmaker/grpc"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/auth"
@@ -115,8 +116,6 @@ func JoinNetwork(cfg config.ClientConfig, privateKey string) error {
 				return err
 			}
 		}
-	} else {
-		cfg.Node.Endpoint = cfg.Node.Endpoint
 	}
 	if privateKey == "" {
 		wgPrivatekey, err := wgtypes.GeneratePrivateKey()
@@ -178,7 +177,7 @@ func JoinNetwork(cfg config.ClientConfig, privateKey string) error {
 	if err = config.ModConfig(postnode); err != nil {
 		return err
 	}
-	data, err := json.Marshal(&postnode)
+	data, err := json.Marshal(postnode)
 	if err != nil {
 		return err
 	}
@@ -216,6 +215,11 @@ func JoinNetwork(cfg config.ClientConfig, privateKey string) error {
 		return err
 	}
 
+	err = wireguard.StorePrivKey(privateKey, cfg.Network)
+	if err != nil {
+		return err
+	}
+
 	if node.IsPending == "yes" {
 		fmt.Println("Node is marked as PENDING.")
 		fmt.Println("Awaiting approval from Admin before configuring WireGuard.")
@@ -227,14 +231,11 @@ func JoinNetwork(cfg config.ClientConfig, privateKey string) error {
 	log.Println("retrieving remote peers")
 	peers, hasGateway, gateways, err := server.GetPeers(node.MacAddress, cfg.Network, cfg.Server.GRPCAddress, node.IsDualStack == "yes", node.IsIngressGateway == "yes")
 
-	if err != nil {
-		log.Println("failed to retrieve peers")
-		return err
-	}
-	err = wireguard.StorePrivKey(privateKey, cfg.Network)
-	if err != nil {
+	if err != nil && !database.IsEmptyRecord(err) {
+		log.Println("failed to retrieve peers", err)
 		return err
 	}
+
 	log.Println("starting wireguard")
 	err = wireguard.InitWireguard(&node, privateKey, peers, hasGateway, gateways)
 	if err != nil {

+ 12 - 0
netclient/functions/logging.go

@@ -0,0 +1,12 @@
+package functions
+
+import (
+	"log"
+)
+
+func PrintLog(message string, loglevel int) {
+	log.SetFlags(log.Flags() &^ (log.Llongfile | log.Lshortfile))
+	if loglevel == 0 {
+			log.Println(message)
+	}
+}

+ 0 - 101
netclient/functions/register.go

@@ -1,101 +0,0 @@
-package functions
-
-import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"io/ioutil"
-	"log"
-	"net"
-	"net/http"
-	"os"
-	"time"
-
-	"github.com/gravitl/netmaker/models"
-	"github.com/gravitl/netmaker/netclient/config"
-	"github.com/gravitl/netmaker/netclient/local"
-	//	"github.com/davecgh/go-spew/spew"
-)
-
-func Register(cfg config.GlobalConfig) error {
-
-	_, err := os.Stat("/etc/netclient")
-	if os.IsNotExist(err) {
-		os.Mkdir("/etc/netclient", 744)
-	} else if err != nil {
-		log.Println("couldnt find or create /etc/netclient")
-		return err
-	}
-
-	postclient := &models.IntClient{
-		AccessKey:  cfg.Client.AccessKey,
-		PublicKey:  cfg.Client.PublicKey,
-		PrivateKey: cfg.Client.PublicKey,
-		Address:    cfg.Client.Address,
-		Address6:   cfg.Client.Address6,
-		Network:    "comms",
-	}
-
-	jsonstring, err := json.Marshal(postclient)
-	if err != nil {
-		return err
-	}
-	jsonbytes := []byte(jsonstring)
-	body := bytes.NewBuffer(jsonbytes)
-	publicaddress := net.JoinHostPort(cfg.Client.ServerPublicEndpoint, cfg.Client.ServerAPIPort)
-
-	res, err := http.Post("http://"+publicaddress+"/api/intclient/register", "application/json", body)
-	if err != nil {
-		log.Println("Failed to register to http://" + publicaddress + "/api/client/register")
-		return err
-	}
-	if res.StatusCode != http.StatusOK {
-		log.Println("Failed to register to http://" + publicaddress + "/api/client/register")
-		return errors.New("request to server failed: " + res.Status)
-	}
-	bodyBytes, err := ioutil.ReadAll(res.Body)
-	//bodyString := string(bodyBytes)
-	//spew.Dump(bodyString)
-	if err != nil {
-		return err
-	}
-	var wgclient models.IntClient
-	json.Unmarshal(bodyBytes, &wgclient)
-	//spew.Dump(wgclient)
-	err = config.ModGlobalConfig(wgclient)
-	if err != nil {
-		return err
-	}
-	//spew.Dump(wgclient)
-	// err = wireguard.InitGRPCWireguard(wgclient)
-	//     if err != nil {
-	//             return err
-	//     }
-	log.Println("registered netclient to " + cfg.Client.ServerPrivateAddress)
-	return err
-}
-
-func Unregister(cfg config.GlobalConfig) error {
-	client := &http.Client{Timeout: 7 * time.Second}
-	publicaddress := net.JoinHostPort(cfg.Client.ServerPublicEndpoint, cfg.Client.ServerAPIPort)
-	log.Println("sending delete request to: " + "http://" + publicaddress + "/api/intclient/" + cfg.Client.ClientID)
-	req, err := http.NewRequest("DELETE", "http://"+publicaddress+"/api/intclient/"+cfg.Client.ClientID, nil)
-	if err != nil {
-		log.Println(err)
-	} else {
-		res, err := client.Do(req)
-		if res == nil {
-			err = errors.New("server not reachable at " + "http://" + publicaddress + "/api/intclient/" + cfg.Client.ClientID)
-			log.Println(err)
-		} else if res.StatusCode != http.StatusOK {
-			err = errors.New("request to server failed: " + res.Status)
-			log.Println(err)
-			defer res.Body.Close()
-		}
-	}
-	err = local.WipeGRPCClient()
-	if err == nil {
-		log.Println("successfully removed grpc client interface")
-	}
-	return err
-}

+ 1 - 17
netclient/local/local.go

@@ -118,7 +118,7 @@ func ConfigureSystemD(network string) error {
 	}
 
 	systemservice := `[Unit]
-Description=network check for remote peers and local config
+Description=Network Check
 Wants=netclient.timer
 
 [Service]
@@ -303,22 +303,6 @@ func WipeLocal(network string) error {
 
 }
 
-func WipeGRPCClient() error {
-	home := "/etc/netclient"
-	_ = os.Remove(home + "/netconfig-global-001")
-
-	ipExec, err := exec.LookPath("ip")
-
-	cmdIPLinkDel := &exec.Cmd{
-		Path:   ipExec,
-		Args:   []string{ipExec, "link", "del", "grpc-wg-001"},
-		Stdout: os.Stdout,
-		Stderr: os.Stdout,
-	}
-	err = cmdIPLinkDel.Run()
-	return err
-}
-
 func HasNetwork(network string) bool {
 
 	return FileExists("/etc/systemd/system/netclient-"+network+".timer") ||

+ 1 - 24
netclient/main.go

@@ -306,30 +306,7 @@ func main() {
 			// the action, or code that will be executed when
 			// we execute our `ns` command
 			Action: func(c *cli.Context) error {
-				cfg, err := config.ReadGlobalConfig()
-				if err != nil {
-					return err
-				}
-				var gconf config.GlobalConfig
-				gconf = *cfg
-				err = command.Uninstall(gconf)
-				return err
-			},
-		},
-		{
-			Name:  "unregister",
-			Usage: "Unregister the netclient from secure server GRPC.",
-			Flags: cliFlags,
-			// the action, or code that will be executed when
-			// we execute our `ns` command
-			Action: func(c *cli.Context) error {
-				cfg, err := config.ReadGlobalConfig()
-				if err != nil {
-					return err
-				}
-				var gconf config.GlobalConfig
-				gconf = *cfg
-				err = command.Unregister(gconf)
+				err := command.Uninstall()
 				return err
 			},
 		},

BIN
netclient/netclient-amd64


BIN
netclient/netclient.arm5 → netclient/netclient-arm


BIN
netclient/netclient-arm64


+ 5 - 5
netclient/wireguard/kernel.go

@@ -68,7 +68,7 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 	_, addLinkErr := local.RunCmd(ipExec + " link add dev " + ifacename + " type wireguard")
 	_, addErr := local.RunCmd(ipExec + " address add dev " + ifacename + " " + node.Address + "/24")
 	if delErr != nil {
-		log.Println(delErr)
+		// pass
 	}
 	if addLinkErr != nil {
 		log.Println(addLinkErr)
@@ -80,10 +80,10 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 	nodeport = int(node.ListenPort)
 
 	conf := wgtypes.Config{}
-	if nodecfg.UDPHolePunch == "yes" &&  
-	nodecfg.IsServer == "no"  &&    
-	nodecfg.IsIngressGateway == "no" && 
-	nodecfg.IsStatic != "yes" {
+	if nodecfg.UDPHolePunch == "yes" &&
+		nodecfg.IsServer == "no" &&
+		nodecfg.IsIngressGateway != "yes" &&
+		nodecfg.IsStatic != "yes" {
 		conf = wgtypes.Config{
 			PrivateKey:   &key,
 			ReplacePeers: true,

+ 0 - 96
nginx/netmaker-nginx-dns.conf

@@ -1,96 +0,0 @@
-user www-data;
-worker_processes auto;
-pid /run/nginx.pid;
-include /etc/nginx/modules-enabled/*.conf;
-
-events {
-	worker_connections 768;
-	# multi_accept on;
-}
-
-http {
-
-	##
-	# Basic Settings
-	##
-
-	sendfile on;
-	tcp_nopush on;
-	tcp_nodelay on;
-	keepalive_timeout 65;
-	types_hash_max_size 2048;
-	# server_tokens off;
-
-	# server_names_hash_bucket_size 64;
-	# server_name_in_redirect off;
-
-	include /etc/nginx/mime.types;
-	default_type application/octet-stream;
-
-	##
-	# SSL Settings
-	##
-
-	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
-	ssl_prefer_server_ciphers on;
-
-	##
-	# Logging Settings
-	##
-
-	access_log /var/log/nginx/access.log;
-	error_log /var/log/nginx/error.log;
-
-	##
-	# Gzip Settings
-	##
-
-	gzip on;
-
-	# gzip_vary on;
-	# gzip_proxied any;
-	# gzip_comp_level 6;
-	# gzip_buffers 16 8k;
-	# gzip_http_version 1.1;
-	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
-
-	##
-	# Virtual Host Configs
-	##
-
-	include /etc/nginx/conf.d/*.conf;
-	include /etc/nginx/sites-enabled/*;
-}
-
-
-#mail {
-#	# See sample authentication script at:
-#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
-# 
-#	# auth_http localhost/auth.php;
-#	# pop3_capabilities "TOP" "USER";
-#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
-# 
-#	server {
-#		listen     localhost:110;
-#		protocol   pop3;
-#		proxy      on;
-#	}
-# 
-#	server {
-#		listen     localhost:143;
-#		protocol   imap;
-#		proxy      on;
-#	}
-#}
-stream {
-	upstream dns_servers {
-                server 127.0.0.1:5353;
-	}
-        server {
-                listen 53 udp;
-                listen 53;
-                proxy_pass dns_servers;
-        	error_log  /var/log/nginx/dns.log info;
-        }
-}

+ 8 - 2
nginx/netmaker-nginx-template.conf

@@ -1,3 +1,9 @@
+server {
+    listen 80;
+    server_name *.NETMAKER_BASE_DOMAIN;
+    return 301 https://$host$request_uri;
+}
+
 server {
     listen 443 ssl;
     listen [::]:443 ssl;
@@ -26,8 +32,8 @@ server {
         }
 }
 server {
-    listen 1443 ssl http2;
-    server_name grpc.NETMAKER_BASE_DOMAIN
+    listen 443 ssl http2;
+    server_name grpc.NETMAKER_BASE_DOMAIN;
     ssl_certificate /etc/letsencrypt/live/NETMAKER_BASE_DOMAIN/fullchain.pem; 
     ssl_certificate_key /etc/letsencrypt/live/NETMAKER_BASE_DOMAIN/privkey.pem; 
     #include /etc/letsencrypt/options-ssl-nginx.conf; 

+ 1 - 10
scripts/netmaker-server.sh

@@ -5,7 +5,6 @@ mkdir -p /etc/netmaker/config/environments
 wget -O /etc/netmaker/netmaker https://github.com/gravitl/netmaker/releases/download/latest/netmaker
 chmod +x /etc/netmaker/netmaker
 
-
 cat >/etc/netmaker/config/environments/dev.yaml<<EOL
 server:
   host:
@@ -15,15 +14,7 @@ server:
   allowedorigin: "*"
   restbackend: true            
   agentbackend: true
-  defaultnetname: "default"
-  defaultnetrange: "10.10.10.0/24"
-  createdefault: true
-mongoconn:
-  user: "mongoadmin"
-  pass: "mongopass"
-  host: "localhost"
-  port: "27017"
-  opts: '/?authSource=admin'
+  dnsmode: "on"
 EOL
 
 cat >/etc/systemd/system/netmaker.service<<EOL

Some files were not shown because too many files changed in this diff