From 2e2a516caa7bd78e894ddd034376c58757be200c Mon Sep 17 00:00:00 2001 From: afeiszli Date: Tue, 18 May 2021 13:55:06 -0400 Subject: [PATCH] server installation section completed --- ...e.kube.yml => docker-compose.noclient.yml} | 40 +- compose/docker-compose.nodns.yml | 5 +- compose/docker-compose.reference.yml | 49 +- ...ing.yml => docker-compose.server-only.yml} | 5 - ...pose.quick.yml => docker-compose.slim.yml} | 0 compose/docker-compose.yml | 35 +- docs/_build/doctrees/environment.pickle | Bin 63943 -> 69645 bytes docs/_build/doctrees/quick-start.doctree | Bin 35792 -> 36212 bytes .../doctrees/server-installation.doctree | Bin 4833 -> 102357 bytes docs/_build/doctrees/support.doctree | Bin 3419 -> 3483 bytes docs/_build/html/_sources/quick-start.rst.txt | 4 +- .../html/_sources/server-installation.rst.txt | 311 +++++++++- docs/_build/html/_sources/support.rst.txt | 5 +- docs/_build/html/genindex.html | 32 +- docs/_build/html/index.html | 40 +- docs/_build/html/quick-start.html | 102 +++- docs/_build/html/search.html | 32 +- docs/_build/html/searchindex.js | 2 +- docs/_build/html/server-installation.html | 573 +++++++++++++++++- docs/_build/html/support.html | 25 +- docs/quick-start.rst | 4 +- docs/server-installation.rst | 311 +++++++++- docs/support.rst | 5 +- 23 files changed, 1448 insertions(+), 132 deletions(-) rename compose/{docker-compose.kube.yml => docker-compose.noclient.yml} (53%) rename compose/{docker-compose.ui-testing.yml => docker-compose.server-only.yml} (91%) rename compose/{docker-compose.quick.yml => docker-compose.slim.yml} (100%) diff --git a/compose/docker-compose.kube.yml b/compose/docker-compose.noclient.yml similarity index 53% rename from compose/docker-compose.kube.yml rename to compose/docker-compose.noclient.yml index 30c02fe0..8b39ea7e 100644 --- a/compose/docker-compose.kube.yml +++ b/compose/docker-compose.noclient.yml @@ -1,5 +1,8 @@ version: "3.4" +volumes: + dnsconfig: + driver: local services: mongodb: image: mongo:4.2 @@ -7,33 +10,22 @@ services: - "27017:27017" container_name: mongodb volumes: - - /netmaker/mongodb:/data/db + - mongovol:/data/db restart: always environment: MONGO_INITDB_ROOT_USERNAME: mongoadmin MONGO_INITDB_ROOT_PASSWORD: mongopass netmaker: - privileged: true container_name: netmaker + ports: + - "8081:8081" + - "50051:50051" depends_on: - mongodb image: gravitl/netmaker:v0.3 - volumes: - - ./:/local - - /etc/netclient:/etc/netclient - - /netmaker/coredns:/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_GRPC_HOST: "192.168.88.101" + SERVER_HOST: "HOST_IP" CLIENT_MODE: "off" netmaker-ui: container_name: netmaker-ui @@ -45,4 +37,18 @@ services: ports: - "80:80" environment: - BACKEND_URL: "http://64.147.211.252:8081" + BACKEND_URL: "http://HOST_IP:8081" + 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 +volumes: + mongovol: {} + dnsconfig: {} diff --git a/compose/docker-compose.nodns.yml b/compose/docker-compose.nodns.yml index cddc195e..be254940 100644 --- a/compose/docker-compose.nodns.yml +++ b/compose/docker-compose.nodns.yml @@ -22,9 +22,6 @@ services: depends_on: - mongodb image: gravitl/netmaker:v0.3 - ports: - - "8081:8081" - - "50051:50051" volumes: - ./:/local - /etc/netclient:/etc/netclient @@ -39,6 +36,8 @@ services: - SYS_MODULE restart: always network_mode: host + environment: + DNS_MODE: "off" netmaker-ui: container_name: netmaker-ui depends_on: diff --git a/compose/docker-compose.reference.yml b/compose/docker-compose.reference.yml index 274dd6ce..e44bbc3a 100644 --- a/compose/docker-compose.reference.yml +++ b/compose/docker-compose.reference.yml @@ -1,38 +1,56 @@ version: "3.4" services: - mongodb: + mongodb: # The MongoDB Instance that backs up Netmaker image: mongo:4.2 ports: - - "27017:27017" + - "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 restart: always environment: - MONGO_INITDB_ROOT_USERNAME: mongoadmin - MONGO_INITDB_ROOT_PASSWORD: mongopass - netmaker: - privileged: true + 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. + 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.3 - volumes: + 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 - - dnsconfig:/root/config/dnsconfig + - 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: + cap_add: # Necessary for CLIENT_MODE. Should be removed if turned off. - NET_ADMIN - SYS_MODULE restart: always - network_mode: host - netmaker-ui: + network_mode: host # Necessary for CLIENT_MODE. Should be removed if turned off, but then need to add port mappings + environment: + 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. + SERVER_HTTP_HOST: "127.0.0.1" # Overrides SERVER_HOST if set. Useful for making HTTP and GRPC available via different interfaces/networks. + SERVER_GRPC_HOST: "127.0.0.1" # Overrides SERVER_HOST if set. Useful for making HTTP and GRPC available via different interfaces/networks. + 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. + 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. + netmaker-ui: # The Netmaker UI Component container_name: netmaker-ui depends_on: - netmaker @@ -42,16 +60,17 @@ services: ports: - "80:80" environment: - BACKEND_URL: "http://3.236.149.180:8081" - coredns: + 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 image: coredns/coredns - command: -conf /root/dnsconfig/Corefile + 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" + - "53:53/udp" # Likely needs to run at port 53 for adequate nameserver usage. volumes: - dnsconfig:/root/dnsconfig volumes: diff --git a/compose/docker-compose.ui-testing.yml b/compose/docker-compose.server-only.yml similarity index 91% rename from compose/docker-compose.ui-testing.yml rename to compose/docker-compose.server-only.yml index addb653e..2ab958a0 100644 --- a/compose/docker-compose.ui-testing.yml +++ b/compose/docker-compose.server-only.yml @@ -16,7 +16,6 @@ services: MONGO_INITDB_ROOT_USERNAME: mongoadmin MONGO_INITDB_ROOT_PASSWORD: mongopass netmaker: - privileged: true container_name: netmaker depends_on: - mongodb @@ -33,11 +32,7 @@ services: - /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: CLIENT_MODE: "off" DNS_MODE: "off" diff --git a/compose/docker-compose.quick.yml b/compose/docker-compose.slim.yml similarity index 100% rename from compose/docker-compose.quick.yml rename to compose/docker-compose.slim.yml diff --git a/compose/docker-compose.yml b/compose/docker-compose.yml index 38cb05d3..a2667394 100644 --- a/compose/docker-compose.yml +++ b/compose/docker-compose.yml @@ -1,8 +1,5 @@ version: "3.4" -volumes: - dnsconfig: - driver: local services: mongodb: image: mongo:4.2 @@ -16,19 +13,27 @@ services: MONGO_INITDB_ROOT_USERNAME: mongoadmin MONGO_INITDB_ROOT_PASSWORD: mongopass netmaker: + privileged: true container_name: netmaker - ports: - - "8081:8081" - - "50051:50051" depends_on: - mongodb image: gravitl/netmaker:v0.3 + 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: - MONGO_HOST: "mongodb" SERVER_HOST: "HOST_IP" - DNS_MODE: "off" - CLIENT_MODE: "off" netmaker-ui: container_name: netmaker-ui depends_on: @@ -40,5 +45,17 @@ services: - "80:80" environment: BACKEND_URL: "http://HOST_IP:8081" + 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 volumes: mongovol: {} + dnsconfig: {} diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index 8def0a4a8696bcd7a49f9597d341b8ca721742ab..f998c43ce44ec4f23f528cff41854f4e8f6dd683 100644 GIT binary patch literal 69645 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 diff --git a/docs/_build/doctrees/quick-start.doctree b/docs/_build/doctrees/quick-start.doctree index bf0ecdafc0d3232c61d3977894371fc6ca5ce0b0..3f811d111e0298ef7841803bea4ee238808aefee 100644 GIT binary patch delta 573 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%0Aw-d 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 diff --git a/docs/_build/doctrees/support.doctree b/docs/_build/doctrees/support.doctree index f9e4770221d1b5d6956ce66108358494c1118a5d..58f52f7a040104773af05d8a3107b83a735e32df 100644 GIT binary patch delta 198 zcmcaDHCvjcfpzMHjVx1`CB$8G6EkzH6f*PD@*UEP63a46a`ck(b0=SCzBD/g’ docker-compose.yml`` #. ``docker-compose up -d`` @@ -133,5 +133,5 @@ Uninstalling the netclient Uninstralling Netmaker =========================== -To uninstall Netmaker from the server, simply run `docker-compose down` +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. diff --git a/docs/_build/html/_sources/server-installation.rst.txt b/docs/_build/html/_sources/server-installation.rst.txt index eaae1c21..6f6f7cc6 100644 --- a/docs/_build/html/_sources/server-installation.rst.txt +++ b/docs/_build/html/_sources/server-installation.rst.txt @@ -1,27 +1,308 @@ -============ +==================== Server Installation -============ +==================== + +This section outlines installing the Netmaker server, including Netmaker, Netmaker UI, MongoDB, and CoreDNS + +Notes on Optional Features +============================ + +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. + +**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. + +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. + +**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. + +**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. -This document tells you how to install Netmaker. System Compatibility ==================== -Prerequisites -============= +Whether or not you run Netmaker in **Client Mode** is the main determination of system compatibility. -Installing Netmaker -=================== +With Client Mode **disabled**, Netmaker can be run on any system that supports Docker. This includes Windows, Mac, Linux, mainframes, and most Unix-based systems. It also requires no special privileges. Netmaker will only need ports for GRPC (50051 by default), the API (8081 by default), and CoreDNS (53, if enabled). -Linux with Docker Compose -------------------------- +With Client Mode **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. -Linux without Docker --------------------- +This requires privileged (root) access to the host machine and multiple host directory mounts. It also requires WireGuard to be installed, and Linux with systemd installed (see :doc:`compatible systems <./architecture>` for more details). -Kubernetes ----------- +To run a non-docker installation, you are running the Netmaker binary, CoreDNS binary, MongoDB, and a web server directly on your 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. -Customizing your Installation ------------------------------ +DNS Mode Prereqisite Setup (Ubuntu) +==================================== + +If you plan on running the + + +Docker Compose Install +======================= + +The most simple (and recommended) way of installing Netmaker is to use one of the provided `Docker Compose files `_. 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. + +Slim Install - No DNS and No Client Mode +-------------------------------------------- + +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. + +**Prerequisites:** + * ports 80, 8081, and 50051 are not blocked by firewall + * ports 80, 8081, 50051, and 27017 are not in use + +**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.slim.yml`` +#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml`` +#. ``docker-compose up -d`` + +Full Install - DNS and Client Mode Enabled +-------------------------------------------- + +This installation gives you the fully-featured product with Client Mode and DNS Mode. + +**Prerequisites:** + * systemd linux (Debian or Ubuntu reccommended) + * sudo privileges + * DNS Mode Prerequisite Setup (see above) + * WireGuard installed + * ports 80, 8081, 53, and 50051 are not blocked by firewall + * ports 80, 8081, 53, 50051, and 27017 are not in use + +**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. + +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): + +#. ``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`` + + +Server Only Install - UI, DNS, Client Disabled +------------------------------------------------ + +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. + +**Prerequisites:** + * ports 8081 and 50051 are not blocked by firewall + * ports 8081, 50051, and 27017 are not in use + +**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.server-only.yml`` +#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml`` + +No DNS - CoreDNS Disabled, Client Enabled +---------------------------------------------- + +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. + +**Prerequisites:** + * systemd linux (Debian or Ubuntu reccommended) + * sudo privileges + * WireGuard installed + * ports 80, 8081, and 50051 are not blocked by firewall + * ports 80, 8081, 50051, and 27017 are not in use + +**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. + +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`` + +No DNS - CoreDNS Disabled, Client Enabled + +No Client - DNS Enabled, Client Disabled +--------------------------------------------- + +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. + +**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) + +**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`` + + +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. + +.. literalinclude:: ../compose/docker-compose.reference.yml + :language: YAML + + +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. + +MongoDB 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 `_. + +2. Create a user: + * ``mongo admin`` + * > `db.createUser({ user: "mongoadmin" , pwd: "mongopass", roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]})` + +Server Setup +------------- +1. **Run the install script:** ``sudo curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/v0.3.5/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. + +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://:PORT /usr/share/nginx/html/generate_config_js.sh >/usr/share/nginx/html/config.js'`` +6. **Start Nginx:** ``sudo systemctl start nginx`` + +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. If changed, need to change port of BACKEND_URL for netmaker-ui. + +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. Note, turning "off" does not remove CoreDNS. You still need to remove CoreDNS from compose file. + +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. Change to match above MongoDB instance + +MONGO_PASS: + **Default:** "mongopass" + + **Description:** Admin password for MongoDB. Change to match above MongoDB instance + +MONGO_HOST: + **Default:** "127.0.0.1" + + **Description:** Address of MongoDB. Change if necessary. + +MONGO_PORT: + **Default:** "27017" + + **Description:** Port of MongoDB. Change if necessary. + +MONGO_OPTS: + **Default:** "/?authSource=admin" + + **Description:** Opts to enable admin login for Mongo. + +Config File Reference +---------------------- +A config file may be placed under config/environments/.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 diff --git a/docs/_build/html/_sources/support.rst.txt b/docs/_build/html/_sources/support.rst.txt index c87949d1..8b10ca1b 100644 --- a/docs/_build/html/_sources/support.rst.txt +++ b/docs/_build/html/_sources/support.rst.txt @@ -3,11 +3,12 @@ Support ========= FAQ -===== +---- Contact -======== +-------- If you need help, try the discord or open a GitHub ticket. Email: info@gravitl.com + Discord: https://discord.gg/zRb9Vfhk8A diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index 93dc272d..57ecb8da 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -345,6 +345,13 @@
  • + Notes on Optional Features + + +
  • +
  • + + System Compatibility @@ -352,14 +359,35 @@
  • - Prerequisites + DNS Mode Prereqisite Setup (Ubuntu)
  • - Installing Netmaker + Docker Compose Install + + +
  • +
  • + + + Linux Install without Docker + + +
  • +
  • + + + Kubernetes Install + + +
  • +
  • + + + Configuration Reference
  • diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index 453bf45e..61fd666f 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -346,6 +346,13 @@
  • + Notes on Optional Features + + +
  • +
  • + + System Compatibility @@ -353,14 +360,35 @@
  • - Prerequisites + DNS Mode Prereqisite Setup (Ubuntu)
  • - Installing Netmaker + Docker Compose Install + + +
  • +
  • + + + Linux Install without Docker + + +
  • +
  • + + + Kubernetes Install + + +
  • +
  • + + + Configuration Reference
  • @@ -749,9 +777,13 @@
    diff --git a/docs/_build/html/quick-start.html b/docs/_build/html/quick-start.html index 47d04f13..4afaa676 100644 --- a/docs/_build/html/quick-start.html +++ b/docs/_build/html/quick-start.html @@ -56,7 +56,7 @@ - + @@ -376,8 +376,10 @@
  • - Server Installation - diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index 36656a42..9658d036 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["about","api","architecture","client-installation","conduct","contribute","index","license","quick-start","server-installation","support","troubleshoot","usage"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["about.rst","api.rst","architecture.rst","client-installation.rst","conduct.rst","contribute.rst","index.rst","license.rst","quick-start.rst","server-installation.rst","support.rst","troubleshoot.rst","usage.rst"],objects:{},objnames:{},objtypes:{},terms:{"100":1,"172":1,"200":1,"50051":2,"50052":8,"6400":1,"8081":[1,2],"abstract":2,"case":[1,2,6,8,12],"default":[1,2,8],"function":[1,2],"import":[2,8],"long":[0,8],"new":[2,8],"public":[2,4,7],"return":2,"static":2,"try":10,"var":1,"while":2,AWS:0,Being:4,DNS:[2,6,8,12],For:[2,8],IPs:2,NOT:[],Not:2,That:2,The:[0,1,2,4,8],Then:8,There:[0,1,8],These:[2,8],Use:6,Using:[0,1,4,6,8],Will:[],With:2,aa3bvg0rnitirxdx:1,abl:[1,2],abou:8,about:[2,8],abov:[2,8],abus:4,acceler:2,accept:4,access:[0,2,8,12],accesskei:1,accesss:[],accomplish:[],account:4,achiev:[1,2],across:0,act:[2,4],action:[1,4],actual:2,adapt:4,add:[0,1,2,8],added:[2,8],adding:8,addit:[2,8],addnetwork:1,address:[2,4,8],addressrang:[1,8],adm:1,admin:[0,1,2,8],adopt:2,advanc:[1,4,8],after:8,age:4,agent:[0,2,6,8],aggreg:2,align:4,all:[0,1,2,4,6,7,8],allow:[1,2,8,12],alreadi:[2,8],also:[0,1,2,8],altern:2,android:2,ani:[0,2,4,8],anoth:2,anyon:[],anyth:2,aorijqalrik3ajflaqrdajhkr:1,apach:2,api:[2,8],appear:[4,8],appli:4,applic:1,appoint:4,appropri:[2,4],approv:[1,8],arbitrari:0,arch:2,architectur:8,arrai:2,artifact:7,ask:[],assum:2,attack:4,attent:4,attribut:6,authent:[2,8],author:1,autom:0,automat:2,avail:[4,7],awai:2,await:2,back:2,backend:[],backend_url:[],background:2,ban:4,bare:2,base64:8,base:[2,8],bash:2,basi:2,basic:6,bearer:1,becaus:0,becom:2,been:2,befor:2,begin:2,behavior:4,behind:2,being:2,below:[1,2,8,12],best:4,better:2,between:[0,2],binari:[2,8],bit:12,bodi:4,both:[2,4],bottom:8,browser:8,build:6,built:2,c42wt:[],call:[0,2,6],can:[0,1,2,7,8,12],carrier:2,caus:2,center:0,cento:2,certain:2,cgnat:2,chang:[0,1,2,8],check:[1,2,8],checkin:1,choos:[],chosen:2,circumst:4,clarifi:4,click:[2,8],client:[0,2,8],clone:[],cloud:[0,12],cloudnet:[],cluster:12,code:[2,7],com:[4,8,10],come:[2,6],command:[2,8],comment:4,commit:4,common:[2,6],commun:[2,4,6,12],compat:[6,8],compil:2,complaint:4,complet:2,complex:2,complic:2,compon:6,compos:8,comput:[0,2],concept:6,conf:[],confidenti:4,config:[1,2],configur:[0,1,2,6,8],conflict:[2,8],connect:[0,2,8,12],consid:[2,4],consider:2,consist:2,consol:8,construct:4,consumpt:2,contact:[4,6],contain:[2,8],content:1,contrast:2,contribut:4,contributor:4,control:[2,8],copi:8,cordon:[],core:[0,6],coredn:6,coreo:2,correct:4,could:[0,4],coupl:[],coven:4,cover:6,cpu:2,creat:[0,1,2,4,6,12],createadmin:1,creategatewai:1,creation:0,critic:4,cross:12,cryptocurr:0,curl:8,current:2,custom:6,cycl:[1,2],daemon:2,data:[0,2],databas:2,date:1,debian:2,decis:6,decod:[2,8],deem:4,defaultkeepal:8,defin:4,delet:[1,8],deletegatewai:1,depend:2,deploi:[2,6],deploy:2,derogatori:4,design:[2,6],desktop:2,detail:[1,2,4,6,8],determin:4,develop:2,devic:[0,2,6,8],diagram:2,differ:[0,2,4,8,12],direct:[],directli:[0,1,2],disabl:[2,4],discord:10,displai:8,displaynam:1,distribut:2,distributionshav:2,dns:2,dnsstublisten:[],doc:8,docker:[2,8],document:[0,2,3,8,9],doe:[2,6],doing:0,don:[2,12],doubl:2,down:[0,8],download:8,dual:6,dynam:[0,2,6],each:[0,2,8],easier:2,easiest:2,easili:0,echo:8,edg:[],edit:4,effect:8,effici:2,either:2,electron:4,email:10,empathi:4,enabl:[2,8],encod:8,encompass:0,encount:2,encrypt:[0,2],end:2,endpoint:[1,2],enforc:6,enhanc:6,enough:8,enter:8,entir:[2,8],entireti:2,entri:[],env:1,environ:[0,1,2,4],especi:[],etc:8,eth0:1,ethnic:4,even:[0,2],event:4,everi:[2,8],everyon:4,everyth:2,evolv:2,examin:8,exampl:[2,4,6],exist:[0,2,8],expect:[4,6],experi:4,explain:[2,6],explicit:4,expos:2,express:4,extens:2,extern:[2,6,8],face:4,fact:0,fail:8,fair:4,fairli:2,faith:4,familiar:[0,2],faq:6,fast:[2,6],faster:[0,2],featur:8,fedora:2,few:[],field:8,figur:12,file:2,filenam:1,find:[2,12],fine:0,first:[2,8,12],fit:12,flat:0,flexibl:[0,2],flow:2,focus:4,folder:2,follow:[4,8],fork:6,foster:4,found:[0,2,7,8],free:4,freeli:7,from:[0,1,2,4,8,12],front:2,full:[0,2],fulli:[0,2],further:4,futur:2,gatewai:[1,2,12],gender:4,gener:[1,2],get:[1,6,8,12],github:[2,6,10],githubusercont:8,give:[2,8],given:[0,2,8],goal:[],goe:0,going:8,golang:2,good:[4,12],googl:[],gracefulli:4,grade:2,gravitl:[4,8,10],grpc:[2,8],guid:[0,2,8],hand:6,handl:0,harass:4,harm:4,has:[0,2,12],hasadmin:1,have:[0,2,4,8,12],header:1,heavi:2,heaviest:2,heavili:2,help:[1,2,6,10,12],here:[2,4,7,8,12],high:2,hold:[0,2],home:[0,2],homenet:[],host:[2,8],host_ip:8,hous:1,how:[2,3,6,9],howev:[1,2,8],http:[1,8,10],hub:[0,2],iOS:[],icon:[],idea:[],ident:4,imageri:4,impact:2,inappropri:4,incid:4,includ:[2,4,6],inclus:4,incompat:2,increas:2,individu:4,industri:2,info:[2,4,10],inform:[2,4,8],insert:8,instal:[0,2],instanc:[1,2,4,8],instead:[0,8],instruct:8,insult:4,interact:[0,2],interest:4,interfac:1,internet:[0,2],intro:12,introduc:2,introduct:6,invalid:8,investig:4,invis:2,iot:[0,2],iphon:2,ipsec:2,ipv4:[],ipv6:6,issu:[4,6],its:[0,2,4,8],itself:2,join:8,json:1,just:[0,2,8],jwt:1,keep:1,kei:2,kernel:[0,2],keynam:1,keyupd:1,know:12,known:2,krckbjhwwdk:[],kubernet:[0,6],languag:4,laptop1:1,larg:2,last:1,lastmodifi:1,latenc:2,later:2,latest:2,launch:[],layer:0,layout:2,leadership:4,learn:8,least:0,left:[],less:2,let:[0,12],level:[2,4],lighter:2,lightweight:2,like:[0,2,8],limit:6,line:2,link:6,linux:[2,8],list:[0,2],listenport:1,littl:2,load:2,local:[2,6,8],localaddress:1,localhost:1,locat:[0,2],login:8,lose:[],lot:2,macaddress:1,machin:[0,2,3,8],maco:[],made:[0,2],mai:[1,2,4,8],mail:4,maintain:4,make:[0,2,4,8],manag:[0,2,6,12],mani:[0,2,12],manual:[2,8],master:8,masterkei:1,mean:2,meant:[],media:4,member:[4,12],memori:2,mesh:[0,12],meshclient:1,metal:2,method:[1,2,8],mgmt:1,might:[0,2],mint:2,miss:2,mode:[2,8],model:[0,2],modifi:[1,2,8],more:[0,1,2,6,8],most:[1,2],mostli:2,much:[0,2],multipl:[0,8],must:[1,2,8],mykei:[1,8],mynet:8,name:[1,8],nameserv:2,nat:2,nation:4,nativ:[],navig:8,nebula:0,necessari:[4,8],need:[0,1,2,8,10],neighborhood:0,neither:2,netclient:[0,6],netid:1,netmak:[1,3,7],network:[0,3,6,8],networknam:[],next:8,nginx:2,node:6,non:[2,3],none:0,noonewillguessthi:1,note:1,notifi:2,now:[0,8],number:[2,8],oblig:4,obtain:1,off:2,offens:4,offic:[0,12],offici:[1,4,8],offlin:4,onc:8,one:[2,8],onli:[1,2,8],onlin:4,open:[2,4,10],openvpn:2,oper:2,option:[2,6],order:2,orient:4,other:[0,2,4,8],otherwis:[0,4],our:6,out:[0,2,8,12],outlin:2,output:8,outsid:[],over:[0,2],overlai:[0,6],overridden:2,overview:[2,6,12],overwhelm:12,own:2,pair:2,pane:8,part:[2,3],partial:2,particip:4,particular:2,pass:2,password:[1,8],path:1,peer:[2,12],pencil:[],pend:[1,8],perform:[1,2],period:2,perman:4,permiss:[4,8],permit:8,persistenkeepal:8,person:4,perspect:[0,2],phone:2,physic:4,pick:[2,8],pictur:2,pidof:8,ping:8,platform:[2,6],pleas:8,pledg:6,point:2,polici:4,polit:4,popup:[],port:[2,8],posit:4,possibl:[2,6,8],post:[1,2,4],postfix:[],practic:2,pre:8,preced:2,prefer:[],prepar:[],prereq:[],prerequisit:6,present:8,previou:2,privat:[2,4,6,8,12],privateapi:[],privileg:[],probabl:0,process:[6,8],product:[],profession:4,project:[1,4,6],proof:0,provid:[0,2],publickei:1,publish:[4,7],pull:2,pure:6,put:1,pwlpt320ybo:[],quickli:[6,8],race:4,rang:8,rangestr:1,rapidli:2,raspian:2,raw:8,reach:[0,2],reachabl:[2,8],reactj:2,readi:[],realli:[],reallysecret:1,reason:[2,4],recent:2,reciev:[1,2],recommend:1,reconfigur:2,reduc:2,refer:[2,8],regard:[2,4],regardless:4,regist:2,reiter:2,reject:4,rel:2,relai:2,releas:2,reli:[0,2],relianc:2,religion:4,remot:0,remov:[1,2,4,8],removenetwork:1,repeat:8,repercuss:4,replac:2,repo:[],report:[2,4],repositori:[2,7],repres:4,represent:4,request:[1,2],requir:[1,2,8],resolv:2,resolvectl:[],respect:4,respons:[2,6],result:4,retriev:[0,1,2,8],review:4,rhel:2,right:[0,4],root:8,rout:[0,2],router:2,run:[0,1,2,6,8],said:2,same:[0,8],sampl:0,save:8,scenario:8,scope:6,screen:8,script:[2,8],second:8,secret:[1,8],section:8,secur:[0,1,2,6],sed:8,see:[1,2,8],select:[8,12],send:2,sens:2,sensibl:[0,2,8],separ:[2,4,12],serv:2,server:[0,7,8],servic:2,set:[1,2,4,8,12],setup:[0,6],sever:2,sexual:4,sfl:8,ship:8,should:[0,1,2,6,8],show:[4,8],side:7,sign:[2,8],signific:2,signigif:2,signup:2,similar:[0,8],simpl:[2,8],simplest:2,simpli:[2,8],simultan:0,singl:1,site:[0,6],situat:2,size:4,skynet:1,slow:0,small:2,smartgui:1,snap:[],social:4,solut:2,some:[1,2,12],someth:8,somewher:8,soon:6,sort:[0,2],sourc:[2,6,7],space:4,special:[2,8],specif:[2,4],specifi:[],speed:[0,2],spoke:[0,2],spread:0,sql:2,ssh:8,sspl:7,stack:6,stake:0,standard:[2,6,8],start:12,startup:[1,8],state:8,statement:6,step:[2,8],still:0,stop:[],store:2,string:8,structur:2,submit:[6,8],subnet:2,substanti:0,success:2,sudo:8,support:2,suse:2,swagger:6,system:[6,8],systemctl:[],systemd:8,tab:8,tailscal:0,take:[0,1,2,4,8],talk:[0,2],team:4,technic:[0,6],technolog:2,tell:[0,2,3,9],temporari:4,temporarili:4,test:[6,8],than:2,thei:[0,2,4],them:[2,8],themselv:2,thi:[0,1,2,3,4,6,7,8,9],thing:[0,2],think:12,those:[0,2],though:[],thousand:0,threaten:4,three:8,through:2,ticket:10,time:[1,2,8,12],timer:2,timestamp:2,tld:[],toggl:[],token:8,tool:0,top:2,topic:12,topolog:2,toward:4,traffic:[0,2],transact:2,treat:2,tricki:2,troll:4,troubleshoot:[1,8],tunnel:[0,2],turn:2,tutori:6,two:[0,1,2],type:1,typic:[0,2,8],ubuntu:2,unabl:2,unaccept:4,uncom:[],uncordon:1,under:[7,8],underlai:[0,12],underwai:[],uninstal:6,uninstral:6,unix:2,unmanag:6,unnecessari:[],unset:8,until:8,unwelcom:4,updat:[1,2,8],upon:2,upper:[],usag:[6,12],use:[0,1,2,4,6,8,12],used:[1,2,8],user:[2,8],usernam:[1,8],uses:[0,1,2,8],using:[0,1,2,4,6,12],util:[],valid:2,valu:[1,2,8],variabl:2,variou:6,veri:[0,2],verifi:2,version:[2,4,7],via:[1,2,4,12],video:[],view:8,viewpoint:4,vim:[],virtual:[0,6,12],visibl:8,vm3ow4thatogiwnsla3thsl3894th:8,vpc:0,vpn:[2,12],want:[0,2,8],webserv:2,websit:2,weight:2,welcom:4,well:[2,3,6,8],wget:8,what:[2,4,6],whatev:[],when:[2,4],where:[2,6,8,12],wherev:0,whether:0,which:[0,2,4,7,8],who:4,why:[2,6],wide:2,wider:2,wiki:4,window:2,wireguard:[0,6,8],within:[2,4],without:[1,2,4,8],work:[2,6],workstat:8,world:[0,2],wors:2,worth:2,would:[0,8],write:2,yaml:1,yml:8,you:[0,1,2,3,6,8,9,10,12],your:[0,1,2,8,12],your_pass:1,your_password:1,your_secret_kei:1,youtu:[],zeroti:0,zrb9vfhk8a:10},titles:["About","API Reference","Architecture","Client Installation","Code of Conduct","Contribute","Welcome to the Netmaker Documentation","License","Quick Start","Server Installation","Support","Troubleshooting","Using Netmaker"],titleterms:{"case":0,Use:0,Using:12,about:[0,6],access:1,agent:11,api:[1,6],architectur:[2,6],attribut:4,authent:1,basic:12,build:5,call:1,client:[3,6],code:[4,5,6],common:11,compat:[2,3,9],compon:2,compos:9,concept:2,conduct:[4,6],contact:10,contribut:[5,6],core:2,coredn:[2,11],creat:8,curl:1,custom:[3,9],deploi:8,docker:[3,9],document:[1,6],doe:0,dual:12,enforc:4,enhanc:5,examin:[],exampl:1,extern:12,faq:10,file:1,fork:5,format:1,guid:6,how:0,instal:[3,6,8,9],introduct:8,ipv6:12,issu:[5,11],kei:[1,8],kubernet:[3,9,12],licens:[6,7],limit:2,linux:[3,9],local:12,manag:[1,8],mesh:2,mongodb:2,netclient:[2,3,8],netmak:[0,2,6,8,9,12],network:[1,2,12],node:[1,2,8,12],our:4,pledg:4,prerequisit:[3,8,9],process:2,pure:3,quick:[6,8],refer:[1,6],respons:4,scope:4,server:[1,2,6,9,11],setup:8,site:12,stack:12,standard:4,start:[6,8],submit:5,support:[6,10],system:[2,3,9],systemd:2,technic:2,test:5,troubleshoot:[6,11],tutori:12,uninstal:8,uninstral:8,unmanag:3,usag:1,user:1,video:12,welcom:6,what:0,wireguard:[2,3],without:9,work:0,written:12,your:[3,9]}}) \ No newline at end of file +Search.setIndex({docnames:["about","api","architecture","client-installation","conduct","contribute","index","license","quick-start","server-installation","support","troubleshoot","usage"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["about.rst","api.rst","architecture.rst","client-installation.rst","conduct.rst","contribute.rst","index.rst","license.rst","quick-start.rst","server-installation.rst","support.rst","troubleshoot.rst","usage.rst"],objects:{},objnames:{},objtypes:{},terms:{"100":1,"127":9,"172":1,"200":1,"27017":9,"50051":[2,9],"50052":8,"5_doc":[],"6400":1,"8081":[1,2,9],"abstract":2,"case":[1,2,6,8,9,12],"default":[1,2,8,9],"function":[1,2,9],"import":[2,8,9],"long":[0,8],"new":[2,8],"public":[2,4,7],"return":2,"static":[2,9],"true":9,"try":10,"var":[1,9],"while":[2,9],AWS:0,Being:4,DNS:[2,6,8,12],For:[2,8,9],IPs:2,NOT:[],Not:2,That:2,The:[0,1,2,4,8,9],Then:8,There:[0,1,8,9],These:[2,8],Use:6,Used:9,Useful:9,Using:[0,1,4,6,8],Will:9,With:[2,9],aa3bvg0rnitirxdx:1,abl:[1,2],abou:8,about:[2,8],abov:[2,8,9],abus:4,acceler:2,accept:4,access:[0,2,8,9,12],accesskei:1,accesss:[],accomplish:[],account:4,achiev:[1,2],across:0,act:[2,4],action:[1,4],actual:2,adapt:4,add:[0,1,2,8,9],added:[2,8,9],adding:8,addit:[2,8,9],addnetwork:1,address:[2,4,8,9],addressrang:[1,8],adequ:9,adm:1,admin:[0,1,2,8,9],adopt:2,advanc:[1,4,8,9],after:8,age:4,agent:[0,2,6,8,9],agent_backend:9,agentbackend:9,aggreg:2,align:4,all:[0,1,2,4,6,7,8,9],allow:[1,2,8,9,12],allowedorigin:9,alreadi:[2,8,9],also:[0,1,2,8,9],altern:[2,9],alwai:9,android:2,ani:[0,2,4,8,9],annot:[],anoth:2,anyon:[],anyth:2,aorijqalrik3ajflaqrdajhkr:1,apach:[2,9],api:[2,8,9],api_port:9,apihost:9,apiport:9,appear:[4,8],appli:4,applic:1,appoint:4,appropri:[2,4],approv:[1,8],apt:9,arbitrari:0,arch:2,architectur:[8,9],arrai:2,artifact:7,ask:[],asset:9,assum:[2,9],attack:4,attent:4,attribut:6,authent:[2,8],author:1,authsourc:9,autom:0,automat:[2,9],avail:[4,7,9],awai:2,await:2,back:[2,9],backend:9,backend_url:9,background:2,ban:4,bare:2,base64:8,base:[2,8,9],bash:2,basi:2,basic:6,bearer:1,becaus:[0,9],becom:[2,9],been:2,befor:2,begin:2,behavior:4,behind:2,being:2,below:[1,2,8,9,12],best:4,better:2,between:[0,2],beyond:9,bin:9,binari:[2,8,9],bit:[9,12],block:9,bodi:4,both:[2,4,9],bottom:8,browser:8,build:6,built:2,button:9,c42wt:[],call:[0,2,6,9],can:[0,1,2,7,8,9,12],cap_add:9,carrier:2,caus:[2,9],center:0,cento:2,certain:2,cgnat:2,cgroup:9,challeng:9,chang:[0,1,2,8,9],check:[1,2,8,9],checkin:1,choos:[],chosen:2,circumst:4,clarifi:4,click:[2,8,9],client:[0,2,8],client_mod:9,clientmod:9,clone:[],cloud:[0,12],cloudnet:[],cluster:[9,12],code:[2,7],com:[4,8,9,10],come:[2,6,9],command:[2,8,9],comment:[4,9],commit:4,common:[2,6],commun:[2,4,6,9,12],compat:[6,8],compil:2,complaint:4,complet:2,complex:2,complic:2,compon:[6,9],compos:[6,8],comput:[0,2],concept:6,conf:9,confidenti:4,config:[1,2],configur:[0,1,2,6,8],conflict:[2,8],connect:[0,2,8,12],consid:[2,4],consider:2,consist:2,consol:8,construct:4,consumpt:2,contact:[4,6],contain:[2,8,9],container_nam:9,content:1,contrast:2,contribut:4,contributor:4,control:[2,8,9],copi:[8,9],cordon:[],core:[0,6],coredn:6,corefil:9,coreo:2,correct:4,cors_allowed_origin:9,could:[0,4],coupl:[],coven:4,cover:[6,9],cpu:2,creat:[0,1,2,4,6,9,12],createadmin:1,creategatewai:1,createus:9,creation:0,credenti:9,critic:4,cross:12,cryptocurr:0,curl:[8,9],current:[2,9],custom:[6,9],customiz:9,cycl:[1,2],daemon:2,data:[0,2,9],databas:2,date:1,dbadminanydatabas:9,dbu:9,debian:[2,9],decis:6,decod:[2,8],deem:4,defaultkeepal:8,defin:4,delet:[1,8],deletegatewai:1,depend:[2,9],depends_on:9,deploi:[2,6,9],deploy:[2,9],derogatori:4,descript:[],design:[2,6],desktop:2,detail:[1,2,4,6,8,9],determin:[4,9],dev:9,develop:2,devic:[0,2,6,8],diabl:9,diagram:2,differ:[0,2,4,8,9,12],direct:[],directli:[0,1,2,9],directori:9,disabl:[2,4],disable_remote_ip_check:9,disableremoteipcheck:9,discord:10,discuss:9,displai:8,displaynam:1,distribut:2,distributionshav:2,dns:[2,9],dns_mode:9,dnsconfig:9,dnsmode:9,dnsstublisten:[],doc:[8,9],docker:[2,6,8],document:[0,2,3,8,9],doe:[2,6,9],doing:0,domain:9,don:[2,12],doubl:2,down:[0,8],download:[8,9],dual:6,dynam:[0,2,6],each:[0,2,8,9],easier:[2,9],easiest:2,easili:[0,9],echo:8,edg:[],edit:4,effect:8,effici:2,either:2,electron:4,email:10,empathi:4,enabl:[2,8],encod:8,encompass:0,encount:2,encrypt:[0,2],end:[2,9],endpoint:[1,2],enforc:6,enhanc:6,enough:8,enter:8,entir:[2,8],entireti:2,entri:[],env:[1,9],environ:[0,1,2,4,9],equal:9,equival:9,escal:9,especi:9,etc:[8,9],eth0:1,ethnic:4,even:[0,2,9],event:4,everi:[2,8],everyon:4,everyth:2,evolv:2,examin:8,exampl:[2,4,6],except:9,exist:[0,2,8],expect:[4,6],experi:4,explain:[2,6,9],explicit:4,explicitli:9,expos:2,express:4,extens:2,extern:[2,6,8],face:4,fact:0,fail:8,fair:4,fairli:2,faith:4,fals:9,familiar:[0,2],faq:6,fast:[2,6],faster:[0,2],featur:[6,8],feature_v0:[],fedora:2,few:9,field:8,figur:12,file:2,filenam:1,find:[2,12],fine:0,firewal:9,first:[2,8,12],fit:12,flag:9,flat:0,flexibl:[0,2],flow:2,focus:4,folder:2,follow:[4,8,9],fork:6,foster:4,found:[0,2,7,8],free:4,freeli:7,from:[0,1,2,4,8,9,12],front:[2,9],full:[0,2],fulli:[0,2,9],fundament:9,further:4,futur:[2,8,9],gatewai:[1,2,9,12],gender:4,gener:[1,2,9],generate_config_j:9,get:[1,6,8,9,12],github:[2,6,9,10],githubusercont:[8,9],give:[2,8,9],given:[0,2,8],goal:[],goe:0,going:8,golang:2,good:[4,12],googl:[],gracefulli:4,grade:2,gravitl:[4,8,9,10],grpc:[2,8,9],grpc_port:9,grpchost:9,grpcport:9,guid:[0,2,8,9],hand:6,handl:0,harass:4,harm:4,has:[0,2,9,12],hasadmin:1,have:[0,2,4,8,9,12],header:1,heavi:2,heaviest:2,heavili:2,help:[1,2,6,9,10,12],here:[2,4,7,8,9,12],high:2,hold:[0,2],home:[0,2],homenet:[],host:[2,8,9],host_ip:[8,9],hous:1,how:[2,3,6,9],howev:[1,2,8,9],html:9,http:[1,8,9,10],http_port:9,hub:[0,2],iOS:[],icon:[],idea:[],ident:4,imag:9,imageri:4,impact:2,inappropri:4,incid:4,includ:[2,4,6,9],inclus:4,incompat:2,incorrect:9,increas:[2,9],individu:[4,9],industri:2,info:[2,4,9,10],inform:[2,4,8],insert:[8,9],instal:[0,2],instanc:[1,2,4,8,9],instead:[0,8],instruct:[8,9],insult:4,interact:[0,2],interest:4,interfac:[1,9],internet:[0,2],intro:12,introduc:2,introduct:6,invalid:8,investig:4,invis:2,iot:[0,2],iphon:2,ipsec:2,ipv4:[],ipv6:6,issu:[4,6,9],its:[0,2,4,8,9],itself:2,join:8,journalctl:9,json:1,just:[0,2,8,9],jwt:1,keep:[1,9],kei:[2,9],kernel:[0,2,9],keynam:1,keyupd:1,know:12,known:2,krckbjhwwdk:[],kubernet:[0,6],lack:9,languag:4,laptop1:1,larg:2,last:1,lastmodifi:1,latenc:2,later:[2,9],latest:[2,9],launch:[],layer:0,layout:2,leadership:4,learn:8,least:0,left:9,less:2,let:[0,12],level:[2,4,9],lighter:2,lightweight:2,like:[0,2,8,9],limit:[6,9],line:2,link:[6,9],linux:[2,6,8],list:[0,2,9],listenport:1,littl:2,load:[2,9],local:[2,6,8,9],localaddress:1,localhost:1,locat:[0,2,9],login:[8,9],lose:[],lot:2,lxc:9,mac:9,macaddress:1,machin:[0,2,3,8,9],maco:[],made:[0,2],mai:[1,2,4,8,9],mail:4,main:9,mainfram:9,maintain:4,make:[0,2,4,8,9],manag:[0,2,6,9,12],mandatori:9,mani:[0,2,9,12],manual:[2,8],map:9,master:[8,9],master_kei:9,masterkei:[1,9],match:9,mean:[2,9],meant:[],media:4,member:[4,12],memori:2,mesh:[0,12],meshclient:1,metal:2,method:[1,2,8],mgmt:1,might:[0,2,9],mind:9,mint:2,minu:9,miss:2,mode:[2,6,8],model:[0,2],modif:9,modifi:[1,2,8,9],mongo:9,mongo_admin:9,mongo_host:9,mongo_initdb_root_password:9,mongo_initdb_root_usernam:9,mongo_opt:9,mongo_pass:9,mongo_port:9,mongoadmin:9,mongoconn:9,mongodb:[],mongopass:9,mongovol:9,more:[0,1,2,6,8,9],most:[1,2,9],mostli:2,mount:9,much:[0,2],multipl:[0,8,9],must:[1,2,8,9],mykei:[1,8],mynet:8,name:[1,8,9],nameserv:[2,9],nat:2,nation:4,nativ:[],navig:8,nebula:0,necessari:[4,8,9],need:[0,1,2,8,9,10],neighborhood:0,neither:2,net_admin:9,netclient:[0,6,9],netid:1,netmak:[1,3,7,9],network:[0,3,6,8,9],network_mod:9,networknam:[],next:8,nginx:[2,9],noclient:9,node:[6,9],nodn:9,non:[2,3,9],none:0,noonewillguessthi:1,note:[1,6],notifi:2,now:[0,8],number:[2,8,9],oblig:4,obtain:1,off:[2,9],offens:4,offic:[0,12],offici:[1,4,8],offlin:4,onc:8,one:[2,8,9],onli:[1,2,8],onlin:4,onto:9,open:[2,4,9,10],openvpn:2,oper:[2,9],opt:9,option:[2,6],order:2,orient:4,origin:9,other:[0,2,4,8,9],otherwis:[0,4],our:[6,9],out:[0,2,8,9,12],outlin:[2,9],output:8,outsid:[],over:[0,2],overlai:[0,6],overrid:9,overridden:[2,9],overview:[2,6,12],overwhelm:12,own:2,pair:[2,9],pane:8,part:[2,3,9],partial:2,particip:4,particular:2,pass:[2,9],password:[1,8,9],path:[1,9],peer:[2,12],pencil:[],pend:[1,8],perform:[1,2,9],period:2,perman:4,permiss:[4,8],permit:8,persistenkeepal:8,person:4,perspect:[0,2],phone:2,physic:4,pick:[2,8],pictur:2,pidof:8,ping:8,place:9,plan:9,platform:[2,6],pleas:8,pledg:6,point:2,polici:4,polit:4,popul:9,popup:[],port:[2,8,9],posit:4,possibl:[2,6,8],post:[1,2,4],postfix:[],practic:2,pre:[8,9],preced:2,prefer:[],prepar:[],prereq:[],prereqisit:6,prerequisit:[6,9],present:8,previou:2,primari:9,privat:[2,4,6,8,12],privateapi:[],privileg:9,probabl:0,problem:9,process:[6,8,9],product:9,profession:4,project:[1,4,6],proof:0,provid:[0,2,9],publickei:1,publish:[4,7],pull:2,pure:6,put:1,pwd:9,pwlpt320ybo:[],quick:9,quickli:[6,8],race:4,rang:8,rangestr:1,rapidli:2,raspian:2,raw:[8,9],reach:[0,2],reachabl:[2,8],reactj:2,read:9,readi:[],readwriteanydatabas:9,realli:[],reallysecret:1,reason:[2,4,9],reccommend:9,recent:2,reciev:[1,2],recommend:[1,9],reconfigur:2,reduc:2,refer:[2,8],regard:[2,4],regardless:4,regist:2,reiter:2,reject:4,rel:2,relai:[2,9],releas:[2,9],reli:[0,2],relianc:2,religion:4,remot:[0,9],remov:[1,2,4,8,9],removenetwork:1,repeat:8,repercuss:4,replac:[2,9],repo:[],report:[2,4],repositori:[2,7],repres:4,represent:4,request:[1,2,9],requir:[1,2,8,9],resolv:[2,9],resolvectl:9,respect:4,respons:[2,6],rest:9,rest_backend:9,restart:9,restbackend:9,restrict:9,result:4,retriev:[0,1,2,8],review:4,rhel:2,right:[0,4],role:9,root:[8,9],rout:[0,2],router:2,run:[0,1,2,6,8,9],runtim:9,said:2,same:[0,8,9],sampl:0,save:8,scenario:[8,9],scope:6,screen:8,script:[2,8,9],second:8,secret:[1,8],secretkei:9,section:[8,9],secur:[0,1,2,6],sed:[8,9],see:[1,2,8,9],select:[8,12],send:[2,9],sens:2,sensibl:[0,2,8],separ:[2,4,9,12],serv:[2,9],server:[0,7,8],server_api_host:9,server_grpc_host:9,server_host:9,server_http_host:9,servic:[2,9],set:[1,2,4,8,9,12],setup:[0,6],sever:[2,9],sexual:4,sfl:[8,9],share:9,ship:8,should:[0,1,2,6,8,9],show:[4,8,9],side:[7,9],sign:[2,8],signific:2,signigif:2,signup:2,similar:[0,8,9],simpl:[2,8,9],simplest:2,simpli:[2,8],simultan:0,sinc:9,singl:[1,9],site:[0,6,9],situat:2,size:4,skynet:1,slim:8,slow:0,small:2,smartgui:1,snap:[],social:4,solut:2,solv:9,some:[1,2,9,12],someth:8,somewher:8,soon:[6,9],sort:[0,2],sourc:[2,6,7],space:4,special:[2,8,9],specif:[2,4],specifi:9,speed:[0,2],spoke:[0,2],spread:0,sql:2,ssh:8,sspl:7,stack:6,stake:0,standard:[2,6,8,9],start:[9,12],startup:[1,8],state:8,statement:6,statu:9,step:[2,8,9],still:[0,9],stop:[],store:[2,9],string:8,structur:2,submit:[6,8],subnet:2,substanti:[0,9],success:2,sudo:[8,9],support:[2,9],sure:9,suse:2,swagger:6,sys:9,sys_modul:9,system:[6,8],system_bus_socket:9,systemctl:9,systemd:[8,9],tab:8,tailscal:0,take:[0,1,2,4,8,9],talk:[0,2],team:4,technic:[0,6],technolog:2,tell:[0,2,3],temporari:4,temporarili:4,test:[6,8],than:2,thei:[0,2,4,9],them:[2,8,9],themselv:2,thhe:9,thi:[0,1,2,3,4,6,7,8,9],thing:[0,2,9],think:12,those:[0,2,9],though:9,thousand:0,threaten:4,three:8,through:2,ticket:10,time:[1,2,8,12],timer:2,timestamp:2,tld:[],toggl:[],token:8,tool:0,top:2,topic:12,topolog:2,toward:4,traffic:[0,2,9],transact:2,treat:2,tree:[],tricki:2,troll:4,troubleshoot:[1,8],tunnel:[0,2],turn:[2,9],tutori:6,two:[0,1,2,9],type:1,typic:[0,2,8],ubuntu:[2,6],udp:9,unabl:2,unaccept:4,uncom:[],uncordon:1,under:[7,8,9],underlai:[0,12],underli:9,understand:9,underwai:[],uninstal:6,uninstral:6,unix:[2,9],unless:9,unmanag:6,unnecessari:[],unset:[8,9],until:8,unwelcom:4,unzip:9,updat:[1,2,8],upon:2,upper:[],url:9,usag:[6,9,12],use:[0,1,2,4,6,8,9,12],used:[1,2,8,9],useful:9,user:[2,8,9],useradminanydatabas:9,usernam:[1,8,9],uses:[0,1,2,8,9],using:[0,1,2,4,6,12],usr:9,util:[],valid:2,valu:[1,2,8,9],vari:9,variabl:2,variou:[6,9],veri:[0,2],verifi:2,version:[2,4,7,9],via:[1,2,4,9,12],video:[],view:8,viewpoint:4,vim:[],virtual:[0,6,12],visibl:8,vm3ow4thatogiwnsla3thsl3894th:8,volum:[8,9],vpc:0,vpn:[2,12],wai:9,want:[0,2,8,9],web:9,webserv:2,websit:2,weight:2,welcom:4,well:[2,3,6,8],wget:[8,9],what:[2,4,6],whatev:[],when:[2,4,9],where:[2,6,8,9,12],wherev:0,whether:[0,9],which:[0,2,4,7,8,9],who:4,why:[2,6],wide:2,wider:2,wiki:4,window:[2,9],wireguard:[0,6,8,9],wish:9,within:[2,4],without:[1,2,4,6,8],work:[2,6],workstat:8,world:[0,2],wors:2,worth:2,would:[0,8,9],write:[2,9],www:9,yaml:[1,9],yml:[8,9],you:[0,1,2,3,6,8,9,10,12],your:[0,1,2,8,9,12],your_pass:1,your_password:1,your_secret_kei:1,youtu:[],zeroti:0,zip:9,zrb9vfhk8a:10},titles:["About","API Reference","Architecture","Client Installation","Code of Conduct","Contribute","Welcome to the Netmaker Documentation","License","Quick Start","Server Installation","Support","Troubleshooting","Using Netmaker"],titleterms:{"case":0,"default":[],DNS:9,Use:0,Using:12,about:[0,6],access:1,agent:11,annot:9,api:[1,6],architectur:[2,6],attribut:4,authent:1,basic:12,build:5,call:1,client:[3,6,9],code:[4,5,6],common:11,compat:[2,3,9],compon:2,compos:9,concept:2,conduct:[4,6],config:9,configur:9,contact:10,contribut:[5,6],core:2,coredn:[2,9,11],creat:8,curl:1,custom:3,deploi:8,descript:9,disabl:9,docker:[3,9],document:[1,6],doe:0,dual:12,enabl:9,enforc:4,enhanc:5,environ:[],examin:[],exampl:1,extern:12,faq:10,featur:9,file:[1,9],fork:5,format:1,full:9,guid:6,how:0,instal:[3,6,8,9],introduct:8,ipv6:12,issu:[5,11],kei:[1,8],kubernet:[3,9,12],licens:[6,7],limit:2,linux:[3,9],local:12,manag:[1,8],mesh:2,mode:9,mongodb:[2,9],netclient:[2,3,8],netmak:[0,2,6,8,12],network:[1,2,12],node:[1,2,8,12],note:9,onli:9,option:9,our:4,pledg:4,prereqisit:9,prerequisit:[3,8],process:2,pure:3,quick:[6,8],refer:[1,6,9],respons:4,scope:4,server:[1,2,6,9,11],setup:[8,9],site:12,slim:9,stack:12,standard:4,start:[6,8],submit:5,support:[6,10],system:[2,3,9],systemd:2,technic:2,test:5,troubleshoot:[6,11],tutori:12,ubuntu:9,uninstal:8,uninstral:8,unmanag:3,usag:1,user:1,variabl:9,video:12,welcom:6,what:0,wireguard:[2,3],without:9,work:0,written:12,your:3}}) \ No newline at end of file diff --git a/docs/_build/html/server-installation.html b/docs/_build/html/server-installation.html index ee7ace99..07ae773a 100644 --- a/docs/_build/html/server-installation.html +++ b/docs/_build/html/server-installation.html @@ -263,7 +263,7 @@
  • - Compatible Systems + Compatible Systems for Netclient
  • @@ -280,8 +280,64 @@ Quick Start + +
  • @@ -297,19 +353,47 @@ @@ -463,19 +575,54 @@
  • - Support + Troubleshooting + +
  • +
  • + + + Support +
      +
    • + + + FAQ
    • @@ -588,19 +735,47 @@
      • Server Installation
      • +
      • + + + Manage Nodes + + +
      • +
      • + + + Uninstalling the netclient + + +
      • +
      • + + + Uninstralling Netmaker + +
      @@ -669,8 +690,8 @@

      Contact

      If you need help, try the discord or open a GitHub ticket.

      -

      Email: info@gravitl.com -Discord: https://discord.gg/zRb9Vfhk8A

      +

      Email: info@gravitl.com

      +

      Discord: https://discord.gg/zRb9Vfhk8A

      diff --git a/docs/quick-start.rst b/docs/quick-start.rst index d43a0421..32bb0e94 100644 --- a/docs/quick-start.rst +++ b/docs/quick-start.rst @@ -18,7 +18,7 @@ Prerequisites Install ============== #. ``ssh root@your-host`` -#. ``wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/docker-compose.quick.yml`` +#. ``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`` @@ -133,5 +133,5 @@ Uninstalling the netclient Uninstralling Netmaker =========================== -To uninstall Netmaker from the server, simply run `docker-compose down` +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. diff --git a/docs/server-installation.rst b/docs/server-installation.rst index eaae1c21..6f6f7cc6 100644 --- a/docs/server-installation.rst +++ b/docs/server-installation.rst @@ -1,27 +1,308 @@ -============ +==================== Server Installation -============ +==================== + +This section outlines installing the Netmaker server, including Netmaker, Netmaker UI, MongoDB, and CoreDNS + +Notes on Optional Features +============================ + +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. + +**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. + +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. + +**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. + +**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. -This document tells you how to install Netmaker. System Compatibility ==================== -Prerequisites -============= +Whether or not you run Netmaker in **Client Mode** is the main determination of system compatibility. -Installing Netmaker -=================== +With Client Mode **disabled**, Netmaker can be run on any system that supports Docker. This includes Windows, Mac, Linux, mainframes, and most Unix-based systems. It also requires no special privileges. Netmaker will only need ports for GRPC (50051 by default), the API (8081 by default), and CoreDNS (53, if enabled). -Linux with Docker Compose -------------------------- +With Client Mode **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. -Linux without Docker --------------------- +This requires privileged (root) access to the host machine and multiple host directory mounts. It also requires WireGuard to be installed, and Linux with systemd installed (see :doc:`compatible systems <./architecture>` for more details). -Kubernetes ----------- +To run a non-docker installation, you are running the Netmaker binary, CoreDNS binary, MongoDB, and a web server directly on your 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. -Customizing your Installation ------------------------------ +DNS Mode Prereqisite Setup (Ubuntu) +==================================== + +If you plan on running the + + +Docker Compose Install +======================= + +The most simple (and recommended) way of installing Netmaker is to use one of the provided `Docker Compose files `_. 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. + +Slim Install - No DNS and No Client Mode +-------------------------------------------- + +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. + +**Prerequisites:** + * ports 80, 8081, and 50051 are not blocked by firewall + * ports 80, 8081, 50051, and 27017 are not in use + +**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.slim.yml`` +#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml`` +#. ``docker-compose up -d`` + +Full Install - DNS and Client Mode Enabled +-------------------------------------------- + +This installation gives you the fully-featured product with Client Mode and DNS Mode. + +**Prerequisites:** + * systemd linux (Debian or Ubuntu reccommended) + * sudo privileges + * DNS Mode Prerequisite Setup (see above) + * WireGuard installed + * ports 80, 8081, 53, and 50051 are not blocked by firewall + * ports 80, 8081, 53, 50051, and 27017 are not in use + +**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. + +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): + +#. ``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`` + + +Server Only Install - UI, DNS, Client Disabled +------------------------------------------------ + +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. + +**Prerequisites:** + * ports 8081 and 50051 are not blocked by firewall + * ports 8081, 50051, and 27017 are not in use + +**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.server-only.yml`` +#. ``sed -i ‘s/HOST_IP/< Insert your-host IP Address Here >/g’ docker-compose.yml`` + +No DNS - CoreDNS Disabled, Client Enabled +---------------------------------------------- + +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. + +**Prerequisites:** + * systemd linux (Debian or Ubuntu reccommended) + * sudo privileges + * WireGuard installed + * ports 80, 8081, and 50051 are not blocked by firewall + * ports 80, 8081, 50051, and 27017 are not in use + +**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. + +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`` + +No DNS - CoreDNS Disabled, Client Enabled + +No Client - DNS Enabled, Client Disabled +--------------------------------------------- + +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. + +**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) + +**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`` + + +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. + +.. literalinclude:: ../compose/docker-compose.reference.yml + :language: YAML + + +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. + +MongoDB 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 `_. + +2. Create a user: + * ``mongo admin`` + * > `db.createUser({ user: "mongoadmin" , pwd: "mongopass", roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]})` + +Server Setup +------------- +1. **Run the install script:** ``sudo curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/v0.3.5/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. + +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://:PORT /usr/share/nginx/html/generate_config_js.sh >/usr/share/nginx/html/config.js'`` +6. **Start Nginx:** ``sudo systemctl start nginx`` + +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. If changed, need to change port of BACKEND_URL for netmaker-ui. + +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. Note, turning "off" does not remove CoreDNS. You still need to remove CoreDNS from compose file. + +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. Change to match above MongoDB instance + +MONGO_PASS: + **Default:** "mongopass" + + **Description:** Admin password for MongoDB. Change to match above MongoDB instance + +MONGO_HOST: + **Default:** "127.0.0.1" + + **Description:** Address of MongoDB. Change if necessary. + +MONGO_PORT: + **Default:** "27017" + + **Description:** Port of MongoDB. Change if necessary. + +MONGO_OPTS: + **Default:** "/?authSource=admin" + + **Description:** Opts to enable admin login for Mongo. + +Config File Reference +---------------------- +A config file may be placed under config/environments/.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 diff --git a/docs/support.rst b/docs/support.rst index c87949d1..8b10ca1b 100644 --- a/docs/support.rst +++ b/docs/support.rst @@ -3,11 +3,12 @@ Support ========= FAQ -===== +---- Contact -======== +-------- If you need help, try the discord or open a GitHub ticket. Email: info@gravitl.com + Discord: https://discord.gg/zRb9Vfhk8A