From 2678ec27d827028a042ed4a5ca91d25f6e50c0ba Mon Sep 17 00:00:00 2001 From: Fonoster Team Date: Tue, 1 Jan 2019 14:32:34 -0500 Subject: [PATCH] New updates to the docs. Pending proofreading... --- .../{cli.md => cli/cheatsheet.md} | 2 +- docs/administration/cli/installation.md | 17 ++++++ docs/administration/cli/remote-access.md | 18 ++++++ docs/assets/images/architecture.png | Bin 0 -> 87942 bytes docs/concepts.md | 2 + docs/configuration/users.md | 27 ++++++++- docs/guides/running-with-docker-or-compose.md | 49 +++++++++++++++- docs/introduction/faq.md | 49 ++++------------ docs/introduction/glossary.md | 52 +++++++++++++---- docs/introduction/installation.md | 42 +++----------- docs/introduction/media.md | 10 ++++ docs/introduction/overview.md | 54 ++++++++++++------ docs/introduction/roadmap.md | 18 +++++- docs/theme/partials/header.html | 2 +- mkdocs.yml | 5 +- 15 files changed, 239 insertions(+), 108 deletions(-) rename docs/administration/{cli.md => cli/cheatsheet.md} (98%) create mode 100644 docs/administration/cli/installation.md create mode 100644 docs/administration/cli/remote-access.md create mode 100644 docs/assets/images/architecture.png diff --git a/docs/administration/cli.md b/docs/administration/cli/cheatsheet.md similarity index 98% rename from docs/administration/cli.md rename to docs/administration/cli/cheatsheet.md index 5729b3398..68da89dff 100644 --- a/docs/administration/cli.md +++ b/docs/administration/cli/cheatsheet.md @@ -1,4 +1,4 @@ -`rctl` is a command line interface for running commands against a **Routr** server. This overview covers `rctl` syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the `rctl` reference documentation. This tool is part of Routr installation. +`rctl` is a command line interface for running commands against a **Routr** server. This overview covers `rctl` syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the `rctl` reference documentation. This tool ships separately from the Routr server. ## Syntax diff --git a/docs/administration/cli/installation.md b/docs/administration/cli/installation.md new file mode 100644 index 000000000..bfa9dade3 --- /dev/null +++ b/docs/administration/cli/installation.md @@ -0,0 +1,17 @@ +To get the Routr Command-Line Tool run the following command: + +```bash +npm install -g routr-ctl +``` + +This will provide you with the globally accessible `rctl` command. + +## Login to a Routr server + +To login to a Routr server and being issuing commands run the following commands + +```bash +rctl login https://127.0.0.1/api/{apiVersion} -u admin -p changeit +``` + +> The current API version is v1beta1 diff --git a/docs/administration/cli/remote-access.md b/docs/administration/cli/remote-access.md new file mode 100644 index 000000000..415c32235 --- /dev/null +++ b/docs/administration/cli/remote-access.md @@ -0,0 +1,18 @@ +By default Routr installs a certificate that only allows for connections using the `localhost` or `127.0.0.1`. To use `rctl` tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or ip and update the `spec.restService` section of the `config.yml`. + +Here is an example using a self-signed certificate(usually enough). + +```bash +keytool -genkey -keyalg RSA \ +-noprompt \ +-alias routr \ +-keystore api-cert.jks \ +-storepass changeit \ +-keypass changeit \ +-validity 365 \ +-keysize 2048 \ +-dname "CN=domain.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \ +-ext SAN=dns:your.domain.com,dns:localhost,ip:127.0.0.1 +``` + +> Remember to place the certificate in the `etc/certs` folder diff --git a/docs/assets/images/architecture.png b/docs/assets/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..e98ffba2513fdfae61b467043bc2a312cf5c20dd GIT binary patch literal 87942 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

X`|MkUzc8+!hQUN(`9OD8N+j^qMFP}c?Rb)E8 z&zAiJ)lu;y@8VVEYP;jcDi`}I@8)Yer6-Y?b3Q89(5QKBjt(+aQ zLn07J&RB9RBB4vXn5^0ET;SLEe6l#zjLk)lAFZrKFR=BoTOyfCvmz@W|D+Ye~&k7^PRM4Sfj&qOXbN8JX*Og8#8P^lBN*Asnwi3<)ULZh!m{07m9|SjgRLcgts$S$tQZW?g94;4u8}`C zQ?+Ojw82jMZaGZhdxAH?YwBOdm%RPiV@aTijx*J?Ax};8UW50hduO8H%q{w38V;tM z=`c)H!v%V^&lFAa^c}iEA{L_K4-gjc=DUT{d;h2!+6X>TO`i=0UC|Z&cDTYOp#@V^5>r;&2W3bdf#0#Sq)-CY zlGxG%MSrg)Qit3Rs7gCYdlwh9kGXUUb3NMF(rJ^?J#H6D{^y|N$|oQS)H!T7;Kehi z_nz~;*%8N4_4xcA{Z_0|TeD%E**e0-N)rvhKum6#3m$L|HCvsFy`JaPtbvzX3rQy@ zCAqeMi{xfPL_b&`=a{pG-4wWOCBo{>cTukN-S2V$e|0qO>zL!{dX?QuP8NL6(`*%k z?rAXJT4Fr*n1esJ5LdP?22y(uny5?P=_u)8H#*+G=kWX6`*!)`r?UGS(;XA0!FqI9 z?d)_S5*EszRaw-8G}xo-{QZC7*pZ5(+=N8)Zg1nMF=A0f!eOIXC$drvaW{7C%xZ|; z>7#CH#P!;Nf*TLgW@S*D!gts0krAs6Inpd6(W!CG7bKT#m`tUPTCA+fZ$};9KMY|j z;F>7vHzUkyKHIhJc6^_89Ouu0L^YLj!L&ar!JDQ4KO(RWRE;-d08iEH_`j; z2?N%lj~U)rf=?mO`fd8x$Hvl-{h(_ZfYEp*V)DlCUw&FLZ~MGow#>#Bz_iH=N`5a~o!VZmqH(4}ECJ&Fgni zPAJe4WG0$UH8nL3cyn_6&SzlG08*F9k$O+7!!U;p7qg^d!UdX8FV z39Sc!{?i=-6QS-WuT@03tqDA&P*;yG|M1Z3qVGN&lI!KM(_K+Y7+(}S*-OVtthX9$ z&vkz#7)%ts-cNLg-viU79c**(t}J;yZAcEQG@WmD!O9hFqAr)IrZt^wcEiH#%>$G| z>F!ot*5AVBVTSF0%yj@INjwAn>=!wT$qVNv$W=tPquu0ov#9M4i|3CczvH# zqb7d8H=W(8%TZD&Z1nb%OoWaJxR-jH%Wo++o&uzfQIr)AqSX7G-6KYMpoeinmw*)1w1yx^()8u3-j zM{ALCpeoV#`uhMpC)f>yc@}=SOHqT&5A4comD3^E# z%;s&_AWx0Iw$@6YfqOqIx

FcZP(8K-Gk(g+5X0iNla!Z*nBC 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 A new token will be issued after your next login with `rctl` diff --git a/docs/guides/running-with-docker-or-compose.md b/docs/guides/running-with-docker-or-compose.md index 6863c0981..498f1622b 100644 --- a/docs/guides/running-with-docker-or-compose.md +++ b/docs/guides/running-with-docker-or-compose.md @@ -1 +1,48 @@ -Coming soon! +This is a short-guide about running the dockerized version of Routr Server. + +## Run Environment + +Run environment variables are used in the entry point script to render configuration templates. The values of this variables can be specified during docker run, or in Kubernetes manifests in the env array. + +- ROUTR_JAVA_OPTS +- ROUTR_EXTERN_ADDR +- ROUTR_LOCALNETS +- ROUTR_REGISTRAR_INTF +- ROUTR_DS_PROVIDER +- ROUTR_DS_PARAMETERS +- ROUTR_CONFIG_FILE +- ROUTR_SALT + +## Usage + +### Running with docker (pre-built) + +**Pull the images** + +`docker pull fonoster/routr` + +**To run:** + +```bash +docker run -it \ + -p 4567:4567 \ + -p 5060:5060 \ + -p 5060:5060/udp \ + -p 5061-5063:5061-5063 \ + -e ROUTR_EXTERN_ADDR=${your host address} \ + fonoster/routr +``` + +### Running with docker-compose + +**Pull the images** + +`docker-compose pull` + +**To run:** + +`docker-compose up --abort-on-container-exit` + +**Destroying the container** + +`docker-compose down` diff --git a/docs/introduction/faq.md b/docs/introduction/faq.md index d8b9042e2..7e8320890 100644 --- a/docs/introduction/faq.md +++ b/docs/introduction/faq.md @@ -1,48 +1,23 @@ -Here is a list of common questions we get. +### What is Routr? -## 1. How do I change the server's password? +Routr is an open-source SIP Server and tooling to deploy VoIP networks. See the [overview](/introduction/overview). -If you are using the `files_data_provider` then you must change the password in the `users.yml` file. For the `redis_data_provider` follow this steps: +### What dependencies does Routr have? -First run the command `redis-cli smembers users` to obtain the reference to the user. Here is an example: +The main Routr server runs standalone and has no external dependencies. -``` -$ redis-cli smembers users -1) "5aa69ead8fd6861d92385bac" -``` -Then, retrieve the document for reference running `redis-cli get {REF}`. For example +### How does Routr compare with other SIP servers -``` -$ redis-cli get 5aa69ead8fd6861d92385bac -"{\"apiVersion\":\"v1beta1\",\"kind\":\"User\",\"metadata\":{\"name\":\"Ctl\",\"ref\":\"5aa69ead8fd6861d92385bac\"},\"spec\":{\"credentials\":{\"username\":\"admin\",\"secret\":\"oldpass\"}}}" -``` +See the [comparison page](/introduction/comparison). -Finally, search and change the old password and update your document using `redis-cli set {REF} {DOCUMENT}`. Like this: +### What language is Routr written in? -``` -$ redis-cli set 5aa69ead8fd6861d92385bac -"{\"apiVersion\":\"v1beta1\",\"kind\":\"User\",\"metadata\":{\"name\":\"Ctl\",\"ref\":\"5aa69ead8fd6861d92385bac\"},\"spec\":{\"credentials\":{\"username\":\"admin\",\"secret\":\"newpass\"}}}" -``` +Most Routr components are written in Javascript(with Oracle Nashorn). Some are also written in Java. -> A new token will be issued after your next login with `rctl` +### What will happen once Nashorn is deprecated? -## 2. How can I use `rctl` from a remote host? +The announcement Nashorn will soon be [deprecated](https://openjdk.java.net/jeps/335) is definitely a concern. The current course of action is to wait and see if GraalJS is viable replacement for Nashorn or completely re-write the project in Java. In either case, we believe we have time to make the decision later this year. -By default Routr installs a certificate that only allows for connections using the `localhost` or `127.0.0.1`. To use `rctl` tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or ip and update the `spec.restService` section of the `config.yml`. +### What license is Routr released under? -Here is an example using a self-signed certificate(usually enough). - -```bash -keytool -genkey -keyalg RSA \ --noprompt \ --alias routr \ --keystore api-cert.jks \ --storepass changeit \ --keypass changeit \ --validity 365 \ --keysize 2048 \ --dname "CN=domain.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \ --ext SAN=dns:your.domain.com,dns:localhost,ip:127.0.0.1 -``` - -> Remember to place the certificate in the `etc/certs` folder +Routr is released under the [MIT](https://opensource.org/licenses/MIT) license. diff --git a/docs/introduction/glossary.md b/docs/introduction/glossary.md index f5027c3f1..e493b2e99 100644 --- a/docs/introduction/glossary.md +++ b/docs/introduction/glossary.md @@ -1,14 +1,42 @@ This following table features some important concepts, including the different routing types implemented by the server. -| Concept | Description | -| -- | -- | -| User | Users perform administrative actions on the server | -| Agent | Agents represent SIP endpoints such as softphones and IP phones | -| Domain | Enables the creation of isolated groups of Agents | -| Peer | Similar to Agents but without Domain boundaries | -| Gateway | SIP entity that allows call termination | -| DID | Routes and translate calls between the PSTN and Routr | -| Intra-Domain Routing | Routing type for calling within the same Domain | -| Domain Ingress Routing | Calling from the PSTN to an Agent or Peer | -| Domain Egress Routing | Calling from an Agent to the PSTN thru a Gateway | -| Peer Egress Routing | Similar to *DER* but applies only to Peers | +### User + +Users perform administrative actions on the server + +### Agent + +Agents represent SIP endpoints such as softphones and IP phones, or paging speakers + +### Domain + +Enables the creation of isolated groups of Agents + +### Peer + +Similar to Agents but without Domain boundaries + +### Gateway + +IP entity that allows call termination + +### DID + +Routes and translate calls between the PSTN and Routr + +### Intra-Domain Routing (IDR) + +Routing strategy for signaling within the same Domain + +### Domain Ingress Routing (DIR) + +Routing strategy use when an Agent or Peer must go outside the domain using +a Gateway + +### Domain Egress Routing (DER) + +Calling from an Agent to the PSTN thru a Gateway + +### Peer Egress Routing (PER) + +Similar to *DER* but applies only to Peers diff --git a/docs/introduction/installation.md b/docs/introduction/installation.md index 8a4ec0fe7..13dca76d6 100644 --- a/docs/introduction/installation.md +++ b/docs/introduction/installation.md @@ -1,50 +1,24 @@ -There are no special requirements to install the server. Just download, decompress, and move the folder to a location of your choice. +There are no special requirements to install and run the server. Just follow this easy steps: -## Download the Server +➊ Download the server for your platform | Platform | Download | | -- | -- | | Linux | [tar.gz](https://github.com/fonoster/routr/releases/download/1.0.0-rc1/routr-1.0.0-rc1_linux-x64_bin.tar.gz) | | macOS | [tar.gz](https://github.com/fonoster/routr/releases/download/1.0.0-rc1/routr-1.0.0-rc1_osx-x64_bin.tar.gz) | | Windows | [tar.gz](https://github.com/fonoster/routr/releases/download/1.0.0-rc1/routr-1.0.0-rc1_windows-x64_bin.tar.gz), [zip](https://github.com/fonoster/routr/releases/download/1.0.0-rc1/routr-1.0.0-rc1_windows-x64_bin.zip) | -| Docker | [img](https://hub.docker.com/r/fonoster/routr/) | -## Or Build from Source - -> Building from source requires of Java 1.8+, Gradle, and NPM +➋ Then extract it: ```bash -git clone https://github.com/fonoster/routr -cd routr -npm i -npm run pack +tar xvfz routr-*.tar.gz +cd routr-* ``` -## Running with Docker +➌ Run the server using the `routr` command ```bash -docker pull fonoster/routr -docker run -it \ - -p 4567:4567 \ - -p 5060:5060 \ - -p 5060:5060/udp \ - -p 5061-5063:5061-5063 \ - -e ROUTR_EXTERN_ADDR=${your host address} \ - fonoster/routr +./routr ``` -## Running in any other Plattform - -To start the server just run the script `./routr` at the root of this -project. Your output will look similar to this: - -```bash -$ ./routr -[INFO ] Starting Routr -[INFO ] Listening @ 172.18.0.4:5060 [udp] -[INFO ] Listening @ 172.18.0.4:5060 [tcp] -[INFO ] Listening @ 172.18.0.4:5061 [tls] -[INFO ] Starting Location service -[INFO ] Starting Registry service -[INFO ] Starting Restful service on port 4567 -``` +> If you are interested in running Routr on Docker please see the guide [Running with Docker or Compose](https://routr.io/docs/guides/running-with-docker-or-compose/) diff --git a/docs/introduction/media.md b/docs/introduction/media.md index 6863c0981..63b24bae9 100644 --- a/docs/introduction/media.md +++ b/docs/introduction/media.md @@ -1 +1,11 @@ +There is a [subreddit](https://www.reddit.com/r/Routr/) collecting all Routr-related resources on the internet. + +The following selection of resources are particularly useful to get started with Routr. + +## Blogs + Coming soon! + +## Tutorials + +- [Instructions and example a basic setup of Routr](https://routr.io/docs/guides/basic-setup/) diff --git a/docs/introduction/overview.md b/docs/introduction/overview.md index 62905e1ae..af54d21cc 100644 --- a/docs/introduction/overview.md +++ b/docs/introduction/overview.md @@ -1,23 +1,39 @@ -**Routr** is a lightweight sip proxy, location server, and registrar that provides a reliable and scalable SIP infrastructure for telephony carriers, communication service providers, and integrators. It also provides with capabilities that are suitable for the enterprise and personal needs. To get involved in the development of this project please contact us at [@fonoster](https://twitter.com/fonoster). +## What is Routr? + +[Routr](https://github.com/fonoster/routr) is a lightweight sip proxy, location server, and registrar that provides a reliable and scalable SIP infrastructure for telephony carriers, communication service providers, and integrators. It also provides with capabilities that are suitable for the enterprise and personal needs. To get involved in the development of this project please contact us at [@fonoster](https://twitter.com/fonoster). ## Features -- Proxy -- Registrar Service -- Location Service -- Call Forking -- Multi-Tenancy/Multi-Domain -- Access to the PSTN Using SIP Gateways +Routr's main features are: + +- Typical Sip Server functions; Proxy, Registrar, Location Service +- Per node Multi-Tenancy/Multi-Domain with Domain level Access Control List - Transport: TCP, UDP, TLS, WebSocket -- Data Sources: Redis, RESTful API, Files -- Security - - Digest SIP User Authentication - - Domain Access Control List (DACL) - - RESTful service secured with TLS and JWT tokens -- Rest API -- Command Line Tool for Admin Operations -- Routing Capabilities - - Intra-Domain Routing (IDR) - - Domain Ingress Routing(DIR) - - Domain Egress Routing (DER) - - Peer Egress Routing (PER) +- Routr currently support Redis, HTTP Requests, and YAML files as data source +- Server management and monitoring with the RESTful API, CLI, and Web Console +- Configurable routing strategies; Intra-Domain, Domain Ingress, Domain Egress and Peer Egress + +## Components + +The Routr ecosystem consists of three main components: + +- The main [Routr server](https://github.com/fonoster/routr) server which acts as SIP server +- The command-line interface, [rctl](https://github.com/fonoster/routr-ctl), for remote management of the server +- A optional [web console](https://github.com/fonoster/routr-ui) for easy management of the server + +## Architecture + +This diagram illustrates the architecture of Routr and some of its ecosystem components: + +
+ +
+
+ +At the center of Routr are the routing rules. This rules are the core of Routr. In addition they are typical SIP Server the functions such as Proxy, Location, and Registrar. The main integration points are the data abstraction layer, the event publisher, and the RESTful API. This integration points, allow for easy integration with third party software. + +## Use cases + +Routr specializes in the management of SIP resources and a domain-centric routing strategies. It works well in front of the Media servers like Asterisk or FreeSWITCH. Routr runs in all mayor operating systems, in [Docker](https://www.docker.com/), and can be deployed as in cloud system such as [Kubernetes](https://kubernetes.io/). + +Unlike Kamailio and OpenSIPS, Routr does not require of any type of scripting to perform any of its typical routing tasks. Routing is configure not programed. The monitoring tasks are centralized using a RESTful API, and from that API it is possible to control de service using command-line interface or the web UI. diff --git a/docs/introduction/roadmap.md b/docs/introduction/roadmap.md index 6863c0981..151f54801 100644 --- a/docs/introduction/roadmap.md +++ b/docs/introduction/roadmap.md @@ -1 +1,17 @@ -Coming soon! +The following is only a selection of some of the major features we plan to implement in the near future. To get a more complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the [Routr server](https://github.com/fonoster/routr/issues). + +## Accounting, Authentication and Authorization + +Routr, does not currently provide any mechanism for aid the accounting. Our current priority is to implement a module to support pushing accounting, authentication and authorization events. + +## IM and Presence + +We understand that instant-messaging and presence are an important piece of any VoIP network. We are currently looking into the SIMPLE and XCAP protocols to provide IM and Presence in Routr. + +## Per-domain Certificate + +To secure the signal path, it is necessary to install a certificate. Routr, currently its only posible to install a single certificate with multiple-domains. In the future, we want to ease the certificate installation/updating process by allowing a per-domain certificate. + +## Support the Ecosystem + +In the near future we want to release a stable version of the [web UI](https://github.com/fonoster/routr-ui) which is one of our main strategy to facilitate the deployment of VoIP networks with Routr. diff --git a/docs/theme/partials/header.html b/docs/theme/partials/header.html index 2170c4ccb..a947ed64c 100644 --- a/docs/theme/partials/header.html +++ b/docs/theme/partials/header.html @@ -74,7 +74,7 @@
Demo - Community + Community About diff --git a/mkdocs.yml b/mkdocs.yml index ef316730f..741e92c18 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -35,7 +35,10 @@ nav: - Agents Configuration: configuration/agents.md - Peers Configuration: configuration/peers.md - Administration: - - Command-Line: administration/cli.md + - Command-Line: + - Installation: administration/cli/installation.md + - Cheatsheet: administration/cli/cheatsheet.md + - Remote Access to a Routr Server: administration/cli/remote-access.md - Web Console: administration/webconsole.md - API: - Reference: api/reference.md