<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.innovaphone.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dde</id>
	<title>innovaphone wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.innovaphone.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dde"/>
	<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Special:Contributions/Dde"/>
	<updated>2026-05-15T11:04:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=79800</id>
		<title>Reference14r2:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=79800"/>
		<updated>2026-05-08T08:04:08Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* It still doesn&amp;#039;t start */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or above&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
** Proxmox/KVM/Qemu&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How to implement large PBXs#Technical data and recommended number of users supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App services and multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. Before version 130012, you must use ISA, as Virtio was not supported with older versions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
** Proxmox: follow this description here, just with the app-platform-ova.zip: https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Proxmox_VE&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: eg. your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: eg. DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: eg. TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: eg. your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How to retrieve files from the AP| Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nightly database analyse ===&lt;br /&gt;
&lt;br /&gt;
Every database is analysed at night to keep indexes in sync with the data. This triggers a &#039;&#039;vacuumdb -a -z&#039;&#039;, which updates optimizer statistics, but does &#039;&#039;&#039;not&#039;&#039;&#039; shrink the physical size of the database.&amp;lt;br/&amp;gt;&lt;br /&gt;
This must be done manually in the instance settings.&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13 Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
After the update has been downloaded and verified, your App Platform will reboot.&lt;br /&gt;
You can check the installation process after the reboot with the following URL: https://IP-of-AP/manager/ramdisk.log&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: A timezone string which is used by the App Platform Manager to do certain jobs according to the configured timezone.&lt;br /&gt;
** Note that this doesn&#039;t change the timezone of the linux itself!&lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: see [[#Backup_of_the_Apps| Backup of Apps]]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Current Webserver certificates&#039;&#039;: shows the current certificates with the ability to download them. &lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Encrypt ==&lt;br /&gt;
&lt;br /&gt;
Configure the certificate creation by Let&#039;s Encrypt here.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Enable&#039;&#039;: turns the automatic creation on or off&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App URL&#039;&#039;: the URL of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this URL from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App Password&#039;&#039;: the client password of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this password from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Key length&#039;&#039;: 2048, 3072 or 4096 (keep in mind, that [[{{NAMESPACE}}:Certificate_management#Certificate_Key_Length_and_CPU_Usage|a higher value provides higher security but also lower performance!]])&lt;br /&gt;
* &#039;&#039;DNS Name&#039;&#039;: the external DNS names of your device (up to 100 possible)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
Starting with 16r1 you also can configure OAuth2 Authentications. You can have a look into our HowTo Article for assistance: [[Howto16r1:Configure OAuth2 E-Mail]]&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
App Platform [[#App Platform replication|replication settings]]&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Updates the App Platform to the latest image available on the App Store.&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
Restarts the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Shutdown ==&lt;br /&gt;
Shuts down the App Platform.&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 or above on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
**Note: to ensure rapid recognition of the new DNS target, the definition of an appropriate TTL value is recommended&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.innovaphone.com/index.php?title=Howto14r2:Firmware_Upgrade_V14r1_V14r2#App_Platform_and_Apps&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= App Installer PBX Manager Plugin =&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V14 and above&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The app installer plugin allows IT administrator (with access to the PBX Manager) to install/update/delete new apps from the innovaphone app store including Partners apps. It is automatically available with existing app platforms or after adding a new one in the PBX Manager.&lt;br /&gt;
It offers a view to the App Platform Manager‘s App Store with all the available functionalities and simplifies the install, update and uninstall of apps.&lt;br /&gt;
&lt;br /&gt;
== Dedicated AP for each user ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app will install the app service and add a new instance with the user’s domain. The instance is automatically started.&amp;lt;br&amp;gt;&lt;br /&gt;
This further enables the configuration of the instance through its respective PBX Manager plugin. &amp;lt;br&amp;gt;&lt;br /&gt;
Uninstalling the app will remove the app service and the corresponding instance.&lt;br /&gt;
&lt;br /&gt;
== Shared AP between users ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app works in a similar way to that of the dedicated AP. However, each time a new user installs the app, only a new instance is created if the app service is already installed. &amp;lt;br&amp;gt;&lt;br /&gt;
A user can uninstall the app, in this case the corresponding instance is deleted. If no more instances exist, then the app service is uninstalled. &amp;lt;br&amp;gt;&lt;br /&gt;
The administrator can only update the app service in such scenario.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM/ARM64 gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &lt;br /&gt;
** IPxx11: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
** IPxx13: &#039;&#039;&#039;root=/dev/nvme0n1p3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== App Platform doesn&#039;t start after an update ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
Note: This process can take a while, after it&#039;s finished it reboots and automatically change the &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; value. &lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine ===&lt;br /&gt;
&lt;br /&gt;
Boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition.&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
=== It still doesn&#039;t start ===&lt;br /&gt;
&lt;br /&gt;
If it still doesn&#039;t start, configure the App Platform to boot from /dev/sda3|IPx11 or /dev/nvme0n1p3|IPx13 (or inside a VM start the second boot loader entry) and login with SSH as root.&lt;br /&gt;
Then do a first check to verify that you have a specific error due to an incomplete update or a [[Howto15r1:Firmware Upgrade V14r2 V15r1#AP Upgrade to Image 130006|wrong update order]]:&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* /apps/manager/manager&lt;br /&gt;
* if this outputs &#039;&#039;&#039;error while loading shared libraries: libcrypto.so.3:&#039;&#039;&#039; you have a manager version which cannot run on the current image.&lt;br /&gt;
&lt;br /&gt;
In this case you must download an older build (14r1 1410593):&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* wget --no-check-certificate -O /apps/manager/manager https://webbuild.innovaphone.com/1410593/arm/manager/manager &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* wget --no-check-certificate -O /apps/webserver/webserver https://webbuild.innovaphone.com/1410593/arm/webserver/webserver &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* chown root:root /apps/manager/manager&lt;br /&gt;
* chown root:root /apps/webserver/webserver&lt;br /&gt;
* chmod +x /apps/manager/manager&lt;br /&gt;
* chmod +x /apps/webserver/webserver&lt;br /&gt;
* echo 110000 &amp;gt; /mnt/sda1/label&lt;br /&gt;
** this allows the manager to perform an image update again&lt;br /&gt;
* /etc/init.d/S92manager start&lt;br /&gt;
* now perform an image update and &#039;&#039;&#039;afterwards&#039;&#039;&#039; update your apps again&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files|Reference14r2:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine|Reference14r2:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or &#039;&#039;&#039;130007&#039;&#039;&#039; and lower than &#039;&#039;&#039;130015&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 130015 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
&lt;br /&gt;
=== All databases ===&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
=== single database ===&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and the App database is not available during this time&lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 (or /dev/nvme0n1p3) to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt; on IPx10/IPx11 gateways&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt; on IPx10/IPx11 gateways&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/nvme0n1p2&amp;lt;/code&amp;gt; on IPx13 gateways&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/nvme0n1p3&amp;lt;/code&amp;gt; on IPx13 gateways&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt; (IPx10/IPx11) or to &amp;lt;code&amp;gt;root=/dev/nvme0n1p3&amp;lt;/code&amp;gt; (IPx13)&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;br /&gt;
&lt;br /&gt;
== Move instance database to external database host ==&lt;br /&gt;
&lt;br /&gt;
In case you want to use an external database server instead of the integrated:&lt;br /&gt;
&lt;br /&gt;
* download a backup of the specific instance over the App Platform Manager&lt;br /&gt;
* create a postgresql database on the external host:&lt;br /&gt;
** createdb --encoding=UTF-8 exampledb&lt;br /&gt;
* restore the backup&lt;br /&gt;
** pg_restore -d exampledb backup-exampledb.dump&lt;br /&gt;
* change the ownership to a specific postgresql user (which you have to create yourself first)&lt;br /&gt;
** psql -d postgres -c &amp;quot;ALTER DATABASE exampledb OWNER TO exampleuser&amp;quot;&lt;br /&gt;
* configure the database host, name, user and password on the instance inside the App Platform Manager&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=79799</id>
		<title>Reference14r2:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=79799"/>
		<updated>2026-05-08T08:02:52Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Reboot after an image update hangs (ARM gateway) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or above&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
** Proxmox/KVM/Qemu&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How to implement large PBXs#Technical data and recommended number of users supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App services and multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. Before version 130012, you must use ISA, as Virtio was not supported with older versions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
** Proxmox: follow this description here, just with the app-platform-ova.zip: https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Proxmox_VE&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: eg. your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: eg. DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: eg. TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: eg. your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How to retrieve files from the AP| Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nightly database analyse ===&lt;br /&gt;
&lt;br /&gt;
Every database is analysed at night to keep indexes in sync with the data. This triggers a &#039;&#039;vacuumdb -a -z&#039;&#039;, which updates optimizer statistics, but does &#039;&#039;&#039;not&#039;&#039;&#039; shrink the physical size of the database.&amp;lt;br/&amp;gt;&lt;br /&gt;
This must be done manually in the instance settings.&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13 Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
After the update has been downloaded and verified, your App Platform will reboot.&lt;br /&gt;
You can check the installation process after the reboot with the following URL: https://IP-of-AP/manager/ramdisk.log&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: A timezone string which is used by the App Platform Manager to do certain jobs according to the configured timezone.&lt;br /&gt;
** Note that this doesn&#039;t change the timezone of the linux itself!&lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: see [[#Backup_of_the_Apps| Backup of Apps]]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Current Webserver certificates&#039;&#039;: shows the current certificates with the ability to download them. &lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Encrypt ==&lt;br /&gt;
&lt;br /&gt;
Configure the certificate creation by Let&#039;s Encrypt here.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Enable&#039;&#039;: turns the automatic creation on or off&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App URL&#039;&#039;: the URL of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this URL from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App Password&#039;&#039;: the client password of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this password from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Key length&#039;&#039;: 2048, 3072 or 4096 (keep in mind, that [[{{NAMESPACE}}:Certificate_management#Certificate_Key_Length_and_CPU_Usage|a higher value provides higher security but also lower performance!]])&lt;br /&gt;
* &#039;&#039;DNS Name&#039;&#039;: the external DNS names of your device (up to 100 possible)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
Starting with 16r1 you also can configure OAuth2 Authentications. You can have a look into our HowTo Article for assistance: [[Howto16r1:Configure OAuth2 E-Mail]]&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
App Platform [[#App Platform replication|replication settings]]&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Updates the App Platform to the latest image available on the App Store.&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
Restarts the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Shutdown ==&lt;br /&gt;
Shuts down the App Platform.&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 or above on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
**Note: to ensure rapid recognition of the new DNS target, the definition of an appropriate TTL value is recommended&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.innovaphone.com/index.php?title=Howto14r2:Firmware_Upgrade_V14r1_V14r2#App_Platform_and_Apps&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= App Installer PBX Manager Plugin =&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V14 and above&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The app installer plugin allows IT administrator (with access to the PBX Manager) to install/update/delete new apps from the innovaphone app store including Partners apps. It is automatically available with existing app platforms or after adding a new one in the PBX Manager.&lt;br /&gt;
It offers a view to the App Platform Manager‘s App Store with all the available functionalities and simplifies the install, update and uninstall of apps.&lt;br /&gt;
&lt;br /&gt;
== Dedicated AP for each user ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app will install the app service and add a new instance with the user’s domain. The instance is automatically started.&amp;lt;br&amp;gt;&lt;br /&gt;
This further enables the configuration of the instance through its respective PBX Manager plugin. &amp;lt;br&amp;gt;&lt;br /&gt;
Uninstalling the app will remove the app service and the corresponding instance.&lt;br /&gt;
&lt;br /&gt;
== Shared AP between users ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app works in a similar way to that of the dedicated AP. However, each time a new user installs the app, only a new instance is created if the app service is already installed. &amp;lt;br&amp;gt;&lt;br /&gt;
A user can uninstall the app, in this case the corresponding instance is deleted. If no more instances exist, then the app service is uninstalled. &amp;lt;br&amp;gt;&lt;br /&gt;
The administrator can only update the app service in such scenario.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM/ARM64 gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &lt;br /&gt;
** IPxx11: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
** IPxx13: &#039;&#039;&#039;root=/dev/nvme0n1p3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== App Platform doesn&#039;t start after an update ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
Note: This process can take a while, after it&#039;s finished it reboots and automatically change the &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; value. &lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine ===&lt;br /&gt;
&lt;br /&gt;
Boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition.&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
=== It still doesn&#039;t start ===&lt;br /&gt;
&lt;br /&gt;
If it still doesn&#039;t start, configure the App Platform to boot from /dev/sda3 (or inside a VM start the second boot loader entry) and login with SSH as root.&lt;br /&gt;
Then do a first check to verify that you have a specific error due to an incomplete update or a [[Howto15r1:Firmware Upgrade V14r2 V15r1#AP Upgrade to Image 130006|wrong update order]]:&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* /apps/manager/manager&lt;br /&gt;
* if this outputs &#039;&#039;&#039;error while loading shared libraries: libcrypto.so.3:&#039;&#039;&#039; you have a manager version which cannot run on the current image.&lt;br /&gt;
&lt;br /&gt;
In this case you must download an older build (14r1 1410593):&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* wget --no-check-certificate -O /apps/manager/manager https://webbuild.innovaphone.com/1410593/arm/manager/manager &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* wget --no-check-certificate -O /apps/webserver/webserver https://webbuild.innovaphone.com/1410593/arm/webserver/webserver &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* chown root:root /apps/manager/manager&lt;br /&gt;
* chown root:root /apps/webserver/webserver&lt;br /&gt;
* chmod +x /apps/manager/manager&lt;br /&gt;
* chmod +x /apps/webserver/webserver&lt;br /&gt;
* echo 110000 &amp;gt; /mnt/sda1/label&lt;br /&gt;
** this allows the manager to perform an image update again&lt;br /&gt;
* /etc/init.d/S92manager start&lt;br /&gt;
* now perform an image update and &#039;&#039;&#039;afterwards&#039;&#039;&#039; update your apps again&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files|Reference14r2:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine|Reference14r2:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or &#039;&#039;&#039;130007&#039;&#039;&#039; and lower than &#039;&#039;&#039;130015&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 130015 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
&lt;br /&gt;
=== All databases ===&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
=== single database ===&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and the App database is not available during this time&lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 (or /dev/nvme0n1p3) to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt; on IPx10/IPx11 gateways&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt; on IPx10/IPx11 gateways&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/nvme0n1p2&amp;lt;/code&amp;gt; on IPx13 gateways&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/nvme0n1p3&amp;lt;/code&amp;gt; on IPx13 gateways&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt; (IPx10/IPx11) or to &amp;lt;code&amp;gt;root=/dev/nvme0n1p3&amp;lt;/code&amp;gt; (IPx13)&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;br /&gt;
&lt;br /&gt;
== Move instance database to external database host ==&lt;br /&gt;
&lt;br /&gt;
In case you want to use an external database server instead of the integrated:&lt;br /&gt;
&lt;br /&gt;
* download a backup of the specific instance over the App Platform Manager&lt;br /&gt;
* create a postgresql database on the external host:&lt;br /&gt;
** createdb --encoding=UTF-8 exampledb&lt;br /&gt;
* restore the backup&lt;br /&gt;
** pg_restore -d exampledb backup-exampledb.dump&lt;br /&gt;
* change the ownership to a specific postgresql user (which you have to create yourself first)&lt;br /&gt;
** psql -d postgres -c &amp;quot;ALTER DATABASE exampledb OWNER TO exampleuser&amp;quot;&lt;br /&gt;
* configure the database host, name, user and password on the instance inside the App Platform Manager&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Devices&amp;diff=79776</id>
		<title>Reference15r1:Concept App Service Devices</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Devices&amp;diff=79776"/>
		<updated>2026-05-05T06:20:36Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Certificates configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
The App Service Devices is an App Service which can be installed on an innovaphone App Platform. It is used to administrate the innovaphone devices which belong to the whole installation.&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX from version 13r1&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
=== Devices App (innovaphone-devices) ===&lt;br /&gt;
This is the standard UI App for Devices.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Websocket: to publish the com.innovaphone.devicesui-API, which can be used to link directly to devices (which is done e.g. inside the Events app)&lt;br /&gt;
&lt;br /&gt;
=== Devices API (innovaphone-devices-api) ===&lt;br /&gt;
This is a hidden App, which provides the Devices API (com.innovaphone.devices). This API can be used to find and communicate with devices which are registered to the Devices App.&lt;br /&gt;
&lt;br /&gt;
Additionally it acts as a provider of the Search API (com.innovaphone.search). So you can find devices and domains in other apps like the Search App.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Hidden: DevicesApi must be a hidden App&lt;br /&gt;
;Websocket: to get the URL of the Devices App itself which is used for provisioning&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
=== Devices ===&lt;br /&gt;
&lt;br /&gt;
With the Devices plugin App objects can be created, edited and deleted for Devices and the Devices API on the PBX.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
All innovaphone hard phones and gateways starting from version 13r1 can establish a registration inside the Devices App and therefor administrative tasks can be performed through the App.&lt;br /&gt;
&lt;br /&gt;
=== Domains ===&lt;br /&gt;
&lt;br /&gt;
In a hosted environment, it might be needed to add multiple domains to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
After the initial installation of Devices through Install, you have administrative rights and can add more domains. &lt;br /&gt;
&lt;br /&gt;
==== Administrative rights ====&lt;br /&gt;
You have administrative rights if the configured PBX App object for Devices uses the password of the instance which is configured in the Manager App and the PBX uses the same domain as this instance.&lt;br /&gt;
&lt;br /&gt;
==== Domain local rights ====&lt;br /&gt;
You have just rights to a certain domain if the configured PBX App object for Devices uses the domain password which can be configured in Devices for each domain and the PBX uses the same domain name as configured in Devices.&lt;br /&gt;
&lt;br /&gt;
==== Assign rights to other domains ====&lt;br /&gt;
Domains can gain access to other domains by configuring these access rights in the Devices App.&lt;br /&gt;
&lt;br /&gt;
==== Deploy passwords and access rights ====&lt;br /&gt;
During install, a domain is created inside the Devices App. There is a checkmark Deploy the domain password on all devices which is set by default and which is the same as the administrative password.&lt;br /&gt;
If you change the domain password, all passwords on all administrative devices and app platforms which are connected to this domain will be also changed.&amp;lt;br/&amp;gt;&lt;br /&gt;
Since 13r2sr25/13r3sr7/14rx: devices which are auto provisioned or provisioned through the Profile/Users Admin App will get a random password instead of the domain password.&lt;br /&gt;
If you add a phone device manually to a domain inside the Devices App, this phone device will also get a random password. Other device types added manually or devices added with a provisioning code which has been created within the Devices App directly, will get the domain password instead.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This will also set the manager password and the SSH passwords of App Platforms.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The clear text random passwords can be requested and viewed in the settings of a device in the Devices App.&lt;br /&gt;
&lt;br /&gt;
 Attention: If you untick the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark, the password won&#039;t be deployed anymore, but also not reconfigured to the default password!&lt;br /&gt;
&lt;br /&gt;
 Attention: After each reconnect of a client, the password will be deployed again.&lt;br /&gt;
 This means, if the checkmark is set and you set another password somewhere else (e.g. under General::Admin),&lt;br /&gt;
 this password will be just valid until the next reboot or reconnect to the Devices App!&lt;br /&gt;
&lt;br /&gt;
;Create new random passwords&lt;br /&gt;
You can rollout new random passwords by unticking the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark and ticking it again.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Devices with multiple domains (Cloud)&lt;br /&gt;
In a hosted environment, you can use the Devices App with multiple domains. The corresponding instance of Devices has a configured domain and an instance password set inside the manager.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hosting PBX has a domain inside Devices with a specific password.&amp;lt;br&amp;gt;&lt;br /&gt;
If this domain name matches the instance domain of the Devices instance and the password matches either the instance password or the domain password, you will be logged in as admin and have access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each newly created domain has its own password inside Devices. If you create an App Object inside a PBX with this domain and the password of this domain (inside Devices), you will just have access to this single domain.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Devices also has the possibility to grant access to other domains for a specific domain.&lt;br /&gt;
&lt;br /&gt;
=== Categories ===&lt;br /&gt;
&lt;br /&gt;
There are two types of categories:&lt;br /&gt;
* provisioning category: used for device configurations and provisioning&lt;br /&gt;
* standard category: used for update/backup jobs and device management&lt;br /&gt;
&lt;br /&gt;
Each device can have just a &#039;&#039;&#039;single&#039;&#039;&#039; provisioning category, as it receives it&#039;s configuration by all configured device configurations for this provisioning category.&lt;br /&gt;
&lt;br /&gt;
In addition, a provisioning category, which is used inside an analogue phone/phone device configuration &#039;&#039;&#039;cannot&#039;&#039;&#039; be used to provision a gateway.&lt;br /&gt;
&lt;br /&gt;
=== Device connections ===&lt;br /&gt;
The Devices registration is done through a websocket connection to the webserver of the App Platform and the Devices instance (standard HTTP/s port).&amp;lt;br&amp;gt;&lt;br /&gt;
The URL used can be configured manually under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration] or through a new provisioning mechanism.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A binary protocol is used to transfer information between the device and the devices App. The MAC address is the unique key to identify a device.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a device is added to a domain in Devices, the device gets a unique random password. Without such a password, a device shows up as &#039;&#039;&#039;unassigned&#039;&#039;&#039; in the Devices app.&lt;br /&gt;
This is also the case after a long reset or when the device lost its configuration.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In such a case, the device has to be manually added again to a domain or it has to be provisioned again.&lt;br /&gt;
&lt;br /&gt;
 If a device is not assigned to a domain or provisioning category, it won&#039;t receive any configurations.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registrations ====&lt;br /&gt;
See [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration]&lt;br /&gt;
&lt;br /&gt;
==== Second Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The firmware has a second SYSCLIENT2 module, which can be configured to point to a different Devices instance and the AP Manager also has a second Devices Registration URL.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you use this configuration option, you should take care and consider:&lt;br /&gt;
&lt;br /&gt;
* if the Devices domain from the second configuration provides a password for all devices, the password is ignored, as it would lead to inconsistend passwords otherwise (from 13r1 SR12 on)&lt;br /&gt;
* the Devices domain from the second configuration should not provide Devices Configurations or Update Jobs as these might collide with configurations from the first Devices instance!&lt;br /&gt;
&lt;br /&gt;
Generally, only one of the two  &#039;&#039;Devices&#039;&#039;  App instances connected to the device must apply changes to the device.&lt;br /&gt;
&lt;br /&gt;
 We strongly discourage the usage of this second configuration option due to unexpected behaviour if incorrectly used!&lt;br /&gt;
 Never use the second URL if you use software or hardware rental!&lt;br /&gt;
&lt;br /&gt;
==== Device information ====&lt;br /&gt;
&lt;br /&gt;
The following data is transferred:&lt;br /&gt;
* MAC address&lt;br /&gt;
* device type (e.g. IPVA, AppPlatform, IP112)&lt;br /&gt;
* IP addresses (IPv4, IPv6)&lt;br /&gt;
* version (not searchable)&lt;br /&gt;
&lt;br /&gt;
You can also search for this data inside the devices tab in the App.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==== Device Advanced UI ====&lt;br /&gt;
By default, Devices administrators and non admins can access the advanced UI of any device without limitations.&amp;lt;br/&amp;gt;&lt;br /&gt;
In certain scenerios (e.g. Cloud), you may want to restrict this access to just the PBX on gateways and IPVAs for non adminstrative users, which just have access to certain domains.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
In this case, you can set the corresponding checkmark in the device settings tab of the specific device.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the flag is set, just the PBX tab of the advanced UI is accessible for non administrative Devices users.&lt;br /&gt;
&lt;br /&gt;
 Technically this means, that every HTTP request is checked if it starts with PBX0 and if not, the request is rejected with 401 unauthorized.&lt;br /&gt;
&lt;br /&gt;
If the device can be accessed directly without Devices, you may need a reverse proxy in between to filter HTTP requests.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Provisioning ===&lt;br /&gt;
Devices can be added by provisioning (both phones and gateways). &lt;br /&gt;
The standard online provisioning looks like this:&lt;br /&gt;
* a user or administrator creates a provisioning code in the Devices or Users App (this stores the Devices URL on the provisioning server side)&lt;br /&gt;
* a device with 13r1 or newer is connected to the network after a long reset&lt;br /&gt;
* the provisioning code has to be entered within one hour (after one hour, the Update URL isn&#039;t polled anymore)&lt;br /&gt;
* the device sends this code to config.innovaphone.com and retrieves the Devices URL&lt;br /&gt;
* the device connects to the Devices URL and is added to the domain where the code has been created&lt;br /&gt;
&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Offline_Provisioning offline provisioning mode].&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Provisioning#Automatic_provisioning automatic provisioning mode].&lt;br /&gt;
&lt;br /&gt;
 Note: provisioning is cancelled if the device already belongs to another domain in the same Devices instance! This prevents the unauthorized move of a device between different domains.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The Devices Registration URL which is set through the provisioning process, always starts with &#039;&#039;&#039;wss&#039;&#039;&#039;. This is not dependent anymore on the App URL which is configured inside the PBX Devices App object.&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
The Devices App can be used to rollout updates.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSON files ====&lt;br /&gt;
The update files have to be acccessible on a webserver without authentication and four json files are used:&lt;br /&gt;
* firmware.json: innovaphone device firmware&lt;br /&gt;
* apps.json: Apps for the App Platform&lt;br /&gt;
* software.json: contains software for DECT handsets&lt;br /&gt;
** just IP64 and IP65 are used and supported&lt;br /&gt;
* phoneplatform.json: contains the phone platform image for e.g. the IP270&lt;br /&gt;
&lt;br /&gt;
You can either use the standard innovaphone App Store for these files or your own local webserver.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update jobs ====&lt;br /&gt;
You can configure several update jobs with different categories to organize your updates.&amp;lt;br&amp;gt;&lt;br /&gt;
Update jobs are always sequentially processed and inside one update job, just &#039;&#039;&#039;20&#039;&#039;&#039; devices are updated at the same time.&lt;br /&gt;
&lt;br /&gt;
==== Device update check after the update job has been already executed====&lt;br /&gt;
If a device goes online, the newest suitable update job is searched for this device (depending on the categories).&amp;lt;br&amp;gt;&lt;br /&gt;
If an update job is found, the update is just performed, if there has been &#039;&#039;&#039;no&#039;&#039;&#039; successfull update for this device in this job before and the version does not match (simply string compare).&lt;br /&gt;
&lt;br /&gt;
====Update errors====&lt;br /&gt;
If an update fails, the Devices App shows an error. You may have to enable further tracing on the updated device itself to find out the reason of the failure.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 module and take a look at the events which may already tell you the reason&lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
 An update job is retried &#039;&#039;&#039;two&#039;&#039;&#039; times if updates inside this job failed. The retry is done &#039;&#039;&#039;ten&#039;&#039;&#039; minutes after the update job finished previously.&lt;br /&gt;
&lt;br /&gt;
====innovaphone myApps====&lt;br /&gt;
The path to the App Store and the used innovaphone myApps version is updated to the version of the gateway on gateways with an enabled PBX after a successfull update.&amp;lt;br&amp;gt;&lt;br /&gt;
This configuration can be found [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:PBX/Config/myApps here]&lt;br /&gt;
&lt;br /&gt;
Inside the configuration on an update job, the flag &amp;quot;Do not update myApps launcher software&amp;quot; disables the update of the innovaphone myApps version inside PBXes.&lt;br /&gt;
&lt;br /&gt;
====DECT handsets====&lt;br /&gt;
If you check the update DECT handsets checkmark, all DECT devices will be configured to rollout updates to DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
The DECT handset firmware will be searched inside the configured software.json.&lt;br /&gt;
&lt;br /&gt;
=== Backups ===&lt;br /&gt;
The Devices App can be used to backup the configuration and data of Apps and devices.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Webserver requirements====&lt;br /&gt;
Backups are stored on a webserver with or without Digest/Basic authentication and with the &#039;&#039;&#039;webdav PUT&#039;&#039;&#039; method.&lt;br /&gt;
&lt;br /&gt;
====Backup jobs====&lt;br /&gt;
Backup jobs are executed sequentially. Inside one backup job, just &#039;&#039;&#039;20&#039;&#039;&#039; backups are performed at the same time.&lt;br /&gt;
&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
The configuration file is stored. Therefor the Devices App tells the device to store the configuration with a !mod cmd UP0 /sync prot URL.&lt;br /&gt;
&lt;br /&gt;
====Apps on an App Platform====&lt;br /&gt;
The databases of all existing instances and the manager are stored.&amp;lt;br&amp;gt;&lt;br /&gt;
Each installed App Service can have multiple instances and each App instance has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
A database contains &#039;&#039;&#039;both&#039;&#039;&#039; configuration and data of an App instance! &amp;lt;br&amp;gt;&lt;br /&gt;
The manager database contains the webserver certificate and further manager related configuration settings.&lt;br /&gt;
&lt;br /&gt;
The Devices App establishes a websocket connection to the manager and tells the manager where to store the backups.&amp;lt;br&amp;gt;&lt;br /&gt;
The manager on the backuped App Platform itself performs the HTTP requests to store the files.&lt;br /&gt;
&lt;br /&gt;
====Backup errors====&lt;br /&gt;
If a backup fails, the Devices App shows an error. You may have to enable further tracing on the backuped device itself to find out the reason of the failure.&lt;br /&gt;
&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 &lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
=== Restore ===&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
Just as always under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Administration/Upload/Config Upload Config].&lt;br /&gt;
&lt;br /&gt;
====Apps====&lt;br /&gt;
The App Service itself has to be installed on the App Platform prior restoring of a single instance.&amp;lt;br&amp;gt;&lt;br /&gt;
The restoring is done in the Manager App on the App Platform itself.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance settings, the configuration and data are restored in a single process.&lt;br /&gt;
&lt;br /&gt;
=== Device Configurations ===&lt;br /&gt;
&lt;br /&gt;
You can define several device configurations. These configurations are either applied to all devices inside this domain or to selected categories.&amp;lt;br/&amp;gt;&lt;br /&gt;
Configurations are applied on creation and on every reconnect of a matching device.&lt;br /&gt;
&lt;br /&gt;
==== Transfer checkmarks ====&lt;br /&gt;
&lt;br /&gt;
Some configuration options have a specific checkmark to enable the transfer of the option.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* Checkmark disabled:&lt;br /&gt;
** configuration option field(s) are disabled &lt;br /&gt;
** option values are &#039;&#039;&#039;not&#039;&#039;&#039; transferred at all&lt;br /&gt;
* Checkmark enabled:&lt;br /&gt;
** configuration option field(s) are enabled&lt;br /&gt;
** option values are transferred, even if field values are empty&lt;br /&gt;
&lt;br /&gt;
==== Expert configuration ====&lt;br /&gt;
&lt;br /&gt;
The expert configuration can be used to configure different settings which are not available inside the other device configurations.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can use the standard syntax of an update server script (see [[ {{NAMESPACE}}:Concept_Update_Server | Concept Update Server ]] for a general overview and the section on [[Howto:PHP_based_Update_Server_V2#Hints_for_writing_your_update_snippets | Hints for writing your update snippets ]] (note that the remainder of this article relates to the now deprecated old mechanism, so please disregard the rest)).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Some hints:&lt;br /&gt;
* the expert configuration is just executed once after a device restarted and on change of the expert configuration itself&lt;br /&gt;
* the expert configuration is executed after all other device configuration types, so that you can override changes&lt;br /&gt;
* to make configuration changes effective, you may also need to issue a final &#039;&#039;config write&#039;&#039;, &#039;&#039;config activate&#039;&#039; and &#039;&#039;iresetn&#039;&#039; command (see the [[ {{NAMESPACE}}:Concept_Update_Server#Check_command | &#039;&#039;check&#039;&#039; command]] for details)&lt;br /&gt;
* some commands shouldn&#039;t be used inside the script:&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Times_command |&#039;&#039;times&#039;&#039;]]: since the expert configuration is executed only once after a reboot of the device and when changes are made, it does not make sense to use the &#039;&#039;times&#039;&#039; command&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Prot_command |&#039;&#039;prot&#039;&#039;]]|[[ {{NAMESPACE}}:Concept_Update_Server#Boot_command |&#039;&#039;boot&#039;&#039;]]: use an update job instead&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Scfg_command |&#039;&#039;scfg&#039;&#039;]]: use a backup job instead&lt;br /&gt;
** [[Howto:PHP_based_Update_Server_V2#Using_vars_create|&#039;&#039;vars create&#039;&#039;]]: this cmd will always raise the &#039;&#039;reset needed condition&#039;&#039; and the aforementioned &#039;&#039;iresetn&#039;&#039; command would always execute therefore.  As a result, the devices would enter a boot loop.  Be sure to avoid this using an appropriate [[ {{NAMESPACE}}:Concept_Update_Server#Check_command |&#039;&#039;check&#039;&#039; command ]] and update its &#039;&#039;&amp;lt;serial&amp;gt;&#039;&#039; properly whenever the expert configuration is changed&lt;br /&gt;
&lt;br /&gt;
==== Certificates configuration ====&lt;br /&gt;
You can use this configuration to rollout certificates to the trust list of your devices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Manual upload certificates.&lt;br /&gt;
* Configure up to five URLs which are polled every 24 hours. They must return files with PEM formatted public keys (one or more) which are then rolled out.&lt;br /&gt;
** certificates are just rolled out if differences are determined, so if URLs are polled and no changes are detected, certificates are not rolled out again. Changes are detected by fingerprint comparison of each embedded certificate&lt;br /&gt;
** if a device restarts, the configuration is applied again. Just the fingerprints of the device trust list are checked against the configuration trust list and just on differences, certificates are rolled out again&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/innovaphone.pem to always have the innovaphone public keys in your trust list (e.g. used for our push service).&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca.pem to always have the innovaphone Device Certification Authority certificates in your trust list.&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca-unverified.pem to always have the innovaphone Unverified Device Certification Authority certificates in your trust list.&lt;br /&gt;
** The Unverified CA is used for non hardware devices, e.g. IPVAs, which are not shipped with an official innovaphone Device Certification Authority certificate, as innovaphone has no control over the serial number here.&lt;br /&gt;
&lt;br /&gt;
 Using this configuration, the trust list can only be managed through &#039;&#039;Devices&#039;&#039; because it is cleared before each rollout.&lt;br /&gt;
&lt;br /&gt;
==== DECT Handsets ====&lt;br /&gt;
&lt;br /&gt;
This configuration can be used to configure specific options like language, voicemail number etc. for DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* all DECT devices like IP1202, IP1203 etc. will receive this configuration (of course just if the configured categories match)&lt;br /&gt;
* Devices configures a URL like https://domain.com/domain.com/devices/parameters/id.xml on the specific DEVMANBW module.&lt;br /&gt;
* This file is then polled by the basestations and the read values are transfered to the DECT handsets.&lt;br /&gt;
* see [[{{NAMESPACE}}:IP1202/IP1203_DECT_System#Configuration_of_Handset_parameters]]&lt;br /&gt;
&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
=== Software rental ===&lt;br /&gt;
Regarding the Software Rental program and the Payment Method, please refer to:&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_Software_Rental|Concept Software Rental]]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
Software rental can be done for innovaphone Cloud installations or for software, which operates on the customer premisis. This could eventually be customer owned hardware or a privat virtual machine, managed by the customer.&lt;br /&gt;
&lt;br /&gt;
==== Hardware licenses ====&lt;br /&gt;
Hardware licenses have to be bound on the specific device in my.innovaphone itself and currently can&#039;t be handled within the Devices App itself. So you also need to download the licenses from my.innovaphone and upload them on the device with the already known methods.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses with software rental =====&lt;br /&gt;
If your device has software rental licenses, you can bind hardware licenses within my.innovaphone in the software rental project itself.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses without software rental =====&lt;br /&gt;
If your device does not have software rental licenses, you should bind hardware licenses in a separate non rental project in my.innovaphone.&lt;br /&gt;
&lt;br /&gt;
==== innovaphone Cloud ====&lt;br /&gt;
Inside the innovaphone Cloud, you just have to upload your activation keys with iSCs to add licenses to one or more gateways.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Email expiry notifications ====&lt;br /&gt;
You will receive an email notification if the rental of a project expires. This notification will be sent &#039;&#039;&#039;seven&#039;&#039;&#039; weeks before the expiry and then once a week until the rental expires.&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure one or more email recipients in the domain settings.&amp;lt;br&amp;gt;&lt;br /&gt;
If no email address is configured, the email address of the logged in user account is used.&lt;br /&gt;
&lt;br /&gt;
==== History ====&lt;br /&gt;
You can download the history in the Devices App. You&#039;ll get a CSV file (semicolon separated). The date and number format depends on the selected language in the UI.&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an API available for automated downloas, which is described [[ {{NAMESPACE}}:Concept_App_Service_Devices#API_to_download_rental_history|here ]].&lt;br /&gt;
&lt;br /&gt;
====Own installation====&lt;br /&gt;
Inside your own installation, you have to register a new my.innovaphone account or you can use an existing account inside the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
One domain inside Devices belongs to one project inside your my.innovaphone company, so you can handle multiple domains with one my.innovaphone account.&lt;br /&gt;
&lt;br /&gt;
====Technical aspects====&lt;br /&gt;
A new rental expiration date is calculated on each license or balance change in the domain.&amp;lt;br&amp;gt;&lt;br /&gt;
So after each change new licenses with a new date are transfered to the gateways and also stored in the Devices App itself.&amp;lt;br&amp;gt;&lt;br /&gt;
If the rental expires, the gateway reboots and the licenses are not available anymore.&amp;lt;br&amp;gt;&lt;br /&gt;
The licenses are also transfered after each reconnect of a gateway to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For license and balance changes, the Devices App must be online and have access to my.innovaphone.com!&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
You have to add (use the + symbol) a PBX and select all licenses you want to rent.&amp;lt;br&amp;gt;&lt;br /&gt;
Use the &#039;&#039;&#039;apply&#039;&#039;&#039; button to really bind these licenses. Without usage of the apply button, you can just see a precalculation of the iSCs/month and the rental end date, but nothing is really charged from your balance.&lt;br /&gt;
&lt;br /&gt;
===Change of IP address/DNS name in PBX object===&lt;br /&gt;
If the IP address or DNS name inside the PBX object of the Devices App changes, all currently connected clients get a new Devices Registration URL and also all clients, which connect afterwards with the old host name.&lt;br /&gt;
&lt;br /&gt;
== Appendix ==&lt;br /&gt;
=== Sample firmware.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;devices&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP101&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP102&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1060&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP111&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP112&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1130&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1260&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP150&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP2000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP200A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP22&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP222&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP230&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP232&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP24&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP240&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP241&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP29&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP302&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP305&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP311&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP411&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP800&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP810&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP811&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IPVA&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;versions&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;text&amp;quot;: &amp;quot;13r1 dvl [131705]&amp;quot;, &amp;quot;wiki&amp;quot;: &amp;quot;&amp;quot; }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample apps.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;apps&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;Apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;The Apidemo&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;AppStore&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;AppStore&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample software.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;software&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myapps.apk&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Android&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Android&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myAppsSetup.msi&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Windows&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Windows&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample phoneplatform.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;arm64&amp;quot;,&lt;br /&gt;
            &amp;quot;text&amp;quot;: &amp;quot;Phone Platform&amp;quot;,&lt;br /&gt;
            &amp;quot;file&amp;quot;: &amp;quot;phone-platform.img&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;yocto2&amp;quot;,&lt;br /&gt;
            &amp;quot;version&amp;quot;: &amp;quot;2063&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;devices&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;IP270&amp;quot;,&lt;br /&gt;
            &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
                &amp;quot;arm64&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API to download rental history ===&lt;br /&gt;
&lt;br /&gt;
You can download the history as a UTF-8 CSV file with simple &#039;&#039;&#039;HTTP GET&#039;&#039;&#039; requests with &#039;&#039;&#039;digest&#039;&#039;&#039; authentication.&amp;lt;br&amp;gt;&lt;br /&gt;
The CSV file uses the semicolon as delimiter.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The URL to download the history is e.g.:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?...&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 You can find this path by editing the instance in the AP manager.&lt;br /&gt;
 In the listed paths, you&#039;ll find something which ends with csvapi&lt;br /&gt;
&lt;br /&gt;
In the innovaphone Cloud environment, the URL can be retrieved by taking a look at the Devices App object inside the cloud PBX and replacing the ending &#039;&#039;&#039;innovaphone-devices&#039;&#039;&#039; with &#039;&#039;&#039;csvapi&#039;&#039;&#039; inside the App URL, so it looks e.g. like this:&lt;br /&gt;
&lt;br /&gt;
 https://cloud-apps0.innovaphone.com/cloud.innovaphone.com/devices/csvapi&lt;br /&gt;
&lt;br /&gt;
====CSV columns====&lt;br /&gt;
Most columns should be self explaining, but the column &#039;&#039;&#039;invoice reference&#039;&#039;&#039; refers to a value which you can configure manually in the domain settings in the Devices App!&lt;br /&gt;
&lt;br /&gt;
====Digest authentication====&lt;br /&gt;
You can login with two different username/password combinations, while the domain is the digest username:&lt;br /&gt;
&lt;br /&gt;
* If you use the domain and password of your Devices App instance inside the AP Manager, you have automatically access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
* If you use the domain name of any domain as digest username and the configured domain password, you&#039;ll have access to this domain and all domains to which this domain has access to&lt;br /&gt;
&lt;br /&gt;
====Query parameters====&lt;br /&gt;
The following query parameters can be used (don&#039;t forget to URL encode the parameter values, if neccessary!):&lt;br /&gt;
* all: if &#039;&#039;&#039;1&#039;&#039;&#039; or &#039;&#039;&#039;true&#039;&#039;&#039;, the history is queried for all domains where the digest user has access to&lt;br /&gt;
* domain: required, if &#039;&#039;all&#039;&#039; is not set&lt;br /&gt;
* lang: the output language of the CSV file, which also controls date and number formats, e.g. &#039;&#039;&#039;en&#039;&#039;&#039;, &#039;&#039;&#039;de&#039;&#039;&#039;, ...&lt;br /&gt;
* tz: the timezone for dates, e.g. &#039;&#039;&#039;Europe/Berlin&#039;&#039;&#039;&lt;br /&gt;
* type: two types are available:&lt;br /&gt;
** &#039;&#039;&#039;history&#039;&#039;&#039;: history which contains changes&lt;br /&gt;
** &#039;&#039;&#039;overview&#039;&#039;&#039;: a monthly overview with the iSC costs at the first of the last months&lt;br /&gt;
* from: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
* to: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
&lt;br /&gt;
====Example requests====&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=history&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;amp;from=1601903431000&amp;amp;to=1601903385000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?all=1&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Supported DECT handsets ===&lt;br /&gt;
&lt;br /&gt;
The following handsets are supported for update jobs and the DECT handsets configuration:&lt;br /&gt;
&lt;br /&gt;
* IP64&lt;br /&gt;
* IP65&lt;br /&gt;
* D81&lt;br /&gt;
* D83&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
===SoftwarePhone===&lt;br /&gt;
The Devices App is not meant to be used with the windows SoftwarPhone standalone installation.&lt;br /&gt;
&lt;br /&gt;
== Related Articles == &lt;br /&gt;
* [[Howto:Software_Rental]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Firmware_Upgrade_V15r1_V16r1&amp;diff=79424</id>
		<title>Howto16r1:Firmware Upgrade V15r1 V16r1</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Firmware_Upgrade_V15r1_V16r1&amp;diff=79424"/>
		<updated>2026-04-10T09:11:34Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Applies To ==&lt;br /&gt;
This information applies to:&lt;br /&gt;
&lt;br /&gt;
* All 16r1 capable innovaphone devices&lt;br /&gt;
: For a general overview of the upgrade process and a list of supported devices with 16r1, see [[Howto:Firmware Upgrade]]&lt;br /&gt;
== Licenses ==&lt;br /&gt;
In case of cloud or rental model, don&#039;t worry about licenses.&lt;br /&gt;
&lt;br /&gt;
If the system is licensed on premise, you&#039;ll need to regenerate the license file for v16 in https://portal.innovaphone.com/ and load into the system before upgrade (The system needs to have the SSC up to date).&lt;br /&gt;
&lt;br /&gt;
== Migration Policy ==&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red; font-weight: bold&amp;quot;&amp;gt;Before you begin, be sure that your whole installation is running the latest 15r1 service release. Create backups before you start and store them on an external location&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TechAssist Upgrade Helper ===&lt;br /&gt;
* Before you start, make sure that all TechAssist tests (you will receive the required tests in the last update in the previous major version) labelled &amp;lt;code&amp;gt;Pre Upgrade: xy&amp;lt;/code&amp;gt; are positive, if available&lt;br /&gt;
* When you are finished, make sure that all TechAssist tests (you will receive new tests with the upgrade) are positive&lt;br /&gt;
&lt;br /&gt;
=== New TLS Profile ===&lt;br /&gt;
Please note that we have changed our TLS profiles ([[Reference16r1:IP4/General/TLS]]). The new &#039;&#039;Normal&#039;&#039; setting, which is the default value, now only allows TLS 1.3 and TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
== Changes visible to the end customers ==&lt;br /&gt;
Listed here are changes that should be communicated by resellers to end users prior to a upgrade, as the change will be visible/audible in the behaviour of the application/device.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Manual steps needed after upgrade ==&lt;br /&gt;
If the installer is not used for a new installation, some new default settings are not set. Please evaluate per app whether you want to configure the new default settings manually.&lt;br /&gt;
&lt;br /&gt;
=== Connector for Microsoft 365 ===&lt;br /&gt;
If you plan to use the new &#039;&#039;&#039;Contact Search&#039;&#039;&#039; feature of the Connector for Microsoft 365, you need to perform two manual Steps:&lt;br /&gt;
# Create the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; app object by using the Settings template&lt;br /&gt;
# Assign the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; app object to every user who should be able to use the new Contact Search feature. (Of cause, you can use a template for that)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For a more detailed guide, please refer to the how-to article: [[Howto16r1:Configure Contact Search by Connector for Microsoft365#Creating the PBX app object using the PBX Manager Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Remote Control ===&lt;br /&gt;
In order to use the Admin Configuration Panel of the Settings App – AP Remote Control, it is necessary to grant access to the &#039;&#039;&#039;admin&#039;&#039;&#039; API, available in the App tab of the Remote Control App object.&lt;br /&gt;
&lt;br /&gt;
=== Working ===&lt;br /&gt;
For badge counts to work, the Working Manager app object must have &#039;&#039;&#039;Websocket&#039;&#039;&#039; and &#039;&#039;&#039;PbxSignal&#039;&#039;&#039; enabled.&lt;br /&gt;
For the Connect integration of the Working app, &#039;&#039;&#039;Websocket&#039;&#039;&#039;, &#039;&#039;&#039;Services&#039;&#039;&#039; and &#039;&#039;&#039;connect&#039;&#039;&#039;(in the Apps tab) must be enabled in the Working User app.&lt;br /&gt;
&lt;br /&gt;
=== Switchboard ===&lt;br /&gt;
For the Connect Integration (Call Notes) to work, the Switchboard App must have the &#039;&#039;&#039;Services&#039;&#039;&#039; (App-tab) and &#039;&#039;&#039;connect&#039;&#039;&#039; or &#039;&#039;&#039;messages&#039;&#039;&#039; (Apps-tab) enabled (the name depends when the PBX was installed).&lt;br /&gt;
&lt;br /&gt;
=== Projects ===&lt;br /&gt;
* Projects requires &#039;&#039;&#039;App platform version 140029&#039;&#039;&#039; or higher, so updating the App Platform before Projects is recommended. &amp;lt;br /&amp;gt;The Store will prohibit the update if the App Plattform does not have the minimum required version.&lt;br /&gt;
* For some extra admin-functionalities the &#039;&#039;&#039;Projects App Object needs to have an admin mode&#039;&#039;&#039; (App-tab). &amp;lt;br /&amp;gt;Easiest way to set this new mode is to the open the Projects App via the Projects Plugin Settings App and to re-apply it (click the OK-button). The same plugin can also be used to distribute this mode via the Config Templates.&lt;br /&gt;
* The &#039;&#039;&#039;App Platform requires the correct Time and a Timezone&#039;&#039;&#039; set under AP Manager/Settings/General. &amp;lt;br /&amp;gt;This is needed for some automatic cleanup of deleted items and automatic task status updates (done around 00:00h on the due date).&lt;br /&gt;
&lt;br /&gt;
== New Apps ==&lt;br /&gt;
New Apps will not be installed automatically by the upgrade. The installation description of new apps is usually in the concept article. Please rate per app whether you want to install/use the new app and configure it manually.&lt;br /&gt;
&lt;br /&gt;
* App Polls: [[Reference16r1:Concept App Polls]]&lt;br /&gt;
* App Service Conference Transcriptions [[Reference16r1:Concept_App_Service_myApps_Assistant]]&lt;br /&gt;
* App Service Connector for Whatsapp: [[Reference16r1:Concept_App_Service_Connector_for_Whatsapp]]&lt;br /&gt;
* App Conference Scaler: [[Reference16r1:Concept_Conference_Scaler_App]]&lt;br /&gt;
* App Service IP: [[Reference16r1:Concept App Service IP]]&lt;br /&gt;
&lt;br /&gt;
== Removed ==&lt;br /&gt;
The following software is no longer included.&lt;br /&gt;
&lt;br /&gt;
* IP110A (can still be used with 15r1 firmware on current PBX versions)&lt;br /&gt;
* IP240A (can still be used with 15r1 firmware on current PBX versions)&lt;br /&gt;
* CA on CF card feature&lt;br /&gt;
&lt;br /&gt;
== Deprecated ==&lt;br /&gt;
The following software is based on legacy technology, with no further development and limited maintenance and support.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Previously deprecated and now no longer supported == &lt;br /&gt;
The following software is based on legacy technology, with no further development and no more maintenance and support.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Known Problems==&lt;br /&gt;
===Long Update-duration===&lt;br /&gt;
When you update, it can be up to 10 minutes before you have access to your app platform again.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
*[[Howto:Firmware_Upgrade]]&lt;br /&gt;
* [[Howto15r1:Firmware_Upgrade_V14r2_V15r1]]&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto16r1:Firmware_Upgrade_V15r1_V16r1&amp;diff=79423</id>
		<title>Howto16r1:Firmware Upgrade V15r1 V16r1</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto16r1:Firmware_Upgrade_V15r1_V16r1&amp;diff=79423"/>
		<updated>2026-04-10T09:01:53Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Applies To ==&lt;br /&gt;
This information applies to:&lt;br /&gt;
&lt;br /&gt;
* All 16r1 capable innovaphone devices&lt;br /&gt;
: For a general overview of the upgrade process and a list of supported devices with 16r1, see [[Howto:Firmware Upgrade]]&lt;br /&gt;
== Licenses ==&lt;br /&gt;
In case of cloud or rental model, don&#039;t worry about licenses.&lt;br /&gt;
&lt;br /&gt;
If the system is licensed on premise, you&#039;ll need to regenerate the license file for v16 in https://portal.innovaphone.com/ and load into the system before upgrade (The system needs to have the SSC up to date).&lt;br /&gt;
&lt;br /&gt;
== Migration Policy ==&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red; font-weight: bold&amp;quot;&amp;gt;Before you begin, be sure that your whole installation is running the latest 15r1 service release. Create backups before you start and store them on an external location&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TechAssist Upgrade Helper ===&lt;br /&gt;
* Before you start, make sure that all TechAssist tests (you will receive the required tests in the last update in the previous major version) labelled &amp;lt;code&amp;gt;Pre Upgrade: xy&amp;lt;/code&amp;gt; are positive, if available&lt;br /&gt;
* When you are finished, make sure that all TechAssist tests (you will receive new tests with the upgrade) are positive&lt;br /&gt;
&lt;br /&gt;
=== New TLS Profile ===&lt;br /&gt;
Please note that we have changed our TLS profiles ([[Reference16r1:IP4/General/TLS]]). The new &#039;&#039;Normal&#039;&#039; setting, which is the default value, now only allows TLS 1.3 and TLS 1.2.&lt;br /&gt;
&lt;br /&gt;
== Changes visible to the end customers ==&lt;br /&gt;
Listed here are changes that should be communicated by resellers to end users prior to a upgrade, as the change will be visible/audible in the behaviour of the application/device.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Manual steps needed after upgrade ==&lt;br /&gt;
If the installer is not used for a new installation, some new default settings are not set. Please evaluate per app whether you want to configure the new default settings manually.&lt;br /&gt;
&lt;br /&gt;
=== Connector for Microsoft 365 ===&lt;br /&gt;
If you plan to use the new &#039;&#039;&#039;Contact Search&#039;&#039;&#039; feature of the Connector for Microsoft 365, you need to perform two manual Steps:&lt;br /&gt;
# Create the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; app object by using the Settings template&lt;br /&gt;
# Assign the &#039;&#039;&#039;microsoft365-api&#039;&#039;&#039; app object to every user who should be able to use the new Contact Search feature. (Of cause, you can use a template for that)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For a more detailed guide, please refer to the how-to article: [[Howto16r1:Configure Contact Search by Connector for Microsoft365#Creating the PBX app object using the PBX Manager Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Remote Control ===&lt;br /&gt;
In order to use the Admin Configuration Panel of the Settings App – AP Remote Control, it is necessary to grant access to the &#039;&#039;&#039;admin&#039;&#039;&#039; API, available in the App tab of the Remote Control App object.&lt;br /&gt;
&lt;br /&gt;
=== Working ===&lt;br /&gt;
For badge counts to work, the Working Manager app object must have &#039;&#039;&#039;Websocket&#039;&#039;&#039; and &#039;&#039;&#039;PbxSignal&#039;&#039;&#039; enabled.&lt;br /&gt;
For the Connect integration of the Working app, &#039;&#039;&#039;Websocket&#039;&#039;&#039;, &#039;&#039;&#039;Services&#039;&#039;&#039; and &#039;&#039;&#039;connect&#039;&#039;&#039;(in the Apps tab) must be enabled in the Working User app.&lt;br /&gt;
&lt;br /&gt;
=== Switchboard ===&lt;br /&gt;
For the Connect Integration (Call Notes) to work, the Switchboard App must have the &#039;&#039;&#039;Services&#039;&#039;&#039; (App-tab) and &#039;&#039;&#039;connect&#039;&#039;&#039; or &#039;&#039;&#039;messages&#039;&#039;&#039; (Apps-tab) enabled (the name depends when the PBX was installed).&lt;br /&gt;
&lt;br /&gt;
=== Projects ===&lt;br /&gt;
* Projects requires &#039;&#039;&#039;App platform version 140003&#039;&#039;&#039; or higher, so updating the App Platform before Projects is recommended. &amp;lt;br /&amp;gt;The Store will prohibit the update if the App Plattform does not have the minimum required version.&lt;br /&gt;
* For some extra admin-functionalities the &#039;&#039;&#039;Projects App Object needs to have an admin mode&#039;&#039;&#039; (App-tab). &amp;lt;br /&amp;gt;Easiest way to set this new mode is to the open the Projects App via the Projects Plugin Settings App and to re-apply it (click the OK-button). The same plugin can also be used to distribute this mode via the Config Templates.&lt;br /&gt;
* The &#039;&#039;&#039;App Platform requires the correct Time and a Timezone&#039;&#039;&#039; set under AP Manager/Settings/General. &amp;lt;br /&amp;gt;This is needed for some automatic cleanup of deleted items and automatic task status updates (done around 00:00h on the due date).&lt;br /&gt;
&lt;br /&gt;
== New Apps ==&lt;br /&gt;
New Apps will not be installed automatically by the upgrade. The installation description of new apps is usually in the concept article. Please rate per app whether you want to install/use the new app and configure it manually.&lt;br /&gt;
&lt;br /&gt;
* App Polls: [[Reference16r1:Concept App Polls]]&lt;br /&gt;
* App Service Conference Transcriptions [[Reference16r1:Concept_App_Service_myApps_Assistant]]&lt;br /&gt;
* App Service Connector for Whatsapp: [[Reference16r1:Concept_App_Service_Connector_for_Whatsapp]]&lt;br /&gt;
* App Conference Scaler: [[Reference16r1:Concept_Conference_Scaler_App]]&lt;br /&gt;
* App Service IP: [[Reference16r1:Concept App Service IP]]&lt;br /&gt;
&lt;br /&gt;
== Removed ==&lt;br /&gt;
The following software is no longer included.&lt;br /&gt;
&lt;br /&gt;
* IP110A (can still be used with 15r1 firmware on current PBX versions)&lt;br /&gt;
* IP240A (can still be used with 15r1 firmware on current PBX versions)&lt;br /&gt;
* CA on CF card feature&lt;br /&gt;
&lt;br /&gt;
== Deprecated ==&lt;br /&gt;
The following software is based on legacy technology, with no further development and limited maintenance and support.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Previously deprecated and now no longer supported == &lt;br /&gt;
The following software is based on legacy technology, with no further development and no more maintenance and support.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Nothing&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Known Problems==&lt;br /&gt;
===Long Update-duration===&lt;br /&gt;
When you update, it can be up to 10 minutes before you have access to your app platform again.&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
*[[Howto:Firmware_Upgrade]]&lt;br /&gt;
* [[Howto15r1:Firmware_Upgrade_V14r2_V15r1]]&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Devices&amp;diff=79414</id>
		<title>Reference16r1:Concept App Service Devices</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_Devices&amp;diff=79414"/>
		<updated>2026-04-09T09:29:29Z</updated>

		<summary type="html">&lt;p&gt;Dde: Created page with &amp;quot;Apps The App Service Devices is an App Service which can be installed on an innovaphone App Platform. It is used to administrate the innovaphone devices which belong to the whole installation. == Applies To ==   * innovaphone PBX from version 13r1  == Apps ==  === Devices App (innovaphone-devices) === This is the standard UI App for Devices.  Parameters:  ;Websocket: to publish the com.innovaphone.devicesui-API, which can be used to link directly to...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
The App Service Devices is an App Service which can be installed on an innovaphone App Platform. It is used to administrate the innovaphone devices which belong to the whole installation.&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX from version 13r1&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
=== Devices App (innovaphone-devices) ===&lt;br /&gt;
This is the standard UI App for Devices.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Websocket: to publish the com.innovaphone.devicesui-API, which can be used to link directly to devices (which is done e.g. inside the Events app)&lt;br /&gt;
&lt;br /&gt;
=== Devices API (innovaphone-devices-api) ===&lt;br /&gt;
This is a hidden App, which provides the Devices API (com.innovaphone.devices). This API can be used to find and communicate with devices which are registered to the Devices App.&lt;br /&gt;
&lt;br /&gt;
Additionally it acts as a provider of the Search API (com.innovaphone.search). So you can find devices and domains in other apps like the Search App.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Hidden: DevicesApi must be a hidden App&lt;br /&gt;
;Websocket: to get the URL of the Devices App itself which is used for provisioning&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
=== Devices ===&lt;br /&gt;
&lt;br /&gt;
With the Devices plugin App objects can be created, edited and deleted for Devices and the Devices API on the PBX.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
All innovaphone hard phones and gateways starting from version 13r1 can establish a registration inside the Devices App and therefor administrative tasks can be performed through the App.&lt;br /&gt;
&lt;br /&gt;
=== Domains ===&lt;br /&gt;
&lt;br /&gt;
In a hosted environment, it might be needed to add multiple domains to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
After the initial installation of Devices through Install, you have administrative rights and can add more domains. &lt;br /&gt;
&lt;br /&gt;
==== Administrative rights ====&lt;br /&gt;
You have administrative rights if the configured PBX App object for Devices uses the password of the instance which is configured in the Manager App and the PBX uses the same domain as this instance.&lt;br /&gt;
&lt;br /&gt;
==== Domain local rights ====&lt;br /&gt;
You have just rights to a certain domain if the configured PBX App object for Devices uses the domain password which can be configured in Devices for each domain and the PBX uses the same domain name as configured in Devices.&lt;br /&gt;
&lt;br /&gt;
==== Assign rights to other domains ====&lt;br /&gt;
Domains can gain access to other domains by configuring these access rights in the Devices App.&lt;br /&gt;
&lt;br /&gt;
==== Deploy passwords and access rights ====&lt;br /&gt;
During install, a domain is created inside the Devices App. There is a checkmark Deploy the domain password on all devices which is set by default and which is the same as the administrative password.&lt;br /&gt;
If you change the domain password, all passwords on all administrative devices and app platforms which are connected to this domain will be also changed.&amp;lt;br/&amp;gt;&lt;br /&gt;
Since 13r2sr25/13r3sr7/14rx: devices which are auto provisioned or provisioned through the Profile/Users Admin App will get a random password instead of the domain password.&lt;br /&gt;
If you add a phone device manually to a domain inside the Devices App, this phone device will also get a random password. Other device types added manually or devices added with a provisioning code which has been created within the Devices App directly, will get the domain password instead as long as you do not tick the checkmark &#039;&#039;&#039;Provision device with a random password&#039;&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This will also set the manager password and the SSH passwords of App Platforms.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The clear text random passwords can be requested and viewed in the settings of a device in the Devices App.&lt;br /&gt;
&lt;br /&gt;
 Attention: If you untick the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark, the password won&#039;t be deployed anymore, but also not reconfigured to the default password!&lt;br /&gt;
&lt;br /&gt;
 Attention: After each reconnect of a client, the password will be deployed again.&lt;br /&gt;
 This means, if the checkmark is set and you set another password somewhere else (e.g. under General::Admin),&lt;br /&gt;
 this password will be just valid until the next reboot or reconnect to the Devices App!&lt;br /&gt;
&lt;br /&gt;
;Create new random passwords&lt;br /&gt;
You can rollout new random passwords by unticking the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark and ticking it again.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Changing a device from random to domain password&lt;br /&gt;
Starting with 16r1, you can edit a device and un-/tick &amp;quot;Use random password&amp;quot; to change the password method for each device separately.&lt;br /&gt;
&lt;br /&gt;
;Devices with multiple domains (Cloud)&lt;br /&gt;
In a hosted environment, you can use the Devices App with multiple domains. The corresponding instance of Devices has a configured domain and an instance password set inside the manager.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hosting PBX has a domain inside Devices with a specific password.&amp;lt;br&amp;gt;&lt;br /&gt;
If this domain name matches the instance domain of the Devices instance and the password matches either the instance password or the domain password, you will be logged in as admin and have access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each newly created domain has its own password inside Devices. If you create an App Object inside a PBX with this domain and the password of this domain (inside Devices), you will just have access to this single domain.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Devices also has the possibility to grant access to other domains for a specific domain.&lt;br /&gt;
&lt;br /&gt;
=== Categories ===&lt;br /&gt;
&lt;br /&gt;
There are two types of categories:&lt;br /&gt;
* provisioning category: used for device configurations and provisioning&lt;br /&gt;
* standard category: used for update/backup jobs and device management&lt;br /&gt;
&lt;br /&gt;
Each device can have just a &#039;&#039;&#039;single&#039;&#039;&#039; provisioning category, as it receives it&#039;s configuration by all configured device configurations for this provisioning category.&lt;br /&gt;
&lt;br /&gt;
In addition, a provisioning category, which is used inside an analogue phone/phone device configuration &#039;&#039;&#039;cannot&#039;&#039;&#039; be used to provision a gateway.&lt;br /&gt;
&lt;br /&gt;
=== Device connections ===&lt;br /&gt;
The Devices registration is done through a websocket connection to the webserver of the App Platform and the Devices instance (standard HTTP/s port).&amp;lt;br&amp;gt;&lt;br /&gt;
The URL used can be configured manually under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration] or through a new provisioning mechanism.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A binary protocol is used to transfer information between the device and the devices App. The MAC address is the unique key to identify a device.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a device is added to a domain in Devices, the device gets a unique random password. Without such a password, a device shows up as &#039;&#039;&#039;unassigned&#039;&#039;&#039; in the Devices app.&lt;br /&gt;
This is also the case after a long reset or when the device lost its configuration.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In such a case, the device has to be manually added again to a domain or it has to be provisioned again.&lt;br /&gt;
&lt;br /&gt;
 If a device is not assigned to a domain or provisioning category, it won&#039;t receive any configurations.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registrations ====&lt;br /&gt;
See [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration]&lt;br /&gt;
&lt;br /&gt;
==== Second Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The firmware has a second SYSCLIENT2 module, which can be configured to point to a different Devices instance and the AP Manager also has a second Devices Registration URL.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you use this configuration option, you should take care and consider:&lt;br /&gt;
&lt;br /&gt;
* if the Devices domain from the second configuration provides a password for all devices, the password is ignored, as it would lead to inconsistend passwords otherwise (from 13r1 SR12 on)&lt;br /&gt;
* the Devices domain from the second configuration should not provide Devices Configurations or Update Jobs as these might collide with configurations from the first Devices instance!&lt;br /&gt;
&lt;br /&gt;
Generally, only one of the two  &#039;&#039;Devices&#039;&#039;  App instances connected to the device must apply changes to the device.&lt;br /&gt;
&lt;br /&gt;
 We strongly discourage the usage of this second configuration option due to unexpected behaviour if incorrectly used!&lt;br /&gt;
 Never use the second URL if you use software or hardware rental!&lt;br /&gt;
&lt;br /&gt;
==== Device information ====&lt;br /&gt;
&lt;br /&gt;
The following data is transferred:&lt;br /&gt;
* MAC address&lt;br /&gt;
* device type (e.g. IPVA, AppPlatform, IP112)&lt;br /&gt;
* IP addresses (IPv4, IPv6)&lt;br /&gt;
* version (not searchable)&lt;br /&gt;
&lt;br /&gt;
You can also search for this data inside the devices tab in the App.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==== Device Advanced UI ====&lt;br /&gt;
By default, Devices administrators and non admins can access the advanced UI of any device without limitations.&amp;lt;br/&amp;gt;&lt;br /&gt;
In certain scenerios (e.g. Cloud), you may want to restrict this access to just the PBX on gateways and IPVAs for non adminstrative users, which just have access to certain domains.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
In this case, you can set the corresponding checkmark in the device settings tab of the specific device.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the flag is set, just the PBX tab of the advanced UI is accessible for non administrative Devices users.&lt;br /&gt;
&lt;br /&gt;
 Technically this means, that every HTTP request is checked if it starts with PBX0 and if not, the request is rejected with 401 unauthorized.&lt;br /&gt;
&lt;br /&gt;
If the device can be accessed directly without Devices, you may need a reverse proxy in between to filter HTTP requests.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Provisioning ===&lt;br /&gt;
Devices can be added by provisioning (both phones and gateways). &lt;br /&gt;
The standard online provisioning looks like this:&lt;br /&gt;
* a user or administrator creates a provisioning code in the Devices or Users App (this stores the Devices URL on the provisioning server side)&lt;br /&gt;
* a device with 13r1 or newer is connected to the network after a long reset&lt;br /&gt;
* the provisioning code has to be entered within one hour (after one hour, the Update URL isn&#039;t polled anymore)&lt;br /&gt;
* the device sends this code to config.innovaphone.com and retrieves the Devices URL&lt;br /&gt;
* the device connects to the Devices URL and is added to the domain where the code has been created&lt;br /&gt;
&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Offline_Provisioning offline provisioning mode].&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Provisioning#Automatic_provisioning automatic provisioning mode].&lt;br /&gt;
&lt;br /&gt;
 Note: provisioning is cancelled if the device already belongs to another domain in the same Devices instance! This prevents the unauthorized move of a device between different domains.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The Devices Registration URL which is set through the provisioning process, always starts with &#039;&#039;&#039;wss&#039;&#039;&#039;. This is not dependent anymore on the App URL which is configured inside the PBX Devices App object.&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
The Devices App can be used to rollout updates.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSON files ====&lt;br /&gt;
The update files have to be acccessible on a webserver without authentication and four json files are used:&lt;br /&gt;
* firmware.json: innovaphone device firmware&lt;br /&gt;
* apps.json: Apps for the App Platform&lt;br /&gt;
* software.json: contains software for DECT handsets&lt;br /&gt;
** just IP64 and IP65 are used and supported&lt;br /&gt;
* phoneplatform.json: contains the phone platform image for e.g. the IP270&lt;br /&gt;
&lt;br /&gt;
You can either use the standard innovaphone App Store for these files or your own local webserver.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update jobs ====&lt;br /&gt;
You can configure several update jobs with different categories to organize your updates.&amp;lt;br&amp;gt;&lt;br /&gt;
Update jobs are always sequentially processed and inside one update job, just &#039;&#039;&#039;20&#039;&#039;&#039; devices are updated at the same time.&lt;br /&gt;
&lt;br /&gt;
==== Device update check after the update job has been already executed====&lt;br /&gt;
If a device goes online, the newest suitable update job is searched for this device (depending on the categories).&amp;lt;br&amp;gt;&lt;br /&gt;
If an update job is found, the update is just performed, if there has been &#039;&#039;&#039;no&#039;&#039;&#039; successfull update for this device in this job before and the version does not match (simply string compare).&lt;br /&gt;
&lt;br /&gt;
====Update errors====&lt;br /&gt;
If an update fails, the Devices App shows an error. You may have to enable further tracing on the updated device itself to find out the reason of the failure.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 module and take a look at the events which may already tell you the reason&lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
 An update job is retried &#039;&#039;&#039;two&#039;&#039;&#039; times if updates inside this job failed. The retry is done &#039;&#039;&#039;ten&#039;&#039;&#039; minutes after the update job finished previously.&lt;br /&gt;
&lt;br /&gt;
====innovaphone myApps====&lt;br /&gt;
The path to the App Store and the used innovaphone myApps version is updated to the version of the gateway on gateways with an enabled PBX after a successfull update.&amp;lt;br&amp;gt;&lt;br /&gt;
This configuration can be found [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:PBX/Config/myApps here]&lt;br /&gt;
&lt;br /&gt;
Inside the configuration on an update job, the flag &amp;quot;Do not update myApps launcher software&amp;quot; disables the update of the innovaphone myApps version inside PBXes.&lt;br /&gt;
&lt;br /&gt;
====DECT handsets====&lt;br /&gt;
If you check the update DECT handsets checkmark, all DECT devices will be configured to rollout updates to DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
The DECT handset firmware will be searched inside the configured software.json.&lt;br /&gt;
&lt;br /&gt;
=== Backups ===&lt;br /&gt;
The Devices App can be used to backup the configuration and data of Apps and devices.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Webserver requirements====&lt;br /&gt;
Backups are stored on a webserver with or without Digest/Basic authentication and with the &#039;&#039;&#039;webdav PUT&#039;&#039;&#039; method.&lt;br /&gt;
&lt;br /&gt;
====Backup jobs====&lt;br /&gt;
Backup jobs are executed sequentially. Inside one backup job, just &#039;&#039;&#039;20&#039;&#039;&#039; backups are performed at the same time.&lt;br /&gt;
&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
The configuration file is stored. Therefor the Devices App tells the device to store the configuration with a !mod cmd UP0 /sync prot URL.&lt;br /&gt;
&lt;br /&gt;
====Apps on an App Platform====&lt;br /&gt;
The databases of all existing instances and the manager are stored.&amp;lt;br&amp;gt;&lt;br /&gt;
Each installed App Service can have multiple instances and each App instance has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
A database contains &#039;&#039;&#039;both&#039;&#039;&#039; configuration and data of an App instance! &amp;lt;br&amp;gt;&lt;br /&gt;
The manager database contains the webserver certificate and further manager related configuration settings.&lt;br /&gt;
&lt;br /&gt;
The Devices App establishes a websocket connection to the manager and tells the manager where to store the backups.&amp;lt;br&amp;gt;&lt;br /&gt;
The manager on the backuped App Platform itself performs the HTTP requests to store the files.&lt;br /&gt;
&lt;br /&gt;
====Backup errors====&lt;br /&gt;
If a backup fails, the Devices App shows an error. You may have to enable further tracing on the backuped device itself to find out the reason of the failure.&lt;br /&gt;
&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 &lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
=== Restore ===&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
Just as always under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Administration/Upload/Config Upload Config].&lt;br /&gt;
&lt;br /&gt;
====Apps====&lt;br /&gt;
The App Service itself has to be installed on the App Platform prior restoring of a single instance.&amp;lt;br&amp;gt;&lt;br /&gt;
The restoring is done in the Manager App on the App Platform itself.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance settings, the configuration and data are restored in a single process.&lt;br /&gt;
&lt;br /&gt;
=== Device Configurations ===&lt;br /&gt;
&lt;br /&gt;
You can define several device configurations. These configurations are either applied to all devices inside this domain or to selected categories.&amp;lt;br/&amp;gt;&lt;br /&gt;
Configurations are applied on creation and on every reconnect of a matching device.&lt;br /&gt;
&lt;br /&gt;
==== Transfer checkmarks ====&lt;br /&gt;
&lt;br /&gt;
Some configuration options have a specific checkmark to enable the transfer of the option.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* Checkmark disabled:&lt;br /&gt;
** configuration option field(s) are disabled &lt;br /&gt;
** option values are &#039;&#039;&#039;not&#039;&#039;&#039; transferred at all&lt;br /&gt;
* Checkmark enabled:&lt;br /&gt;
** configuration option field(s) are enabled&lt;br /&gt;
** option values are transferred, even if field values are empty&lt;br /&gt;
&lt;br /&gt;
==== Expert configuration ====&lt;br /&gt;
&lt;br /&gt;
The expert configuration can be used to configure different settings which are not available inside the other device configurations.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can use the standard syntax of an update server script (see [[ {{NAMESPACE}}:Concept_Update_Server | Concept Update Server ]] for a general overview and the section on [[Howto:PHP_based_Update_Server_V2#Hints_for_writing_your_update_snippets | Hints for writing your update snippets ]] (note that the remainder of this article relates to the now deprecated old mechanism, so please disregard the rest)).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Some hints:&lt;br /&gt;
* the expert configuration is just executed once after a device restarted and on change of the expert configuration itself&lt;br /&gt;
* the expert configuration is executed after all other device configuration types, so that you can override changes&lt;br /&gt;
* to make configuration changes effective, you may also need to issue a final &#039;&#039;config write&#039;&#039;, &#039;&#039;config activate&#039;&#039; and &#039;&#039;iresetn&#039;&#039; command (see the [[ {{NAMESPACE}}:Concept_Update_Server#Check_command | &#039;&#039;check&#039;&#039; command]] for details)&lt;br /&gt;
* some commands shouldn&#039;t be used inside the script:&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Times_command |&#039;&#039;times&#039;&#039;]]: since the expert configuration is executed only once after a reboot of the device and when changes are made, it does not make sense to use the &#039;&#039;times&#039;&#039; command&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Prot_command |&#039;&#039;prot&#039;&#039;]]|[[ {{NAMESPACE}}:Concept_Update_Server#Boot_command |&#039;&#039;boot&#039;&#039;]]: use an update job instead&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Scfg_command |&#039;&#039;scfg&#039;&#039;]]: use a backup job instead&lt;br /&gt;
** [[Howto:PHP_based_Update_Server_V2#Using_vars_create|&#039;&#039;vars create&#039;&#039;]]: this cmd will always raise the &#039;&#039;reset needed condition&#039;&#039; and the aforementioned &#039;&#039;iresetn&#039;&#039; command would always execute therefore.  As a result, the devices would enter a boot loop.  Be sure to avoid this using an appropriate [[ {{NAMESPACE}}:Concept_Update_Server#Check_command |&#039;&#039;check&#039;&#039; command ]] and update its &#039;&#039;&amp;lt;serial&amp;gt;&#039;&#039; properly whenever the expert configuration is changed&lt;br /&gt;
&lt;br /&gt;
==== Certificates configuration ====&lt;br /&gt;
You can use this configuration to rollout certificates to the trust list of your devices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Manual upload certificates.&lt;br /&gt;
* Configure up to five URLs which are polled every 24 hours. They must return files with PEM formatted public keys (one or more) which are then rolled out.&lt;br /&gt;
** certificates are just rolled out if differences are determined, so if URLs are polled and no changes are detected, certificates are not rolled out again. Changes are detected by fingerprint comparison of each embedded certificate&lt;br /&gt;
** if a device restarts, the configuration is applied again. Just the fingerprints of the device trust list are checked against the configuration trust list and just on differences, certificates are rolled out again&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/innovaphone.pem to always have the innovaphone public keys in your trust list (e.g. used for our push service).&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca.pem to always have the innovaphone Device Certification Authority certificates in your trust list.&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca-unverified.pem to always have the innovaphone Unverified Device Certification Authority certificates in your trust list.&lt;br /&gt;
** The Unverified CA is used for non hardware devices, e.g. IPVAs, which are not shipped with an official innovaphone Device Certification Authority certificate, as innovaphone has no control over the serial number here.&lt;br /&gt;
* Configure https://curl.se/ca/cacert.pem to always have the public Root Certifications Authorities in your trust list.&lt;br /&gt;
&lt;br /&gt;
 Using this configuration, the trust list can only be managed through &#039;&#039;Devices&#039;&#039; because it is cleared before each rollout.&lt;br /&gt;
&lt;br /&gt;
==== DECT Handsets ====&lt;br /&gt;
&lt;br /&gt;
This configuration can be used to configure specific options like language, voicemail number etc. for DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* all DECT devices like IP1202, IP1203 etc. will receive this configuration (of course just if the configured categories match)&lt;br /&gt;
* Devices configures a URL like https://domain.com/domain.com/devices/parameters/id.xml on the specific DEVMANBW module.&lt;br /&gt;
* This file is then polled by the basestations and the read values are transfered to the DECT handsets.&lt;br /&gt;
* see [[{{NAMESPACE}}:IP1202/IP1203_DECT_System#Configuration_of_Handset_parameters]]&lt;br /&gt;
&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
=== Software rental ===&lt;br /&gt;
Regarding the Software Rental program and the Payment Method, please refer to:&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_Software_Rental|Concept Software Rental]]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
Software rental can be done for innovaphone Cloud installations or for software, which operates on the customer premisis. This could eventually be customer owned hardware or a privat virtual machine, managed by the customer.&lt;br /&gt;
&lt;br /&gt;
==== Hardware licenses ====&lt;br /&gt;
Hardware licenses have to be bound on the specific device in my.innovaphone itself and currently can&#039;t be handled within the Devices App itself. So you also need to download the licenses from my.innovaphone and upload them on the device with the already known methods.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses with software rental =====&lt;br /&gt;
If your device has software rental licenses, you can bind hardware licenses within my.innovaphone in the software rental project itself.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses without software rental =====&lt;br /&gt;
If your device does not have software rental licenses, you should bind hardware licenses in a separate non rental project in my.innovaphone.&lt;br /&gt;
&lt;br /&gt;
==== innovaphone Cloud ====&lt;br /&gt;
Inside the innovaphone Cloud, you just have to upload your activation keys with iSCs to add licenses to one or more gateways.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Email expiry notifications ====&lt;br /&gt;
You will receive an email notification if the rental of a project expires. This notification will be sent &#039;&#039;&#039;seven&#039;&#039;&#039; weeks before the expiry and then once a week until the rental expires.&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure one or more email recipients in the domain settings.&amp;lt;br&amp;gt;&lt;br /&gt;
If no email address is configured, the email address of the logged in user account is used.&lt;br /&gt;
&lt;br /&gt;
==== History ====&lt;br /&gt;
You can download the history in the Devices App. You&#039;ll get a CSV file (semicolon separated). The date and number format depends on the selected language in the UI.&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an API available for automated downloas, which is described [[ {{NAMESPACE}}:Concept_App_Service_Devices#API_to_download_rental_history|here ]].&lt;br /&gt;
&lt;br /&gt;
====Own installation====&lt;br /&gt;
Inside your own installation, you have to register a new my.innovaphone account or you can use an existing account inside the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
One domain inside Devices belongs to one project inside your my.innovaphone company, so you can handle multiple domains with one my.innovaphone account.&lt;br /&gt;
&lt;br /&gt;
====Technical aspects====&lt;br /&gt;
A new rental expiration date is calculated on each license or balance change in the domain.&amp;lt;br&amp;gt;&lt;br /&gt;
So after each change new licenses with a new date are transfered to the gateways and also stored in the Devices App itself.&amp;lt;br&amp;gt;&lt;br /&gt;
If the rental expires, the gateway reboots and the licenses are not available anymore.&amp;lt;br&amp;gt;&lt;br /&gt;
The licenses are also transfered after each reconnect of a gateway to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For license and balance changes, the Devices App must be online and have access to my.innovaphone.com!&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
You have to add (use the + symbol) a PBX and select all licenses you want to rent.&amp;lt;br&amp;gt;&lt;br /&gt;
Use the &#039;&#039;&#039;apply&#039;&#039;&#039; button to really bind these licenses. Without usage of the apply button, you can just see a precalculation of the iSCs/month and the rental end date, but nothing is really charged from your balance.&lt;br /&gt;
&lt;br /&gt;
===Change of IP address/DNS name in PBX object===&lt;br /&gt;
If the IP address or DNS name inside the PBX object of the Devices App changes, all currently connected clients get a new Devices Registration URL and also all clients, which connect afterwards with the old host name.&lt;br /&gt;
&lt;br /&gt;
== Appendix ==&lt;br /&gt;
=== Sample firmware.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;devices&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP101&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP102&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1060&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP111&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP112&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1130&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1260&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP150&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP2000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP200A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP22&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP222&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP230&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP232&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP24&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP240&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP241&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP29&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP302&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP305&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP311&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP411&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP800&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP810&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP811&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IPVA&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;versions&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;text&amp;quot;: &amp;quot;13r1 dvl [131705]&amp;quot;, &amp;quot;wiki&amp;quot;: &amp;quot;&amp;quot; }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample apps.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;apps&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;Apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;The Apidemo&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;AppStore&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;AppStore&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample software.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;software&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myapps.apk&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Android&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Android&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myAppsSetup.msi&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Windows&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Windows&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample phoneplatform.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;arm64&amp;quot;,&lt;br /&gt;
            &amp;quot;text&amp;quot;: &amp;quot;Phone Platform&amp;quot;,&lt;br /&gt;
            &amp;quot;file&amp;quot;: &amp;quot;phone-platform.img&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;yocto2&amp;quot;,&lt;br /&gt;
            &amp;quot;version&amp;quot;: &amp;quot;2063&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;devices&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;IP270&amp;quot;,&lt;br /&gt;
            &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
                &amp;quot;arm64&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API to download rental history ===&lt;br /&gt;
&lt;br /&gt;
You can download the history as a UTF-8 CSV file with simple &#039;&#039;&#039;HTTP GET&#039;&#039;&#039; requests with &#039;&#039;&#039;digest&#039;&#039;&#039; authentication.&amp;lt;br&amp;gt;&lt;br /&gt;
The CSV file uses the semicolon as delimiter.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The URL to download the history is e.g.:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?...&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 You can find this path by editing the instance in the AP manager.&lt;br /&gt;
 In the listed paths, you&#039;ll find something which ends with csvapi&lt;br /&gt;
&lt;br /&gt;
In the innovaphone Cloud environment, the URL can be retrieved by taking a look at the Devices App object inside the cloud PBX and replacing the ending &#039;&#039;&#039;innovaphone-devices&#039;&#039;&#039; with &#039;&#039;&#039;csvapi&#039;&#039;&#039; inside the App URL, so it looks e.g. like this:&lt;br /&gt;
&lt;br /&gt;
 https://cloud-apps0.innovaphone.com/cloud.innovaphone.com/devices/csvapi&lt;br /&gt;
&lt;br /&gt;
====CSV columns====&lt;br /&gt;
Most columns should be self explaining, but the column &#039;&#039;&#039;invoice reference&#039;&#039;&#039; refers to a value which you can configure manually in the domain settings in the Devices App!&lt;br /&gt;
&lt;br /&gt;
====Digest authentication====&lt;br /&gt;
You can login with two different username/password combinations, while the domain is the digest username:&lt;br /&gt;
&lt;br /&gt;
* If you use the domain and password of your Devices App instance inside the AP Manager, you have automatically access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
* If you use the domain name of any domain as digest username and the configured domain password, you&#039;ll have access to this domain and all domains to which this domain has access to&lt;br /&gt;
&lt;br /&gt;
====Query parameters====&lt;br /&gt;
The following query parameters can be used (don&#039;t forget to URL encode the parameter values, if neccessary!):&lt;br /&gt;
* all: if &#039;&#039;&#039;1&#039;&#039;&#039; or &#039;&#039;&#039;true&#039;&#039;&#039;, the history is queried for all domains where the digest user has access to&lt;br /&gt;
* domain: required, if &#039;&#039;all&#039;&#039; is not set&lt;br /&gt;
* lang: the output language of the CSV file, which also controls date and number formats, e.g. &#039;&#039;&#039;en&#039;&#039;&#039;, &#039;&#039;&#039;de&#039;&#039;&#039;, ...&lt;br /&gt;
* tz: the timezone for dates, e.g. &#039;&#039;&#039;Europe/Berlin&#039;&#039;&#039;&lt;br /&gt;
* type: two types are available:&lt;br /&gt;
** &#039;&#039;&#039;history&#039;&#039;&#039;: history which contains changes&lt;br /&gt;
** &#039;&#039;&#039;overview&#039;&#039;&#039;: a monthly overview with the iSC costs at the first of the last months&lt;br /&gt;
* from: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
* to: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
&lt;br /&gt;
====Example requests====&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=history&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;amp;from=1601903431000&amp;amp;to=1601903385000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?all=1&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Supported DECT handsets ===&lt;br /&gt;
&lt;br /&gt;
The following handsets are supported for update jobs and the DECT handsets configuration:&lt;br /&gt;
&lt;br /&gt;
* IP64&lt;br /&gt;
* IP65&lt;br /&gt;
* D81&lt;br /&gt;
* D83&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
===SoftwarePhone===&lt;br /&gt;
The Devices App is not meant to be used with the windows SoftwarPhone standalone installation.&lt;br /&gt;
&lt;br /&gt;
== Related Articles == &lt;br /&gt;
* [[Howto:Software_Rental]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_myApps_platform_services&amp;diff=79263</id>
		<title>Reference16r1:Concept myApps platform services</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_myApps_platform_services&amp;diff=79263"/>
		<updated>2026-03-26T08:13:14Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* MSI Parameters and install options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|myApps]]&lt;br /&gt;
&lt;br /&gt;
myApps platform services provide various operating system specific services which can be used by other &#039;&#039;Apps&#039;&#039; running in the [[{{NAMESPACE}}:Concept myApps|myApps client]]. Those services typically are not available in the browser&#039;s JavaScript environment and hence must be implemented in native platform code. Therefore, the platform services are installed as native executable on the respective platform.&lt;br /&gt;
&lt;br /&gt;
When myApps is started in a web browser (and hence has no access to the platform services), some Apps will use [https://en.wikipedia.org/wiki/WebRTC WebRTC] services implemented by the browser instead.  For ease of reference, features available in this scenario are also described here.&lt;br /&gt;
&lt;br /&gt;
On windows, the platform services also come with their own web browser in which the myApps web App will be started then.  This browser is based on google&#039;s [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium] open source software.&lt;br /&gt;
= Applies To =&lt;br /&gt;
&lt;br /&gt;
* [[{{NAMESPACE}}:Concept myApps|myApps]]&lt;br /&gt;
* myApps for Windows&lt;br /&gt;
* myApps for macOS&lt;br /&gt;
* myApps for iOS&lt;br /&gt;
* myApps for Android&lt;br /&gt;
* myApps Web App (WebRTC)&lt;br /&gt;
* myApps for IP270&lt;br /&gt;
version 16r1&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
Not all features are available or required on all platforms.&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Feature&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
| || || Windows || iOS || Android || macOS || Browser&amp;lt;ref&amp;gt;This refers to the myApps web application running in a browser with no platform services available&amp;lt;/ref&amp;gt;&lt;br /&gt;
|IP270&lt;br /&gt;
|-&lt;br /&gt;
| [[#Device handling|Audio Devices]] || manage local audio devices to record and playback audio conversations || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (audio available but devices managed by web browser) || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Video || manage local displays and cameras to capture and render video live stream || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (video available but devices managed by web browser) || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Ringer || manage local ringing device || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Application sharing|Application sharing]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; presenter || share an application || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; consumer  || view an application shared by the peer || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Hot keys|Hot keys]] || capture key presses for quick invocation of phone apps (e.g. dial selected number) || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#URL Handler|tel: and sip: URI handler]] || intercept clicks on tel: and sip: links in web sites to invoke phone apps || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#User activity|User activity]] || set presence state according to user activity ||  &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;limited, see [[#User activity|User activity]] below&amp;lt;/ref&amp;gt; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Docking || myApps can be docked persistently to the right or left edge of your screens ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| Multi-windowing || Apps can be launched in separate windows||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Recording|Recording]] || Calls can be recorded to recording app||  &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Notifications|Notifications]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; display notifications || display notifications with OS standard mechanism ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; push notifications || receive push notifications while myApps is not running  ||  &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The browser needs to be running in order to receive push notifications.&amp;lt;/ref&amp;gt; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; chat and apps || display notifications for chat and other apps  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; calls || display notifications for incoming calls  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&amp;lt;ref&amp;gt;Call notifications are only displayed locally while the phone or softphone app is started.&amp;lt;/ref&amp;gt; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Local phonebook access|Local phonebook]] || access local phone book ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Microsoft Office Integration|Office presence provider]] || maps PBX presence state to Microsoft office presence state ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Call an external application for calls|External application start]] || start arbitrary external applications for calls || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#App Proxy|App Proxy]]|| a caching proxy that provides app persistence  || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| [[#Auto update|Auto update]] || automatically updates myApps platform services to the same version the PBX has || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The then-current web app is always loaded from the PBX upon startup and hence up-to-date by definition&amp;lt;/ref&amp;gt; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Three party conference || initiate 3-pty-conference using Softphone-App || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Exclude VPN || disable use of VPN connections for audio and appsharing || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| Screen lock || myApps screen lock against unauthorised use || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
* innovaphone PBX 16r1 and up&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Recommended hardware requirements&lt;br /&gt;
* Processor: Dual-core 2Ghz or higher&lt;br /&gt;
* RAM: 4 Gb&lt;br /&gt;
&lt;br /&gt;
== myApps for Windows ==&lt;br /&gt;
* Windows 11 and up&lt;br /&gt;
* Windows Server 2016 and later versions&lt;br /&gt;
&lt;br /&gt;
=== 32 &amp;amp; 64 bit Windows ===&lt;br /&gt;
* 32 bit Windows: install the myAppsSetup32.msi from the App Store&lt;br /&gt;
* 64 bit Windows: install the myAppsSetup.msi from the App Store&lt;br /&gt;
** the 64 bit variant still installs into Program Files (x86), as the main myApps.exe is still a 32bit application&lt;br /&gt;
** the 64 bit variant just contains an additional 64 bit binary for the outlook search&lt;br /&gt;
&lt;br /&gt;
=== Windows N editions ===&lt;br /&gt;
&lt;br /&gt;
Windows N editions are missing the &#039;&#039;Media Feature Pack&#039;&#039; which is pre installed on other Windows versions.&lt;br /&gt;
&lt;br /&gt;
Please install the pack from [https://www.microsoft.com/en-us/software-download/mediafeaturepack Microsoft (Windows 10 pack)] before you install myApps. The installer will check if the file &amp;lt;code&amp;gt;C:\Windows\SysWOW64\mfplat.dll&amp;lt;/code&amp;gt; exist on your system.&lt;br /&gt;
&lt;br /&gt;
Make sure to install the correct pack depending on your Windows version! There are different packs for Windows 10 1703, 1803, 1809 and 32bit or 64bit etc.&lt;br /&gt;
&lt;br /&gt;
NB: Sometimes the myApps installation will not work even though the media pack is already installed. This is because the installer has no read access to check if the package is already installed. If the above-mentioned file exists and the installer asks to install the Windows Media Feature Pack nevertheless, you have to start the myApps install with administrative rights.&lt;br /&gt;
&lt;br /&gt;
=== Terminal Server environments ===&lt;br /&gt;
&lt;br /&gt;
Audio driver was removed if myApps discovers that it is running in a terminal server environment like Citrix.&lt;br /&gt;
&lt;br /&gt;
The audio driver is needed for the Softphone App but the Softphone App should not use an audio driver at the server side because the audio devices are plugged locally and there would be a delay sending and receiving audio data with the server.&lt;br /&gt;
&lt;br /&gt;
If a customer wants to use the Softphone App at the server side he needs to make use of the myApps Plugin for virtual desktops solution:&lt;br /&gt;
&lt;br /&gt;
[[{{NAMESPACE}}:MyApps_Plugin_for_Virtual_Desktops|Reference15r1:MyApps_Plugin_for_Virtual_Desktops]]&lt;br /&gt;
&lt;br /&gt;
== myApps for macOS ==&lt;br /&gt;
* macOS 13 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for iOS ==&lt;br /&gt;
* iOS 16 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for Android ==&lt;br /&gt;
* Android 13 or higher.&lt;br /&gt;
&lt;br /&gt;
== myApps for IP270 ==&lt;br /&gt;
Exclusively used in IP270.&lt;br /&gt;
&lt;br /&gt;
= Licenses =&lt;br /&gt;
* No license needed for myApps platform services&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
myApps platform services is a native executable that is installed using the standard mechanisms on the respective operating system. It provides various advanced services which can be used by the myApps web client code as well as the Apps running in the myApps context. &lt;br /&gt;
&lt;br /&gt;
Also, on Windows, the platform services come with their own, dedicated browser to run myApps in.  This browser is based on [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium].  On iOS, macOS and Android, it is based upon native embedded web view facilities (such as WKWebView) instead.&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
=== RTP service for audio and appsharing ===&lt;br /&gt;
The RTP service provides audio and appsharing as a video stream. VoIP RTP endpoints (e.g. for softphones).  It supports STUN, TURN, ICE, SRTP, DTLS. Note however that unlike WebRTC, these endpoints do not &#039;&#039;require&#039;&#039; ICE and DTLS. In other words, they can communicate also with non-compliant (i.e. older) VoIP devices.&lt;br /&gt;
&lt;br /&gt;
Note that the available capabilities when not running the myApps platform services depend on the used browser&#039;s WebRTC implementation. See your browser documentation for details.&lt;br /&gt;
&lt;br /&gt;
Apps can request RTP channels using the [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol]&#039;s &#039;&#039;AllocChannel&#039;&#039; message.&lt;br /&gt;
&lt;br /&gt;
==== RTP ports ====&lt;br /&gt;
{|&lt;br /&gt;
|  audio || 50000 -&amp;gt; 50099&lt;br /&gt;
|-&lt;br /&gt;
| video (app sharing) || 50100 -&amp;gt; 50199&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The RTP service will enumerate all local interfaces and create local HOST candidates for ICE.  There is an option however to disregard VPN interfaces (more precisely such interfaces with type of &#039;&#039;IF_TYPE_PPP&#039;&#039; or &#039;&#039;IF_TYPE_TUNNEL&#039;&#039;).  This can eliminate quality issues when RTP data is transmitted through TCP based VPN tunnels.&lt;br /&gt;
&lt;br /&gt;
SRFLX and RELAY candidates are obtained using the STUN and TURN server configuration passed by the App (e.g the &#039;&#039;softphone&#039;&#039; App) as part of the &#039;&#039;AllocChannel&#039;&#039; request.&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;AllocChannel&amp;quot;,&amp;quot;channel&amp;quot;:&amp;quot;81429cba-396d-43de-8a76-ec020ba8796e&amp;quot;,&amp;quot;iceServers&amp;quot;:[{&amp;quot;urls&amp;quot;:&amp;quot;turn:myturn.domaincom:4077?transport=udp&amp;quot;,&amp;quot;username&amp;quot;:&amp;quot;turnuser&amp;quot;,&amp;quot;credential&amp;quot;:&amp;quot;pwd&amp;quot;,&amp;quot;credentialType&amp;quot;:&amp;quot;password&amp;quot;},{&amp;quot;urls&amp;quot;:&amp;quot;stun:mystun.domain.com:4077&amp;quot;}],&amp;quot;dn&amp;quot;:&amp;quot;Foo Bar&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;RemoteRtp&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;video&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Codecs ====&lt;br /&gt;
The installed myApps launchers provide codecs that can be used by softphone apps for media streams. When running in a web browser the codecs depend on the browser version and operating system. See the documentation of your browser for details.&lt;br /&gt;
&lt;br /&gt;
The following codecs are supported:&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align:left;width:100px;&amp;quot;|Codec&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Windows-Launcher&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Android&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|iOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|macOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Firefox (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Chrome (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Edge (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Safari (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Opera (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|IP270&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;11&amp;quot;|Audio&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|G711A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G711u&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G722&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-NB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-WB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; |Video&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP8 VP8]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP9 VP9]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=H264 H264]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;11&amp;quot;|Application Sharing&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Share&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|Watch&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;* small presentation only&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;** only for 1:1 calls, not for conferences&lt;br /&gt;
&lt;br /&gt;
==== Video capture ====&lt;br /&gt;
The default resolution for video capture is 1920x1080 if available.  Otherwise, 1280x720, 640x480, 352x288 or 320x240 will be used.  The frame rate is 30 fps if available, otherwise 15 fps. The resulting average bandwidth could reach 1 Mbps.&lt;br /&gt;
&lt;br /&gt;
==== Application sharing ====&lt;br /&gt;
Screen content will be transmitted as video stream by the presenter&lt;br /&gt;
&lt;br /&gt;
==== Device handling ====&lt;br /&gt;
The RTP service enumerates microphones, loudspeaker, cameras and ringing devices and notifies apps when devices come and go. It is up to the apps using the devices to store preferences.&lt;br /&gt;
&lt;br /&gt;
The RTP service also enables some extended features (such as hook switch or volume control) for supported USB headsets or Bluetooth headsets connected to myApps.&lt;br /&gt;
The supported headset-SDKs determine which headset vendors are recommended to be used with the myApps softphone app. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this to work, the following vendor specific development kits are integrated in our myApps client. Be aware that the SDK are updated within our Service release :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SDK Vendor !! Supported OS !! SDK Version !! innovaphone Service Release&lt;br /&gt;
|-&lt;br /&gt;
| Jabra|| MacOS || 1.12.2.0 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 1.12.2.0 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Epos &#039;&#039;(formerly Sennheiser)&#039;&#039; || MacOS || 12.4.0.5478 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || n.a. - [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|to be installed separately]]|| 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Poly &#039;&#039;(formerly Plantronics)&#039;&#039; || MacOS || 3.25.53799.37131 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.25.53800.37131 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Yealink || MacOS || 3.1.1.20 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.1.1.20 || 14r1sr3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* It is possible to inhibit the start of the Sennheiser SDK (SenncomSDK.exe) using the &amp;lt;code&amp;gt;DISABLEHEADSETS&amp;lt;/code&amp;gt; directive of the installer (see [[#MSI Parameters and install options|  MSI parameters]]  below).&lt;br /&gt;
&lt;br /&gt;
* Starting with V13r3sr10, the Epos-SDK needs to be installed separately using the Epos Connect software to ensure full compatibility between current Epos headset models and native myApps-Windows client. For details [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|refer to this article]].&lt;br /&gt;
&amp;lt;!--Keywords: myapps softphone supported headsets sdk--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
myApps-IP270 supports use of [[Reference9:Concept USB Headset|USB devices known for innovpahone desk phones]].&lt;br /&gt;
&lt;br /&gt;
==== Ring tones ====&lt;br /&gt;
Ring tones can be played. Apps can choose the tone from a pre-defined list of ring tones.&lt;br /&gt;
&lt;br /&gt;
On Windows, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;ringtones&amp;lt;/code&amp;gt; sub-directory of myApps&#039; roaming directory (which usually is in &amp;lt;code&amp;gt;%appdata%\innovaphone\myApps\ringtones&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
On Android, custom ring tones can be added to the system via Android settings.&lt;br /&gt;
&lt;br /&gt;
On iOS, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;Ringtones&amp;lt;/code&amp;gt; subdirectory of the myApps file share that is available in iTunes if the iPhone has been connected via USB.&lt;br /&gt;
&lt;br /&gt;
On macOS, custom ring tones can be uploaded as .mp3 files to &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-macos/Data/Documents/Ringtones&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Debugging ====&lt;br /&gt;
For extended debugging, turn on the &#039;&#039;Audio&#039;&#039;, &#039;&#039;Media&#039;&#039; and &#039;&#039;AppSharing&#039;&#039; traces in myApps.&lt;br /&gt;
=== Hot keys ===&lt;br /&gt;
On Windows and macOS systems, myApps platform services can listen for hot keys and invoke certain functions. Invocation is done by sending API messages to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
The hot keys can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below. Any of the function keys F1 to F11 (optionally combined with up to two modifier keys &#039;&#039;alt&#039;&#039;, &#039;&#039;ctrl&#039;&#039;, &#039;&#039;shift&#039;&#039; or &#039;&#039;win&#039;&#039;) can be chosen for each function. If you do not want to start the call with &amp;quot;Hotkey+Enter&amp;quot; because you would have to wait for the focus, the hotkey can also be pressed twice and the number is dialled directly.&lt;br /&gt;
&lt;br /&gt;
; dial selected number : Initiates a call using the currently selected text as target.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;text&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;mt&amp;quot;:&amp;quot;PrepareCall&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;13&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; accept call : Accepts a currently alerting call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;ConnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;ConnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; reject/disconnect call : Rejects a currently alerting call or disconnects an active call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;DisconnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;DisconnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== URL Handler ===&lt;br /&gt;
&lt;br /&gt;
On Windows systems, two URI-handler are installed with the myApps platform services.  Windows will call up this URI handler when a user clicks on an appropriate link, for example in a web site.&lt;br /&gt;
&lt;br /&gt;
The handler will the send an API message to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
; tel URI : call a number, e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;num&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;num&amp;quot;:&amp;quot;4711&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; sip URI : call a SIP name, e.g. &amp;lt;code&amp;gt;sip:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; im URI : start chat with SIP name, e.g. &amp;lt;code&amp;gt;im:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;StartChat&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm &#039;&#039;com.innovaphone.chat&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.chat&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartChat&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On macOS systems myApps might be made the default application to handle tel URI e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt; via Apple FaceTime. Open the &amp;quot;FaceTime&amp;quot; menu &amp;quot;Settings...&amp;quot; and select myApps as &amp;quot;Default for phone calls&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On iOS &#039;&#039;tel&#039;&#039; URIs are always dialed via GSM. Therefore myApps iOS also reacts to URI schemes &#039;&#039;com.innovaphone.tel&#039;&#039;, &#039;&#039;com.innovaphone.sip&#039;&#039; and &#039;&#039;com.innovaphone.im&#039;&#039;, e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.tel:4711&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.sip:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.im:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== User activity ===&lt;br /&gt;
On Windows and macOS systems, the myApps platform services can monitor user keyboard/mouse activity and change the user&#039;s presence state after a certain amount of inactivity.  The timeout can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below.&lt;br /&gt;
&lt;br /&gt;
myApps will then send a [https://sdk.innovaphone.com/doc/appwebsocket/myApps.htm#SetUserActivity&#039;&#039;SetUserActivity&#039;&#039;] message to the PBX using the &#039;&#039;myApps&#039;&#039; protocol.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;SetUserActivity&amp;quot;,&amp;quot;inactive&amp;quot;:true}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will change the &#039;&#039;status&#039;&#039; property of the &#039;&#039;im:&#039;&#039; contact for the user&#039;s own presence and hence result in a presence update from the PBX to myApps&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;UpdateOwnPresence&amp;quot;,&amp;quot;presence&amp;quot;:[{...},{&amp;quot;contact&amp;quot;:&amp;quot;im:&amp;quot;,&amp;quot;activity&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;closed&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
The &#039;&#039;closed&#039;&#039; status is reflected in the grey status color when displaying a contact [[Image:myapps-inactive.png|myapps-inactive.png/|myapps-inactive.png/]].&lt;br /&gt;
&lt;br /&gt;
On iOS and Android, the state is set to &#039;&#039;inactive&#039;&#039; as soon as the App is brought to background.&lt;br /&gt;
When myApps platform services are not available (i.e. when running the web application in a browser solely) a limited user activity monitoring is available: the state is set to active when the web page is not used for more than 5 minutes.&lt;br /&gt;
&lt;br /&gt;
=== Recording ===&lt;br /&gt;
&lt;br /&gt;
The new launcher offers the possibility to record the audio of incoming and outgoing calls. In order to activate that functionality the URL of the recording instance must be configured in either the PBX (PBX-&amp;gt;myApps-&amp;gt;Config: Recording URL) or the softphone App (Settings-&amp;gt;Audio Recording (URL)) &lt;br /&gt;
&lt;br /&gt;
[[Image:PBX-Recording-Settings.png|pbx-recording-settings.png/|pbx-recording-settings.png/]] [[Image:Recording-Softphone-Settings.png|recording-softphone-settings.png/|recording-softphone-settings.png/]]. &lt;br /&gt;
&lt;br /&gt;
As long as that URL is configured the audio data of all calls are stored as pcap-files under that URL.&lt;br /&gt;
If the URL points to a CF device in the PBX, write access must be granted for that URL (PBX-&amp;gt;Services-&amp;gt;HTTP-&amp;gt;Server:Public compact flash access) and if the URL points to the recording app, the files can be accessed via the recording app [[{{NAMESPACE}}:Concept_App_Service_Recordings|recording]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under PBX-&amp;gt;myApps the administrator can set a certain default behaviour of the audio recording like whether or not the recording should start automatically at the beginning of the call (Recording by Default ON/OFF), only calls with external numbers should be recorded (Record external calls only) or whether or not the user should be able to start/stop the recording himself (Allow user incall recording control). Except for the last parameter these parameters can also be modified by the user in its softphone settings if the administrator doesn&#039;t set the FORCE flag.&lt;br /&gt;
&lt;br /&gt;
If the user was allowed by the admin to control the recording a recording switch is active during the call when the &amp;quot;Media&amp;quot; Panel is opened. There the audio recording may be stopped and continued at will. A red recording notice is shown in the top right corner when the recording actually takes place.&lt;br /&gt;
 &lt;br /&gt;
[[Image:Recording-incall-switch.png|recording-incall-switch.png/|recording-incall-switch.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services can use the OS specific notification mechanism (e.g. &#039;&#039;desktop notifications&#039;&#039; on Windows) to display messages (e.g. &#039;&#039;incoming new chat message&#039;&#039;) to the user.&lt;br /&gt;
&lt;br /&gt;
Note that the actual rendering of the notification is under control of the OS.  Therefore, myApps must be allowed to show notifications and its appearance can be restricted by OS native settings.&lt;br /&gt;
&lt;br /&gt;
==== Microsoft Windows Notifications ====&lt;br /&gt;
&lt;br /&gt;
Microsoft Windows Server editions (2016, 2019, 2022) are just capable of showing a single &#039;&#039;IncomingCall&#039;&#039; notification at the same time (we couldn&#039;t find a workaround for this limitation).&amp;lt;br/&amp;gt;&lt;br /&gt;
An &#039;&#039;IncomingCall&#039;&#039; notification is visible the whole time instead of being moved to the action center after a certain time.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
A notification about a missed call uses the &#039;&#039;IncomingCall&#039;&#039; type so that this notification is visible until the user returns.&amp;lt;br/&amp;gt;&lt;br /&gt;
Due to the above limitation, on a new arriving call such a missed call notification is transformed to a default notification which will be moved to the action center automatically.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On non server editions, you can have multiple IncomingCall notifications at the same time (so two parallel incoming calls will be indeed notified at the same time), but the missed call notification handling is the same on both platforms!&lt;br /&gt;
&lt;br /&gt;
 Thus there will be always just &#039;&#039;&#039;one&#039;&#039;&#039; missed call notification visible and previous missed calls can be found inside your action center!&lt;br /&gt;
&lt;br /&gt;
To see myApps notifications, ensure:&lt;br /&gt;
* System -&amp;gt; Notifications &lt;br /&gt;
** enable notifications&lt;br /&gt;
** disable &amp;quot;Do not disturb&amp;quot; or allow myApps as priority application while &amp;quot;Do not disturb&amp;quot; is active&lt;br /&gt;
** enable notifications for myApps in the list of applications&lt;br /&gt;
* System -&amp;gt; Focus &lt;br /&gt;
** if a focus session is active and the &amp;quot;Do not disturb&amp;quot; is activated during a focus session, make sure that myApps is a priority application (see above)&lt;br /&gt;
&lt;br /&gt;
==== macOS Notifications ====&lt;br /&gt;
Notifications are the same as on Windows.&lt;br /&gt;
The difference is, that for macOS, notifications need to be allowed in the system settings.&lt;br /&gt;
Go to Notifications - myApps, select Banner and enable all check marks.&lt;br /&gt;
&lt;br /&gt;
=== Local phonebook access ===&lt;br /&gt;
&#039;&#039;&#039;Contact Search:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm &#039;&#039;com.innovaphone.search&#039;&#039; API]]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Search&#039;&#039; request to the API:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;Search&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;search&amp;quot;:&amp;quot;john doe&amp;quot;},&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
Search results are delivered as &#039;&#039;SearchInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;SearchInfo&amp;quot;,&amp;quot;relevance&amp;quot;:2000,&amp;quot;adjust&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;contact&amp;quot;:{&amp;quot;givenname&amp;quot;:&amp;quot;John&amp;quot;,&amp;quot;sn&amp;quot;:&amp;quot;Doe&amp;quot;,&amp;quot;company&amp;quot;:&amp;quot;ACME&amp;quot;,&amp;quot;position&amp;quot;:&amp;quot;Head of everything&amp;quot;,&amp;quot;telephonenumber&amp;quot;:[&amp;quot;11111&amp;quot;,&amp;quot;22222&amp;quot;],&amp;quot;homephone&amp;quot;:[&amp;quot;+4944444&amp;quot;,&amp;quot;33333&amp;quot;],&amp;quot;mobile&amp;quot;:[&amp;quot;+49 (123) 55555&amp;quot;]}},&amp;quot;api&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reverse Lookup:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.phonelookup/lib1_api_phonelookup.htm &#039;&#039;com.innovaphone.phonelookup&#039;&#039; API]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Lookup&#039;&#039; request to the API: &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{ mt: &amp;quot;Lookup&amp;quot;, prefixIntl: &amp;quot;000&amp;quot;, prefixNtl: &amp;quot;00&amp;quot;, prefixExt:&amp;quot;0&amp;quot;, area: &amp;quot;7031&amp;quot;, country: &amp;quot;49&amp;quot;, lookup: &amp;quot;0004970311234567&amp;quot; },&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.lookup&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search results are delivered as &#039;&#039;LookupInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{mt: &amp;quot;LookupInfo&amp;quot;, dn: &amp;quot;Jake Blues&amp;quot;, contact: { telephonenumber: [&amp;quot;0004970311234567&amp;quot;], givenname: &amp;quot;Jake&amp;quot;, sn: &amp;quot;Blues&amp;quot;, company: &amp;quot;Blues Brothers&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
On Windows, the search and lookup are performed in all of the user&#039;s Outlook contact folders.  As opposed to the search implemented in the &#039;&#039;Contacts&#039;&#039; and &#039;&#039;Users&#039;&#039; App, all items are returned which match any of the search words (i.e. searching for &#039;&#039;a b&#039;&#039; will return items matching either &#039;&#039;a&#039;&#039; or &#039;&#039;b&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
; searched properties : firstname, lastname&lt;br /&gt;
; returned properties : Following Outlook contact phone number properties are returned  (if available):&lt;br /&gt;
&lt;br /&gt;
:* OFFICE_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* OFFICE2_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* HOME_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* HOME2_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* MOBILE_TELEPHONE_NUMBER as &#039;&#039;mobile&#039;&#039;&lt;br /&gt;
:* BUSINESS_FAX_NUMBER as &#039;&#039;facsimiletelephonenumber&#039;&#039;&lt;br /&gt;
Note that contact information is cached in the search provider.  Updated contacts may therefore become effective after a while only.&lt;br /&gt;
Outlook search will create its own trace file &amp;lt;code&amp;gt;myAppsOutlookSearch-&amp;lt;/code&amp;gt;&#039;&#039;date-time&#039;&#039;&amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; in the standard trace directory.&lt;br /&gt;
&lt;br /&gt;
This search provider is always installed and can be disabled.  There is no need (nor possibility) to enable it in the &#039;&#039;Apps&#039;&#039; tab of the PBX&#039;s user object.  Also, no &#039;&#039;App&#039;&#039; object needs to be created for it.&lt;br /&gt;
&lt;br /&gt;
==== Android/iOS ====&lt;br /&gt;
The search and lookup are performed in the contacts.&lt;br /&gt;
&lt;br /&gt;
==== macOS ====&lt;br /&gt;
The search and lookup are performed in the contacts. If you wish to disable local contact lookup, go to system settings - Security &amp;amp; Privacy and disable the access to contacts for myapps.&lt;br /&gt;
=== Microsoft Office integration ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services has a &#039;&#039;office presence provider&#039;&#039; that can provide the user&#039;s presence state to Office applications.  See [[{{NAMESPACE}}:Concept_myApps_Office_Integration|myApps Office Integration]] for details.&lt;br /&gt;
&lt;br /&gt;
This feature is installed by default.  However, it can be disabled using the &#039;&#039;OFFICEPRESENCE&#039;&#039; MSI Parameter.  Also, a check-mark is available in the setup dialog.&lt;br /&gt;
&lt;br /&gt;
=== Call an external application for calls ===&lt;br /&gt;
&lt;br /&gt;
Phone Apps (such as the phoneapp or softphone) can initiate the start of an external application when a new call appears (either incoming or outgoing).  The actual spawning of the application is done by the myApps platform service.  Also, the application properties (such as e.g. the executable&#039;s path) is configured in the myApps platform services (see [[#UI elements|Advanced settings]] in the &#039;&#039;UI elements&#039;&#039; section below).&lt;br /&gt;
&lt;br /&gt;
A number of arguments can be passed to the application by substituting $-variables in the &#039;&#039;Parameter&#039;&#039; field:&lt;br /&gt;
&lt;br /&gt;
; $n : phone number as dialed (called party number for outgoing calls) or received (calling party number for incoming calls)&lt;br /&gt;
&lt;br /&gt;
; $N : called or calling party number in &#039;&#039;national&#039;&#039; format (e.g. 07031730090)&lt;br /&gt;
&lt;br /&gt;
; $I : called or calling party number in &#039;&#039;international&#039;&#039; format (e.g. +497031730090)&lt;br /&gt;
&lt;br /&gt;
: note that both $N and $I only work if $n includes both subscriber number and area code (e.g. 07031730090). Otherwise they are equal to $n&lt;br /&gt;
&lt;br /&gt;
; $d : display name of peer (if known)&lt;br /&gt;
&lt;br /&gt;
; $u : URI name of the peer (if available eg with a federation call)&lt;br /&gt;
&lt;br /&gt;
; $c : conference id&lt;br /&gt;
&lt;br /&gt;
: this is a globally unique ID for this call and may be used to relate the call to the &#039;&#039;guid&#039;&#039; found in the CallInfo structure in the [http://wiki.innovaphone.com/index.php?title=Reference10:SOAP_API#CallInfo SOAP-API] and [http://sdk.innovaphone.com/doc/appwebsocket/RCC.htm RCC-API ].  Also, corresponding [[Reference10:Call Detail Record CDR PBX|CDRs]] can be related using the &#039;&#039;event&#039;&#039; tag&#039;s &#039;&#039;conf&#039;&#039; attribute.&lt;br /&gt;
The start of an external application can be requested using the &#039;&#039;com.innovaphone.externalapps&#039;&#039; API.&lt;br /&gt;
&lt;br /&gt;
Some setup examples are [[Howto:Integrate External Apps in innovaphone UC clients|shown here]].&lt;br /&gt;
&lt;br /&gt;
=== Push ===&lt;br /&gt;
&lt;br /&gt;
Mobile operating systems usually inhibit network operation of apps which run in the background or are closed by the user.  This is done in order to reduce battery consumption.  Unfortunately, this also stops such apps to maintain a registration by regularly sending &#039;&#039;keep alive&#039;&#039; messages to a server (in our case to the PBX).  As a result, myApps will be disconnected from the PBX.   When the PBX determines that there is an event for the application which needs a response, it needs to wake up the app using a dedicated channel provided by the operating system.  This mechanism is know as &#039;&#039;push&#039;&#039;. When running on iOS or Android, myApps supports &#039;&#039;push&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;push&#039;&#039; to work, a [[{{NAMESPACE}}:PBX/Objects/Push|&#039;&#039;push object&#039;&#039;]] needs to be configured in the PBX .  Also, it needs to be enabled on the mobile phone for the myApps app.&lt;br /&gt;
This mechanism is quite similar in v12 and v13, so you can refer to [[{{NAMESPACE}}:Concept_Push_Notifications_for_iOS_and_Android|the concept for push notifications for iOS and Android]] for more details. &lt;br /&gt;
&lt;br /&gt;
Also, helpful hints can be found in [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]].&lt;br /&gt;
&lt;br /&gt;
=== App Proxy ===&lt;br /&gt;
&lt;br /&gt;
myApps runs further &#039;&#039;Apps&#039;&#039; (such as e.g. the &#039;&#039;phoneapp&#039;&#039;) as a web page in an IFRAME of the browser myApps is running in.  The App&#039;s page code is loaded either from the PBX or from an &#039;&#039;application platform&#039;&#039; (AP).   This however would mean that the App&#039;s IFRAME would remain empty (a dead white screen) when the PBX or AP is not available. To make sure the App can start-up anyway, the myApps platform services feature the so-called &#039;&#039;App Proxy&#039;&#039;.  This is a caching proxy that caches all the App code so it is available even in case of network failure. When myApps runs in the context of the platform services, Apps are therefore not loaded from the App source directly, but from the local App proxy. &lt;br /&gt;
&lt;br /&gt;
The cached files are stored in the PCs local file system in the &amp;lt;code&amp;gt;%LOCALAPPDATA%\innovaphone\myApps\appproxy&amp;lt;/path&amp;gt;&amp;lt;/code&amp;gt;.  There is no configuration required.  However, if myApps seems to run with outdated or corrupt cached copies of the App, you can safely delete the entire directory.&lt;br /&gt;
&lt;br /&gt;
=== Auto update ===&lt;br /&gt;
&lt;br /&gt;
On Windows and on macOS, the myApps platform services can auto-update themselves to a common version.  This is controlled by the [[{{NAMESPACE}}:PBX/Config/myApps#Launcher_Software_Update | &#039;&#039;Launcher Software Update&#039;&#039;]] settings under &#039;&#039;PBX/Config/myApps&#039;&#039; in the PBX. &lt;br /&gt;
&lt;br /&gt;
When myApps is started or the user logs in or myApps needs to re-connect to the PBX, the platform services will use the [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client API] to learn the desired version (&#039;&#039;launcherUpdateBuild&#039;&#039;, which is part of the API&#039;s &#039;&#039;model&#039;&#039;). If this differs from the current version, the platform services will try to download the respective new version. &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;mt&amp;quot;: &amp;quot;ApiUpdate&amp;quot;,&lt;br /&gt;
    &amp;quot;apis&amp;quot;: {&lt;br /&gt;
        &amp;quot;com.innovaphone.client&amp;quot;: {&lt;br /&gt;
            &amp;quot;@client&amp;quot;: {&lt;br /&gt;
                &amp;quot;title&amp;quot;: &amp;quot;innovaphone myApps&amp;quot;,&lt;br /&gt;
                &amp;quot;model&amp;quot;: {&lt;br /&gt;
                    &amp;quot;launcher&amp;quot;: true,&lt;br /&gt;
                    &amp;quot;launcherUpdateBuild&amp;quot;: &amp;quot;134906&amp;quot;,&lt;br /&gt;
                    &amp;quot;appStoreUrl&amp;quot;: &amp;quot;http://store.innovaphone.com/release/download/&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The installation of the downloaded version is done by the &#039;&#039;innovaphonemyAppsUpdateService&#039;&#039;. This service is installed and enabled during the initial installation of the myApps platform services.  To disable auto-update, either leave the &#039;&#039;Launcher Software Update&#039;&#039; settings empty or set the service&#039;s start mode to &#039;&#039;disabled&#039;&#039; in the Windows &#039;&#039;services control panel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that on Windows the update service does not work on terminal servers. Administrators must do myApps base services updates using standard windows mechanisms.&lt;br /&gt;
&lt;br /&gt;
Note that on macOS if myApps has been installed from the Apple Store it is assumed that auto update from the PBX is not desired and disabled therefore.&lt;br /&gt;
&lt;br /&gt;
On Android/iOS/macOS updates can be downloaded from the respective app store.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Devices&#039;&#039; app can not update software installed on Windows PCs directly. However, when the PBX is updated using an &#039;&#039;update job&#039;&#039; in the &#039;&#039;Devices&#039;&#039; App, the &#039;&#039;Launcher Software Update&#039;&#039; settings will be updated accordingly and hence the myApps base services will ultimately also be updated to the same version.&lt;br /&gt;
&lt;br /&gt;
==== Auto update flow on Windows ====&lt;br /&gt;
&lt;br /&gt;
* On start of myApps, myApps checks if an update is available and ready for installation&lt;br /&gt;
** if yes, the update is installed directly, without user interaction (a popup is shown during the installation)&lt;br /&gt;
** if not, myApps starts&lt;br /&gt;
* if an update is available while myApps is already running, an update notification will be shown which let&#039;s the user choose to install the update now or later (the notification will then popup again after one hour)&lt;br /&gt;
&lt;br /&gt;
==UI elements ==&lt;br /&gt;
There are a few user interfaces provided by the platform services:&lt;br /&gt;
===tray-icon (Windows only) ===&lt;br /&gt;
::[[Image:myapps-tray.png|myapps-tray.png/|myapps-tray.png/]]&lt;br /&gt;
:Allows to&lt;br /&gt;
:* terminate myApps&lt;br /&gt;
:* toggle the &#039;&#039;autostart&#039;&#039; state&lt;br /&gt;
:* toggle the &#039;&#039;show in task bar&#039;&#039; state&lt;br /&gt;
:* open the trace folder&lt;br /&gt;
:&lt;br /&gt;
=== PBX connect form===&lt;br /&gt;
:: [[Image:myapps-connect.png|myapps-connect.png/|myapps-connect.png/]]&lt;br /&gt;
: Allows the user to specify the connect data for the PBX (i.e. IP address or DNS name)&lt;br /&gt;
:&lt;br /&gt;
=== Advanced settings===&lt;br /&gt;
::[[Image:myapps-settings0.png|myapps-settings0.png/|myapps-settings0.png/]]&lt;br /&gt;
::[[Image:myapps-settings.png|myapps-settings.png/|myapps-settings.png/]] [[Image:myapps-settings2.png|myapps-settings2.png/|myapps-settings2.png/]] [[Image:myapps-settings3.png|myapps-settings3.png/|myapps-settings3.png/]]&lt;br /&gt;
&lt;br /&gt;
: Allows to modify various platform dependant settings (such as e.g. the hotkey selection on Windows)&lt;br /&gt;
&lt;br /&gt;
== Interfaces ==&lt;br /&gt;
=== Provided APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm com.innovaphone.search] : access to local phone book entries by the [[#Local phonebook access|Local phonebook access]] component.&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.launcher/com.innovaphone.launcher.htm com.innovaphone.launcher] : display of OS specific user notifications and receipt of related user actions&lt;br /&gt;
; com.innovaphone.notificationhandler : reports back click on a notification.&lt;br /&gt;
; com.innovaphone.externalapps : to start external applications, see [[#Call an external application for calls|Call an external application for calls]]  above&lt;br /&gt;
&lt;br /&gt;
=== Used APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm com.innovaphone.phone] : used to initiate new or manipulate existing calls by the [[#Hot keys|Hot keys]] and [[#URL handler|URL handler]] components.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm com.innovaphone.chat] : used to start a new chat by the [[#URL handler|URL handler]] component.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client] : the model is used to learn the update settings, see [[#Auto update|Auto update]] above&lt;br /&gt;
&lt;br /&gt;
=== Protocols ===&lt;br /&gt;
&lt;br /&gt;
; [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol] : used by apps to allocate RTP channels, see [[#RTP service for audio.2C video and data|RTP service for audio, video and data]] above&lt;br /&gt;
&lt;br /&gt;
== Related App Services ==&lt;br /&gt;
&lt;br /&gt;
none&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
; Incoming call as banner on myApps for iOS : Since iOS 14 the iOS CallKit presents incoming calls as a banner leaving the original green answer button of myApps visible. Use only the blue button of the banner to accept the call or change iPhone Settings, App &amp;quot;Phone&amp;quot;, &amp;quot;Incoming Calls&amp;quot; to &amp;quot;Full Screen&amp;quot; to hide the myApps user interface again during call answering.&lt;br /&gt;
&lt;br /&gt;
; Call answer in speakerphone mode even with active Bluetooth headset on myApps for iOS : This causes unwanted speakerphone operation if the smartphone is used with a Bluetooth car audio system. The behaviour can be changed by selecting &#039;&#039;Bluetooth Headset&#039;&#039; in this setting:&lt;br /&gt;
:&#039;&#039;iOS Settings-&amp;gt;Accessibility-&amp;gt;Touch-&amp;gt;Call Audio Routing: Automatic / Bluetooth Headset / Speaker&#039;&#039;&lt;br /&gt;
:&#039;&#039;iOS Einstellungen-&amp;gt;Bedienungshilfen-&amp;gt;Tippen-&amp;gt;Anrufaudioausgabe: Automatisch / Bluetooth-Headset / Lautsprecher&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Windows Server 2016 (Windows 10 Build 1607) : windows just shows the first notification. Further notifications aren&#039;t displayed until the previous ones are removed from the notification center. Current windows builds do not show this behaviour anymore.&lt;br /&gt;
&lt;br /&gt;
; Problems on Mac computers with Yealink USB headsets&lt;br /&gt;
: we have received reports that myApps quits unexpectedly on some Mac computers when a Yealink headset is plugged in.  Unfortunately, we could not find out the cause yet.  If you use Yealink USB headsets and have a similar issue, please open a support ticket and send myApps traces.&lt;br /&gt;
&lt;br /&gt;
; Poly / Plantronics headset buttons only functional if myApps is started with Rosetta&lt;br /&gt;
: myApps macOS supports Apple M1/M2 hardware natively. However, the Poly / Plantronics headset SDK is only available for Intel platform and thus myApps needs to be started via Apple&#039;s Intel emulator Rosetta if a Poly / Plantronics headset is used. This is done with right-click on the myApps executable, &#039;&#039;Information&#039;&#039;, &#039;&#039;Open with Rosetta&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Windows surface devices may not work correctly&lt;br /&gt;
: Chromium does not get touch keyboard events. USB Keyboards may not be recognized either.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Windows using the .msi file found in the &#039;&#039;myApps Windows&#039;&#039; package from [https://store.innovaphone.com/release/download.htm store.innovaphone.com].&lt;br /&gt;
&lt;br /&gt;
myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
=== MSI Parameters and install options ===&lt;br /&gt;
&lt;br /&gt;
The MSI installer of myApps for Windows supports the following parameters and can be edited with [https://docs.microsoft.com/en-us/windows/win32/msi/orca-exe Microsoft Orca]. You can add your parameters in the table &#039;&#039;property&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; SERVER (REG_SZ): the PBX&#039;s server address (without protocol like https://)&lt;br /&gt;
; OFFICEPRESENCE (REG_DWORD): &#039;&#039;&#039;false&#039;&#039;&#039; to disable presence integration in Microsoft Office&lt;br /&gt;
: this is also available as a check-mark when running the install manually&lt;br /&gt;
&lt;br /&gt;
; DISABLEHEADSETS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable headsets support, see [[#Device handling|Device handling]] above&lt;br /&gt;
&lt;br /&gt;
; EXTERNALAPPS (REG_SZ): pre-define external applications, see [[#Call an external application for calls|Call an external application for calls]] above&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;&amp;quot;{&amp;quot;&amp;quot;externalApps&amp;quot;&amp;quot;:[{&amp;quot;&amp;quot;id&amp;quot;&amp;quot;:0,&amp;quot;&amp;quot;name&amp;quot;&amp;quot;:&amp;quot;&amp;quot;Wireshark&amp;quot;&amp;quot;,&amp;quot;&amp;quot;path&amp;quot;&amp;quot;:&amp;quot;&amp;quot;C:\\Program Files\\Wireshark\\Wireshark.exe&amp;quot;&amp;quot;,&amp;quot;&amp;quot;param&amp;quot;&amp;quot;:&amp;quot;&amp;quot;test $I&amp;quot;&amp;quot;}]}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FORCERESTART (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; (or any string ...) kills myApps during the installation and restarts it for the currently logged in user, if it was running&lt;br /&gt;
&lt;br /&gt;
; DISABLELOCALHOST (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable use of &#039;&#039;&#039;localhost&#039;&#039;&#039; string to access the local webserver. Use &#039;&#039;&#039;127.0.0.1&#039;&#039;&#039; instead&lt;br /&gt;
&lt;br /&gt;
; EXCLUDEINTERFACES (REG_SZ): some VPN interfaces are not detected by Windows as IF_TYPE_PPP or IF_TYPE_TUNNEL and therefore the &#039;&#039;&#039;media outside VPN&#039;&#039;&#039; setting is not taking effect. With this option interfaces can be pre-defined that will not be used for media. Interfaces must be comma separated&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;EXCLUDEINTERFACES=&amp;quot;172,192.168,10.10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FASTERDOWNLOADS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to have faster downloads without artificially slowing down the download of an update (which is done to avoid audio lags if clients have slow networks).&lt;br /&gt;
&lt;br /&gt;
Current settings are stored in the registry at &amp;lt;code&amp;gt;Computer\HKEY_CURRENT_USER\Software\innovaphone\myApps&amp;lt;/code&amp;gt; or at &amp;lt;code&amp;gt;Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\innovaphone\myApps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Boolean values like OfficePresence are stored in registry entries with type REG_DWORD and values 1 or 0. 0 disables the setting and 1 enables it.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on iOS by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;App Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== macOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services might be installed directly from the Apple store. An installer package &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; and a disk image &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; is also available from the innovaphone app store. Install &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; by double-click on the file and follow the instructions of the installer. myApps becomes available in the Applications folder and can be opened by double-click. Or download and open &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; and double klick myApps. If desired integrate it into the app dock by right click, &#039;&#039;Options, Keep in the dock&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If installed from the innovaphone app store, myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
If installed from the Apple store, macOS notifies about updates on the Apple store. myApps [[#Auto update|Auto update]] is disabled then.&lt;br /&gt;
&lt;br /&gt;
If a clean-install of the client is necessary, the folder &amp;quot;/Users/username/Library/Containers/myapps&amp;quot; needs to be deleted. To be on the safe side also delete it from the trash bin.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Preferences ===&lt;br /&gt;
&lt;br /&gt;
macOS supports preference settings that can be set via a shell command or via Mac remote management&lt;br /&gt;
&lt;br /&gt;
 defaults write com.innovaphone.client-ios-14r1 server &amp;quot;PBX-server-URL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following parameters and can be set through this method:&lt;br /&gt;
&lt;br /&gt;
; server: the PBX&#039;s server URL&lt;br /&gt;
&lt;br /&gt;
=== Setting myApps as Default App for SIP-URLs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add &#039;{&lt;br /&gt;
   LSHandlerURLScheme = sip;&lt;br /&gt;
   LSHandlerRoleAll = &amp;quot;&amp;lt;CFBundleIdentifier&amp;gt;&amp;quot;;&lt;br /&gt;
}&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To find the “CFBundleIdentifier”, proceed as follows:&lt;br /&gt;
* In the Finder under “Applications”, search for the desired myApps client that you want to set as the default app.&lt;br /&gt;
* Right-click on “Show package contents” -&amp;gt; you will find the “CFBundleIdentifier” in the Info.plist file.&lt;br /&gt;
&lt;br /&gt;
A restart of the MAC is required.&lt;br /&gt;
&lt;br /&gt;
=== Using Sennheiser headsets ===&lt;br /&gt;
If you use Sennheiser headsets, you should also install the then-current &amp;lt;code&amp;gt;DSEA_SDK_v&amp;lt;/code&amp;gt;&#039;&#039;version&#039;&#039;&amp;lt;code&amp;gt;.pkg&amp;lt;/code&amp;gt; package, after you installed the myApps client.  Without that, audio will still work, but not the controls on the headset.  You will need to keep that up-to-date yourself, as it is not updated by myApps&#039;s auto-update function.&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Android by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;Play Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying a property &amp;quot;server&amp;quot; with string value &amp;quot;pbx.example.com&amp;quot; in the MDM.&lt;br /&gt;
&lt;br /&gt;
== IP270 ==&lt;br /&gt;
For configuration instructions, refer to the [[Reference16r1:Concept IP270|IP270 concept article]].&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
When opening myApps for the first time, the user is prompted for the Server. Usually only the hostname (DNS host name or IP address) needs to be configured.&lt;br /&gt;
&lt;br /&gt;
But there are more options for special PBX configurations.&lt;br /&gt;
&lt;br /&gt;
; Non-standard HTTPS port&lt;br /&gt;
: If the PBX uses a non-standard HTTPS port, it must be appended to the host name separated by a colon (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com:4444&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com:4444/PBX0/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; DynPBX module name&lt;br /&gt;
: If the PBX is a DynPBX, the module id must be appended to PBX0 separated - (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com/PBX0-1&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0-1/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; Softphone physical location&lt;br /&gt;
: If user defined physical location shall be used for softphone, you can append it using a parameter &amp;lt;code&amp;gt;#phys=&amp;lt;/code&amp;gt;.&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com#phys=slave&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0/APPCLIENT/appclient.htm#phys=slave&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Example 1: PBX pbx.example.com with standard configuration&lt;br /&gt;
 pbx.example.com&lt;br /&gt;
&lt;br /&gt;
Example 2: PBX slave.example with DynPBX module ID 1, HTTPS port 4444 and physical location master&lt;br /&gt;
 slave.example.com:4444/PBX0-1#phys=master&lt;br /&gt;
&lt;br /&gt;
=== HTTP proxy support ===&lt;br /&gt;
&lt;br /&gt;
myApps platform services do support operation via HTTP proxy now. If one or more proxies have been configured in the network settings of the operating system for the active network connection, HTTP CONNECT tunnels are established.&lt;br /&gt;
&lt;br /&gt;
On Windows user name and password can be specified for the tunnel servers as generic credentials in the credentials manager (Anmeldeinformationsverwaltung). The name of the credentials must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
On Android user name and password can be specified through Android &#039;&#039;Settings, Accounts&#039;&#039; by adding a myApps &#039;&#039;HTTP Proxy Credentials&#039;&#039; account. The name of the account must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
== Platform specific settings ==&lt;br /&gt;
When myApps runs under the myApps platform services, it will show various platform specific settings as part of its &#039;&#039;burger menu&#039;&#039;, so the user can set them.  See &#039;&#039;Advanced settings&#039;&#039; in [[#UI elements|UI elements]] above.&lt;br /&gt;
&lt;br /&gt;
Some options can also be set globally for all myApps clients in the PBX&#039;s [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps &#039;&#039;Client Settings&#039;&#039;]]&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Option&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Where to set&lt;br /&gt;
&lt;br /&gt;
!&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || User menu || PBX &#039;&#039;Client Settings&#039;&#039; || Windows || iOS || Android || macOS&lt;br /&gt;
|IP270&amp;lt;ref&amp;gt;myApps-IP270 offers device specific settings explained in [[Reference16r1:Concept IP270|IP270 concept article]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Autostart || Launch myApps on login || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Appear offline after || controls after which idle time a user is considered &#039;&#039;inactive&#039;&#039;. See [[#User activity|User activity]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Hotkeys || Hotkeys for call dial, accept, reject. See [[#Hot keys|Hot keys]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Docking || Docking mode (left, right, none). See [[#???|??]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Desktop notifications|| Turn on/off platform notifications. See [[#Notifications|  Notifications]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| VPN || Disable VPN address for ICE candidate selection. See [[#RTP ports| RTP ports]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Show in taskbar|| Show myApps in the taskbar in addition to it&#039;s tray icon.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Log flags || turn on/off certain trace levels. See [[#Troubleshooting|Troubleshooting]] below.  || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| External applications || define the applications available for Apps to be started. See [[#Call an external application for calls|Call an external application for calls]] above.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Ring in headset || send ring tone for incoming to headset instead of loudspeaker.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|&amp;amp;#10007;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Start parameters for Windows ==&lt;br /&gt;
&lt;br /&gt;
On Windows, it is not possible to pass start parameters from the [https://www.chromium.org/developers Chromium documentation] to the myApps process.&lt;br /&gt;
&lt;br /&gt;
== OS Settings for Windows ==&lt;br /&gt;
Windows settings can influence the display of &#039;&#039;Desktop notifications&#039;&#039;. See [https://support.microsoft.com/en-us/help/4028678/windows-10-change-notification-settings Change notification settings in Windows 10/11] for details.&lt;br /&gt;
&lt;br /&gt;
=== Windows 11 ===&lt;br /&gt;
&lt;br /&gt;
* Windows 11 has a feature &amp;quot;do not disturb&amp;quot;. This hides notifications if enabled.&lt;br /&gt;
* Windows 11 has a feature &amp;quot;focus&amp;quot;. This enables &amp;quot;do not disturb&amp;quot; and thus hides notifications too.&lt;br /&gt;
* Windows 11 has priority settings for notifications. Ensure that VoIP notifications for calls are allowed any maybe also include myApps as an App which is allowed to show notifications.&lt;br /&gt;
&lt;br /&gt;
== OS settings for Android ==&lt;br /&gt;
; Events : The appearance of notifications can be controlled here.&lt;br /&gt;
&lt;br /&gt;
; Call accounts : For proper incoming call signaling, the call account &#039;&#039;myApps&#039;&#039; needs to be enabled. Note that on Samsung smartphones the call account switch likely toggles back and a few tries may need to be done until it persists. Please double-check the state.&lt;br /&gt;
&lt;br /&gt;
; Preferred Calling Account : Choose which calling account (myApps/SIM/..) should be used for outgoing calls initiated from within the native phone app / phone book.&lt;br /&gt;
&lt;br /&gt;
; Background data, unlimited data usage : Grant background data use to enable &#039;&#039;myApps&#039;&#039; to connect to the PBX immediately on an incoming call.&lt;br /&gt;
&lt;br /&gt;
; Overlaying : This setting is not needed if call account &#039;&#039;myApps&#039;&#039; has been enabled. Should there be a reason for not enabling call account &#039;&#039;myApps&#039;&#039;, the permission for overlaying needs to be granted on Android 10 or higher for proper call signaling.&lt;br /&gt;
&lt;br /&gt;
Note: If no SIM card is installed some Android smartphones exhibit a problem dialing from the smartphone contacts. The contacts app shows a choice &#039;&#039;Select SIM card for this call&#039;&#039; but all possible dialers are greyed out. In this case make myApps the default phone app in Android settings &#039;&#039;Apps, Default apps, Telephony&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for iOS ==&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in iOS &#039;&#039;Settings, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for macOS ==&lt;br /&gt;
&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in macOS &#039;&#039;Preferences, Notifications, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
myApps platform services can write various traces for debugging.  Trace can be turned on and off selectively in the [[#Advanced settings|Advanced settings]].&lt;br /&gt;
&lt;br /&gt;
The following trace flags can be set:&lt;br /&gt;
&lt;br /&gt;
(&#039;&#039;Recommended trace options are: &#039;&#039;&#039;App, Browser, ICE, TURN, Signaling and Audio&#039;&#039;&#039;. Please do not activate other flags unless innovaphone support says otherwise&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |  Abbreviation&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |code&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| App||0x000000001|| logs from the App Service itself&lt;br /&gt;
|-&lt;br /&gt;
| DNS||0x000000008|| logs DNS requests and results&lt;br /&gt;
|-&lt;br /&gt;
| HTTP client||0x000000080|| http client logs&lt;br /&gt;
|-&lt;br /&gt;
| TLS||0x000000400|| TLS logs&lt;br /&gt;
|-&lt;br /&gt;
| TCP||0x000000800|| TCP logs&lt;br /&gt;
|-&lt;br /&gt;
| LDS||0x000001000|| local domain sockets&lt;br /&gt;
|-&lt;br /&gt;
| WebSocket client||0x000004000|| logs outgoing websocket connections&lt;br /&gt;
|-&lt;br /&gt;
| App WebSocket||0x000008000|| logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
|-&lt;br /&gt;
| UDP||0x000200000|| UDP logs&lt;br /&gt;
|-&lt;br /&gt;
| DTLS||0x000400000|| logs DTLS handshake and messages&lt;br /&gt;
|-&lt;br /&gt;
| Media||0x000800000|| logs media events&lt;br /&gt;
|-&lt;br /&gt;
| Media channel||0x001000000|| logs RTP/SCTP media connections&lt;br /&gt;
|-&lt;br /&gt;
| ICE||0x002000000|| logs ICE messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| TURN||0x004000000|| logs TURN messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| AppSharing||0x008000000|| logs AppSharing connection&lt;br /&gt;
|-&lt;br /&gt;
| Audio||0x010000000|| logs Audio connection and headset events&lt;br /&gt;
|-&lt;br /&gt;
| Video||0x020000000|| logs video connection and webcam events&lt;br /&gt;
|-&lt;br /&gt;
| Browser||0x040000000|| logs Chromium events&lt;br /&gt;
|-&lt;br /&gt;
| AppProxy||0x080000000|| logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
|-&lt;br /&gt;
| Webserver ||0x200000000|| enables webserver specific logs&lt;br /&gt;
|-&lt;br /&gt;
| Browser Console ||0x400000000|| logs browser console events&lt;br /&gt;
|-&lt;br /&gt;
| Signaling||0x800000000|| enables logs in the signaling module for debugging calls&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;code&#039;&#039; can be or&#039;ed and used as value for the &#039;&#039;Log flags&#039;&#039; field in [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps/Client Settings]].&lt;br /&gt;
&lt;br /&gt;
; Windows :On Windows, traces are written to the &amp;lt;code&amp;gt;%LOCALAPPDATA%\innovaphone\myApps&amp;lt;/code&amp;gt; directory. If you start myApps with --log-size as parameter, you can define the maximum size of a log file (e.g. --log-size=100000000 would be 100MB for each file)&lt;br /&gt;
&lt;br /&gt;
:* myApps-&#039;&#039;date-time&#039;&#039;.txt : main log file for the platform services&lt;br /&gt;
&lt;br /&gt;
:* myAppsOutlookSearch-&#039;&#039;date-time&#039;&#039;.txt : log file for the Outlook phone book access&lt;br /&gt;
&lt;br /&gt;
:* myAppsHookController-&#039;&#039;date-time&#039;&#039;.txt : log file for the hot-key interceptor (see [[#Hot keys|Hot keys]])&lt;br /&gt;
&lt;br /&gt;
; :myApps update installation traces are written to the &amp;lt;code&amp;gt;%windir%\temp\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsInstall.txt: MSI installation file&lt;br /&gt;
&lt;br /&gt;
; :myApps update service traces are written to the &amp;lt;code&amp;gt;%ProgramData%\innovaphone\myAppsUpdateService&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsUpdateService-&#039;&#039;date-time&#039;&#039;.txt: myApps update service traces&lt;br /&gt;
&lt;br /&gt;
;Android : traces can be sent by e-mail.&lt;br /&gt;
: also, an Android device might also be connected to a PC via an USB cable to get the traces. The files can be found in &amp;lt;code&amp;gt;Android/data/com.innovaphone.clientandroid/files&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
; macOS : traces can be sent by e-mail.&lt;br /&gt;
: also, the files can be found in &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-ios/Data/Documents/&amp;lt;/code&amp;gt;. Press &#039;&#039;Alt+N&#039;&#039; followed by space to get tilde &#039;&#039;~&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; IP270 : Refer to the [[Reference16r1:Concept IP270#Troubleshooting|IP270 concept article section troubleshooting]].&lt;br /&gt;
&lt;br /&gt;
= Known Problems =&lt;br /&gt;
[[:Category:Problem myApps platform services|Known Problems]]&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Redundancy|Concept myApps Redundancy]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Office_Integration|Concept myApps Office Integration]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myAPPs_Search_in_local-Outlook_Contacts|Concept myAPPs Search in local Outlook Contacts]]&lt;br /&gt;
* [[{{NAMESPACE}}:Call_Detail_Record_CDR_PBX|Call Detail Records]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept Push Notifications for myPBX iOS and Android|Concept Push Notifications for myPBX iOS and Android]]&lt;br /&gt;
* [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reference16r1:PBX/Config/myApps]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_IP270|IP270 concept article]]&lt;br /&gt;
[[Category:Concept myApps platform services]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_myApps_platform_services&amp;diff=79262</id>
		<title>Reference15r1:Concept myApps platform services</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_myApps_platform_services&amp;diff=79262"/>
		<updated>2026-03-26T08:12:39Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* MSI Parameters and install options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|myApps]]&lt;br /&gt;
&lt;br /&gt;
myApps platform services provide various operating system specific services which can be used by other &#039;&#039;Apps&#039;&#039; running in the [[{{NAMESPACE}}:Concept myApps|myApps client]]. Those services typically are not available in the browser&#039;s JavaScript environment and hence must be implemented in native platform code. Therefore, the platform services are installed as native executable on the respective platform.&lt;br /&gt;
&lt;br /&gt;
When myApps is started in a web browser (and hence has no access to the platform services), some Apps will use [https://en.wikipedia.org/wiki/WebRTC WebRTC] services implemented by the browser instead.  For ease of reference, features available in this scenario are also described here.&lt;br /&gt;
&lt;br /&gt;
On windows, the platform services also come with their own web browser in which the myApps web App will be started then.  This browser is based on google&#039;s [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium] open source software.&lt;br /&gt;
= Applies To =&lt;br /&gt;
&lt;br /&gt;
* [[{{NAMESPACE}}:Concept myApps|myApps]]&lt;br /&gt;
* myApps for Windows&lt;br /&gt;
* myApps for macOS&lt;br /&gt;
* myApps for iOS&lt;br /&gt;
* myApps for Android&lt;br /&gt;
&lt;br /&gt;
* myApps Web App (WebRTC)&lt;br /&gt;
version 14r2&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
Not all features are available or required on all platforms.&lt;br /&gt;
 {|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Feature&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || Windows || iOS || Android || macOS || Browser&amp;lt;ref&amp;gt;This refers to the myApps web application running in a browser with no platform services available&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| audio || manage local audio devices to record and playback audio conversations || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (audio available but devices managed by web browser)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| video || manage local displays and cameras to capture and render video live stream || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (video available but devices managed by web browser)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| ringer || manage local ringing device || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| application sharing&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;amp;nbsp; presenter || share an application || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;amp;nbsp; consumer  || view an application shared by the peer || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| hot keys || capture key presses for quick invocation of phone apps (e.g. dial selected number) || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| tel: and sip: URI handler || intercept clicks on tel: and sip: links in web sites to invoke phone apps || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| user activity || set presence state according to user activity ||  &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;limited, see [[#User activity|User activity]] below&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| docking || myApps can be docked persistently to the right or left edge of your screens ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| multi-windowing|| Apps can be launched in separate windows||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| recording|| Calls can be recorded to recording app||  &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| notifications || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; display notifications || display notifications with OS standard mechanism ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; push notifications || receive push notifications while myApps is not running  ||  &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The browser needs to be running in order to receive push notifications.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; chat and apps || display notifications for chat and other apps  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; calls || display notifications for incoming calls  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&amp;lt;ref&amp;gt;Call notifications are only displayed locally while the phone or softphone app is started.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| phone book access || access local phone book ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| office presence provider || maps PBX presence state to Microsoft office presence state ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| external application start || start arbitrary external applications for calls || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| app proxy|| a caching proxy that provides app persistence  || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| auto update || automatically updates myApps platform services to the same version the PBX has || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The then-current web app is always loaded from the PBX upon startup and hence up-to-date by definition&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| three party conference || initiate 3-pty-conference using Softphone-App || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| exclude VPN || disable use of VPN connections for audio and appsharing || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
* innovaphone PBX 14r2 and up&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Recommended hardware requirements&lt;br /&gt;
* Processor: Dual-core 2Ghz or higher&lt;br /&gt;
* RAM: 4 Gb&lt;br /&gt;
&lt;br /&gt;
== myApps for Windows ==&lt;br /&gt;
* Windows 10 and up&lt;br /&gt;
* Windows Server 2016 and later versions&lt;br /&gt;
&lt;br /&gt;
=== 32 &amp;amp; 64 bit Windows ===&lt;br /&gt;
* 32 bit Windows: install the myAppsSetup32.msi from the App Store&lt;br /&gt;
* 64 bit Windows: install the myAppsSetup.msi from the App Store&lt;br /&gt;
** the 64 bit variant still installs into Program Files (x86), as the main myApps.exe is still a 32bit application&lt;br /&gt;
** the 64 bit variant just contains an additional 64 bit binary for the outlook search&lt;br /&gt;
&lt;br /&gt;
=== Windows N editions ===&lt;br /&gt;
&lt;br /&gt;
Windows N editions are missing the &#039;&#039;Media Feature Pack&#039;&#039; which is pre installed on other Windows versions.&lt;br /&gt;
&lt;br /&gt;
Please install the pack from [https://www.microsoft.com/en-us/software-download/mediafeaturepack Microsoft (Windows 10 pack)] before you install myApps. The installer will check if the file &amp;lt;code&amp;gt;C:\Windows\SysWOW64\mfplat.dll&amp;lt;/code&amp;gt; exist on your system.&lt;br /&gt;
&lt;br /&gt;
Make sure to install the correct pack depending on your Windows version! There are different packs for Windows 10 1703, 1803, 1809 and 32bit or 64bit etc.&lt;br /&gt;
&lt;br /&gt;
NB: Sometimes the myApps installation will not work even though the media pack is already installed. This is because the installer has no read access to check if the package is already installed. If the above-mentioned file exists and the installer asks to install the Windows Media Feature Pack nevertheless, you have to start the myApps install with administrative rights.&lt;br /&gt;
&lt;br /&gt;
=== Terminal Server environments ===&lt;br /&gt;
&lt;br /&gt;
Audio driver was removed if myApps discovers that it is running in a terminal server environment like Citrix.&lt;br /&gt;
&lt;br /&gt;
The audio driver is needed for the Softphone App but the Softphone App should not use an audio driver at the server side because the audio devices are plugged locally and there would be a delay sending and receiving audio data with the server.&lt;br /&gt;
&lt;br /&gt;
If a customer wants to use the Softphone App at the server side he needs to make use of the myApps Plugin for virtual desktops solution:&lt;br /&gt;
&lt;br /&gt;
[[{{NAMESPACE}}:MyApps_Plugin_for_Virtual_Desktops|Reference15r1:MyApps_Plugin_for_Virtual_Desktops]]&lt;br /&gt;
&lt;br /&gt;
== myApps for macOS ==&lt;br /&gt;
* macOS 10.13 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for iOS ==&lt;br /&gt;
* iOS 12 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for Android ==&lt;br /&gt;
* Android 6.0 or higher. Android 6.x may need an update of the Chrome browser.&lt;br /&gt;
&lt;br /&gt;
= Licenses =&lt;br /&gt;
* No license needed for myApps platform services&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
myApps platform services is a native executable that is installed using the standard mechanisms on the respective operating system. It provides various advanced services which can be used by the myApps web client code as well as the Apps running in the myApps context. &lt;br /&gt;
&lt;br /&gt;
Also, on Windows, the platform services come with their own, dedicated browser to run myApps in.  This browser is based on [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium].  On iOS, macOS and Android, it is based upon native embedded web view facilities (such as WKWebView) instead.&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
=== RTP service for audio and appsharing ===&lt;br /&gt;
The RTP service provides audio and appsharing as a video stream. VoIP RTP endpoints (e.g. for softphones).  It supports STUN, TURN, ICE, SRTP, DTLS. Note however that unlike WebRTC, these endpoints do not &#039;&#039;require&#039;&#039; ICE and DTLS. In other words, they can communicate also with non-compliant (i.e. older) VoIP devices.&lt;br /&gt;
&lt;br /&gt;
Note that the available capabilities when not running the myApps platform services depend on the used browser&#039;s WebRTC implementation. See your browser documentation for details.&lt;br /&gt;
&lt;br /&gt;
Apps can request RTP channels using the [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol]&#039;s &#039;&#039;AllocChannel&#039;&#039; message.&lt;br /&gt;
&lt;br /&gt;
===== RTP ports=====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|  audio || 50000 -&amp;gt; 50099&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| video (app sharing) || 50100 -&amp;gt; 50199&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The RTP service will enumerate all local interfaces and create local HOST candidates for ICE.  There is an option however to disregard VPN interfaces (more precisely such interfaces with type of &#039;&#039;IF_TYPE_PPP&#039;&#039; or &#039;&#039;IF_TYPE_TUNNEL&#039;&#039;).  This can eliminate quality issues when RTP data is transmitted through TCP based VPN tunnels.&lt;br /&gt;
&lt;br /&gt;
SRFLX and RELAY candidates are obtained using the STUN and TURN server configuration passed by the App (e.g the &#039;&#039;softphone&#039;&#039; App) as part of the &#039;&#039;AllocChannel&#039;&#039; request.&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;AllocChannel&amp;quot;,&amp;quot;channel&amp;quot;:&amp;quot;81429cba-396d-43de-8a76-ec020ba8796e&amp;quot;,&amp;quot;iceServers&amp;quot;:[{&amp;quot;urls&amp;quot;:&amp;quot;turn:myturn.domaincom:4077?transport=udp&amp;quot;,&amp;quot;username&amp;quot;:&amp;quot;turnuser&amp;quot;,&amp;quot;credential&amp;quot;:&amp;quot;pwd&amp;quot;,&amp;quot;credentialType&amp;quot;:&amp;quot;password&amp;quot;},{&amp;quot;urls&amp;quot;:&amp;quot;stun:mystun.domain.com:4077&amp;quot;}],&amp;quot;dn&amp;quot;:&amp;quot;Foo Bar&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;RemoteRtp&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;video&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Codecs =====&lt;br /&gt;
&lt;br /&gt;
The installed myApps launchers provide codecs that can be used by softphone apps for media streams. When running in a web browser the codecs depend on the browser version and operating system. See the documentation of your browser for details.&lt;br /&gt;
&lt;br /&gt;
The following codecs are supported:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align:left;width:100px;&amp;quot;|Codec&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Windows-Launcher&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Android&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|iOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|macOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Firefox (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Chrome (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Edge (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Safari (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Opera (Browser)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Audio&lt;br /&gt;
|-&lt;br /&gt;
|G711A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G711u&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G722&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G729&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729B&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729AB&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-NB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-WB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Video&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP8 VP8]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP9 VP9]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=H264 H264]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Application Sharing&lt;br /&gt;
|-&lt;br /&gt;
|Share&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|Watch&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;* small presentation only&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;** only for 1:1 calls, not for conferences&lt;br /&gt;
&lt;br /&gt;
===== Video capture =====&lt;br /&gt;
&lt;br /&gt;
The default resolution for video capture is 1920x1080 if available.  Otherwise, 1280x720, 640x480, 352x288 or 320x240 will be used.  The frame rate is 30 fps if available, otherwise 15 fps. The resulting average bandwidth could reach 1 Mbps.&lt;br /&gt;
&lt;br /&gt;
===== Application sharing =====&lt;br /&gt;
&lt;br /&gt;
Screen content will be transmitted as video stream by the presenter&lt;br /&gt;
&lt;br /&gt;
===== Device handling =====&lt;br /&gt;
&lt;br /&gt;
The RTP service enumerates microphones, loudspeaker, cameras and ringing devices and notifies apps when devices come and go. It is up to the apps using the devices to store preferences.&lt;br /&gt;
&lt;br /&gt;
The RTP service also enables some extended features (such as hook switch or volume control) for supported USB headsets or Bluetooth headsets connected to myApps.&lt;br /&gt;
The supported headset-SDKs determine which headset vendors are recommended to be used with the myApps softphone app. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this to work, the following vendor specific development kits are integrated in our myApps client. Be aware that the SDK are updated within our Service release :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SDK Vendor !! Supported OS !! SDK Version !! innovaphone Service Release&lt;br /&gt;
|-&lt;br /&gt;
| Jabra|| MacOS || 1.12.2.0 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 1.12.2.0 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Epos &#039;&#039;(formerly Sennheiser)&#039;&#039; || MacOS || 12.4.0.5478 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || n.a. - [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|to be installed separately]]|| 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Poly &#039;&#039;(formerly Plantronics)&#039;&#039; || MacOS || 3.25.53799.37131 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.25.53800.37131 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Yealink || MacOS || 3.1.1.20 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.1.1.20 || 14r1sr3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* It is possible to inhibit the start of the Sennheiser SDK (SenncomSDK.exe) using the &amp;lt;code&amp;gt;DISABLEHEADSETS&amp;lt;/code&amp;gt; directive of the installer (see [[#MSI Parameters and install options|  MSI parameters]]  below).&lt;br /&gt;
&lt;br /&gt;
* Starting with V13r3sr10, the Epos-SDK needs to be installed separately using the Epos Connect software to ensure full compatibility between current Epos headset models and native myApps-Windows client. For details [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|refer to this article]].&lt;br /&gt;
&amp;lt;!--Keywords: myapps softphone supported headsets sdk--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Ring tones =====&lt;br /&gt;
&lt;br /&gt;
Ring tones can be played. Apps can choose the tone from a pre-defined list of ring tones.&lt;br /&gt;
&lt;br /&gt;
On Windows, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;ringtones&amp;lt;/code&amp;gt; sub-directory of myApps&#039; roaming directory (which usually is in &amp;lt;code&amp;gt;%appdata%\innovaphone\myApps\ringtones&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
On Android, custom ring tones can be added to the system via Android settings.&lt;br /&gt;
&lt;br /&gt;
On iOS, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;Ringtones&amp;lt;/code&amp;gt; subdirectory of the myApps file share that is available in iTunes if the iPhone has been connected via USB.&lt;br /&gt;
&lt;br /&gt;
On macOS, custom ring tones can be uploaded as .mp3 files to &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-macos/Data/Documents/Ringtones&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Debugging =====&lt;br /&gt;
For extended debugging, turn on the &#039;&#039;Audio&#039;&#039;, &#039;&#039;Media&#039;&#039; and &#039;&#039;AppSharing&#039;&#039; traces in myApps.&lt;br /&gt;
&lt;br /&gt;
=== Hot keys ===&lt;br /&gt;
On Windows and macOS systems, myApps platform services can listen for hot keys and invoke certain functions. Invocation is done by sending API messages to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
The hot keys can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below. Any of the function keys F1 to F11 (optionally combined with up to two modifier keys &#039;&#039;alt&#039;&#039;, &#039;&#039;ctrl&#039;&#039;, &#039;&#039;shift&#039;&#039; or &#039;&#039;win&#039;&#039;) can be chosen for each function. If you do not want to start the call with &amp;quot;Hotkey+Enter&amp;quot; because you would have to wait for the focus, the hotkey can also be pressed twice and the number is dialled directly.&lt;br /&gt;
&lt;br /&gt;
; dial selected number : Initiates a call using the currently selected text as target.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;text&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;mt&amp;quot;:&amp;quot;PrepareCall&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;13&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; accept call : Accepts a currently alerting call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;ConnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;ConnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; reject/disconnect call : Rejects a currently alerting call or disconnects an active call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;DisconnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;DisconnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== URL Handler ===&lt;br /&gt;
&lt;br /&gt;
On Windows systems, two URI-handler are installed with the myApps platform services.  Windows will call up this URI handler when a user clicks on an appropriate link, for example in a web site.&lt;br /&gt;
&lt;br /&gt;
The handler will the send an API message to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
; tel URI : call a number, e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;num&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;num&amp;quot;:&amp;quot;4711&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; sip URI : call a SIP name, e.g. &amp;lt;code&amp;gt;sip:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; im URI : start chat with SIP name, e.g. &amp;lt;code&amp;gt;im:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;StartChat&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm &#039;&#039;com.innovaphone.chat&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.chat&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartChat&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On macOS systems myApps might be made the default application to handle tel URI e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt; via Apple FaceTime. Open the &amp;quot;FaceTime&amp;quot; menu &amp;quot;Settings...&amp;quot; and select myApps as &amp;quot;Default for phone calls&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On iOS &#039;&#039;tel&#039;&#039; URIs are always dialed via GSM. Therefore myApps iOS also reacts to URI schemes &#039;&#039;com.innovaphone.tel&#039;&#039;, &#039;&#039;com.innovaphone.sip&#039;&#039; and &#039;&#039;com.innovaphone.im&#039;&#039;, e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.tel:4711&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.sip:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.im:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== User activity ===&lt;br /&gt;
On Windows and macOS systems, the myApps platform services can monitor user keyboard/mouse activity and change the user&#039;s presence state after a certain amount of inactivity.  The timeout can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below.&lt;br /&gt;
&lt;br /&gt;
myApps will then send a [https://sdk.innovaphone.com/doc/appwebsocket/myApps.htm#SetUserActivity&#039;&#039;SetUserActivity&#039;&#039;] message to the PBX using the &#039;&#039;myApps&#039;&#039; protocol.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;SetUserActivity&amp;quot;,&amp;quot;inactive&amp;quot;:true}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will change the &#039;&#039;status&#039;&#039; property of the &#039;&#039;im:&#039;&#039; contact for the user&#039;s own presence and hence result in a presence update from the PBX to myApps&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;UpdateOwnPresence&amp;quot;,&amp;quot;presence&amp;quot;:[{...},{&amp;quot;contact&amp;quot;:&amp;quot;im:&amp;quot;,&amp;quot;activity&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;closed&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
The &#039;&#039;closed&#039;&#039; status is reflected in the grey status color when displaying a contact [[Image:myapps-inactive.png|myapps-inactive.png/|myapps-inactive.png/]].&lt;br /&gt;
&lt;br /&gt;
On iOS and Android, the state is set to &#039;&#039;inactive&#039;&#039; as soon as the App is brought to background.&lt;br /&gt;
When myApps platform services are not available (i.e. when running the web application in a browser solely) a limited user activity monitoring is available: the state is set to active when the web page is not used for more than 5 minutes.&lt;br /&gt;
&lt;br /&gt;
=== Recording ===&lt;br /&gt;
&lt;br /&gt;
The new launcher offers the possibility to record the audio of incoming and outgoing calls. In order to activate that functionality the URL of the recording instance must be configured in either the PBX (PBX-&amp;gt;myApps-&amp;gt;Config: Recording URL) or the softphone App (Settings-&amp;gt;Audio Recording (URL)) &lt;br /&gt;
&lt;br /&gt;
[[Image:PBX-Recording-Settings.png|pbx-recording-settings.png/|pbx-recording-settings.png/]] [[Image:Recording-Softphone-Settings.png|recording-softphone-settings.png/|recording-softphone-settings.png/]]. &lt;br /&gt;
&lt;br /&gt;
As long as that URL is configured the audio data of all calls are stored as pcap-files under that URL.&lt;br /&gt;
If the URL points to a CF device in the PBX, write access must be granted for that URL (PBX-&amp;gt;Services-&amp;gt;HTTP-&amp;gt;Server:Public compact flash access) and if the URL points to the recording app, the files can be accessed via the recording app [[{{NAMESPACE}}:Concept_App_Service_Recordings|recording]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under PBX-&amp;gt;myApps the administrator can set a certain default behaviour of the audio recording like whether or not the recording should start automatically at the beginning of the call (Recording by Default ON/OFF), only calls with external numbers should be recorded (Record external calls only) or whether or not the user should be able to start/stop the recording himself (Allow user incall recording control). Except for the last parameter these parameters can also be modified by the user in its softphone settings if the administrator doesn&#039;t set the FORCE flag.&lt;br /&gt;
&lt;br /&gt;
If the user was allowed by the admin to control the recording a recording switch is active during the call when the &amp;quot;Media&amp;quot; Panel is opened. There the audio recording may be stopped and continued at will. A red recording notice is shown in the top right corner when the recording actually takes place.&lt;br /&gt;
 &lt;br /&gt;
[[Image:Recording-incall-switch.png|recording-incall-switch.png/|recording-incall-switch.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services can use the OS specific notification mechanism (e.g. &#039;&#039;desktop notifications&#039;&#039; on Windows) to display messages (e.g. &#039;&#039;incoming new chat message&#039;&#039;) to the user.&lt;br /&gt;
&lt;br /&gt;
Note that the actual rendering of the notification is under control of the OS.  Therefore, myApps must be allowed to show notifications and its appearance can be restricted by OS native settings.&lt;br /&gt;
&lt;br /&gt;
==== Microsoft Windows Notifications ====&lt;br /&gt;
&lt;br /&gt;
Microsoft Windows Server editions (2016, 2019, 2022) are just capable of showing a single &#039;&#039;IncomingCall&#039;&#039; notification at the same time (we couldn&#039;t find a workaround for this limitation).&amp;lt;br/&amp;gt;&lt;br /&gt;
An &#039;&#039;IncomingCall&#039;&#039; notification is visible the whole time instead of being moved to the action center after a certain time.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
A notification about a missed call uses the &#039;&#039;IncomingCall&#039;&#039; type so that this notification is visible until the user returns.&amp;lt;br/&amp;gt;&lt;br /&gt;
Due to the above limitation, on a new arriving call such a missed call notification is transformed to a default notification which will be moved to the action center automatically.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On non server editions, you can have multiple IncomingCall notifications at the same time (so two parallel incoming calls will be indeed notified at the same time), but the missed call notification handling is the same on both platforms!&lt;br /&gt;
&lt;br /&gt;
 Thus there will be always just &#039;&#039;&#039;one&#039;&#039;&#039; missed call notification visible and previous missed calls can be found inside your action center!&lt;br /&gt;
&lt;br /&gt;
To see myApps notifications, ensure:&lt;br /&gt;
* System -&amp;gt; Notifications &lt;br /&gt;
** enable notifications&lt;br /&gt;
** disable &amp;quot;Do not disturb&amp;quot; or allow myApps as priority application while &amp;quot;Do not disturb&amp;quot; is active&lt;br /&gt;
** enable notifications for myApps in the list of applications&lt;br /&gt;
* System -&amp;gt; Focus &lt;br /&gt;
** if a focus session is active and the &amp;quot;Do not disturb&amp;quot; is activated during a focus session, make sure that myApps is a priority application (see above)&lt;br /&gt;
&lt;br /&gt;
==== macOS Notifications ====&lt;br /&gt;
Notifications are the same as on Windows.&lt;br /&gt;
The difference is, that for macOS, notifications need to be allowed in the system settings.&lt;br /&gt;
Go to Notifications - myApps, select Banner and enable all check marks.&lt;br /&gt;
&lt;br /&gt;
=== Local phonebook access ===&lt;br /&gt;
&#039;&#039;&#039;Contact Search:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm &#039;&#039;com.innovaphone.search&#039;&#039; API]]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Search&#039;&#039; request to the API:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;Search&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;search&amp;quot;:&amp;quot;john doe&amp;quot;},&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
Search results are delivered as &#039;&#039;SearchInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;SearchInfo&amp;quot;,&amp;quot;relevance&amp;quot;:2000,&amp;quot;adjust&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;contact&amp;quot;:{&amp;quot;givenname&amp;quot;:&amp;quot;John&amp;quot;,&amp;quot;sn&amp;quot;:&amp;quot;Doe&amp;quot;,&amp;quot;company&amp;quot;:&amp;quot;ACME&amp;quot;,&amp;quot;position&amp;quot;:&amp;quot;Head of everything&amp;quot;,&amp;quot;telephonenumber&amp;quot;:[&amp;quot;11111&amp;quot;,&amp;quot;22222&amp;quot;],&amp;quot;homephone&amp;quot;:[&amp;quot;+4944444&amp;quot;,&amp;quot;33333&amp;quot;],&amp;quot;mobile&amp;quot;:[&amp;quot;+49 (123) 55555&amp;quot;]}},&amp;quot;api&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reverse Lookup:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.phonelookup/lib1_api_phonelookup.htm &#039;&#039;com.innovaphone.phonelookup&#039;&#039; API]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Lookup&#039;&#039; request to the API: &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{ mt: &amp;quot;Lookup&amp;quot;, prefixIntl: &amp;quot;000&amp;quot;, prefixNtl: &amp;quot;00&amp;quot;, prefixExt:&amp;quot;0&amp;quot;, area: &amp;quot;7031&amp;quot;, country: &amp;quot;49&amp;quot;, lookup: &amp;quot;0004970311234567&amp;quot; },&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.lookup&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search results are delivered as &#039;&#039;LookupInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{mt: &amp;quot;LookupInfo&amp;quot;, dn: &amp;quot;Jake Blues&amp;quot;, contact: { telephonenumber: [&amp;quot;0004970311234567&amp;quot;], givenname: &amp;quot;Jake&amp;quot;, sn: &amp;quot;Blues&amp;quot;, company: &amp;quot;Blues Brothers&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
On Windows, the search and lookup are performed in all of the user&#039;s Outlook contact folders.  As opposed to the search implemented in the &#039;&#039;Contacts&#039;&#039; and &#039;&#039;Users&#039;&#039; App, all items are returned which match any of the search words (i.e. searching for &#039;&#039;a b&#039;&#039; will return items matching either &#039;&#039;a&#039;&#039; or &#039;&#039;b&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
; searched properties : firstname, lastname&lt;br /&gt;
; returned properties : Following Outlook contact phone number properties are returned  (if available):&lt;br /&gt;
&lt;br /&gt;
:* OFFICE_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* OFFICE2_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* HOME_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* HOME2_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* MOBILE_TELEPHONE_NUMBER as &#039;&#039;mobile&#039;&#039;&lt;br /&gt;
:* BUSINESS_FAX_NUMBER as &#039;&#039;facsimiletelephonenumber&#039;&#039;&lt;br /&gt;
Note that contact information is cached in the search provider.  Updated contacts may therefore become effective after a while only.&lt;br /&gt;
Outlook search will create its own trace file &amp;lt;code&amp;gt;myAppsOutlookSearch-&amp;lt;/code&amp;gt;&#039;&#039;date-time&#039;&#039;&amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; in the standard trace directory.&lt;br /&gt;
&lt;br /&gt;
This search provider is always installed and can be disabled.  There is no need (nor possibility) to enable it in the &#039;&#039;Apps&#039;&#039; tab of the PBX&#039;s user object.  Also, no &#039;&#039;App&#039;&#039; object needs to be created for it.&lt;br /&gt;
&lt;br /&gt;
==== Android/iOS ====&lt;br /&gt;
The search and lookup are performed in the contacts.&lt;br /&gt;
&lt;br /&gt;
==== macOS ====&lt;br /&gt;
The search and lookup are performed in the contacts. If you wish to disable local contact lookup, go to system settings - Security &amp;amp; Privacy and disable the access to contacts for myapps.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft Office integration ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services has a &#039;&#039;office presence provider&#039;&#039; that can provide the user&#039;s presence state to Office applications.  See [[{{NAMESPACE}}:Concept_myApps_Office_Integration|myApps Office Integration]] for details.&lt;br /&gt;
&lt;br /&gt;
This feature is installed by default.  However, it can be disabled using the &#039;&#039;OFFICEPRESENCE&#039;&#039; MSI Parameter.  Also, a check-mark is available in the setup dialog.&lt;br /&gt;
&lt;br /&gt;
=== Call an external application for calls ===&lt;br /&gt;
&lt;br /&gt;
Phone Apps (such as the phoneapp or softphone) can initiate the start of an external application when a new call appears (either incoming or outgoing).  The actual spawning of the application is done by the myApps platform service.  Also, the application properties (such as e.g. the executable&#039;s path) is configured in the myApps platform services (see [[#UI elements|Advanced settings]] in the &#039;&#039;UI elements&#039;&#039; section below).&lt;br /&gt;
&lt;br /&gt;
A number of arguments can be passed to the application by substituting $-variables in the &#039;&#039;Parameter&#039;&#039; field:&lt;br /&gt;
&lt;br /&gt;
; $n : phone number as dialed (called party number for outgoing calls) or received (calling party number for incoming calls)&lt;br /&gt;
&lt;br /&gt;
; $N : called or calling party number in &#039;&#039;national&#039;&#039; format (e.g. 07031730090)&lt;br /&gt;
&lt;br /&gt;
; $I : called or calling party number in &#039;&#039;international&#039;&#039; format (e.g. +497031730090)&lt;br /&gt;
&lt;br /&gt;
: note that both $N and $I only work if $n includes both subscriber number and area code (e.g. 07031730090). Otherwise they are equal to $n&lt;br /&gt;
&lt;br /&gt;
; $d : display name of peer (if known)&lt;br /&gt;
&lt;br /&gt;
; $u : URI name of the peer (if available eg with a federation call)&lt;br /&gt;
&lt;br /&gt;
; $c : conference id&lt;br /&gt;
&lt;br /&gt;
: this is a globally unique ID for this call and may be used to relate the call to the &#039;&#039;guid&#039;&#039; found in the CallInfo structure in the [http://wiki.innovaphone.com/index.php?title=Reference10:SOAP_API#CallInfo SOAP-API] and [http://sdk.innovaphone.com/doc/appwebsocket/RCC.htm RCC-API ].  Also, corresponding [[Reference10:Call Detail Record CDR PBX|CDRs]] can be related using the &#039;&#039;event&#039;&#039; tag&#039;s &#039;&#039;conf&#039;&#039; attribute.&lt;br /&gt;
The start of an external application can be requested using the &#039;&#039;com.innovaphone.externalapps&#039;&#039; API.&lt;br /&gt;
&lt;br /&gt;
Some setup examples are [[Howto:Integrate External Apps in innovaphone UC clients|shown here]].&lt;br /&gt;
&lt;br /&gt;
=== Push ===&lt;br /&gt;
&lt;br /&gt;
Mobile operating systems usually inhibit network operation of apps which run in the background or are closed by the user.  This is done in order to reduce battery consumption.  Unfortunately, this also stops such apps to maintain a registration by regularly sending &#039;&#039;keep alive&#039;&#039; messages to a server (in our case to the PBX).  As a result, myApps will be disconnected from the PBX.   When the PBX determines that there is an event for the application which needs a response, it needs to wake up the app using a dedicated channel provided by the operating system.  This mechanism is know as &#039;&#039;push&#039;&#039;. When running on iOS or Android, myApps supports &#039;&#039;push&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;push&#039;&#039; to work, a [[{{NAMESPACE}}:PBX/Objects/Push|&#039;&#039;push object&#039;&#039;]] needs to be configured in the PBX .  Also, it needs to be enabled on the mobile phone for the myApps app.&lt;br /&gt;
This mechanism is quite similar in v12 and v13, so you can refer to [[{{NAMESPACE}}:Concept_Push_Notifications_for_iOS_and_Android|Reference14r2:Concept_Push_Notifications_for_iOS_and_Android]] for more details. &lt;br /&gt;
&lt;br /&gt;
Also, helpful hints can be found in [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]].&lt;br /&gt;
&lt;br /&gt;
=== App Proxy ===&lt;br /&gt;
&lt;br /&gt;
myApps runs further &#039;&#039;Apps&#039;&#039; (such as e.g. the &#039;&#039;phoneapp&#039;&#039;) as a web page in an IFRAME of the browser myApps is running in.  The App&#039;s page code is loaded either from the PBX or from an &#039;&#039;application platform&#039;&#039; (AP).   This however would mean that the App&#039;s IFRAME would remain empty (a dead white screen) when the PBX or AP is not available. To make sure the App can start-up anyway, the myApps platform services feature the so-called &#039;&#039;App Proxy&#039;&#039;.  This is a caching proxy that caches all the App code so it is available even in case of network failure. When myApps runs in the context of the platform services, Apps are therefore not loaded from the App source directly, but from the local App proxy. &lt;br /&gt;
&lt;br /&gt;
The cached files are stored in the PCs local file system in the &amp;lt;code&amp;gt;%LOCALAPPDATA%\innovaphone\myApps\appproxy&amp;lt;/path&amp;gt;&amp;lt;/code&amp;gt;.  There is no configuration required.  However, if myApps seems to run with outdated or corrupt cached copies of the App, you can safely delete the entire directory.&lt;br /&gt;
&lt;br /&gt;
=== Auto update ===&lt;br /&gt;
&lt;br /&gt;
On Windows and on macOS, the myApps platform services can auto-update themselves to a common version.  This is controlled by the [[{{NAMESPACE}}:PBX/Config/myApps#Launcher_Software_Update | &#039;&#039;Launcher Software Update&#039;&#039;]] settings under &#039;&#039;PBX/Config/myApps&#039;&#039; in the PBX. &lt;br /&gt;
&lt;br /&gt;
When myApps is started or the user logs in or myApps needs to re-connect to the PBX, the platform services will use the [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client API] to learn the desired version (&#039;&#039;launcherUpdateBuild&#039;&#039;, which is part of the API&#039;s &#039;&#039;model&#039;&#039;). If this differs from the current version, the platform services will try to download the respective new version. &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;mt&amp;quot;: &amp;quot;ApiUpdate&amp;quot;,&lt;br /&gt;
    &amp;quot;apis&amp;quot;: {&lt;br /&gt;
        &amp;quot;com.innovaphone.client&amp;quot;: {&lt;br /&gt;
            &amp;quot;@client&amp;quot;: {&lt;br /&gt;
                &amp;quot;title&amp;quot;: &amp;quot;innovaphone myApps&amp;quot;,&lt;br /&gt;
                &amp;quot;model&amp;quot;: {&lt;br /&gt;
                    &amp;quot;launcher&amp;quot;: true,&lt;br /&gt;
                    &amp;quot;launcherUpdateBuild&amp;quot;: &amp;quot;134906&amp;quot;,&lt;br /&gt;
                    &amp;quot;appStoreUrl&amp;quot;: &amp;quot;http://store.innovaphone.com/release/download/&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The installation of the downloaded version is done by the &#039;&#039;innovaphonemyAppsUpdateService&#039;&#039;. This service is installed and enabled during the initial installation of the myApps platform services.  To disable auto-update, either leave the &#039;&#039;Launcher Software Update&#039;&#039; settings empty or set the service&#039;s start mode to &#039;&#039;disabled&#039;&#039; in the Windows &#039;&#039;services control panel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that on Windows the update service does not work on terminal servers. Administrators must do myApps base services updates using standard windows mechanisms.&lt;br /&gt;
&lt;br /&gt;
Note that on macOS if myApps has been installed from the Apple Store it is assumed that auto update from the PBX is not desired and disabled therefore.&lt;br /&gt;
&lt;br /&gt;
On Android/iOS/macOS updates can be downloaded from the respective app store.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Devices&#039;&#039; app can not update software installed on Windows PCs directly. However, when the PBX is updated using an &#039;&#039;update job&#039;&#039; in the &#039;&#039;Devices&#039;&#039; App, the &#039;&#039;Launcher Software Update&#039;&#039; settings will be updated accordingly and hence the myApps base services will ultimately also be updated to the same version.&lt;br /&gt;
&lt;br /&gt;
==== Auto update flow on Windows ====&lt;br /&gt;
&lt;br /&gt;
* On start of myApps, myApps checks if an update is available and ready for installation&lt;br /&gt;
** if yes, the update is installed directly, without user interaction (a popup is shown during the installation)&lt;br /&gt;
** if not, myApps starts&lt;br /&gt;
* if an update is available while myApps is already running, an update notification will be shown which let&#039;s the user choose to install the update now or later (the notification will then popup again after one hour)&lt;br /&gt;
&lt;br /&gt;
==UI elements ==&lt;br /&gt;
There are a few user interfaces provided by the platform services:&lt;br /&gt;
===tray-icon (Windows only) ===&lt;br /&gt;
::[[Image:myapps-tray.png|myapps-tray.png/|myapps-tray.png/]]&lt;br /&gt;
:Allows to&lt;br /&gt;
:* terminate myApps&lt;br /&gt;
:* toggle the &#039;&#039;autostart&#039;&#039; state&lt;br /&gt;
:* toggle the &#039;&#039;show in task bar&#039;&#039; state&lt;br /&gt;
:* open the trace folder&lt;br /&gt;
:&lt;br /&gt;
=== PBX connect form===&lt;br /&gt;
:: [[Image:myapps-connect.png|myapps-connect.png/|myapps-connect.png/]]&lt;br /&gt;
: Allows the user to specify the connect data for the PBX (i.e. IP address or DNS name)&lt;br /&gt;
:&lt;br /&gt;
=== Advanced settings===&lt;br /&gt;
::[[Image:myapps-settings0.png|myapps-settings0.png/|myapps-settings0.png/]]&lt;br /&gt;
::[[Image:myapps-settings.png|myapps-settings.png/|myapps-settings.png/]] [[Image:myapps-settings2.png|myapps-settings2.png/|myapps-settings2.png/]] [[Image:myapps-settings3.png|myapps-settings3.png/|myapps-settings3.png/]]&lt;br /&gt;
&lt;br /&gt;
: Allows to modify various platform dependant settings (such as e.g. the hotkey selection on Windows)&lt;br /&gt;
&lt;br /&gt;
== Interfaces ==&lt;br /&gt;
=== Provided APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm com.innovaphone.search] : access to local phone book entries by the [[#Local phonebook access|Local phonebook access]] component.&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.launcher/com.innovaphone.launcher.htm com.innovaphone.launcher] : display of OS specific user notifications and receipt of related user actions&lt;br /&gt;
; com.innovaphone.notificationhandler : reports back click on a notification.&lt;br /&gt;
; com.innovaphone.externalapps : to start external applications, see [[#Call an external application for calls|Call an external application for calls]]  above&lt;br /&gt;
&lt;br /&gt;
=== Used APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm com.innovaphone.phone] : used to initiate new or manipulate existing calls by the [[#Hot keys|Hot keys]] and [[#URL handler|URL handler]] components.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm com.innovaphone.chat] : used to start a new chat by the [[#URL handler|URL handler]] component.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client] : the model is used to learn the update settings, see [[#Auto update|Auto update]] above&lt;br /&gt;
&lt;br /&gt;
=== Protocols ===&lt;br /&gt;
&lt;br /&gt;
; [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol] : used by apps to allocate RTP channels, see [[#RTP service for audio.2C video and data|RTP service for audio, video and data]] above&lt;br /&gt;
&lt;br /&gt;
== Related App Services ==&lt;br /&gt;
&lt;br /&gt;
none&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
; Incoming call as banner on myApps for iOS : Since iOS 14 the iOS CallKit presents incoming calls as a banner leaving the original green answer button of myApps visible. Use only the blue button of the banner to accept the call or change iPhone Settings, App &amp;quot;Phone&amp;quot;, &amp;quot;Incoming Calls&amp;quot; to &amp;quot;Full Screen&amp;quot; to hide the myApps user interface again during call answering.&lt;br /&gt;
&lt;br /&gt;
; Call answer in speakerphone mode even with active Bluetooth headset on myApps for iOS : This causes unwanted speakerphone operation if the smartphone is used with a Bluetooth car audio system. The behaviour can be changed by selecting &#039;&#039;Bluetooth Headset&#039;&#039; in this setting:&lt;br /&gt;
:&#039;&#039;iOS Settings-&amp;gt;Accessibility-&amp;gt;Touch-&amp;gt;Call Audio Routing: Automatic / Bluetooth Headset / Speaker&#039;&#039;&lt;br /&gt;
:&#039;&#039;iOS Einstellungen-&amp;gt;Bedienungshilfen-&amp;gt;Tippen-&amp;gt;Anrufaudioausgabe: Automatisch / Bluetooth-Headset / Lautsprecher&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Windows Server 2016 (Windows 10 Build 1607) : windows just shows the first notification. Further notifications aren&#039;t displayed until the previous ones are removed from the notification center. Current windows builds do not show this behaviour anymore.&lt;br /&gt;
&lt;br /&gt;
; Problems on Mac computers with Yealink USB headsets&lt;br /&gt;
: we have received reports that myApps quits unexpectedly on some Mac computers when a Yealink headset is plugged in.  Unfortunately, we could not find out the cause yet.  If you use Yealink USB headsets and have a similar issue, please open a support ticket and send myApps traces.&lt;br /&gt;
&lt;br /&gt;
; Poly / Plantronics headset buttons only functional if myApps is started with Rosetta&lt;br /&gt;
: myApps macOS supports Apple M1/M2 hardware natively. However, the Poly / Plantronics headset SDK is only available for Intel platform and thus myApps needs to be started via Apple&#039;s Intel emulator Rosetta if a Poly / Plantronics headset is used. This is done with right-click on the myApps executable, &#039;&#039;Information&#039;&#039;, &#039;&#039;Open with Rosetta&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Windows surface devices may not work correctly&lt;br /&gt;
: Chromium does not get touch keyboard events. USB Keyboards may not be recognized either.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Windows using the .msi file found in the &#039;&#039;myApps Windows&#039;&#039; package from [https://store.innovaphone.com/release/download.htm store.innovaphone.com].&lt;br /&gt;
&lt;br /&gt;
myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
=== MSI Parameters and install options ===&lt;br /&gt;
&lt;br /&gt;
The MSI installer of myApps for Windows supports the following parameters and can be edited with [https://docs.microsoft.com/en-us/windows/win32/msi/orca-exe Microsoft Orca]. You can add your parameters in the table &#039;&#039;property&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; SERVER (REG_SZ): the PBX&#039;s server address (without protocol like https://)&lt;br /&gt;
; OFFICEPRESENCE (REG_DWORD): &#039;&#039;&#039;false&#039;&#039;&#039; to disable presence integration in Microsoft Office&lt;br /&gt;
: this is also available as a check-mark when running the install manually&lt;br /&gt;
&lt;br /&gt;
; DISABLEHEADSETS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable headsets support, see [[#Device handling|Device handling]] above&lt;br /&gt;
&lt;br /&gt;
; EXTERNALAPPS (REG_SZ): pre-define external applications, see [[#Call an external application for calls|Call an external application for calls]] above&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;&amp;quot;{&amp;quot;&amp;quot;externalApps&amp;quot;&amp;quot;:[{&amp;quot;&amp;quot;id&amp;quot;&amp;quot;:0,&amp;quot;&amp;quot;name&amp;quot;&amp;quot;:&amp;quot;&amp;quot;Wireshark&amp;quot;&amp;quot;,&amp;quot;&amp;quot;path&amp;quot;&amp;quot;:&amp;quot;&amp;quot;C:\\Program Files\\Wireshark\\Wireshark.exe&amp;quot;&amp;quot;,&amp;quot;&amp;quot;param&amp;quot;&amp;quot;:&amp;quot;&amp;quot;test $I&amp;quot;&amp;quot;}]}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FORCERESTART (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; (or any string ...) kills myApps during the installation and restarts it for the currently logged in user, if it was running&lt;br /&gt;
&lt;br /&gt;
; DISABLELOCALHOST (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable use of &#039;&#039;&#039;localhost&#039;&#039;&#039; string to access the local webserver. Use &#039;&#039;&#039;127.0.0.1&#039;&#039;&#039; instead&lt;br /&gt;
&lt;br /&gt;
; EXCLUDEINTERFACES (REG_SZ): some VPN interfaces are not detected by Windows as IF_TYPE_PPP or IF_TYPE_TUNNEL and therefore the &#039;&#039;&#039;media outside VPN&#039;&#039;&#039; setting is not taking effect. With this option interfaces can be pre-defined that will not be used for media. Interfaces must be comma separated&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;EXCLUDEINTERFACES=&amp;quot;172,192.168,10.10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FASTERDOWNLOADS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to have faster downloads without artificially slowing down the download of an update (which is done to avoid audio lags if clients have slow networks).&lt;br /&gt;
&lt;br /&gt;
Current settings are stored in the registry at &amp;lt;code&amp;gt;Computer\HKEY_CURRENT_USER\Software\innovaphone\myApps&amp;lt;/code&amp;gt; or at &amp;lt;code&amp;gt;Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\innovaphone\myApps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Boolean values like OfficePresence are stored in registry entries with type REG_DWORD and values 1 or 0. 0 disables the setting and 1 enables it.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on iOS by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;App Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== macOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services might be installed directly from the Apple store. An installer package &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; and a disk image &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; is also available from the innovaphone app store. Install &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; by double-click on the file and follow the instructions of the installer. myApps becomes available in the Applications folder and can be opened by double-click. Or download and open &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; and double klick myApps. If desired integrate it into the app dock by right click, &#039;&#039;Options, Keep in the dock&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If installed from the innovaphone app store, myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
If installed from the Apple store, macOS notifies about updates on the Apple store. myApps [[#Auto update|Auto update]] is disabled then.&lt;br /&gt;
&lt;br /&gt;
If a clean-install of the client is necessary, the folder &amp;quot;/Users/username/Library/Containers/myapps&amp;quot; needs to be deleted. To be on the safe side also delete it from the trash bin.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Preferences ===&lt;br /&gt;
&lt;br /&gt;
macOS supports preference settings that can be set via a shell command or via Mac remote management&lt;br /&gt;
&lt;br /&gt;
 defaults write com.innovaphone.client-ios-14r1 server &amp;quot;PBX-server-URL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following parameters and can be set through this method:&lt;br /&gt;
&lt;br /&gt;
; server: the PBX&#039;s server URL&lt;br /&gt;
&lt;br /&gt;
=== Setting myApps as Default App for SIP-URLs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add &#039;{&lt;br /&gt;
   LSHandlerURLScheme = sip;&lt;br /&gt;
   LSHandlerRoleAll = &amp;quot;&amp;lt;CFBundleIdentifier&amp;gt;&amp;quot;;&lt;br /&gt;
}&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To find the “CFBundleIdentifier”, proceed as follows:&lt;br /&gt;
* In the Finder under “Applications”, search for the desired myApps client that you want to set as the default app.&lt;br /&gt;
* Right-click on “Show package contents” -&amp;gt; you will find the “CFBundleIdentifier” in the Info.plist file.&lt;br /&gt;
&lt;br /&gt;
A restart of the MAC is required.&lt;br /&gt;
&lt;br /&gt;
=== Using Sennheiser headsets ===&lt;br /&gt;
If you use Sennheiser headsets, you should also install the then-current &amp;lt;code&amp;gt;DSEA_SDK_v&amp;lt;/code&amp;gt;&#039;&#039;version&#039;&#039;&amp;lt;code&amp;gt;.pkg&amp;lt;/code&amp;gt; package, after you installed the myApps client.  Without that, audio will still work, but not the controls on the headset.  You will need to keep that up-to-date yourself, as it is not updated by myApps&#039;s auto-update function.&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Android by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;Play Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying a property &amp;quot;server&amp;quot; with string value &amp;quot;pbx.example.com&amp;quot; in the MDM.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
When opening myApps for the first time, the user is prompted for the Server. Usually only the hostname (DNS host name or IP address) needs to be configured.&lt;br /&gt;
&lt;br /&gt;
But there are more options for special PBX configurations.&lt;br /&gt;
&lt;br /&gt;
; Non-standard HTTPS port&lt;br /&gt;
: If the PBX uses a non-standard HTTPS port, it must be appended to the host name separated by a colon (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com:4444&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com:4444/PBX0/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; DynPBX module name&lt;br /&gt;
: If the PBX is a DynPBX, the module id must be appended to PBX0 separated - (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com/PBX0-1&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0-1/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; Softphone physical location&lt;br /&gt;
: If user defined physical location shall be used for softphone, you can append it using a parameter &amp;lt;code&amp;gt;#phys=&amp;lt;/code&amp;gt;.&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com#phys=slave&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0/APPCLIENT/appclient.htm#phys=slave&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Example 1: PBX pbx.example.com with standard configuration&lt;br /&gt;
 pbx.example.com&lt;br /&gt;
&lt;br /&gt;
Example 2: PBX slave.example with DynPBX module ID 1, HTTPS port 4444 and physical location master&lt;br /&gt;
 slave.example.com:4444/PBX0-1#phys=master&lt;br /&gt;
&lt;br /&gt;
=== HTTP proxy support ===&lt;br /&gt;
&lt;br /&gt;
myApps platform services do support operation via HTTP proxy now. If one or more proxies have been configured in the network settings of the operating system for the active network connection, HTTP CONNECT tunnels are established.&lt;br /&gt;
&lt;br /&gt;
On Windows user name and password can be specified for the tunnel servers as generic credentials in the credentials manager (Anmeldeinformationsverwaltung). The name of the credentials must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
On Android user name and password can be specified through Android &#039;&#039;Settings, Accounts&#039;&#039; by adding a myApps &#039;&#039;HTTP Proxy Credentials&#039;&#039; account. The name of the account must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
== Platform specific settings ==&lt;br /&gt;
When myApps runs under the myApps platform services, it will show various platform specific settings as part of its &#039;&#039;burger menu&#039;&#039;, so the user can set them.  See &#039;&#039;Advanced settings&#039;&#039; in [[#UI elements|UI elements]] above.&lt;br /&gt;
&lt;br /&gt;
Some options can also be set globally for all myApps clients in the PBX&#039;s [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps &#039;&#039;Client Settings&#039;&#039;]]&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Option&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Where to set&lt;br /&gt;
&lt;br /&gt;
!&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || User menu || PBX &#039;&#039;Client Settings&#039;&#039; || Windows || iOS || Android || macOS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Autostart || Launch myApps on login || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Appear offline after || controls after which idle time a user is considered &#039;&#039;inactive&#039;&#039;. See [[#User activity|User activity]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Hotkeys || Hotkeys for call dial, accept, reject. See [[#Hot keys|Hot keys]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Docking || Docking mode (left, right, none). See [[#???|??]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Desktop notifications|| Turn on/off platform notifications. See [[#Notifications|  Notifications]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| VPN || Disable VPN address for ICE candidate selection. See [[#RTP ports| RTP ports]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Show in taskbar|| Show myApps in the taskbar in addition to it&#039;s tray icon.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Log flags || turn on/off certain trace levels. See [[#Troubleshooting|Troubleshooting]] below.  || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| External applications || define the applications available for Apps to be started. See [[#Call an external application for calls|Call an external application for calls]] above.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Ring in headset || send ring tone for incoming to headset instead of loudspeaker.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|}&lt;br /&gt;
== Start parameters for Windows ==&lt;br /&gt;
&lt;br /&gt;
On Windows, it is not possible to pass start parameters from the [https://www.chromium.org/developers Chromium documentation] to the myApps process.&lt;br /&gt;
&lt;br /&gt;
== OS Settings for Windows ==&lt;br /&gt;
Windows settings can influence the display of &#039;&#039;Desktop notifications&#039;&#039;. See [https://support.microsoft.com/en-us/help/4028678/windows-10-change-notification-settings Change notification settings in Windows 10/11] for details.&lt;br /&gt;
&lt;br /&gt;
=== Windows 11 ===&lt;br /&gt;
&lt;br /&gt;
* Windows 11 has a feature &amp;quot;do not disturb&amp;quot;. This hides notifications if enabled.&lt;br /&gt;
* Windows 11 has a feature &amp;quot;focus&amp;quot;. This enables &amp;quot;do not disturb&amp;quot; and thus hides notifications too.&lt;br /&gt;
* Windows 11 has priority settings for notifications. Ensure that VoIP notifications for calls are allowed any maybe also include myApps as an App which is allowed to show notifications.&lt;br /&gt;
&lt;br /&gt;
== OS settings for Android ==&lt;br /&gt;
; Events : The appearance of notifications can be controlled here.&lt;br /&gt;
&lt;br /&gt;
; Call accounts : For proper incoming call signaling, the call account &#039;&#039;myApps&#039;&#039; needs to be enabled. Note that on Samsung smartphones the call account switch likely toggles back and a few tries may need to be done until it persists. Please double-check the state.&lt;br /&gt;
&lt;br /&gt;
; Preferred Calling Account : Choose which calling account (myApps/SIM/..) should be used for outgoing calls initiated from within the native phone app / phone book.&lt;br /&gt;
&lt;br /&gt;
; Background data, unlimited data usage : Grant background data use to enable &#039;&#039;myApps&#039;&#039; to connect to the PBX immediately on an incoming call.&lt;br /&gt;
&lt;br /&gt;
; Overlaying : This setting is not needed if call account &#039;&#039;myApps&#039;&#039; has been enabled. Should there be a reason for not enabling call account &#039;&#039;myApps&#039;&#039;, the permission for overlaying needs to be granted on Android 10 or higher for proper call signaling.&lt;br /&gt;
&lt;br /&gt;
Note: If no SIM card is installed some Android smartphones exhibit a problem dialing from the smartphone contacts. The contacts app shows a choice &#039;&#039;Select SIM card for this call&#039;&#039; but all possible dialers are greyed out. In this case make myApps the default phone app in Android settings &#039;&#039;Apps, Default apps, Telephony&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for iOS ==&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in iOS &#039;&#039;Settings, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for macOS ==&lt;br /&gt;
&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in macOS &#039;&#039;Preferences, Notifications, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
myApps platform services can write various traces for debugging.  Trace can be turned on and off selectively in the [[#Advanced settings|Advanced settings]].&lt;br /&gt;
&lt;br /&gt;
The following trace flags can be set:&lt;br /&gt;
&lt;br /&gt;
(&#039;&#039;Recommended trace options are: &#039;&#039;&#039;App, Browser, ICE, TURN, Signaling and Audio&#039;&#039;&#039;. Please do not activate other flags unless innovaphone support says otherwise&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |  Abbreviation&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |code&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| App||0x000000001|| logs from the App Service itself&lt;br /&gt;
|-&lt;br /&gt;
| DNS||0x000000008|| logs DNS requests and results&lt;br /&gt;
|-&lt;br /&gt;
| HTTP client||0x000000080|| http client logs&lt;br /&gt;
|-&lt;br /&gt;
| TLS||0x000000400|| TLS logs&lt;br /&gt;
|-&lt;br /&gt;
| TCP||0x000000800|| TCP logs&lt;br /&gt;
|-&lt;br /&gt;
| LDS||0x000001000|| local domain sockets&lt;br /&gt;
|-&lt;br /&gt;
| WebSocket client||0x000004000|| logs outgoing websocket connections&lt;br /&gt;
|-&lt;br /&gt;
| App WebSocket||0x000008000|| logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
|-&lt;br /&gt;
| UDP||0x000200000|| UDP logs&lt;br /&gt;
|-&lt;br /&gt;
| DTLS||0x000400000|| logs DTLS handshake and messages&lt;br /&gt;
|-&lt;br /&gt;
| Media||0x000800000|| logs media events&lt;br /&gt;
|-&lt;br /&gt;
| Media channel||0x001000000|| logs RTP/SCTP media connections&lt;br /&gt;
|-&lt;br /&gt;
| ICE||0x002000000|| logs ICE messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| TURN||0x004000000|| logs TURN messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| AppSharing||0x008000000|| logs AppSharing connection&lt;br /&gt;
|-&lt;br /&gt;
| Audio||0x010000000|| logs Audio connection and headset events&lt;br /&gt;
|-&lt;br /&gt;
| Video||0x020000000|| logs video connection and webcam events&lt;br /&gt;
|-&lt;br /&gt;
| Browser||0x040000000|| logs Chromium events&lt;br /&gt;
|-&lt;br /&gt;
| AppProxy||0x080000000|| logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
|-&lt;br /&gt;
| Webserver ||0x200000000|| enables webserver specific logs&lt;br /&gt;
|-&lt;br /&gt;
| Browser Console ||0x400000000|| logs browser console events&lt;br /&gt;
|-&lt;br /&gt;
| Signaling||0x800000000|| enables logs in the signaling module for debugging calls&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;code&#039;&#039; can be or&#039;ed and used as value for the &#039;&#039;Log flags&#039;&#039; field in [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps/Client Settings]].&lt;br /&gt;
&lt;br /&gt;
; Windows :On Windows, traces are written to the &amp;lt;code&amp;gt;%LOCALAPPDATA%\innovaphone\myApps&amp;lt;/code&amp;gt; directory. If you start myApps with --log-size as parameter, you can define the maximum size of a log file (e.g. --log-size=100000000 would be 100MB for each file)&lt;br /&gt;
&lt;br /&gt;
:* myApps-&#039;&#039;date-time&#039;&#039;.txt : main log file for the platform services&lt;br /&gt;
&lt;br /&gt;
:* myAppsOutlookSearch-&#039;&#039;date-time&#039;&#039;.txt : log file for the Outlook phone book access&lt;br /&gt;
&lt;br /&gt;
:* myAppsHookController-&#039;&#039;date-time&#039;&#039;.txt : log file for the hot-key interceptor (see [[#Hot keys|Hot keys]])&lt;br /&gt;
&lt;br /&gt;
; :myApps update installation traces are written to the &amp;lt;code&amp;gt;%windir%\temp\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsInstall.txt: MSI installation file&lt;br /&gt;
&lt;br /&gt;
; :myApps update service traces are written to the &amp;lt;code&amp;gt;%ProgramData%\innovaphone\myAppsUpdateService&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsUpdateService-&#039;&#039;date-time&#039;&#039;.txt: myApps update service traces&lt;br /&gt;
&lt;br /&gt;
;Android : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
: also, an Android device might also be connected to a PC via an USB cable to get the traces. The files can be found in &amp;lt;code&amp;gt;Android/data/com.innovaphone.clientandroid/files&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
; macOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
: also, the files can be found in &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-ios/Data/Documents/&amp;lt;/code&amp;gt;. Press &#039;&#039;Alt+N&#039;&#039; followed by space to get tilde &#039;&#039;~&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Known Problems =&lt;br /&gt;
[[:Category:Problem myApps platform services|Known Problems]]&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Redundancy|Reference14r2:Concept_myApps_Redundancy]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Office_Integration|Reference14r2:Concept_myApps_Office_Integration]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myAPPs_Search_in_local-Outlook_Contacts|Reference14r2:Concept_myAPPs_Search_in_local-Outlook_Contacts]]&lt;br /&gt;
* [[{{NAMESPACE}}:Call_Detail_Record_CDR_PBX|Reference14r2:Call_Detail_Record_CDR_PBX]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept Push Notifications for myPBX iOS and Android|Reference14r2:Concept Push Notifications for myPBX iOS and Android]]&lt;br /&gt;
* [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept myApps platform services]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_myApps_platform_services&amp;diff=79261</id>
		<title>Reference15r1:Concept myApps platform services</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_myApps_platform_services&amp;diff=79261"/>
		<updated>2026-03-26T08:11:51Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* MSI Parameters and install options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|myApps]]&lt;br /&gt;
&lt;br /&gt;
myApps platform services provide various operating system specific services which can be used by other &#039;&#039;Apps&#039;&#039; running in the [[{{NAMESPACE}}:Concept myApps|myApps client]]. Those services typically are not available in the browser&#039;s JavaScript environment and hence must be implemented in native platform code. Therefore, the platform services are installed as native executable on the respective platform.&lt;br /&gt;
&lt;br /&gt;
When myApps is started in a web browser (and hence has no access to the platform services), some Apps will use [https://en.wikipedia.org/wiki/WebRTC WebRTC] services implemented by the browser instead.  For ease of reference, features available in this scenario are also described here.&lt;br /&gt;
&lt;br /&gt;
On windows, the platform services also come with their own web browser in which the myApps web App will be started then.  This browser is based on google&#039;s [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium] open source software.&lt;br /&gt;
= Applies To =&lt;br /&gt;
&lt;br /&gt;
* [[{{NAMESPACE}}:Concept myApps|myApps]]&lt;br /&gt;
* myApps for Windows&lt;br /&gt;
* myApps for macOS&lt;br /&gt;
* myApps for iOS&lt;br /&gt;
* myApps for Android&lt;br /&gt;
&lt;br /&gt;
* myApps Web App (WebRTC)&lt;br /&gt;
version 14r2&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
Not all features are available or required on all platforms.&lt;br /&gt;
 {|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Feature&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || Windows || iOS || Android || macOS || Browser&amp;lt;ref&amp;gt;This refers to the myApps web application running in a browser with no platform services available&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| audio || manage local audio devices to record and playback audio conversations || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (audio available but devices managed by web browser)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| video || manage local displays and cameras to capture and render video live stream || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (video available but devices managed by web browser)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| ringer || manage local ringing device || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| application sharing&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;amp;nbsp; presenter || share an application || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;amp;nbsp; consumer  || view an application shared by the peer || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| hot keys || capture key presses for quick invocation of phone apps (e.g. dial selected number) || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| tel: and sip: URI handler || intercept clicks on tel: and sip: links in web sites to invoke phone apps || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| user activity || set presence state according to user activity ||  &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;limited, see [[#User activity|User activity]] below&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| docking || myApps can be docked persistently to the right or left edge of your screens ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| multi-windowing|| Apps can be launched in separate windows||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| recording|| Calls can be recorded to recording app||  &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| notifications || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; display notifications || display notifications with OS standard mechanism ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; push notifications || receive push notifications while myApps is not running  ||  &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The browser needs to be running in order to receive push notifications.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; chat and apps || display notifications for chat and other apps  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; calls || display notifications for incoming calls  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&amp;lt;ref&amp;gt;Call notifications are only displayed locally while the phone or softphone app is started.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| phone book access || access local phone book ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| office presence provider || maps PBX presence state to Microsoft office presence state ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| external application start || start arbitrary external applications for calls || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| app proxy|| a caching proxy that provides app persistence  || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| auto update || automatically updates myApps platform services to the same version the PBX has || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The then-current web app is always loaded from the PBX upon startup and hence up-to-date by definition&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| three party conference || initiate 3-pty-conference using Softphone-App || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| exclude VPN || disable use of VPN connections for audio and appsharing || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
* innovaphone PBX 14r2 and up&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Recommended hardware requirements&lt;br /&gt;
* Processor: Dual-core 2Ghz or higher&lt;br /&gt;
* RAM: 4 Gb&lt;br /&gt;
&lt;br /&gt;
== myApps for Windows ==&lt;br /&gt;
* Windows 10 and up&lt;br /&gt;
* Windows Server 2016 and later versions&lt;br /&gt;
&lt;br /&gt;
=== 32 &amp;amp; 64 bit Windows ===&lt;br /&gt;
* 32 bit Windows: install the myAppsSetup32.msi from the App Store&lt;br /&gt;
* 64 bit Windows: install the myAppsSetup.msi from the App Store&lt;br /&gt;
** the 64 bit variant still installs into Program Files (x86), as the main myApps.exe is still a 32bit application&lt;br /&gt;
** the 64 bit variant just contains an additional 64 bit binary for the outlook search&lt;br /&gt;
&lt;br /&gt;
=== Windows N editions ===&lt;br /&gt;
&lt;br /&gt;
Windows N editions are missing the &#039;&#039;Media Feature Pack&#039;&#039; which is pre installed on other Windows versions.&lt;br /&gt;
&lt;br /&gt;
Please install the pack from [https://www.microsoft.com/en-us/software-download/mediafeaturepack Microsoft (Windows 10 pack)] before you install myApps. The installer will check if the file &amp;lt;code&amp;gt;C:\Windows\SysWOW64\mfplat.dll&amp;lt;/code&amp;gt; exist on your system.&lt;br /&gt;
&lt;br /&gt;
Make sure to install the correct pack depending on your Windows version! There are different packs for Windows 10 1703, 1803, 1809 and 32bit or 64bit etc.&lt;br /&gt;
&lt;br /&gt;
NB: Sometimes the myApps installation will not work even though the media pack is already installed. This is because the installer has no read access to check if the package is already installed. If the above-mentioned file exists and the installer asks to install the Windows Media Feature Pack nevertheless, you have to start the myApps install with administrative rights.&lt;br /&gt;
&lt;br /&gt;
=== Terminal Server environments ===&lt;br /&gt;
&lt;br /&gt;
Audio driver was removed if myApps discovers that it is running in a terminal server environment like Citrix.&lt;br /&gt;
&lt;br /&gt;
The audio driver is needed for the Softphone App but the Softphone App should not use an audio driver at the server side because the audio devices are plugged locally and there would be a delay sending and receiving audio data with the server.&lt;br /&gt;
&lt;br /&gt;
If a customer wants to use the Softphone App at the server side he needs to make use of the myApps Plugin for virtual desktops solution:&lt;br /&gt;
&lt;br /&gt;
[[{{NAMESPACE}}:MyApps_Plugin_for_Virtual_Desktops|Reference15r1:MyApps_Plugin_for_Virtual_Desktops]]&lt;br /&gt;
&lt;br /&gt;
== myApps for macOS ==&lt;br /&gt;
* macOS 10.13 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for iOS ==&lt;br /&gt;
* iOS 12 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for Android ==&lt;br /&gt;
* Android 6.0 or higher. Android 6.x may need an update of the Chrome browser.&lt;br /&gt;
&lt;br /&gt;
= Licenses =&lt;br /&gt;
* No license needed for myApps platform services&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
myApps platform services is a native executable that is installed using the standard mechanisms on the respective operating system. It provides various advanced services which can be used by the myApps web client code as well as the Apps running in the myApps context. &lt;br /&gt;
&lt;br /&gt;
Also, on Windows, the platform services come with their own, dedicated browser to run myApps in.  This browser is based on [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium].  On iOS, macOS and Android, it is based upon native embedded web view facilities (such as WKWebView) instead.&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
=== RTP service for audio and appsharing ===&lt;br /&gt;
The RTP service provides audio and appsharing as a video stream. VoIP RTP endpoints (e.g. for softphones).  It supports STUN, TURN, ICE, SRTP, DTLS. Note however that unlike WebRTC, these endpoints do not &#039;&#039;require&#039;&#039; ICE and DTLS. In other words, they can communicate also with non-compliant (i.e. older) VoIP devices.&lt;br /&gt;
&lt;br /&gt;
Note that the available capabilities when not running the myApps platform services depend on the used browser&#039;s WebRTC implementation. See your browser documentation for details.&lt;br /&gt;
&lt;br /&gt;
Apps can request RTP channels using the [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol]&#039;s &#039;&#039;AllocChannel&#039;&#039; message.&lt;br /&gt;
&lt;br /&gt;
===== RTP ports=====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|  audio || 50000 -&amp;gt; 50099&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| video (app sharing) || 50100 -&amp;gt; 50199&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The RTP service will enumerate all local interfaces and create local HOST candidates for ICE.  There is an option however to disregard VPN interfaces (more precisely such interfaces with type of &#039;&#039;IF_TYPE_PPP&#039;&#039; or &#039;&#039;IF_TYPE_TUNNEL&#039;&#039;).  This can eliminate quality issues when RTP data is transmitted through TCP based VPN tunnels.&lt;br /&gt;
&lt;br /&gt;
SRFLX and RELAY candidates are obtained using the STUN and TURN server configuration passed by the App (e.g the &#039;&#039;softphone&#039;&#039; App) as part of the &#039;&#039;AllocChannel&#039;&#039; request.&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;AllocChannel&amp;quot;,&amp;quot;channel&amp;quot;:&amp;quot;81429cba-396d-43de-8a76-ec020ba8796e&amp;quot;,&amp;quot;iceServers&amp;quot;:[{&amp;quot;urls&amp;quot;:&amp;quot;turn:myturn.domaincom:4077?transport=udp&amp;quot;,&amp;quot;username&amp;quot;:&amp;quot;turnuser&amp;quot;,&amp;quot;credential&amp;quot;:&amp;quot;pwd&amp;quot;,&amp;quot;credentialType&amp;quot;:&amp;quot;password&amp;quot;},{&amp;quot;urls&amp;quot;:&amp;quot;stun:mystun.domain.com:4077&amp;quot;}],&amp;quot;dn&amp;quot;:&amp;quot;Foo Bar&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;RemoteRtp&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;video&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Codecs =====&lt;br /&gt;
&lt;br /&gt;
The installed myApps launchers provide codecs that can be used by softphone apps for media streams. When running in a web browser the codecs depend on the browser version and operating system. See the documentation of your browser for details.&lt;br /&gt;
&lt;br /&gt;
The following codecs are supported:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align:left;width:100px;&amp;quot;|Codec&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Windows-Launcher&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Android&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|iOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|macOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Firefox (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Chrome (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Edge (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Safari (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Opera (Browser)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Audio&lt;br /&gt;
|-&lt;br /&gt;
|G711A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G711u&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G722&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G729&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729B&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729AB&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-NB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-WB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Video&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP8 VP8]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP9 VP9]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=H264 H264]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Application Sharing&lt;br /&gt;
|-&lt;br /&gt;
|Share&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|Watch&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;* small presentation only&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;** only for 1:1 calls, not for conferences&lt;br /&gt;
&lt;br /&gt;
===== Video capture =====&lt;br /&gt;
&lt;br /&gt;
The default resolution for video capture is 1920x1080 if available.  Otherwise, 1280x720, 640x480, 352x288 or 320x240 will be used.  The frame rate is 30 fps if available, otherwise 15 fps. The resulting average bandwidth could reach 1 Mbps.&lt;br /&gt;
&lt;br /&gt;
===== Application sharing =====&lt;br /&gt;
&lt;br /&gt;
Screen content will be transmitted as video stream by the presenter&lt;br /&gt;
&lt;br /&gt;
===== Device handling =====&lt;br /&gt;
&lt;br /&gt;
The RTP service enumerates microphones, loudspeaker, cameras and ringing devices and notifies apps when devices come and go. It is up to the apps using the devices to store preferences.&lt;br /&gt;
&lt;br /&gt;
The RTP service also enables some extended features (such as hook switch or volume control) for supported USB headsets or Bluetooth headsets connected to myApps.&lt;br /&gt;
The supported headset-SDKs determine which headset vendors are recommended to be used with the myApps softphone app. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this to work, the following vendor specific development kits are integrated in our myApps client. Be aware that the SDK are updated within our Service release :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SDK Vendor !! Supported OS !! SDK Version !! innovaphone Service Release&lt;br /&gt;
|-&lt;br /&gt;
| Jabra|| MacOS || 1.12.2.0 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 1.12.2.0 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Epos &#039;&#039;(formerly Sennheiser)&#039;&#039; || MacOS || 12.4.0.5478 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || n.a. - [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|to be installed separately]]|| 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Poly &#039;&#039;(formerly Plantronics)&#039;&#039; || MacOS || 3.25.53799.37131 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.25.53800.37131 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Yealink || MacOS || 3.1.1.20 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.1.1.20 || 14r1sr3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* It is possible to inhibit the start of the Sennheiser SDK (SenncomSDK.exe) using the &amp;lt;code&amp;gt;DISABLEHEADSETS&amp;lt;/code&amp;gt; directive of the installer (see [[#MSI Parameters and install options|  MSI parameters]]  below).&lt;br /&gt;
&lt;br /&gt;
* Starting with V13r3sr10, the Epos-SDK needs to be installed separately using the Epos Connect software to ensure full compatibility between current Epos headset models and native myApps-Windows client. For details [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|refer to this article]].&lt;br /&gt;
&amp;lt;!--Keywords: myapps softphone supported headsets sdk--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Ring tones =====&lt;br /&gt;
&lt;br /&gt;
Ring tones can be played. Apps can choose the tone from a pre-defined list of ring tones.&lt;br /&gt;
&lt;br /&gt;
On Windows, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;ringtones&amp;lt;/code&amp;gt; sub-directory of myApps&#039; roaming directory (which usually is in &amp;lt;code&amp;gt;%appdata%\innovaphone\myApps\ringtones&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
On Android, custom ring tones can be added to the system via Android settings.&lt;br /&gt;
&lt;br /&gt;
On iOS, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;Ringtones&amp;lt;/code&amp;gt; subdirectory of the myApps file share that is available in iTunes if the iPhone has been connected via USB.&lt;br /&gt;
&lt;br /&gt;
On macOS, custom ring tones can be uploaded as .mp3 files to &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-macos/Data/Documents/Ringtones&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Debugging =====&lt;br /&gt;
For extended debugging, turn on the &#039;&#039;Audio&#039;&#039;, &#039;&#039;Media&#039;&#039; and &#039;&#039;AppSharing&#039;&#039; traces in myApps.&lt;br /&gt;
&lt;br /&gt;
=== Hot keys ===&lt;br /&gt;
On Windows and macOS systems, myApps platform services can listen for hot keys and invoke certain functions. Invocation is done by sending API messages to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
The hot keys can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below. Any of the function keys F1 to F11 (optionally combined with up to two modifier keys &#039;&#039;alt&#039;&#039;, &#039;&#039;ctrl&#039;&#039;, &#039;&#039;shift&#039;&#039; or &#039;&#039;win&#039;&#039;) can be chosen for each function. If you do not want to start the call with &amp;quot;Hotkey+Enter&amp;quot; because you would have to wait for the focus, the hotkey can also be pressed twice and the number is dialled directly.&lt;br /&gt;
&lt;br /&gt;
; dial selected number : Initiates a call using the currently selected text as target.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;text&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;mt&amp;quot;:&amp;quot;PrepareCall&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;13&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; accept call : Accepts a currently alerting call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;ConnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;ConnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; reject/disconnect call : Rejects a currently alerting call or disconnects an active call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;DisconnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;DisconnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== URL Handler ===&lt;br /&gt;
&lt;br /&gt;
On Windows systems, two URI-handler are installed with the myApps platform services.  Windows will call up this URI handler when a user clicks on an appropriate link, for example in a web site.&lt;br /&gt;
&lt;br /&gt;
The handler will the send an API message to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
; tel URI : call a number, e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;num&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;num&amp;quot;:&amp;quot;4711&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; sip URI : call a SIP name, e.g. &amp;lt;code&amp;gt;sip:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; im URI : start chat with SIP name, e.g. &amp;lt;code&amp;gt;im:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;StartChat&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm &#039;&#039;com.innovaphone.chat&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.chat&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartChat&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On macOS systems myApps might be made the default application to handle tel URI e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt; via Apple FaceTime. Open the &amp;quot;FaceTime&amp;quot; menu &amp;quot;Settings...&amp;quot; and select myApps as &amp;quot;Default for phone calls&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On iOS &#039;&#039;tel&#039;&#039; URIs are always dialed via GSM. Therefore myApps iOS also reacts to URI schemes &#039;&#039;com.innovaphone.tel&#039;&#039;, &#039;&#039;com.innovaphone.sip&#039;&#039; and &#039;&#039;com.innovaphone.im&#039;&#039;, e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.tel:4711&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.sip:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.im:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== User activity ===&lt;br /&gt;
On Windows and macOS systems, the myApps platform services can monitor user keyboard/mouse activity and change the user&#039;s presence state after a certain amount of inactivity.  The timeout can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below.&lt;br /&gt;
&lt;br /&gt;
myApps will then send a [https://sdk.innovaphone.com/doc/appwebsocket/myApps.htm#SetUserActivity&#039;&#039;SetUserActivity&#039;&#039;] message to the PBX using the &#039;&#039;myApps&#039;&#039; protocol.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;SetUserActivity&amp;quot;,&amp;quot;inactive&amp;quot;:true}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will change the &#039;&#039;status&#039;&#039; property of the &#039;&#039;im:&#039;&#039; contact for the user&#039;s own presence and hence result in a presence update from the PBX to myApps&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;UpdateOwnPresence&amp;quot;,&amp;quot;presence&amp;quot;:[{...},{&amp;quot;contact&amp;quot;:&amp;quot;im:&amp;quot;,&amp;quot;activity&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;closed&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
The &#039;&#039;closed&#039;&#039; status is reflected in the grey status color when displaying a contact [[Image:myapps-inactive.png|myapps-inactive.png/|myapps-inactive.png/]].&lt;br /&gt;
&lt;br /&gt;
On iOS and Android, the state is set to &#039;&#039;inactive&#039;&#039; as soon as the App is brought to background.&lt;br /&gt;
When myApps platform services are not available (i.e. when running the web application in a browser solely) a limited user activity monitoring is available: the state is set to active when the web page is not used for more than 5 minutes.&lt;br /&gt;
&lt;br /&gt;
=== Recording ===&lt;br /&gt;
&lt;br /&gt;
The new launcher offers the possibility to record the audio of incoming and outgoing calls. In order to activate that functionality the URL of the recording instance must be configured in either the PBX (PBX-&amp;gt;myApps-&amp;gt;Config: Recording URL) or the softphone App (Settings-&amp;gt;Audio Recording (URL)) &lt;br /&gt;
&lt;br /&gt;
[[Image:PBX-Recording-Settings.png|pbx-recording-settings.png/|pbx-recording-settings.png/]] [[Image:Recording-Softphone-Settings.png|recording-softphone-settings.png/|recording-softphone-settings.png/]]. &lt;br /&gt;
&lt;br /&gt;
As long as that URL is configured the audio data of all calls are stored as pcap-files under that URL.&lt;br /&gt;
If the URL points to a CF device in the PBX, write access must be granted for that URL (PBX-&amp;gt;Services-&amp;gt;HTTP-&amp;gt;Server:Public compact flash access) and if the URL points to the recording app, the files can be accessed via the recording app [[{{NAMESPACE}}:Concept_App_Service_Recordings|recording]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under PBX-&amp;gt;myApps the administrator can set a certain default behaviour of the audio recording like whether or not the recording should start automatically at the beginning of the call (Recording by Default ON/OFF), only calls with external numbers should be recorded (Record external calls only) or whether or not the user should be able to start/stop the recording himself (Allow user incall recording control). Except for the last parameter these parameters can also be modified by the user in its softphone settings if the administrator doesn&#039;t set the FORCE flag.&lt;br /&gt;
&lt;br /&gt;
If the user was allowed by the admin to control the recording a recording switch is active during the call when the &amp;quot;Media&amp;quot; Panel is opened. There the audio recording may be stopped and continued at will. A red recording notice is shown in the top right corner when the recording actually takes place.&lt;br /&gt;
 &lt;br /&gt;
[[Image:Recording-incall-switch.png|recording-incall-switch.png/|recording-incall-switch.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services can use the OS specific notification mechanism (e.g. &#039;&#039;desktop notifications&#039;&#039; on Windows) to display messages (e.g. &#039;&#039;incoming new chat message&#039;&#039;) to the user.&lt;br /&gt;
&lt;br /&gt;
Note that the actual rendering of the notification is under control of the OS.  Therefore, myApps must be allowed to show notifications and its appearance can be restricted by OS native settings.&lt;br /&gt;
&lt;br /&gt;
==== Microsoft Windows Notifications ====&lt;br /&gt;
&lt;br /&gt;
Microsoft Windows Server editions (2016, 2019, 2022) are just capable of showing a single &#039;&#039;IncomingCall&#039;&#039; notification at the same time (we couldn&#039;t find a workaround for this limitation).&amp;lt;br/&amp;gt;&lt;br /&gt;
An &#039;&#039;IncomingCall&#039;&#039; notification is visible the whole time instead of being moved to the action center after a certain time.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
A notification about a missed call uses the &#039;&#039;IncomingCall&#039;&#039; type so that this notification is visible until the user returns.&amp;lt;br/&amp;gt;&lt;br /&gt;
Due to the above limitation, on a new arriving call such a missed call notification is transformed to a default notification which will be moved to the action center automatically.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On non server editions, you can have multiple IncomingCall notifications at the same time (so two parallel incoming calls will be indeed notified at the same time), but the missed call notification handling is the same on both platforms!&lt;br /&gt;
&lt;br /&gt;
 Thus there will be always just &#039;&#039;&#039;one&#039;&#039;&#039; missed call notification visible and previous missed calls can be found inside your action center!&lt;br /&gt;
&lt;br /&gt;
To see myApps notifications, ensure:&lt;br /&gt;
* System -&amp;gt; Notifications &lt;br /&gt;
** enable notifications&lt;br /&gt;
** disable &amp;quot;Do not disturb&amp;quot; or allow myApps as priority application while &amp;quot;Do not disturb&amp;quot; is active&lt;br /&gt;
** enable notifications for myApps in the list of applications&lt;br /&gt;
* System -&amp;gt; Focus &lt;br /&gt;
** if a focus session is active and the &amp;quot;Do not disturb&amp;quot; is activated during a focus session, make sure that myApps is a priority application (see above)&lt;br /&gt;
&lt;br /&gt;
==== macOS Notifications ====&lt;br /&gt;
Notifications are the same as on Windows.&lt;br /&gt;
The difference is, that for macOS, notifications need to be allowed in the system settings.&lt;br /&gt;
Go to Notifications - myApps, select Banner and enable all check marks.&lt;br /&gt;
&lt;br /&gt;
=== Local phonebook access ===&lt;br /&gt;
&#039;&#039;&#039;Contact Search:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm &#039;&#039;com.innovaphone.search&#039;&#039; API]]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Search&#039;&#039; request to the API:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;Search&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;search&amp;quot;:&amp;quot;john doe&amp;quot;},&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
Search results are delivered as &#039;&#039;SearchInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;SearchInfo&amp;quot;,&amp;quot;relevance&amp;quot;:2000,&amp;quot;adjust&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;contact&amp;quot;:{&amp;quot;givenname&amp;quot;:&amp;quot;John&amp;quot;,&amp;quot;sn&amp;quot;:&amp;quot;Doe&amp;quot;,&amp;quot;company&amp;quot;:&amp;quot;ACME&amp;quot;,&amp;quot;position&amp;quot;:&amp;quot;Head of everything&amp;quot;,&amp;quot;telephonenumber&amp;quot;:[&amp;quot;11111&amp;quot;,&amp;quot;22222&amp;quot;],&amp;quot;homephone&amp;quot;:[&amp;quot;+4944444&amp;quot;,&amp;quot;33333&amp;quot;],&amp;quot;mobile&amp;quot;:[&amp;quot;+49 (123) 55555&amp;quot;]}},&amp;quot;api&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reverse Lookup:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.phonelookup/lib1_api_phonelookup.htm &#039;&#039;com.innovaphone.phonelookup&#039;&#039; API]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Lookup&#039;&#039; request to the API: &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{ mt: &amp;quot;Lookup&amp;quot;, prefixIntl: &amp;quot;000&amp;quot;, prefixNtl: &amp;quot;00&amp;quot;, prefixExt:&amp;quot;0&amp;quot;, area: &amp;quot;7031&amp;quot;, country: &amp;quot;49&amp;quot;, lookup: &amp;quot;0004970311234567&amp;quot; },&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.lookup&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search results are delivered as &#039;&#039;LookupInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{mt: &amp;quot;LookupInfo&amp;quot;, dn: &amp;quot;Jake Blues&amp;quot;, contact: { telephonenumber: [&amp;quot;0004970311234567&amp;quot;], givenname: &amp;quot;Jake&amp;quot;, sn: &amp;quot;Blues&amp;quot;, company: &amp;quot;Blues Brothers&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
On Windows, the search and lookup are performed in all of the user&#039;s Outlook contact folders.  As opposed to the search implemented in the &#039;&#039;Contacts&#039;&#039; and &#039;&#039;Users&#039;&#039; App, all items are returned which match any of the search words (i.e. searching for &#039;&#039;a b&#039;&#039; will return items matching either &#039;&#039;a&#039;&#039; or &#039;&#039;b&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
; searched properties : firstname, lastname&lt;br /&gt;
; returned properties : Following Outlook contact phone number properties are returned  (if available):&lt;br /&gt;
&lt;br /&gt;
:* OFFICE_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* OFFICE2_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* HOME_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* HOME2_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* MOBILE_TELEPHONE_NUMBER as &#039;&#039;mobile&#039;&#039;&lt;br /&gt;
:* BUSINESS_FAX_NUMBER as &#039;&#039;facsimiletelephonenumber&#039;&#039;&lt;br /&gt;
Note that contact information is cached in the search provider.  Updated contacts may therefore become effective after a while only.&lt;br /&gt;
Outlook search will create its own trace file &amp;lt;code&amp;gt;myAppsOutlookSearch-&amp;lt;/code&amp;gt;&#039;&#039;date-time&#039;&#039;&amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; in the standard trace directory.&lt;br /&gt;
&lt;br /&gt;
This search provider is always installed and can be disabled.  There is no need (nor possibility) to enable it in the &#039;&#039;Apps&#039;&#039; tab of the PBX&#039;s user object.  Also, no &#039;&#039;App&#039;&#039; object needs to be created for it.&lt;br /&gt;
&lt;br /&gt;
==== Android/iOS ====&lt;br /&gt;
The search and lookup are performed in the contacts.&lt;br /&gt;
&lt;br /&gt;
==== macOS ====&lt;br /&gt;
The search and lookup are performed in the contacts. If you wish to disable local contact lookup, go to system settings - Security &amp;amp; Privacy and disable the access to contacts for myapps.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft Office integration ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services has a &#039;&#039;office presence provider&#039;&#039; that can provide the user&#039;s presence state to Office applications.  See [[{{NAMESPACE}}:Concept_myApps_Office_Integration|myApps Office Integration]] for details.&lt;br /&gt;
&lt;br /&gt;
This feature is installed by default.  However, it can be disabled using the &#039;&#039;OFFICEPRESENCE&#039;&#039; MSI Parameter.  Also, a check-mark is available in the setup dialog.&lt;br /&gt;
&lt;br /&gt;
=== Call an external application for calls ===&lt;br /&gt;
&lt;br /&gt;
Phone Apps (such as the phoneapp or softphone) can initiate the start of an external application when a new call appears (either incoming or outgoing).  The actual spawning of the application is done by the myApps platform service.  Also, the application properties (such as e.g. the executable&#039;s path) is configured in the myApps platform services (see [[#UI elements|Advanced settings]] in the &#039;&#039;UI elements&#039;&#039; section below).&lt;br /&gt;
&lt;br /&gt;
A number of arguments can be passed to the application by substituting $-variables in the &#039;&#039;Parameter&#039;&#039; field:&lt;br /&gt;
&lt;br /&gt;
; $n : phone number as dialed (called party number for outgoing calls) or received (calling party number for incoming calls)&lt;br /&gt;
&lt;br /&gt;
; $N : called or calling party number in &#039;&#039;national&#039;&#039; format (e.g. 07031730090)&lt;br /&gt;
&lt;br /&gt;
; $I : called or calling party number in &#039;&#039;international&#039;&#039; format (e.g. +497031730090)&lt;br /&gt;
&lt;br /&gt;
: note that both $N and $I only work if $n includes both subscriber number and area code (e.g. 07031730090). Otherwise they are equal to $n&lt;br /&gt;
&lt;br /&gt;
; $d : display name of peer (if known)&lt;br /&gt;
&lt;br /&gt;
; $u : URI name of the peer (if available eg with a federation call)&lt;br /&gt;
&lt;br /&gt;
; $c : conference id&lt;br /&gt;
&lt;br /&gt;
: this is a globally unique ID for this call and may be used to relate the call to the &#039;&#039;guid&#039;&#039; found in the CallInfo structure in the [http://wiki.innovaphone.com/index.php?title=Reference10:SOAP_API#CallInfo SOAP-API] and [http://sdk.innovaphone.com/doc/appwebsocket/RCC.htm RCC-API ].  Also, corresponding [[Reference10:Call Detail Record CDR PBX|CDRs]] can be related using the &#039;&#039;event&#039;&#039; tag&#039;s &#039;&#039;conf&#039;&#039; attribute.&lt;br /&gt;
The start of an external application can be requested using the &#039;&#039;com.innovaphone.externalapps&#039;&#039; API.&lt;br /&gt;
&lt;br /&gt;
Some setup examples are [[Howto:Integrate External Apps in innovaphone UC clients|shown here]].&lt;br /&gt;
&lt;br /&gt;
=== Push ===&lt;br /&gt;
&lt;br /&gt;
Mobile operating systems usually inhibit network operation of apps which run in the background or are closed by the user.  This is done in order to reduce battery consumption.  Unfortunately, this also stops such apps to maintain a registration by regularly sending &#039;&#039;keep alive&#039;&#039; messages to a server (in our case to the PBX).  As a result, myApps will be disconnected from the PBX.   When the PBX determines that there is an event for the application which needs a response, it needs to wake up the app using a dedicated channel provided by the operating system.  This mechanism is know as &#039;&#039;push&#039;&#039;. When running on iOS or Android, myApps supports &#039;&#039;push&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;push&#039;&#039; to work, a [[{{NAMESPACE}}:PBX/Objects/Push|&#039;&#039;push object&#039;&#039;]] needs to be configured in the PBX .  Also, it needs to be enabled on the mobile phone for the myApps app.&lt;br /&gt;
This mechanism is quite similar in v12 and v13, so you can refer to [[{{NAMESPACE}}:Concept_Push_Notifications_for_iOS_and_Android|Reference14r2:Concept_Push_Notifications_for_iOS_and_Android]] for more details. &lt;br /&gt;
&lt;br /&gt;
Also, helpful hints can be found in [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]].&lt;br /&gt;
&lt;br /&gt;
=== App Proxy ===&lt;br /&gt;
&lt;br /&gt;
myApps runs further &#039;&#039;Apps&#039;&#039; (such as e.g. the &#039;&#039;phoneapp&#039;&#039;) as a web page in an IFRAME of the browser myApps is running in.  The App&#039;s page code is loaded either from the PBX or from an &#039;&#039;application platform&#039;&#039; (AP).   This however would mean that the App&#039;s IFRAME would remain empty (a dead white screen) when the PBX or AP is not available. To make sure the App can start-up anyway, the myApps platform services feature the so-called &#039;&#039;App Proxy&#039;&#039;.  This is a caching proxy that caches all the App code so it is available even in case of network failure. When myApps runs in the context of the platform services, Apps are therefore not loaded from the App source directly, but from the local App proxy. &lt;br /&gt;
&lt;br /&gt;
The cached files are stored in the PCs local file system in the &amp;lt;code&amp;gt;%LOCALAPPDATA%\innovaphone\myApps\appproxy&amp;lt;/path&amp;gt;&amp;lt;/code&amp;gt;.  There is no configuration required.  However, if myApps seems to run with outdated or corrupt cached copies of the App, you can safely delete the entire directory.&lt;br /&gt;
&lt;br /&gt;
=== Auto update ===&lt;br /&gt;
&lt;br /&gt;
On Windows and on macOS, the myApps platform services can auto-update themselves to a common version.  This is controlled by the [[{{NAMESPACE}}:PBX/Config/myApps#Launcher_Software_Update | &#039;&#039;Launcher Software Update&#039;&#039;]] settings under &#039;&#039;PBX/Config/myApps&#039;&#039; in the PBX. &lt;br /&gt;
&lt;br /&gt;
When myApps is started or the user logs in or myApps needs to re-connect to the PBX, the platform services will use the [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client API] to learn the desired version (&#039;&#039;launcherUpdateBuild&#039;&#039;, which is part of the API&#039;s &#039;&#039;model&#039;&#039;). If this differs from the current version, the platform services will try to download the respective new version. &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;mt&amp;quot;: &amp;quot;ApiUpdate&amp;quot;,&lt;br /&gt;
    &amp;quot;apis&amp;quot;: {&lt;br /&gt;
        &amp;quot;com.innovaphone.client&amp;quot;: {&lt;br /&gt;
            &amp;quot;@client&amp;quot;: {&lt;br /&gt;
                &amp;quot;title&amp;quot;: &amp;quot;innovaphone myApps&amp;quot;,&lt;br /&gt;
                &amp;quot;model&amp;quot;: {&lt;br /&gt;
                    &amp;quot;launcher&amp;quot;: true,&lt;br /&gt;
                    &amp;quot;launcherUpdateBuild&amp;quot;: &amp;quot;134906&amp;quot;,&lt;br /&gt;
                    &amp;quot;appStoreUrl&amp;quot;: &amp;quot;http://store.innovaphone.com/release/download/&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The installation of the downloaded version is done by the &#039;&#039;innovaphonemyAppsUpdateService&#039;&#039;. This service is installed and enabled during the initial installation of the myApps platform services.  To disable auto-update, either leave the &#039;&#039;Launcher Software Update&#039;&#039; settings empty or set the service&#039;s start mode to &#039;&#039;disabled&#039;&#039; in the Windows &#039;&#039;services control panel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that on Windows the update service does not work on terminal servers. Administrators must do myApps base services updates using standard windows mechanisms.&lt;br /&gt;
&lt;br /&gt;
Note that on macOS if myApps has been installed from the Apple Store it is assumed that auto update from the PBX is not desired and disabled therefore.&lt;br /&gt;
&lt;br /&gt;
On Android/iOS/macOS updates can be downloaded from the respective app store.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Devices&#039;&#039; app can not update software installed on Windows PCs directly. However, when the PBX is updated using an &#039;&#039;update job&#039;&#039; in the &#039;&#039;Devices&#039;&#039; App, the &#039;&#039;Launcher Software Update&#039;&#039; settings will be updated accordingly and hence the myApps base services will ultimately also be updated to the same version.&lt;br /&gt;
&lt;br /&gt;
==== Auto update flow on Windows ====&lt;br /&gt;
&lt;br /&gt;
* On start of myApps, myApps checks if an update is available and ready for installation&lt;br /&gt;
** if yes, the update is installed directly, without user interaction (a popup is shown during the installation)&lt;br /&gt;
** if not, myApps starts&lt;br /&gt;
* if an update is available while myApps is already running, an update notification will be shown which let&#039;s the user choose to install the update now or later (the notification will then popup again after one hour)&lt;br /&gt;
&lt;br /&gt;
==UI elements ==&lt;br /&gt;
There are a few user interfaces provided by the platform services:&lt;br /&gt;
===tray-icon (Windows only) ===&lt;br /&gt;
::[[Image:myapps-tray.png|myapps-tray.png/|myapps-tray.png/]]&lt;br /&gt;
:Allows to&lt;br /&gt;
:* terminate myApps&lt;br /&gt;
:* toggle the &#039;&#039;autostart&#039;&#039; state&lt;br /&gt;
:* toggle the &#039;&#039;show in task bar&#039;&#039; state&lt;br /&gt;
:* open the trace folder&lt;br /&gt;
:&lt;br /&gt;
=== PBX connect form===&lt;br /&gt;
:: [[Image:myapps-connect.png|myapps-connect.png/|myapps-connect.png/]]&lt;br /&gt;
: Allows the user to specify the connect data for the PBX (i.e. IP address or DNS name)&lt;br /&gt;
:&lt;br /&gt;
=== Advanced settings===&lt;br /&gt;
::[[Image:myapps-settings0.png|myapps-settings0.png/|myapps-settings0.png/]]&lt;br /&gt;
::[[Image:myapps-settings.png|myapps-settings.png/|myapps-settings.png/]] [[Image:myapps-settings2.png|myapps-settings2.png/|myapps-settings2.png/]] [[Image:myapps-settings3.png|myapps-settings3.png/|myapps-settings3.png/]]&lt;br /&gt;
&lt;br /&gt;
: Allows to modify various platform dependant settings (such as e.g. the hotkey selection on Windows)&lt;br /&gt;
&lt;br /&gt;
== Interfaces ==&lt;br /&gt;
=== Provided APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm com.innovaphone.search] : access to local phone book entries by the [[#Local phonebook access|Local phonebook access]] component.&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.launcher/com.innovaphone.launcher.htm com.innovaphone.launcher] : display of OS specific user notifications and receipt of related user actions&lt;br /&gt;
; com.innovaphone.notificationhandler : reports back click on a notification.&lt;br /&gt;
; com.innovaphone.externalapps : to start external applications, see [[#Call an external application for calls|Call an external application for calls]]  above&lt;br /&gt;
&lt;br /&gt;
=== Used APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm com.innovaphone.phone] : used to initiate new or manipulate existing calls by the [[#Hot keys|Hot keys]] and [[#URL handler|URL handler]] components.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm com.innovaphone.chat] : used to start a new chat by the [[#URL handler|URL handler]] component.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client] : the model is used to learn the update settings, see [[#Auto update|Auto update]] above&lt;br /&gt;
&lt;br /&gt;
=== Protocols ===&lt;br /&gt;
&lt;br /&gt;
; [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol] : used by apps to allocate RTP channels, see [[#RTP service for audio.2C video and data|RTP service for audio, video and data]] above&lt;br /&gt;
&lt;br /&gt;
== Related App Services ==&lt;br /&gt;
&lt;br /&gt;
none&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
; Incoming call as banner on myApps for iOS : Since iOS 14 the iOS CallKit presents incoming calls as a banner leaving the original green answer button of myApps visible. Use only the blue button of the banner to accept the call or change iPhone Settings, App &amp;quot;Phone&amp;quot;, &amp;quot;Incoming Calls&amp;quot; to &amp;quot;Full Screen&amp;quot; to hide the myApps user interface again during call answering.&lt;br /&gt;
&lt;br /&gt;
; Call answer in speakerphone mode even with active Bluetooth headset on myApps for iOS : This causes unwanted speakerphone operation if the smartphone is used with a Bluetooth car audio system. The behaviour can be changed by selecting &#039;&#039;Bluetooth Headset&#039;&#039; in this setting:&lt;br /&gt;
:&#039;&#039;iOS Settings-&amp;gt;Accessibility-&amp;gt;Touch-&amp;gt;Call Audio Routing: Automatic / Bluetooth Headset / Speaker&#039;&#039;&lt;br /&gt;
:&#039;&#039;iOS Einstellungen-&amp;gt;Bedienungshilfen-&amp;gt;Tippen-&amp;gt;Anrufaudioausgabe: Automatisch / Bluetooth-Headset / Lautsprecher&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Windows Server 2016 (Windows 10 Build 1607) : windows just shows the first notification. Further notifications aren&#039;t displayed until the previous ones are removed from the notification center. Current windows builds do not show this behaviour anymore.&lt;br /&gt;
&lt;br /&gt;
; Problems on Mac computers with Yealink USB headsets&lt;br /&gt;
: we have received reports that myApps quits unexpectedly on some Mac computers when a Yealink headset is plugged in.  Unfortunately, we could not find out the cause yet.  If you use Yealink USB headsets and have a similar issue, please open a support ticket and send myApps traces.&lt;br /&gt;
&lt;br /&gt;
; Poly / Plantronics headset buttons only functional if myApps is started with Rosetta&lt;br /&gt;
: myApps macOS supports Apple M1/M2 hardware natively. However, the Poly / Plantronics headset SDK is only available for Intel platform and thus myApps needs to be started via Apple&#039;s Intel emulator Rosetta if a Poly / Plantronics headset is used. This is done with right-click on the myApps executable, &#039;&#039;Information&#039;&#039;, &#039;&#039;Open with Rosetta&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Windows surface devices may not work correctly&lt;br /&gt;
: Chromium does not get touch keyboard events. USB Keyboards may not be recognized either.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Windows using the .msi file found in the &#039;&#039;myApps Windows&#039;&#039; package from [https://store.innovaphone.com/release/download.htm store.innovaphone.com].&lt;br /&gt;
&lt;br /&gt;
myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
=== MSI Parameters and install options ===&lt;br /&gt;
&lt;br /&gt;
The MSI installer of myApps for Windows supports the following parameters and can be edited with [https://docs.microsoft.com/en-us/windows/win32/msi/orca-exe Microsoft Orca]. You can add your parameters in the table &#039;&#039;property&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; SERVER (REG_SZ): the PBX&#039;s server address (without protocol like https://)&lt;br /&gt;
; OFFICEPRESENCE (REG_DWORD): &#039;&#039;&#039;false&#039;&#039;&#039; to disable presence integration in Microsoft Office&lt;br /&gt;
: this is also available as a check-mark when running the install manually&lt;br /&gt;
&lt;br /&gt;
; DISABLEHEADSETS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable headsets support, see [[#Device handling|Device handling]] above&lt;br /&gt;
&lt;br /&gt;
; EXTERNALAPPS (REG_SZ): pre-define external applications, see [[#Call an external application for calls|Call an external application for calls]] above&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;&amp;quot;{&amp;quot;&amp;quot;externalApps&amp;quot;&amp;quot;:[{&amp;quot;&amp;quot;id&amp;quot;&amp;quot;:0,&amp;quot;&amp;quot;name&amp;quot;&amp;quot;:&amp;quot;&amp;quot;Wireshark&amp;quot;&amp;quot;,&amp;quot;&amp;quot;path&amp;quot;&amp;quot;:&amp;quot;&amp;quot;C:\\Program Files\\Wireshark\\Wireshark.exe&amp;quot;&amp;quot;,&amp;quot;&amp;quot;param&amp;quot;&amp;quot;:&amp;quot;&amp;quot;test $I&amp;quot;&amp;quot;}]}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FORCERESTART (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; (or any string ...) kills myApps during the installation and restarts it for the currently logged in user, if it was running&lt;br /&gt;
&lt;br /&gt;
; DISABLELOCALHOST (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable use of &#039;&#039;&#039;localhost&#039;&#039;&#039; string to access the local webserver. Use &#039;&#039;&#039;127.0.0.1&#039;&#039;&#039; instead&lt;br /&gt;
&lt;br /&gt;
; EXCLUDEINTERFACES (REG_SZ): some VPN interfaces are not detected by Windows as IF_TYPE_PPP or IF_TYPE_TUNNEL and therefore the &#039;&#039;&#039;media outside VPN&#039;&#039;&#039; setting is not taking effect. With this option interfaces can be pre-defined that will not be used for media. Interfaces must be comma separated&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;EXCLUDEINTERFACES=&amp;quot;172,192.168,10.10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FASTERDOWNLOADS (REG_DWORD): &#039;&#039;&#039;1&#039;&#039;&#039; to have faster downloads without artificially slowing down the download of an update (which is done to avoid audio lags if clients have slow networks).&lt;br /&gt;
&lt;br /&gt;
Current settings are stored in the registry at &amp;lt;code&amp;gt;Computer\HKEY_CURRENT_USER\Software\innovaphone\myApps&amp;lt;/code&amp;gt; or at &amp;lt;code&amp;gt;Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\innovaphone\myApps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Boolean values like OfficePresence are stored in registry entries with type REG_DWORD and values 1 or 0. 0 disables the setting and 1 enables it.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on iOS by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;App Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== macOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services might be installed directly from the Apple store. An installer package &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; and a disk image &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; is also available from the innovaphone app store. Install &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; by double-click on the file and follow the instructions of the installer. myApps becomes available in the Applications folder and can be opened by double-click. Or download and open &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; and double klick myApps. If desired integrate it into the app dock by right click, &#039;&#039;Options, Keep in the dock&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If installed from the innovaphone app store, myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
If installed from the Apple store, macOS notifies about updates on the Apple store. myApps [[#Auto update|Auto update]] is disabled then.&lt;br /&gt;
&lt;br /&gt;
If a clean-install of the client is necessary, the folder &amp;quot;/Users/username/Library/Containers/myapps&amp;quot; needs to be deleted. To be on the safe side also delete it from the trash bin.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Preferences ===&lt;br /&gt;
&lt;br /&gt;
macOS supports preference settings that can be set via a shell command or via Mac remote management&lt;br /&gt;
&lt;br /&gt;
 defaults write com.innovaphone.client-ios-14r1 server &amp;quot;PBX-server-URL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following parameters and can be set through this method:&lt;br /&gt;
&lt;br /&gt;
; server: the PBX&#039;s server URL&lt;br /&gt;
&lt;br /&gt;
=== Setting myApps as Default App for SIP-URLs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add &#039;{&lt;br /&gt;
   LSHandlerURLScheme = sip;&lt;br /&gt;
   LSHandlerRoleAll = &amp;quot;&amp;lt;CFBundleIdentifier&amp;gt;&amp;quot;;&lt;br /&gt;
}&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To find the “CFBundleIdentifier”, proceed as follows:&lt;br /&gt;
* In the Finder under “Applications”, search for the desired myApps client that you want to set as the default app.&lt;br /&gt;
* Right-click on “Show package contents” -&amp;gt; you will find the “CFBundleIdentifier” in the Info.plist file.&lt;br /&gt;
&lt;br /&gt;
A restart of the MAC is required.&lt;br /&gt;
&lt;br /&gt;
=== Using Sennheiser headsets ===&lt;br /&gt;
If you use Sennheiser headsets, you should also install the then-current &amp;lt;code&amp;gt;DSEA_SDK_v&amp;lt;/code&amp;gt;&#039;&#039;version&#039;&#039;&amp;lt;code&amp;gt;.pkg&amp;lt;/code&amp;gt; package, after you installed the myApps client.  Without that, audio will still work, but not the controls on the headset.  You will need to keep that up-to-date yourself, as it is not updated by myApps&#039;s auto-update function.&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Android by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;Play Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying a property &amp;quot;server&amp;quot; with string value &amp;quot;pbx.example.com&amp;quot; in the MDM.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
When opening myApps for the first time, the user is prompted for the Server. Usually only the hostname (DNS host name or IP address) needs to be configured.&lt;br /&gt;
&lt;br /&gt;
But there are more options for special PBX configurations.&lt;br /&gt;
&lt;br /&gt;
; Non-standard HTTPS port&lt;br /&gt;
: If the PBX uses a non-standard HTTPS port, it must be appended to the host name separated by a colon (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com:4444&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com:4444/PBX0/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; DynPBX module name&lt;br /&gt;
: If the PBX is a DynPBX, the module id must be appended to PBX0 separated - (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com/PBX0-1&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0-1/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; Softphone physical location&lt;br /&gt;
: If user defined physical location shall be used for softphone, you can append it using a parameter &amp;lt;code&amp;gt;#phys=&amp;lt;/code&amp;gt;.&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com#phys=slave&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0/APPCLIENT/appclient.htm#phys=slave&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Example 1: PBX pbx.example.com with standard configuration&lt;br /&gt;
 pbx.example.com&lt;br /&gt;
&lt;br /&gt;
Example 2: PBX slave.example with DynPBX module ID 1, HTTPS port 4444 and physical location master&lt;br /&gt;
 slave.example.com:4444/PBX0-1#phys=master&lt;br /&gt;
&lt;br /&gt;
=== HTTP proxy support ===&lt;br /&gt;
&lt;br /&gt;
myApps platform services do support operation via HTTP proxy now. If one or more proxies have been configured in the network settings of the operating system for the active network connection, HTTP CONNECT tunnels are established.&lt;br /&gt;
&lt;br /&gt;
On Windows user name and password can be specified for the tunnel servers as generic credentials in the credentials manager (Anmeldeinformationsverwaltung). The name of the credentials must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
On Android user name and password can be specified through Android &#039;&#039;Settings, Accounts&#039;&#039; by adding a myApps &#039;&#039;HTTP Proxy Credentials&#039;&#039; account. The name of the account must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
== Platform specific settings ==&lt;br /&gt;
When myApps runs under the myApps platform services, it will show various platform specific settings as part of its &#039;&#039;burger menu&#039;&#039;, so the user can set them.  See &#039;&#039;Advanced settings&#039;&#039; in [[#UI elements|UI elements]] above.&lt;br /&gt;
&lt;br /&gt;
Some options can also be set globally for all myApps clients in the PBX&#039;s [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps &#039;&#039;Client Settings&#039;&#039;]]&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Option&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Where to set&lt;br /&gt;
&lt;br /&gt;
!&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || User menu || PBX &#039;&#039;Client Settings&#039;&#039; || Windows || iOS || Android || macOS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Autostart || Launch myApps on login || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Appear offline after || controls after which idle time a user is considered &#039;&#039;inactive&#039;&#039;. See [[#User activity|User activity]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Hotkeys || Hotkeys for call dial, accept, reject. See [[#Hot keys|Hot keys]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Docking || Docking mode (left, right, none). See [[#???|??]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Desktop notifications|| Turn on/off platform notifications. See [[#Notifications|  Notifications]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| VPN || Disable VPN address for ICE candidate selection. See [[#RTP ports| RTP ports]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Show in taskbar|| Show myApps in the taskbar in addition to it&#039;s tray icon.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Log flags || turn on/off certain trace levels. See [[#Troubleshooting|Troubleshooting]] below.  || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| External applications || define the applications available for Apps to be started. See [[#Call an external application for calls|Call an external application for calls]] above.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Ring in headset || send ring tone for incoming to headset instead of loudspeaker.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|}&lt;br /&gt;
== Start parameters for Windows ==&lt;br /&gt;
&lt;br /&gt;
On Windows, it is not possible to pass start parameters from the [https://www.chromium.org/developers Chromium documentation] to the myApps process.&lt;br /&gt;
&lt;br /&gt;
== OS Settings for Windows ==&lt;br /&gt;
Windows settings can influence the display of &#039;&#039;Desktop notifications&#039;&#039;. See [https://support.microsoft.com/en-us/help/4028678/windows-10-change-notification-settings Change notification settings in Windows 10/11] for details.&lt;br /&gt;
&lt;br /&gt;
=== Windows 11 ===&lt;br /&gt;
&lt;br /&gt;
* Windows 11 has a feature &amp;quot;do not disturb&amp;quot;. This hides notifications if enabled.&lt;br /&gt;
* Windows 11 has a feature &amp;quot;focus&amp;quot;. This enables &amp;quot;do not disturb&amp;quot; and thus hides notifications too.&lt;br /&gt;
* Windows 11 has priority settings for notifications. Ensure that VoIP notifications for calls are allowed any maybe also include myApps as an App which is allowed to show notifications.&lt;br /&gt;
&lt;br /&gt;
== OS settings for Android ==&lt;br /&gt;
; Events : The appearance of notifications can be controlled here.&lt;br /&gt;
&lt;br /&gt;
; Call accounts : For proper incoming call signaling, the call account &#039;&#039;myApps&#039;&#039; needs to be enabled. Note that on Samsung smartphones the call account switch likely toggles back and a few tries may need to be done until it persists. Please double-check the state.&lt;br /&gt;
&lt;br /&gt;
; Preferred Calling Account : Choose which calling account (myApps/SIM/..) should be used for outgoing calls initiated from within the native phone app / phone book.&lt;br /&gt;
&lt;br /&gt;
; Background data, unlimited data usage : Grant background data use to enable &#039;&#039;myApps&#039;&#039; to connect to the PBX immediately on an incoming call.&lt;br /&gt;
&lt;br /&gt;
; Overlaying : This setting is not needed if call account &#039;&#039;myApps&#039;&#039; has been enabled. Should there be a reason for not enabling call account &#039;&#039;myApps&#039;&#039;, the permission for overlaying needs to be granted on Android 10 or higher for proper call signaling.&lt;br /&gt;
&lt;br /&gt;
Note: If no SIM card is installed some Android smartphones exhibit a problem dialing from the smartphone contacts. The contacts app shows a choice &#039;&#039;Select SIM card for this call&#039;&#039; but all possible dialers are greyed out. In this case make myApps the default phone app in Android settings &#039;&#039;Apps, Default apps, Telephony&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for iOS ==&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in iOS &#039;&#039;Settings, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for macOS ==&lt;br /&gt;
&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in macOS &#039;&#039;Preferences, Notifications, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
myApps platform services can write various traces for debugging.  Trace can be turned on and off selectively in the [[#Advanced settings|Advanced settings]].&lt;br /&gt;
&lt;br /&gt;
The following trace flags can be set:&lt;br /&gt;
&lt;br /&gt;
(&#039;&#039;Recommended trace options are: &#039;&#039;&#039;App, Browser, ICE, TURN, Signaling and Audio&#039;&#039;&#039;. Please do not activate other flags unless innovaphone support says otherwise&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |  Abbreviation&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |code&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| App||0x000000001|| logs from the App Service itself&lt;br /&gt;
|-&lt;br /&gt;
| DNS||0x000000008|| logs DNS requests and results&lt;br /&gt;
|-&lt;br /&gt;
| HTTP client||0x000000080|| http client logs&lt;br /&gt;
|-&lt;br /&gt;
| TLS||0x000000400|| TLS logs&lt;br /&gt;
|-&lt;br /&gt;
| TCP||0x000000800|| TCP logs&lt;br /&gt;
|-&lt;br /&gt;
| LDS||0x000001000|| local domain sockets&lt;br /&gt;
|-&lt;br /&gt;
| WebSocket client||0x000004000|| logs outgoing websocket connections&lt;br /&gt;
|-&lt;br /&gt;
| App WebSocket||0x000008000|| logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
|-&lt;br /&gt;
| UDP||0x000200000|| UDP logs&lt;br /&gt;
|-&lt;br /&gt;
| DTLS||0x000400000|| logs DTLS handshake and messages&lt;br /&gt;
|-&lt;br /&gt;
| Media||0x000800000|| logs media events&lt;br /&gt;
|-&lt;br /&gt;
| Media channel||0x001000000|| logs RTP/SCTP media connections&lt;br /&gt;
|-&lt;br /&gt;
| ICE||0x002000000|| logs ICE messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| TURN||0x004000000|| logs TURN messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| AppSharing||0x008000000|| logs AppSharing connection&lt;br /&gt;
|-&lt;br /&gt;
| Audio||0x010000000|| logs Audio connection and headset events&lt;br /&gt;
|-&lt;br /&gt;
| Video||0x020000000|| logs video connection and webcam events&lt;br /&gt;
|-&lt;br /&gt;
| Browser||0x040000000|| logs Chromium events&lt;br /&gt;
|-&lt;br /&gt;
| AppProxy||0x080000000|| logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
|-&lt;br /&gt;
| Webserver ||0x200000000|| enables webserver specific logs&lt;br /&gt;
|-&lt;br /&gt;
| Browser Console ||0x400000000|| logs browser console events&lt;br /&gt;
|-&lt;br /&gt;
| Signaling||0x800000000|| enables logs in the signaling module for debugging calls&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;code&#039;&#039; can be or&#039;ed and used as value for the &#039;&#039;Log flags&#039;&#039; field in [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps/Client Settings]].&lt;br /&gt;
&lt;br /&gt;
; Windows :On Windows, traces are written to the &amp;lt;code&amp;gt;%LOCALAPPDATA%\innovaphone\myApps&amp;lt;/code&amp;gt; directory. If you start myApps with --log-size as parameter, you can define the maximum size of a log file (e.g. --log-size=100000000 would be 100MB for each file)&lt;br /&gt;
&lt;br /&gt;
:* myApps-&#039;&#039;date-time&#039;&#039;.txt : main log file for the platform services&lt;br /&gt;
&lt;br /&gt;
:* myAppsOutlookSearch-&#039;&#039;date-time&#039;&#039;.txt : log file for the Outlook phone book access&lt;br /&gt;
&lt;br /&gt;
:* myAppsHookController-&#039;&#039;date-time&#039;&#039;.txt : log file for the hot-key interceptor (see [[#Hot keys|Hot keys]])&lt;br /&gt;
&lt;br /&gt;
; :myApps update installation traces are written to the &amp;lt;code&amp;gt;%windir%\temp\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsInstall.txt: MSI installation file&lt;br /&gt;
&lt;br /&gt;
; :myApps update service traces are written to the &amp;lt;code&amp;gt;%ProgramData%\innovaphone\myAppsUpdateService&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsUpdateService-&#039;&#039;date-time&#039;&#039;.txt: myApps update service traces&lt;br /&gt;
&lt;br /&gt;
;Android : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
: also, an Android device might also be connected to a PC via an USB cable to get the traces. The files can be found in &amp;lt;code&amp;gt;Android/data/com.innovaphone.clientandroid/files&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
; macOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
: also, the files can be found in &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-ios/Data/Documents/&amp;lt;/code&amp;gt;. Press &#039;&#039;Alt+N&#039;&#039; followed by space to get tilde &#039;&#039;~&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Known Problems =&lt;br /&gt;
[[:Category:Problem myApps platform services|Known Problems]]&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Redundancy|Reference14r2:Concept_myApps_Redundancy]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Office_Integration|Reference14r2:Concept_myApps_Office_Integration]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myAPPs_Search_in_local-Outlook_Contacts|Reference14r2:Concept_myAPPs_Search_in_local-Outlook_Contacts]]&lt;br /&gt;
* [[{{NAMESPACE}}:Call_Detail_Record_CDR_PBX|Reference14r2:Call_Detail_Record_CDR_PBX]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept Push Notifications for myPBX iOS and Android|Reference14r2:Concept Push Notifications for myPBX iOS and Android]]&lt;br /&gt;
* [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept myApps platform services]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79247</id>
		<title>Reference16r1:Concept innovaphone App Platform Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79247"/>
		<updated>2026-03-24T13:47:29Z</updated>

		<summary type="html">&lt;p&gt;Dde: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=Below described feature is experimental and not officially supported for use in productive environments.}}&lt;br /&gt;
The innovaphone App Platform Container provides a myApps App Platform instance that includes the AP Manager, Webserver and PostgreSQL. This container offers a ready-to-use environment for myApps applications and the innovaphone PBX.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone App Platform Container&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Host with docker on a x86_64 (amd64) platform&lt;br /&gt;
* innovaphone App Platform Container&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
The innovaphone App Platform Container provides the innovaphone App Platform for container environments (Open Container Initiative (OCI) format). &lt;br /&gt;
&lt;br /&gt;
* The App Platform Manager and Webserver Apps are already integrated in the container and provide the already known functionality.&lt;br /&gt;
* Apps are installed, updated and managed as usual.&lt;br /&gt;
* The mount point will be used for the database, the App binaries and log files.&lt;br /&gt;
&lt;br /&gt;
==Image Information==&lt;br /&gt;
&lt;br /&gt;
This chapter provides details about the Docker image used for the innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
===Repository Details===&lt;br /&gt;
&lt;br /&gt;
;Repository Host : docker.innovaphone.com&lt;br /&gt;
;Image Name : cloud/kubernetes/innovaphone-platform-instance&lt;br /&gt;
&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
===Tagging and Versioning===&lt;br /&gt;
The image is usually tagged with the build number according to innovaphone software releases:&lt;br /&gt;
&lt;br /&gt;
;Latest Tag : Use the latest tag for pulling the most recent service release.&lt;br /&gt;
&lt;br /&gt;
;Release Build Number : For production or version-specific deployments, use a specific build number as the tag (e.g., 130006).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker pull docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
===Supported Architecture===&lt;br /&gt;
This Docker image supports the &amp;lt;code&amp;gt;linux/amd64&amp;lt;/code&amp;gt; architecture.&lt;br /&gt;
&lt;br /&gt;
===Image Reference===&lt;br /&gt;
An example of a full image reference using a specific release build number would be:&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
==Ports==&lt;br /&gt;
This chapter outlines the various ports exposed by the container. The webserver ports are available immediately upon container startup, after start of the AP Manager and the Webserver, while the additional application ports become active after the app installation. In most cases, a one-to-one mapping is used, meaning the container port is mapped directly to the same host port unless otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Ports &amp;lt; 1024===&lt;br /&gt;
On most docker hosts, a container won&#039;t be able to use ports below 1024, unless the container is started with higher privileges. &lt;br /&gt;
This shouldn&#039;t be neccessary anyways as all ports can be configured to higher ports.&lt;br /&gt;
&lt;br /&gt;
===Webserver Ports===&lt;br /&gt;
;HTTP:&lt;br /&gt;
Container Port: 8080&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
;HTTPS:&lt;br /&gt;
Container Port: 8082&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
=== Additional Application Ports===&lt;br /&gt;
Following additional container ports are avilable depending on installed and configured applications:&lt;br /&gt;
;H323/TLS : 1300&lt;br /&gt;
;SIP : 5060&lt;br /&gt;
;SIPS : 5061&lt;br /&gt;
;LDAPS : 1636&lt;br /&gt;
;SMTP : 8025&lt;br /&gt;
;SMTPS : 8587&lt;br /&gt;
;STUN/TURN : 3478 UDP/TCP&lt;br /&gt;
&#039;&#039;&#039;Additional hint for Portmapping&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
  --name=innovaphone \&lt;br /&gt;
  --restart unless-stopped \&lt;br /&gt;
  -p 9090:8080 \        #Container Host Port (external) 9090:8080 Container Port&lt;br /&gt;
  -p 9091:8082 \&lt;br /&gt;
  -p 5060:5060 \&lt;br /&gt;
  -p 5061:5061 \&lt;br /&gt;
  -p 1300:1300 \&lt;br /&gt;
  -p 1636:1636 \&lt;br /&gt;
  -p 8025:8025 \&lt;br /&gt;
  -p 8587:8587 \&lt;br /&gt;
  -p 3478:3478 \&lt;br /&gt;
  -p 3478:3478/udp \&lt;br /&gt;
  -v /path/of/data/innovaphone:/mnt/data \      #in this path you will find Apps, DBs &amp;amp; Logs&lt;br /&gt;
                                                #this path musst be used for backups!!&lt;br /&gt;
  -e WEBSERVERPORTHTTP=8080 \&lt;br /&gt;
  -e WEBSERVERPORTHTTPS=8082 \&lt;br /&gt;
  -e LOG_FLAGS=7 \&lt;br /&gt;
  -e LOG_SIZE=1048576 \&lt;br /&gt;
  -e DNSIPV4=8.8.8.8 \&lt;br /&gt;
  -e LIMIT_RAM=512 \        #Ram limit in MB&lt;br /&gt;
  -e LIMIT_DISK=10 \        #disk size in GB&lt;br /&gt;
  -e TZ=Europe/Berlin \&lt;br /&gt;
  docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Environment Variables (ENVs)==&lt;br /&gt;
This chapter outlines the key environment variables used to configure the behavior of the innovaphone App Platform Container. These variables allow you to customize logging, port settings, resource limits, and more during startup and runtime.&lt;br /&gt;
&lt;br /&gt;
;LOG_FLAGS : Defines the integer representation for the trace flags of the AP Manager, according flags activated under the AP Manager / Diagnostics. See browser console message on Save button press (e.g. &amp;quot;logFlags&amp;quot;:1 , if the &amp;quot;App&amp;quot; flag is activated).&lt;br /&gt;
 LOG_FLAGS=7&lt;br /&gt;
;LOG_SIZE : Specifies the maximum size in bytes for logs before rotation or management actions occur. Default: 5242880.&lt;br /&gt;
 LOG_SIZE=1048576&lt;br /&gt;
;WEBSERVERPORTHTTP : Sets the in-container HTTP port for the webserver. Default: 8080.&lt;br /&gt;
 WEBSERVERPORTHTTP=8080&lt;br /&gt;
;WEBSERVERPORTHTTPS : Sets the in-container HTTPS port for the webserver. Default: 8082.&lt;br /&gt;
 WEBSERVERPORTHTTPS=8443&lt;br /&gt;
;DNSIPV4 : Specifies the in-container DNS server IPv4 address for DNS resolution. Overrides the default container runtime DNS server.&lt;br /&gt;
 DNSIPV4=8.8.8.8&lt;br /&gt;
;DNS_DOMAIN : The FQDN of the App Platform that can be used to access the app services. This optional parameter is used as a static DNS entry added to /etc/hosts. The destination IP address is the resolved IP address behind INTERNAL_DNS_DOMAIN or NAMESPACE.&lt;br /&gt;
 DNS_DOMAIN=ap.example.com&lt;br /&gt;
;INTERNAL_DNS_DOMAIN : The internal FQDN of the App Platform. This FQDN is used to resolve the internal IP address of the App Platform, to be mapped from DNS_DOMAIN in /etc/hosts.&lt;br /&gt;
 INTERNAL_DNS_DOMAIN=my-apps-deployment.my-namespace.svc.cluster.local&lt;br /&gt;
;NAMESPACE : The Kubernetes namespace used to build internal FQDN of the App Platform. Used with DNS_DOMAIN to map it to the IP address of ap.my-namespace.svc.cluster.local.&lt;br /&gt;
 NAMESPACE=my-namespace&lt;br /&gt;
;LIMIT_RAM : Sets the RAM limit for the container, in MB, controlling how much memory it may consume. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_RAM=512&lt;br /&gt;
;LIMIT_DISK : Defines the disk space limit in GB for the container to manage storage consumption. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_DISK=10&lt;br /&gt;
&lt;br /&gt;
==File limits==&lt;br /&gt;
Containers may have a default file limit per process, e.g. 1024 files. Depending on your installation and usage, this value is too small and you need to allow more, e.g. handing this in the docker run command:&lt;br /&gt;
 --ulimit nofile=1000000:1000000&lt;br /&gt;
&lt;br /&gt;
==Volumes and Mounts==&lt;br /&gt;
This container uses a dedicated internal mount path for the persistent data management across container restarts and updates.&lt;br /&gt;
&lt;br /&gt;
===Internal Data Volume===&lt;br /&gt;
;Mount Path : &amp;lt;code&amp;gt;/mnt/data&amp;lt;/code&amp;gt;&lt;br /&gt;
;Contents:&lt;br /&gt;
*Apps: Installed application binaries.&lt;br /&gt;
*Databases: PostgreSQL files.&lt;br /&gt;
*Logging: Log files for system and application events.&lt;br /&gt;
&lt;br /&gt;
===Mounting===&lt;br /&gt;
To ensure that your data is preserved, map a host directory or Docker named volume to the container&#039;s /mnt/data path when running the container.&lt;br /&gt;
For example:&lt;br /&gt;
 docker run -d -v /path/on/host:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
This setup guarantees that your apps, associated data, databases, and logs persist independently of the container lifecycle.&lt;br /&gt;
&lt;br /&gt;
==Entrypoint==&lt;br /&gt;
The container uses a fixed entrypoint:&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/entrypoint.sh&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
This script prepares the container and starts the AP Manager executable.&lt;br /&gt;
&lt;br /&gt;
==Logging and Monitoring==&lt;br /&gt;
The log of the entrypoint.sh and of the AP manager is avilable as conatiner output. The installed applications store the ir log files under &amp;lt;code&amp;gt;/mnt/data/var/log/apps/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Unexpected high system load ===&lt;br /&gt;
If you encounter a high load, you need to verify whether the load is actually coming from your container. Docker containers always display the load of the physical host system.&lt;br /&gt;
&lt;br /&gt;
It may be that the Docker host itself is also virtualized as an LXC container, and your Docker instances are running within it. In such a setup, the system load of the physical host is displayed because &amp;lt;code&amp;gt;/proc/loadavg&amp;lt;/code&amp;gt; is not isolated per logical layer.&lt;br /&gt;
&lt;br /&gt;
An increased load in the container therefore does not automatically mean that the container itself is the cause or that you have a problem at all. In short: To assess the load, you always need information (e.g., number of CPU cores or I/O information) from the physical host.&lt;br /&gt;
&lt;br /&gt;
==Usage Example==&lt;br /&gt;
 sudo docker run -d --ulimit nofile=1000000:1000000 --restart unless-stopped --name innovaphoneAP -p 9090:8080 -p 9091:8082 -e WEBSERVERPORTHTTP=8080 -e WEBSERVERPORTHTTPS=8082 -v $(pwd)/myapps/:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
This command runs the container in detached mode with automatic restart. It names the container innovaphoneAP, maps host ports 9090 and 9091 to the container&#039;s HTTP and HTTPS ports, sets the webserver port environment variables, mounts a host directory to /mnt/data, and starts the AP Manager. After container start up the AP manager web UI is accessible via &amp;lt;code&amp;gt;http://localhost:9090&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://localhost:9091&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79206</id>
		<title>Reference16r1:Concept innovaphone App Platform Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79206"/>
		<updated>2026-03-19T08:40:10Z</updated>

		<summary type="html">&lt;p&gt;Dde: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=Below described feature is experimental and not officially supported for use in productive environments.}}&lt;br /&gt;
The innovaphone App Platform Container provides a myApps App Platform instance that includes the AP Manager, Webserver and PostgreSQL. This container offers a ready-to-use environment for myApps applications and the innovaphone PBX.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone App Platform Container&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Host with docker on a x86_64 (amd64) platform&lt;br /&gt;
* innovaphone App Platform Container&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
The innovaphone App Platform Container provides the innovaphone App Platform for container environments (Open Container Initiative (OCI) format). &lt;br /&gt;
&lt;br /&gt;
* The App Platform Manager and Webserver Apps are already integrated in the container and provide the already known functionality.&lt;br /&gt;
* Apps are installed, updated and managed as usual.&lt;br /&gt;
* The mount point will be used for the database, the App binaries and log files.&lt;br /&gt;
&lt;br /&gt;
==Image Information==&lt;br /&gt;
&lt;br /&gt;
This chapter provides details about the Docker image used for the innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
===Repository Details===&lt;br /&gt;
&lt;br /&gt;
;Repository Host : docker.innovaphone.com&lt;br /&gt;
;Image Name : cloud/kubernetes/innovaphone-platform-instance&lt;br /&gt;
&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
===Tagging and Versioning===&lt;br /&gt;
The image is usually tagged with the build number according to innovaphone software releases:&lt;br /&gt;
&lt;br /&gt;
;Latest Tag : Use the latest tag for pulling the most recent service release.&lt;br /&gt;
&lt;br /&gt;
;Release Build Number : For production or version-specific deployments, use a specific build number as the tag (e.g., 130006).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker pull docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
===Supported Architecture===&lt;br /&gt;
This Docker image supports the &amp;lt;code&amp;gt;linux/amd64&amp;lt;/code&amp;gt; architecture.&lt;br /&gt;
&lt;br /&gt;
===Image Reference===&lt;br /&gt;
An example of a full image reference using a specific release build number would be:&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
==Ports==&lt;br /&gt;
This chapter outlines the various ports exposed by the container. The webserver ports are available immediately upon container startup, after start of the AP Manager and the Webserver, while the additional application ports become active after the app installation. In most cases, a one-to-one mapping is used, meaning the container port is mapped directly to the same host port unless otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Ports &amp;lt; 1024===&lt;br /&gt;
On most docker hosts, a container won&#039;t be able to use ports below 1024, unless the container is started with higher privileges. &lt;br /&gt;
This shouldn&#039;t be neccessary anyways as all ports can be configured to higher ports.&lt;br /&gt;
&lt;br /&gt;
===Webserver Ports===&lt;br /&gt;
;HTTP:&lt;br /&gt;
Container Port: 8080&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
;HTTPS:&lt;br /&gt;
Container Port: 8082&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
=== Additional Application Ports===&lt;br /&gt;
Following additional container ports are avilable depending on installed and configured applications:&lt;br /&gt;
;H323/TLS : 1300&lt;br /&gt;
;SIP : 5060&lt;br /&gt;
;SIPS : 5061&lt;br /&gt;
;LDAPS : 1636&lt;br /&gt;
;SMTP : 8025&lt;br /&gt;
;SMTPS : 8587&lt;br /&gt;
;STUN/TURN : 3478 UDP/TCP&lt;br /&gt;
&#039;&#039;&#039;Additional hint for Portmapping&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
  --name=innovaphone \&lt;br /&gt;
  --restart unless-stopped \&lt;br /&gt;
  -p 9090:8080 \        #Container Host Port (external) 9090:8080 Container Port&lt;br /&gt;
  -p 9091:8082 \&lt;br /&gt;
  -p 5060:5060 \&lt;br /&gt;
  -p 5061:5061 \&lt;br /&gt;
  -p 1300:1300 \&lt;br /&gt;
  -p 1636:1636 \&lt;br /&gt;
  -p 8025:8025 \&lt;br /&gt;
  -p 8587:8587 \&lt;br /&gt;
  -p 3478:3478 \&lt;br /&gt;
  -p 3478:3478/udp \&lt;br /&gt;
  -v /path/of/data/innovaphone:/mnt/data \      #in this path you will find Apps, DBs &amp;amp; Logs&lt;br /&gt;
                                                #this path musst be used for backups!!&lt;br /&gt;
  -e WEBSERVERPORTHTTP=8080 \&lt;br /&gt;
  -e WEBSERVERPORTHTTPS=8082 \&lt;br /&gt;
  -e LOG_FLAGS=7 \&lt;br /&gt;
  -e LOG_SIZE=1048576 \&lt;br /&gt;
  -e DNSIPV4=8.8.8.8 \&lt;br /&gt;
  -e LIMIT_RAM=512 \        #Ram limit in MB&lt;br /&gt;
  -e LIMIT_DISK=10 \        #disk size in GB&lt;br /&gt;
  -e TZ=Europe/Berlin \&lt;br /&gt;
  docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Environment Variables (ENVs)==&lt;br /&gt;
This chapter outlines the key environment variables used to configure the behavior of the innovaphone App Platform Container. These variables allow you to customize logging, port settings, resource limits, and more during startup and runtime.&lt;br /&gt;
&lt;br /&gt;
;LOG_FLAGS : Defines the integer representation for the trace flags of the AP Manager, according flags activated under the AP Manager / Diagnostics. See browser console message on Save button press (e.g. &amp;quot;logFlags&amp;quot;:1 , if the &amp;quot;App&amp;quot; flag is activated).&lt;br /&gt;
 LOG_FLAGS=7&lt;br /&gt;
;LOG_SIZE : Specifies the maximum size in bytes for logs before rotation or management actions occur. Default: 5242880.&lt;br /&gt;
 LOG_SIZE=1048576&lt;br /&gt;
;WEBSERVERPORTHTTP : Sets the in-container HTTP port for the webserver. Default: 8080.&lt;br /&gt;
 WEBSERVERPORTHTTP=8080&lt;br /&gt;
;WEBSERVERPORTHTTPS : Sets the in-container HTTPS port for the webserver. Default: 8082.&lt;br /&gt;
 WEBSERVERPORTHTTPS=8443&lt;br /&gt;
;DNSIPV4 : Specifies the in-container DNS server IPv4 address for DNS resolution. Overrides the default container runtime DNS server.&lt;br /&gt;
 DNSIPV4=8.8.8.8&lt;br /&gt;
;DNS_DOMAIN : The FQDN of the App Platform that can be used to access the app services. This optional parameter is used as a static DNS entry added to /etc/hosts. The destination IP address is the resolved IP address behind INTERNAL_DNS_DOMAIN or NAMESPACE.&lt;br /&gt;
 DNS_DOMAIN=ap.example.com&lt;br /&gt;
;INTERNAL_DNS_DOMAIN : The internal FQDN of the App Platform. This FQDN is used to resolve the internal IP address of the App Platform, to be mapped from DNS_DOMAIN in /etc/hosts.&lt;br /&gt;
 INTERNAL_DNS_DOMAIN=my-apps-deployment.my-namespace.svc.cluster.local&lt;br /&gt;
;NAMESPACE : The Kubernetes namespace used to build internal FQDN of the App Platform. Used with DNS_DOMAIN to map it to the IP address of ap.my-namespace.svc.cluster.local.&lt;br /&gt;
 NAMESPACE=my-namespace&lt;br /&gt;
;LIMIT_RAM : Sets the RAM limit for the container, in MB, controlling how much memory it may consume. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_RAM=512&lt;br /&gt;
;LIMIT_DISK : Defines the disk space limit in GB for the container to manage storage consumption. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_DISK=10&lt;br /&gt;
&lt;br /&gt;
==Volumes and Mounts==&lt;br /&gt;
This container uses a dedicated internal mount path for the persistent data management across container restarts and updates.&lt;br /&gt;
&lt;br /&gt;
===Internal Data Volume===&lt;br /&gt;
;Mount Path : &amp;lt;code&amp;gt;/mnt/data&amp;lt;/code&amp;gt;&lt;br /&gt;
;Contents:&lt;br /&gt;
*Apps: Installed application binaries.&lt;br /&gt;
*Databases: PostgreSQL files.&lt;br /&gt;
*Logging: Log files for system and application events.&lt;br /&gt;
&lt;br /&gt;
===Mounting===&lt;br /&gt;
To ensure that your data is preserved, map a host directory or Docker named volume to the container&#039;s /mnt/data path when running the container.&lt;br /&gt;
For example:&lt;br /&gt;
 docker run -d -v /path/on/host:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
This setup guarantees that your apps, associated data, databases, and logs persist independently of the container lifecycle.&lt;br /&gt;
&lt;br /&gt;
==Entrypoint==&lt;br /&gt;
The container uses a fixed entrypoint:&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/entrypoint.sh&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
This script prepares the container and starts the AP Manager executable.&lt;br /&gt;
&lt;br /&gt;
==Logging and Monitoring==&lt;br /&gt;
The log of the entrypoint.sh and of the AP manager is avilable as conatiner output. The installed applications store the ir log files under &amp;lt;code&amp;gt;/mnt/data/var/log/apps/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Usage Example==&lt;br /&gt;
 sudo docker run -d --restart unless-stopped --name innovaphoneAP -p 9090:8080 -p 9091:8082 -e WEBSERVERPORTHTTP=8080 -e WEBSERVERPORTHTTPS=8082 -v $(pwd)/myapps/:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
This command runs the container in detached mode with automatic restart. It names the container innovaphoneAP, maps host ports 9090 and 9091 to the container&#039;s HTTP and HTTPS ports, sets the webserver port environment variables, mounts a host directory to /mnt/data, and starts the AP Manager. After container start up the AP manager web UI is accessible via &amp;lt;code&amp;gt;http://localhost:9090&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://localhost:9091&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79204</id>
		<title>Reference16r1:Concept innovaphone App Platform Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79204"/>
		<updated>2026-03-19T08:38:39Z</updated>

		<summary type="html">&lt;p&gt;Dde: Dde moved page Reference16r1:Concept innovaphone App Platform Docker Container to Reference16r1:Concept innovaphone App Platform Container&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=Below described feature is experimental and not officially supported for use in productive environments.}}&lt;br /&gt;
The innovaphone App Platform Docker container provides a myApps App Platform instance that includes the AP Manager, Webserver and PostgreSQL. This container offers a ready-to-use environment for myApps applications and the innovaphone PBX.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone App Platform Docker Container&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Host with docker on a x86_64 (amd64) platform&lt;br /&gt;
* innovaphone App Platform Docker Container&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
The innovaphone App Platform Docker Container provides the innovaphone App Platform for docker environments. &lt;br /&gt;
&lt;br /&gt;
* The App Platform Manager and Webserver Apps are already integrated in the container and provide the already known functionality.&lt;br /&gt;
* Apps are installed, updated and managed as usual.&lt;br /&gt;
* The mount point will be used for the database, the App binaries and log files.&lt;br /&gt;
&lt;br /&gt;
==Image Information==&lt;br /&gt;
&lt;br /&gt;
This chapter provides details about the Docker image used for the innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
===Repository Details===&lt;br /&gt;
&lt;br /&gt;
;Repository Host : docker.innovaphone.com&lt;br /&gt;
;Image Name : cloud/kubernetes/innovaphone-platform-instance&lt;br /&gt;
&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
===Tagging and Versioning===&lt;br /&gt;
The image is usually tagged with the build number according to innovaphone software releases:&lt;br /&gt;
&lt;br /&gt;
;Latest Tag : Use the latest tag for pulling the most recent service release.&lt;br /&gt;
&lt;br /&gt;
;Release Build Number : For production or version-specific deployments, use a specific build number as the tag (e.g., 130006).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker pull docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
===Supported Architecture===&lt;br /&gt;
This Docker image supports the &amp;lt;code&amp;gt;linux/amd64&amp;lt;/code&amp;gt; architecture.&lt;br /&gt;
&lt;br /&gt;
===Image Reference===&lt;br /&gt;
An example of a full image reference using a specific release build number would be:&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
==Ports==&lt;br /&gt;
This chapter outlines the various ports exposed by the Docker container. The webserver ports are available immediately upon container startup, after start of the AP Manager and the Webserver, while the additional application ports become active after the app installation. In most cases, a one-to-one mapping is used, meaning the container port is mapped directly to the same host port unless otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Ports &amp;lt; 1024===&lt;br /&gt;
On most docker hosts, a container won&#039;t be able to use ports below 1024, unless the container is started with higher privileges. &lt;br /&gt;
This shouldn&#039;t be neccessary anyways as all ports can be configured to higher ports.&lt;br /&gt;
&lt;br /&gt;
===Webserver Ports===&lt;br /&gt;
;HTTP:&lt;br /&gt;
Container Port: 8080&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
;HTTPS:&lt;br /&gt;
Container Port: 8082&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
=== Additional Application Ports===&lt;br /&gt;
Following additional container ports are avilable depending on installed and configured applications:&lt;br /&gt;
;H323/TLS : 1300&lt;br /&gt;
;SIP : 5060&lt;br /&gt;
;SIPS : 5061&lt;br /&gt;
;LDAPS : 1636&lt;br /&gt;
;SMTP : 8025&lt;br /&gt;
;SMTPS : 8587&lt;br /&gt;
;STUN/TURN : 3478 UDP/TCP&lt;br /&gt;
&#039;&#039;&#039;Additional hint for Portmapping&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
  --name=innovaphone \&lt;br /&gt;
  --restart unless-stopped \&lt;br /&gt;
  -p 9090:8080 \        #Container Host Port (external) 9090:8080 Container Port&lt;br /&gt;
  -p 9091:8082 \&lt;br /&gt;
  -p 5060:5060 \&lt;br /&gt;
  -p 5061:5061 \&lt;br /&gt;
  -p 1300:1300 \&lt;br /&gt;
  -p 1636:1636 \&lt;br /&gt;
  -p 8025:8025 \&lt;br /&gt;
  -p 8587:8587 \&lt;br /&gt;
  -p 3478:3478 \&lt;br /&gt;
  -p 3478:3478/udp \&lt;br /&gt;
  -v /path/of/data/innovaphone:/mnt/data \      #in this path you will find Apps, DBs &amp;amp; Logs&lt;br /&gt;
                                                #this path musst be used for backups!!&lt;br /&gt;
  -e WEBSERVERPORTHTTP=8080 \&lt;br /&gt;
  -e WEBSERVERPORTHTTPS=8082 \&lt;br /&gt;
  -e LOG_FLAGS=7 \&lt;br /&gt;
  -e LOG_SIZE=1048576 \&lt;br /&gt;
  -e DNSIPV4=8.8.8.8 \&lt;br /&gt;
  -e LIMIT_RAM=512 \        #Ram limit in MB&lt;br /&gt;
  -e LIMIT_DISK=10 \        #disk size in GB&lt;br /&gt;
  -e TZ=Europe/Berlin \&lt;br /&gt;
  docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Environment Variables (ENVs)==&lt;br /&gt;
This chapter outlines the key environment variables used to configure the behavior of the innovaphone App Platform Docker container. These variables allow you to customize logging, port settings, resource limits, and more during startup and runtime.&lt;br /&gt;
&lt;br /&gt;
;LOG_FLAGS : Defines the integer representation for the trace flags of the AP Manager, according flags activated under the AP Manager / Diagnostics. See browser console message on Save button press (e.g. &amp;quot;logFlags&amp;quot;:1 , if the &amp;quot;App&amp;quot; flag is activated).&lt;br /&gt;
 LOG_FLAGS=7&lt;br /&gt;
;LOG_SIZE : Specifies the maximum size in bytes for logs before rotation or management actions occur. Default: 5242880.&lt;br /&gt;
 LOG_SIZE=1048576&lt;br /&gt;
;WEBSERVERPORTHTTP : Sets the in-container HTTP port for the webserver. Default: 8080.&lt;br /&gt;
 WEBSERVERPORTHTTP=8080&lt;br /&gt;
;WEBSERVERPORTHTTPS : Sets the in-container HTTPS port for the webserver. Default: 8082.&lt;br /&gt;
 WEBSERVERPORTHTTPS=8443&lt;br /&gt;
;DNSIPV4 : Specifies the in-container DNS server IPv4 address for DNS resolution. Overrides the default container runtime DNS server.&lt;br /&gt;
 DNSIPV4=8.8.8.8&lt;br /&gt;
;DNS_DOMAIN : The FQDN of the App Platform that can be used to access the app services. This optional parameter is used as a static DNS entry added to /etc/hosts. The destination IP address is the resolved IP address behind INTERNAL_DNS_DOMAIN or NAMESPACE.&lt;br /&gt;
 DNS_DOMAIN=ap.example.com&lt;br /&gt;
;INTERNAL_DNS_DOMAIN : The internal FQDN of the App Platform. This FQDN is used to resolve the internal IP address of the App Platform, to be mapped from DNS_DOMAIN in /etc/hosts.&lt;br /&gt;
 INTERNAL_DNS_DOMAIN=my-apps-deployment.my-namespace.svc.cluster.local&lt;br /&gt;
;NAMESPACE : The Kubernetes namespace used to build internal FQDN of the App Platform. Used with DNS_DOMAIN to map it to the IP address of ap.my-namespace.svc.cluster.local.&lt;br /&gt;
 NAMESPACE=my-namespace&lt;br /&gt;
;LIMIT_RAM : Sets the RAM limit for the container, in MB, controlling how much memory it may consume. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_RAM=512&lt;br /&gt;
;LIMIT_DISK : Defines the disk space limit in GB for the container to manage storage consumption. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_DISK=10&lt;br /&gt;
&lt;br /&gt;
==Volumes and Mounts==&lt;br /&gt;
This container uses a dedicated internal mount path for the persistent data management across container restarts and updates.&lt;br /&gt;
&lt;br /&gt;
===Internal Data Volume===&lt;br /&gt;
;Mount Path : &amp;lt;code&amp;gt;/mnt/data&amp;lt;/code&amp;gt;&lt;br /&gt;
;Contents:&lt;br /&gt;
*Apps: Installed application binaries.&lt;br /&gt;
*Databases: PostgreSQL files.&lt;br /&gt;
*Logging: Log files for system and application events.&lt;br /&gt;
&lt;br /&gt;
===Mounting===&lt;br /&gt;
To ensure that your data is preserved, map a host directory or Docker named volume to the container&#039;s /mnt/data path when running the container.&lt;br /&gt;
For example:&lt;br /&gt;
 docker run -d -v /path/on/host:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
This setup guarantees that your apps, associated data, databases, and logs persist independently of the container lifecycle.&lt;br /&gt;
&lt;br /&gt;
==Entrypoint==&lt;br /&gt;
The container uses a fixed entrypoint:&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/entrypoint.sh&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
This script prepares the container and starts the AP Manager executable.&lt;br /&gt;
&lt;br /&gt;
==Logging and Monitoring==&lt;br /&gt;
The log of the entrypoint.sh and of the AP manager is avilable as conatiner output. The installed applications store the ir log files under &amp;lt;code&amp;gt;/mnt/data/var/log/apps/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Usage Example==&lt;br /&gt;
 sudo docker run -d --restart unless-stopped --name innovaphoneAP -p 9090:8080 -p 9091:8082 -e WEBSERVERPORTHTTP=8080 -e WEBSERVERPORTHTTPS=8082 -v $(pwd)/myapps/:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
This command runs the container in detached mode with automatic restart. It names the container innovaphoneAP, maps host ports 9090 and 9091 to the container&#039;s HTTP and HTTPS ports, sets the webserver port environment variables, mounts a host directory to /mnt/data, and starts the AP Manager. After container start up the AP manager web UI is accessible via &amp;lt;code&amp;gt;http://localhost:9090&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://localhost:9091&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79189</id>
		<title>Reference16r1:Concept innovaphone App Platform Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79189"/>
		<updated>2026-03-18T10:22:23Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Requirements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=Below described feature is experimental and not officially supported for use in productive environments.}}&lt;br /&gt;
The innovaphone App Platform Docker container provides a myApps App Platform instance that includes the AP Manager, Webserver and PostgreSQL. This container offers a ready-to-use environment for myApps applications and the innovaphone PBX.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone App Platform Docker Container&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Host with docker on a x86_64 (amd64) platform&lt;br /&gt;
* innovaphone App Platform Docker Container&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
The innovaphone App Platform Docker Container provides the innovaphone App Platform for docker environments. &lt;br /&gt;
&lt;br /&gt;
* The App Platform Manager and Webserver Apps are already integrated in the container and provide the already known functionality.&lt;br /&gt;
* Apps are installed, updated and managed as usual.&lt;br /&gt;
* The mount point will be used for the database, the App binaries and log files.&lt;br /&gt;
&lt;br /&gt;
==Image Information==&lt;br /&gt;
&lt;br /&gt;
This chapter provides details about the Docker image used for the innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
===Repository Details===&lt;br /&gt;
&lt;br /&gt;
;Repository Host : docker.innovaphone.com&lt;br /&gt;
;Image Name : cloud/kubernetes/innovaphone-platform-instance&lt;br /&gt;
&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
===Tagging and Versioning===&lt;br /&gt;
The image is usually tagged with the build number according to innovaphone software releases:&lt;br /&gt;
&lt;br /&gt;
;Latest Tag : Use the latest tag for pulling the most recent service release.&lt;br /&gt;
&lt;br /&gt;
;Release Build Number : For production or version-specific deployments, use a specific build number as the tag (e.g., 130006).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker pull docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
===Supported Architecture===&lt;br /&gt;
This Docker image supports the &amp;lt;code&amp;gt;linux/amd64&amp;lt;/code&amp;gt; architecture.&lt;br /&gt;
&lt;br /&gt;
===Image Reference===&lt;br /&gt;
An example of a full image reference using a specific release build number would be:&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
==Ports==&lt;br /&gt;
This chapter outlines the various ports exposed by the Docker container. The webserver ports are available immediately upon container startup, after start of the AP Manager and the Webserver, while the additional application ports become active after the app installation. In most cases, a one-to-one mapping is used, meaning the container port is mapped directly to the same host port unless otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Ports &amp;lt; 1024===&lt;br /&gt;
On most docker hosts, a container won&#039;t be able to use ports below 1024, unless the container is started with higher privileges. &lt;br /&gt;
This shouldn&#039;t be neccessary anyways as all ports can be configured to higher ports.&lt;br /&gt;
&lt;br /&gt;
===Webserver Ports===&lt;br /&gt;
;HTTP:&lt;br /&gt;
Container Port: 8080&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
;HTTPS:&lt;br /&gt;
Container Port: 8082&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
=== Additional Application Ports===&lt;br /&gt;
Following additional container ports are avilable depending on installed and configured applications:&lt;br /&gt;
;H323/TLS : 1300&lt;br /&gt;
;SIP : 5060&lt;br /&gt;
;SIPS : 5061&lt;br /&gt;
;LDAPS : 1636&lt;br /&gt;
;SMTP : 8025&lt;br /&gt;
;SMTPS : 8587&lt;br /&gt;
;STUN/TURN : 3478 UDP/TCP&lt;br /&gt;
&#039;&#039;&#039;Additional hint for Portmapping&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
  --name=innovaphone \&lt;br /&gt;
  --restart unless-stopped \&lt;br /&gt;
  -p 9090:8080 \        #Container Host Port (external) 9090:8080 Container Port&lt;br /&gt;
  -p 9091:8082 \&lt;br /&gt;
  -p 5060:5060 \&lt;br /&gt;
  -p 5061:5061 \&lt;br /&gt;
  -p 1300:1300 \&lt;br /&gt;
  -p 1636:1636 \&lt;br /&gt;
  -p 8025:8025 \&lt;br /&gt;
  -p 8587:8587 \&lt;br /&gt;
  -p 3478:3478 \&lt;br /&gt;
  -p 3478:3478/udp \&lt;br /&gt;
  -v /path/of/data/innovaphone:/mnt/data \      #in this path you will find Apps, DBs &amp;amp; Logs&lt;br /&gt;
                                                #this path musst be used for backups!!&lt;br /&gt;
  -e WEBSERVERPORTHTTP=8080 \&lt;br /&gt;
  -e WEBSERVERPORTHTTPS=8082 \&lt;br /&gt;
  -e LOG_FLAGS=7 \&lt;br /&gt;
  -e LOG_SIZE=1048576 \&lt;br /&gt;
  -e DNSIPV4=8.8.8.8 \&lt;br /&gt;
  -e LIMIT_RAM=512 \        #Ram limit in MB&lt;br /&gt;
  -e LIMIT_DISK=10 \        #disk size in GB&lt;br /&gt;
  -e TZ=Europe/Berlin \&lt;br /&gt;
  docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Environment Variables (ENVs)==&lt;br /&gt;
This chapter outlines the key environment variables used to configure the behavior of the innovaphone App Platform Docker container. These variables allow you to customize logging, port settings, resource limits, and more during startup and runtime.&lt;br /&gt;
&lt;br /&gt;
;LOG_FLAGS : Defines the integer representation for the trace flags of the AP Manager, according flags activated under the AP Manager / Diagnostics. See browser console message on Save button press (e.g. &amp;quot;logFlags&amp;quot;:1 , if the &amp;quot;App&amp;quot; flag is activated).&lt;br /&gt;
 LOG_FLAGS=7&lt;br /&gt;
;LOG_SIZE : Specifies the maximum size in bytes for logs before rotation or management actions occur. Default: 5242880.&lt;br /&gt;
 LOG_SIZE=1048576&lt;br /&gt;
;WEBSERVERPORTHTTP : Sets the in-container HTTP port for the webserver. Default: 8080.&lt;br /&gt;
 WEBSERVERPORTHTTP=8080&lt;br /&gt;
;WEBSERVERPORTHTTPS : Sets the in-container HTTPS port for the webserver. Default: 8082.&lt;br /&gt;
 WEBSERVERPORTHTTPS=8443&lt;br /&gt;
;DNSIPV4 : Specifies the in-container DNS server IPv4 address for DNS resolution. Overrides the default container runtime DNS server.&lt;br /&gt;
 DNSIPV4=8.8.8.8&lt;br /&gt;
;DNS_DOMAIN : The FQDN of the App Platform that can be used to access the app services. This optional parameter is used as a static DNS entry added to /etc/hosts. The destination IP address is the resolved IP address behind INTERNAL_DNS_DOMAIN or NAMESPACE.&lt;br /&gt;
 DNS_DOMAIN=ap.example.com&lt;br /&gt;
;INTERNAL_DNS_DOMAIN : The internal FQDN of the App Platform. This FQDN is used to resolve the internal IP address of the App Platform, to be mapped from DNS_DOMAIN in /etc/hosts.&lt;br /&gt;
 INTERNAL_DNS_DOMAIN=my-apps-deployment.my-namespace.svc.cluster.local&lt;br /&gt;
;NAMESPACE : The Kubernetes namespace used to build internal FQDN of the App Platform. Used with DNS_DOMAIN to map it to the IP address of ap.my-namespace.svc.cluster.local.&lt;br /&gt;
 NAMESPACE=my-namespace&lt;br /&gt;
;LIMIT_RAM : Sets the RAM limit for the container, in MB, controlling how much memory it may consume. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_RAM=512&lt;br /&gt;
;LIMIT_DISK : Defines the disk space limit in GB for the container to manage storage consumption. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_DISK=10&lt;br /&gt;
&lt;br /&gt;
==Volumes and Mounts==&lt;br /&gt;
This container uses a dedicated internal mount path for the persistent data management across container restarts and updates.&lt;br /&gt;
&lt;br /&gt;
===Internal Data Volume===&lt;br /&gt;
;Mount Path : &amp;lt;code&amp;gt;/mnt/data&amp;lt;/code&amp;gt;&lt;br /&gt;
;Contents:&lt;br /&gt;
*Apps: Installed application binaries.&lt;br /&gt;
*Databases: PostgreSQL files.&lt;br /&gt;
*Logging: Log files for system and application events.&lt;br /&gt;
&lt;br /&gt;
===Mounting===&lt;br /&gt;
To ensure that your data is preserved, map a host directory or Docker named volume to the container&#039;s /mnt/data path when running the container.&lt;br /&gt;
For example:&lt;br /&gt;
 docker run -d -v /path/on/host:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
This setup guarantees that your apps, associated data, databases, and logs persist independently of the container lifecycle.&lt;br /&gt;
&lt;br /&gt;
==Entrypoint==&lt;br /&gt;
The container uses a fixed entrypoint:&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/entrypoint.sh&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
This script prepares the container and starts the AP Manager executable.&lt;br /&gt;
&lt;br /&gt;
==Logging and Monitoring==&lt;br /&gt;
The log of the entrypoint.sh and of the AP manager is avilable as conatiner output. The installed applications store the ir log files under &amp;lt;code&amp;gt;/mnt/data/var/log/apps/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Usage Example==&lt;br /&gt;
 sudo docker run -d --restart unless-stopped --name innovaphoneAP -p 9090:8080 -p 9091:8082 -e WEBSERVERPORTHTTP=8080 -e WEBSERVERPORTHTTPS=8082 -v $(pwd)/myapps/:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
This command runs the container in detached mode with automatic restart. It names the container innovaphoneAP, maps host ports 9090 and 9091 to the container&#039;s HTTP and HTTPS ports, sets the webserver port environment variables, mounts a host directory to /mnt/data, and starts the AP Manager. After container start up the AP manager web UI is accessible via &amp;lt;code&amp;gt;http://localhost:9090&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://localhost:9091&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79170</id>
		<title>Reference16r1:Concept innovaphone App Platform Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79170"/>
		<updated>2026-03-17T08:08:18Z</updated>

		<summary type="html">&lt;p&gt;Dde: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=Below described feature is experimental and not officially supported for use in productive environments.}}&lt;br /&gt;
The innovaphone App Platform Docker container provides a myApps App Platform instance that includes the AP Manager, Webserver and PostgreSQL. This container offers a ready-to-use environment for myApps applications and the innovaphone PBX.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone App Platform Docker Container&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* Host with docker on a x86_64 (arm64) platform&lt;br /&gt;
* innovaphone App Platform Docker Container&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
The innovaphone App Platform Docker Container provides the innovaphone App Platform for docker environments. &lt;br /&gt;
&lt;br /&gt;
* The App Platform Manager and Webserver Apps are already integrated in the container and provide the already known functionality.&lt;br /&gt;
* Apps are installed, updated and managed as usual.&lt;br /&gt;
* The mount point will be used for the database, the App binaries and log files.&lt;br /&gt;
&lt;br /&gt;
==Image Information==&lt;br /&gt;
&lt;br /&gt;
This chapter provides details about the Docker image used for the innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
===Repository Details===&lt;br /&gt;
&lt;br /&gt;
;Repository Host : docker.innovaphone.com&lt;br /&gt;
;Image Name : cloud/kubernetes/innovaphone-platform-instance&lt;br /&gt;
&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
===Tagging and Versioning===&lt;br /&gt;
The image is usually tagged with the build number according to innovaphone software releases:&lt;br /&gt;
&lt;br /&gt;
;Latest Tag : Use the latest tag for pulling the most recent service release.&lt;br /&gt;
&lt;br /&gt;
;Release Build Number : For production or version-specific deployments, use a specific build number as the tag (e.g., 130006).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker pull docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
===Supported Architecture===&lt;br /&gt;
This Docker image supports the &amp;lt;code&amp;gt;linux/amd64&amp;lt;/code&amp;gt; architecture.&lt;br /&gt;
&lt;br /&gt;
===Image Reference===&lt;br /&gt;
An example of a full image reference using a specific release build number would be:&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
==Ports==&lt;br /&gt;
This chapter outlines the various ports exposed by the Docker container. The webserver ports are available immediately upon container startup, after start of the AP Manager and the Webserver, while the additional application ports become active after the app installation. In most cases, a one-to-one mapping is used, meaning the container port is mapped directly to the same host port unless otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Ports &amp;lt; 1024===&lt;br /&gt;
On most docker hosts, a container won&#039;t be able to use ports below 1024, unless the container is started with higher privileges. &lt;br /&gt;
This shouldn&#039;t be neccessary anyways as all ports can be configured to higher ports.&lt;br /&gt;
&lt;br /&gt;
===Webserver Ports===&lt;br /&gt;
;HTTP:&lt;br /&gt;
Container Port: 8080&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
;HTTPS:&lt;br /&gt;
Container Port: 8082&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
=== Additional Application Ports===&lt;br /&gt;
Following additional container ports are avilable depending on installed and configured applications:&lt;br /&gt;
;H323/TLS : 1300&lt;br /&gt;
;SIP : 5060&lt;br /&gt;
;SIPS : 5061&lt;br /&gt;
;LDAPS : 1636&lt;br /&gt;
;SMTP : 8025&lt;br /&gt;
;SMTPS : 8587&lt;br /&gt;
&#039;&#039;&#039;Additional hint for Portmapping&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
  --name=innovaphone \&lt;br /&gt;
  --restart unless-stopped \&lt;br /&gt;
  -p 9090:8080 \        #Container Host Port (external) 9090:8080 Container Port&lt;br /&gt;
  -p 9091:8082 \&lt;br /&gt;
  -p 5060:5060 \&lt;br /&gt;
  -p 5061:5061 \&lt;br /&gt;
  -p 1300:1300 \&lt;br /&gt;
  -p 1636:1636 \&lt;br /&gt;
  -p 8025:8025 \&lt;br /&gt;
  -p 8587:8587 \&lt;br /&gt;
  -v /path/of/data/innovaphone:/mnt/data \      #in this path you will find Apps, DBs &amp;amp; Logs&lt;br /&gt;
                                                #this path musst be used for backups!!&lt;br /&gt;
  -e WEBSERVERPORTHTTP=8080 \&lt;br /&gt;
  -e WEBSERVERPORTHTTPS=8082 \&lt;br /&gt;
  -e LOG_FLAGS=7 \&lt;br /&gt;
  -e LOG_SIZE=1048576 \&lt;br /&gt;
  -e DNSIPV4=8.8.8.8 \&lt;br /&gt;
  -e LIMIT_RAM=512 \        #Ram limit in MB&lt;br /&gt;
  -e LIMIT_DISK=10 \        #disk size in GB&lt;br /&gt;
  -e TZ=Europe/Berlin \&lt;br /&gt;
  docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Environment Variables (ENVs)==&lt;br /&gt;
This chapter outlines the key environment variables used to configure the behavior of the innovaphone App Platform Docker container. These variables allow you to customize logging, port settings, resource limits, and more during startup and runtime.&lt;br /&gt;
&lt;br /&gt;
;LOG_FLAGS : Defines the integer representation for the trace flags of the AP Manager, according flags activated under the AP Manager / Diagnostics. See browser console message on Save button press (e.g. &amp;quot;logFlags&amp;quot;:1 , if the &amp;quot;App&amp;quot; flag is activated).&lt;br /&gt;
 LOG_FLAGS=7&lt;br /&gt;
;LOG_SIZE : Specifies the maximum size in bytes for logs before rotation or management actions occur. Default: 5242880.&lt;br /&gt;
 LOG_SIZE=1048576&lt;br /&gt;
;WEBSERVERPORTHTTP : Sets the in-container HTTP port for the webserver. Default: 8080.&lt;br /&gt;
 WEBSERVERPORTHTTP=8080&lt;br /&gt;
;WEBSERVERPORTHTTPS : Sets the in-container HTTPS port for the webserver. Default: 8082.&lt;br /&gt;
 WEBSERVERPORTHTTPS=8443&lt;br /&gt;
;DNSIPV4 : Specifies the in-container DNS server IPv4 address for DNS resolution. Overrides the default container runtime DNS server.&lt;br /&gt;
 DNSIPV4=8.8.8.8&lt;br /&gt;
;DNS_DOMAIN : The FQDN of the App Platform that can be used to access the app services. This optional parameter is used as a static DNS entry added to /etc/hosts. The destination IP address is the resolved IP address behind INTERNAL_DNS_DOMAIN or NAMESPACE.&lt;br /&gt;
 DNS_DOMAIN=ap.example.com&lt;br /&gt;
;INTERNAL_DNS_DOMAIN : The internal FQDN of the App Platform. This FQDN is used to resolve the internal IP address of the App Platform, to be mapped from DNS_DOMAIN in /etc/hosts.&lt;br /&gt;
 INTERNAL_DNS_DOMAIN=my-apps-deployment.my-namespace.svc.cluster.local&lt;br /&gt;
;NAMESPACE : The Kubernetes namespace used to build internal FQDN of the App Platform. Used with DNS_DOMAIN to map it to the IP address of ap.my-namespace.svc.cluster.local.&lt;br /&gt;
 NAMESPACE=my-namespace&lt;br /&gt;
;LIMIT_RAM : Sets the RAM limit for the container, in MB, controlling how much memory it may consume. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_RAM=512&lt;br /&gt;
;LIMIT_DISK : Defines the disk space limit in GB for the container to manage storage consumption. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_DISK=10&lt;br /&gt;
&lt;br /&gt;
==Volumes and Mounts==&lt;br /&gt;
This container uses a dedicated internal mount path for the persistent data management across container restarts and updates.&lt;br /&gt;
&lt;br /&gt;
===Internal Data Volume===&lt;br /&gt;
;Mount Path : &amp;lt;code&amp;gt;/mnt/data&amp;lt;/code&amp;gt;&lt;br /&gt;
;Contents:&lt;br /&gt;
*Apps: Installed application binaries.&lt;br /&gt;
*Databases: PostgreSQL files.&lt;br /&gt;
*Logging: Log files for system and application events.&lt;br /&gt;
&lt;br /&gt;
===Mounting===&lt;br /&gt;
To ensure that your data is preserved, map a host directory or Docker named volume to the container&#039;s /mnt/data path when running the container.&lt;br /&gt;
For example:&lt;br /&gt;
 docker run -d -v /path/on/host:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
This setup guarantees that your apps, associated data, databases, and logs persist independently of the container lifecycle.&lt;br /&gt;
&lt;br /&gt;
==Entrypoint==&lt;br /&gt;
The container uses a fixed entrypoint:&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/entrypoint.sh&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
This script prepares the container and starts the AP Manager executable.&lt;br /&gt;
&lt;br /&gt;
==Logging and Monitoring==&lt;br /&gt;
The log of the entrypoint.sh and of the AP manager is avilable as conatiner output. The installed applications store the ir log files under &amp;lt;code&amp;gt;/mnt/data/var/log/apps/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Usage Example==&lt;br /&gt;
 sudo docker run -d --restart unless-stopped --name innovaphoneAP -p 9090:8080 -p 9091:8082 -e WEBSERVERPORTHTTP=8080 -e WEBSERVERPORTHTTPS=8082 -v $(pwd)/myapps/:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
This command runs the container in detached mode with automatic restart. It names the container innovaphoneAP, maps host ports 9090 and 9091 to the container&#039;s HTTP and HTTPS ports, sets the webserver port environment variables, mounts a host directory to /mnt/data, and starts the AP Manager. After container start up the AP manager web UI is accessible via &amp;lt;code&amp;gt;http://localhost:9090&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://localhost:9091&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79169</id>
		<title>Reference16r1:Concept innovaphone App Platform Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79169"/>
		<updated>2026-03-17T08:01:19Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Environment Variables (ENVs) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=Below described feature is experimental and not officially supported for use in productive environments.}}&lt;br /&gt;
The innovaphone App Platform Docker container provides a myApps App Platform instance that includes the AP Manager, Webserver and PostgreSQL. This container offers a ready-to-use environment for myApps applications and the innovaphone PBX.&lt;br /&gt;
&lt;br /&gt;
==Image Information==&lt;br /&gt;
&lt;br /&gt;
This chapter provides details about the Docker image used for the innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
===Repository Details===&lt;br /&gt;
&lt;br /&gt;
;Repository Host : docker.innovaphone.com&lt;br /&gt;
;Image Name : cloud/kubernetes/innovaphone-platform-instance&lt;br /&gt;
&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
===Tagging and Versioning===&lt;br /&gt;
The image is usually tagged with the build number according to innovaphone software releases:&lt;br /&gt;
&lt;br /&gt;
;Latest Tag : Use the latest tag for pulling the most recent service release.&lt;br /&gt;
&lt;br /&gt;
;Release Build Number : For production or version-specific deployments, use a specific build number as the tag (e.g., 130006).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker pull docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
===Supported Architecture===&lt;br /&gt;
This Docker image supports the &amp;lt;code&amp;gt;linux/amd64&amp;lt;/code&amp;gt; architecture.&lt;br /&gt;
&lt;br /&gt;
===Image Reference===&lt;br /&gt;
An example of a full image reference using a specific release build number would be:&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
==Ports==&lt;br /&gt;
This chapter outlines the various ports exposed by the Docker container. The webserver ports are available immediately upon container startup, after start of the AP Manager and the Webserver, while the additional application ports become active after the app installation. In most cases, a one-to-one mapping is used, meaning the container port is mapped directly to the same host port unless otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Ports &amp;lt; 1024===&lt;br /&gt;
On most docker hosts, a container won&#039;t be able to use ports below 1024, unless the container is started with higher privileges. &lt;br /&gt;
This shouldn&#039;t be neccessary anyways as all ports can be configured to higher ports.&lt;br /&gt;
&lt;br /&gt;
===Webserver Ports===&lt;br /&gt;
;HTTP:&lt;br /&gt;
Container Port: 8080&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
;HTTPS:&lt;br /&gt;
Container Port: 8082&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
=== Additional Application Ports===&lt;br /&gt;
Following additional container ports are avilable depending on installed and configured applications:&lt;br /&gt;
;H323/TLS : 1300&lt;br /&gt;
;SIP : 5060&lt;br /&gt;
;SIPS : 5061&lt;br /&gt;
;LDAPS : 1636&lt;br /&gt;
;SMTP : 8025&lt;br /&gt;
;SMTPS : 8587&lt;br /&gt;
&#039;&#039;&#039;Additional hint for Portmapping&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
  --name=innovaphone \&lt;br /&gt;
  --restart unless-stopped \&lt;br /&gt;
  -p 9090:8080 \        #Container Host Port (external) 9090:8080 Container Port&lt;br /&gt;
  -p 9091:8082 \&lt;br /&gt;
  -p 5060:5060 \&lt;br /&gt;
  -p 5061:5061 \&lt;br /&gt;
  -p 1300:1300 \&lt;br /&gt;
  -p 1636:1636 \&lt;br /&gt;
  -p 8025:8025 \&lt;br /&gt;
  -p 8587:8587 \&lt;br /&gt;
  -v /path/of/data/innovaphone:/mnt/data \      #in this path you will find Apps, DBs &amp;amp; Logs&lt;br /&gt;
                                                #this path musst be used for backups!!&lt;br /&gt;
  -e WEBSERVERPORTHTTP=8080 \&lt;br /&gt;
  -e WEBSERVERPORTHTTPS=8082 \&lt;br /&gt;
  -e LOG_FLAGS=7 \&lt;br /&gt;
  -e LOG_SIZE=1048576 \&lt;br /&gt;
  -e DNSIPV4=8.8.8.8 \&lt;br /&gt;
  -e LIMIT_RAM=512 \        #Ram limit in MB&lt;br /&gt;
  -e LIMIT_DISK=10 \        #disk size in GB&lt;br /&gt;
  -e TZ=Europe/Berlin \&lt;br /&gt;
  docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Environment Variables (ENVs)==&lt;br /&gt;
This chapter outlines the key environment variables used to configure the behavior of the innovaphone App Platform Docker container. These variables allow you to customize logging, port settings, resource limits, and more during startup and runtime.&lt;br /&gt;
&lt;br /&gt;
;LOG_FLAGS : Defines the integer representation for the trace flags of the AP Manager, according flags activated under the AP Manager / Diagnostics. See browser console message on Save button press (e.g. &amp;quot;logFlags&amp;quot;:1 , if the &amp;quot;App&amp;quot; flag is activated).&lt;br /&gt;
 LOG_FLAGS=7&lt;br /&gt;
;LOG_SIZE : Specifies the maximum size in bytes for logs before rotation or management actions occur. Default: 5242880.&lt;br /&gt;
 LOG_SIZE=1048576&lt;br /&gt;
;WEBSERVERPORTHTTP : Sets the in-container HTTP port for the webserver. Default: 8080.&lt;br /&gt;
 WEBSERVERPORTHTTP=8080&lt;br /&gt;
;WEBSERVERPORTHTTPS : Sets the in-container HTTPS port for the webserver. Default: 8082.&lt;br /&gt;
 WEBSERVERPORTHTTPS=8443&lt;br /&gt;
;DNSIPV4 : Specifies the in-container DNS server IPv4 address for DNS resolution. Overrides the default container runtime DNS server.&lt;br /&gt;
 DNSIPV4=8.8.8.8&lt;br /&gt;
;DNS_DOMAIN : The FQDN of the App Platform that can be used to access the app services. This optional parameter is used as a static DNS entry added to /etc/hosts. The destination IP address is the resolved IP address behind INTERNAL_DNS_DOMAIN or NAMESPACE.&lt;br /&gt;
 DNS_DOMAIN=ap.example.com&lt;br /&gt;
;INTERNAL_DNS_DOMAIN : The internal FQDN of the App Platform. This FQDN is used to resolve the internal IP address of the App Platform, to be mapped from DNS_DOMAIN in /etc/hosts.&lt;br /&gt;
 INTERNAL_DNS_DOMAIN=my-apps-deployment.my-namespace.svc.cluster.local&lt;br /&gt;
;NAMESPACE : The Kubernetes namespace used to build internal FQDN of the App Platform. Used with DNS_DOMAIN to map it to the IP address of ap.my-namespace.svc.cluster.local.&lt;br /&gt;
 NAMESPACE=my-namespace&lt;br /&gt;
;LIMIT_RAM : Sets the RAM limit for the container, in MB, controlling how much memory it may consume. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_RAM=512&lt;br /&gt;
;LIMIT_DISK : Defines the disk space limit in GB for the container to manage storage consumption. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_DISK=10&lt;br /&gt;
&lt;br /&gt;
==Volumes and Mounts==&lt;br /&gt;
This container uses a dedicated internal mount path for the persistent data management across container restarts and updates.&lt;br /&gt;
&lt;br /&gt;
===Internal Data Volume===&lt;br /&gt;
;Mount Path : &amp;lt;code&amp;gt;/mnt/data&amp;lt;/code&amp;gt;&lt;br /&gt;
;Contents:&lt;br /&gt;
*Apps: Installed application binaries.&lt;br /&gt;
*Databases: PostgreSQL files.&lt;br /&gt;
*Logging: Log files for system and application events.&lt;br /&gt;
&lt;br /&gt;
===Mounting===&lt;br /&gt;
To ensure that your data is preserved, map a host directory or Docker named volume to the container&#039;s /mnt/data path when running the container.&lt;br /&gt;
For example:&lt;br /&gt;
 docker run -d -v /path/on/host:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
This setup guarantees that your apps, associated data, databases, and logs persist independently of the container lifecycle.&lt;br /&gt;
&lt;br /&gt;
==Entrypoint==&lt;br /&gt;
The container uses a fixed entrypoint:&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/entrypoint.sh&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
This script prepares the container and starts the AP Manager executable.&lt;br /&gt;
&lt;br /&gt;
==Logging and Monitoring==&lt;br /&gt;
The log of the entrypoint.sh and of the AP manager is avilable as conatiner output. The installed applications store the ir log files under &amp;lt;code&amp;gt;/mnt/data/var/log/apps/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Usage Example==&lt;br /&gt;
 sudo docker run -d --restart unless-stopped --name innovaphoneAP -p 9090:8080 -p 9091:8082 -e WEBSERVERPORTHTTP=8080 -e WEBSERVERPORTHTTPS=8082 -v $(pwd)/myapps/:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
This command runs the container in detached mode with automatic restart. It names the container innovaphoneAP, maps host ports 9090 and 9091 to the container&#039;s HTTP and HTTPS ports, sets the webserver port environment variables, mounts a host directory to /mnt/data, and starts the AP Manager. After container start up the AP manager web UI is accessible via &amp;lt;code&amp;gt;http://localhost:9090&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://localhost:9091&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79168</id>
		<title>Reference16r1:Concept innovaphone App Platform Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79168"/>
		<updated>2026-03-17T08:00:39Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Environment Variables (ENVs) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=Below described feature is experimental and not officially supported for use in productive environments.}}&lt;br /&gt;
The innovaphone App Platform Docker container provides a myApps App Platform instance that includes the AP Manager, Webserver and PostgreSQL. This container offers a ready-to-use environment for myApps applications and the innovaphone PBX.&lt;br /&gt;
&lt;br /&gt;
==Image Information==&lt;br /&gt;
&lt;br /&gt;
This chapter provides details about the Docker image used for the innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
===Repository Details===&lt;br /&gt;
&lt;br /&gt;
;Repository Host : docker.innovaphone.com&lt;br /&gt;
;Image Name : cloud/kubernetes/innovaphone-platform-instance&lt;br /&gt;
&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
===Tagging and Versioning===&lt;br /&gt;
The image is usually tagged with the build number according to innovaphone software releases:&lt;br /&gt;
&lt;br /&gt;
;Latest Tag : Use the latest tag for pulling the most recent service release.&lt;br /&gt;
&lt;br /&gt;
;Release Build Number : For production or version-specific deployments, use a specific build number as the tag (e.g., 130006).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker pull docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
===Supported Architecture===&lt;br /&gt;
This Docker image supports the &amp;lt;code&amp;gt;linux/amd64&amp;lt;/code&amp;gt; architecture.&lt;br /&gt;
&lt;br /&gt;
===Image Reference===&lt;br /&gt;
An example of a full image reference using a specific release build number would be:&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
==Ports==&lt;br /&gt;
This chapter outlines the various ports exposed by the Docker container. The webserver ports are available immediately upon container startup, after start of the AP Manager and the Webserver, while the additional application ports become active after the app installation. In most cases, a one-to-one mapping is used, meaning the container port is mapped directly to the same host port unless otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Ports &amp;lt; 1024===&lt;br /&gt;
On most docker hosts, a container won&#039;t be able to use ports below 1024, unless the container is started with higher privileges. &lt;br /&gt;
This shouldn&#039;t be neccessary anyways as all ports can be configured to higher ports.&lt;br /&gt;
&lt;br /&gt;
===Webserver Ports===&lt;br /&gt;
;HTTP:&lt;br /&gt;
Container Port: 8080&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
;HTTPS:&lt;br /&gt;
Container Port: 8082&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
=== Additional Application Ports===&lt;br /&gt;
Following additional container ports are avilable depending on installed and configured applications:&lt;br /&gt;
;H323/TLS : 1300&lt;br /&gt;
;SIP : 5060&lt;br /&gt;
;SIPS : 5061&lt;br /&gt;
;LDAPS : 1636&lt;br /&gt;
;SMTP : 8025&lt;br /&gt;
;SMTPS : 8587&lt;br /&gt;
&#039;&#039;&#039;Additional hint for Portmapping&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
  --name=innovaphone \&lt;br /&gt;
  --restart unless-stopped \&lt;br /&gt;
  -p 9090:8080 \        #Container Host Port (external) 9090:8080 Container Port&lt;br /&gt;
  -p 9091:8082 \&lt;br /&gt;
  -p 5060:5060 \&lt;br /&gt;
  -p 5061:5061 \&lt;br /&gt;
  -p 1300:1300 \&lt;br /&gt;
  -p 1636:1636 \&lt;br /&gt;
  -p 8025:8025 \&lt;br /&gt;
  -p 8587:8587 \&lt;br /&gt;
  -v /path/of/data/innovaphone:/mnt/data \      #in this path you will find Apps, DBs &amp;amp; Logs&lt;br /&gt;
                                                #this path musst be used for backups!!&lt;br /&gt;
  -e WEBSERVERPORTHTTP=8080 \&lt;br /&gt;
  -e WEBSERVERPORTHTTPS=8082 \&lt;br /&gt;
  -e LOG_FLAGS=7 \&lt;br /&gt;
  -e LOG_SIZE=1048576 \&lt;br /&gt;
  -e DNSIPV4=8.8.8.8 \&lt;br /&gt;
  -e LIMIT_RAM=512 \        #Ram limit in MB&lt;br /&gt;
  -e LIMIT_DISK=10 \        #disk size in GB&lt;br /&gt;
  -e TZ=Europe/Berlin \&lt;br /&gt;
  docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Environment Variables (ENVs)==&lt;br /&gt;
This chapter outlines the key environment variables used to configure the behavior of the innovaphone App Platform Docker container. These variables allow you to customize logging, port settings, resource limits, and more during startup and runtime.&lt;br /&gt;
&lt;br /&gt;
;LOG_FLAGS : Defines the integer representation for the trace flags of the AP Manager, according flags activated under the AP Manager / Diagnostics. See browser console message on Save button press (e.g. &amp;quot;logFlags&amp;quot;:1 , if the &amp;quot;App&amp;quot; flag is activated).&lt;br /&gt;
 LOG_FLAGS=7&lt;br /&gt;
;LOG_SIZE : Specifies the maximum size in bytes for logs before rotation or management actions occur. Default: 5242880.&lt;br /&gt;
 LOG_SIZE=1048576&lt;br /&gt;
;WEBSERVERPORTHTTP : Sets the in-container HTTP port for the webserver. Default: 8080.&lt;br /&gt;
 WEBSERVERPORTHTTP=8080&lt;br /&gt;
;WEBSERVERPORTHTTPS : Sets the in-container HTTPS port for the webserver. Default: 8082.&lt;br /&gt;
 WEBSERVERPORTHTTPS=8443&lt;br /&gt;
;DNSIPV4 : Specifies the in-container DNS server IPv4 address for DNS resolution. Overrides the default container runtime DNS server.&lt;br /&gt;
 DNSIPV4=8.8.8.8&lt;br /&gt;
;DNS_DOMAIN : The FQDN of the App Platform that can be used to access the app services. This optional parameter is used as a static DNS entry added to /etc/hosts. The destination IP address is the resolved IP address behind INTERNAL_DNS_DOMAIN or NAMESPACE.&lt;br /&gt;
 DNS_DOMAIN=ap.example.com&lt;br /&gt;
;INTERNAL_DNS_DOMAIN : The internal FQDN of the App Platform. This FQDN is used to resolve the internal IP address of the App Platform, to be mapped from DNS_DOMAIN in /etc/hosts.&lt;br /&gt;
 INTERNAL_DNS_DOMAIN=my-apps-deployment.my-namespace.svc.cluster.local&lt;br /&gt;
;NAMESPACE : The Kubernetes namespace used to build internal FQDN of the App Platform. Used with DNS_DOMAIN to map it to the IP address of ap.my-namespace.svc.cluster.local.&lt;br /&gt;
 NAMESPACE=my-namespace&lt;br /&gt;
;LIMIT_RAM : Sets the RAM limit for the container, in MB, controlling how much memory it may consume. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_RAM=512&lt;br /&gt;
;LIMIT_DISK : Defines the disk space limit in GB for the container to manage storage consumption. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_DISK=10&lt;br /&gt;
;MANAGER_DB_HOST : defines an external database host for the database of the App Platform Manager&lt;br /&gt;
If you hand database settings, the container will work without the local database server and doesn&#039;t need any storage at all (under development).&lt;br /&gt;
 MANAGER_DB_HOST=172.16.14.35:5432 (port is optional)&lt;br /&gt;
;MANAGER_DB_NAME : the external database name&lt;br /&gt;
 MANAGER_DB_NAME=databasename&lt;br /&gt;
;MANAGER_DB_USER : the external database user who has access&lt;br /&gt;
 MANAGER_DB_USER=databaseuser&lt;br /&gt;
;MANAGER_DB_PASSWORD : the password of the user&lt;br /&gt;
 MANAGER_DB_PASSWORD=o1kk2hj312k3&lt;br /&gt;
&lt;br /&gt;
==Volumes and Mounts==&lt;br /&gt;
This container uses a dedicated internal mount path for the persistent data management across container restarts and updates.&lt;br /&gt;
&lt;br /&gt;
===Internal Data Volume===&lt;br /&gt;
;Mount Path : &amp;lt;code&amp;gt;/mnt/data&amp;lt;/code&amp;gt;&lt;br /&gt;
;Contents:&lt;br /&gt;
*Apps: Installed application binaries.&lt;br /&gt;
*Databases: PostgreSQL files.&lt;br /&gt;
*Logging: Log files for system and application events.&lt;br /&gt;
&lt;br /&gt;
===Mounting===&lt;br /&gt;
To ensure that your data is preserved, map a host directory or Docker named volume to the container&#039;s /mnt/data path when running the container.&lt;br /&gt;
For example:&lt;br /&gt;
 docker run -d -v /path/on/host:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
This setup guarantees that your apps, associated data, databases, and logs persist independently of the container lifecycle.&lt;br /&gt;
&lt;br /&gt;
==Entrypoint==&lt;br /&gt;
The container uses a fixed entrypoint:&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/entrypoint.sh&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
This script prepares the container and starts the AP Manager executable.&lt;br /&gt;
&lt;br /&gt;
==Logging and Monitoring==&lt;br /&gt;
The log of the entrypoint.sh and of the AP manager is avilable as conatiner output. The installed applications store the ir log files under &amp;lt;code&amp;gt;/mnt/data/var/log/apps/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Usage Example==&lt;br /&gt;
 sudo docker run -d --restart unless-stopped --name innovaphoneAP -p 9090:8080 -p 9091:8082 -e WEBSERVERPORTHTTP=8080 -e WEBSERVERPORTHTTPS=8082 -v $(pwd)/myapps/:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
This command runs the container in detached mode with automatic restart. It names the container innovaphoneAP, maps host ports 9090 and 9091 to the container&#039;s HTTP and HTTPS ports, sets the webserver port environment variables, mounts a host directory to /mnt/data, and starts the AP Manager. After container start up the AP manager web UI is accessible via &amp;lt;code&amp;gt;http://localhost:9090&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://localhost:9091&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79167</id>
		<title>Reference16r1:Concept innovaphone App Platform Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=79167"/>
		<updated>2026-03-17T07:59:13Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Ports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=Below described feature is experimental and not officially supported for use in productive environments.}}&lt;br /&gt;
The innovaphone App Platform Docker container provides a myApps App Platform instance that includes the AP Manager, Webserver and PostgreSQL. This container offers a ready-to-use environment for myApps applications and the innovaphone PBX.&lt;br /&gt;
&lt;br /&gt;
==Image Information==&lt;br /&gt;
&lt;br /&gt;
This chapter provides details about the Docker image used for the innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
===Repository Details===&lt;br /&gt;
&lt;br /&gt;
;Repository Host : docker.innovaphone.com&lt;br /&gt;
;Image Name : cloud/kubernetes/innovaphone-platform-instance&lt;br /&gt;
&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
===Tagging and Versioning===&lt;br /&gt;
The image is usually tagged with the build number according to innovaphone software releases:&lt;br /&gt;
&lt;br /&gt;
;Latest Tag : Use the latest tag for pulling the most recent service release.&lt;br /&gt;
&lt;br /&gt;
;Release Build Number : For production or version-specific deployments, use a specific build number as the tag (e.g., 130006).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker pull docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
===Supported Architecture===&lt;br /&gt;
This Docker image supports the &amp;lt;code&amp;gt;linux/amd64&amp;lt;/code&amp;gt; architecture.&lt;br /&gt;
&lt;br /&gt;
===Image Reference===&lt;br /&gt;
An example of a full image reference using a specific release build number would be:&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
==Ports==&lt;br /&gt;
This chapter outlines the various ports exposed by the Docker container. The webserver ports are available immediately upon container startup, after start of the AP Manager and the Webserver, while the additional application ports become active after the app installation. In most cases, a one-to-one mapping is used, meaning the container port is mapped directly to the same host port unless otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Ports &amp;lt; 1024===&lt;br /&gt;
On most docker hosts, a container won&#039;t be able to use ports below 1024, unless the container is started with higher privileges. &lt;br /&gt;
This shouldn&#039;t be neccessary anyways as all ports can be configured to higher ports.&lt;br /&gt;
&lt;br /&gt;
===Webserver Ports===&lt;br /&gt;
;HTTP:&lt;br /&gt;
Container Port: 8080&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
;HTTPS:&lt;br /&gt;
Container Port: 8082&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
=== Additional Application Ports===&lt;br /&gt;
Following additional container ports are avilable depending on installed and configured applications:&lt;br /&gt;
;H323/TLS : 1300&lt;br /&gt;
;SIP : 5060&lt;br /&gt;
;SIPS : 5061&lt;br /&gt;
;LDAPS : 1636&lt;br /&gt;
;SMTP : 8025&lt;br /&gt;
;SMTPS : 8587&lt;br /&gt;
&#039;&#039;&#039;Additional hint for Portmapping&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
  --name=innovaphone \&lt;br /&gt;
  --restart unless-stopped \&lt;br /&gt;
  -p 9090:8080 \        #Container Host Port (external) 9090:8080 Container Port&lt;br /&gt;
  -p 9091:8082 \&lt;br /&gt;
  -p 5060:5060 \&lt;br /&gt;
  -p 5061:5061 \&lt;br /&gt;
  -p 1300:1300 \&lt;br /&gt;
  -p 1636:1636 \&lt;br /&gt;
  -p 8025:8025 \&lt;br /&gt;
  -p 8587:8587 \&lt;br /&gt;
  -v /path/of/data/innovaphone:/mnt/data \      #in this path you will find Apps, DBs &amp;amp; Logs&lt;br /&gt;
                                                #this path musst be used for backups!!&lt;br /&gt;
  -e WEBSERVERPORTHTTP=8080 \&lt;br /&gt;
  -e WEBSERVERPORTHTTPS=8082 \&lt;br /&gt;
  -e LOG_FLAGS=7 \&lt;br /&gt;
  -e LOG_SIZE=1048576 \&lt;br /&gt;
  -e DNSIPV4=8.8.8.8 \&lt;br /&gt;
  -e LIMIT_RAM=512 \        #Ram limit in MB&lt;br /&gt;
  -e LIMIT_DISK=10 \        #disk size in GB&lt;br /&gt;
  -e TZ=Europe/Berlin \&lt;br /&gt;
  docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Environment Variables (ENVs)==&lt;br /&gt;
This chapter outlines the key environment variables used to configure the behavior of the innovaphone App Platform Docker container. These variables allow you to customize logging, port settings, resource limits, and more during startup and runtime.&lt;br /&gt;
&lt;br /&gt;
;LOG_FLAGS : Defines the integer representation for the trace flags of the AP Manager, according flags activated under the AP Manager / Diagnostics. See browser console message on Save button press (e.g. &amp;quot;logFlags&amp;quot;:1 , if the &amp;quot;App&amp;quot; flag is activated).&lt;br /&gt;
 LOG_FLAGS=7&lt;br /&gt;
;LOG_SIZE : Specifies the maximum size in bytes for logs before rotation or management actions occur. Default: 5242880.&lt;br /&gt;
 LOG_SIZE=1048576&lt;br /&gt;
;WEBSERVERPORTHTTP : Sets the in-container HTTP port for the webserver. Default: 8080.&lt;br /&gt;
 WEBSERVERPORTHTTP=8080&lt;br /&gt;
;WEBSERVERPORTHTTPS : Sets the in-container HTTPS port for the webserver. Default: 8082.&lt;br /&gt;
 WEBSERVERPORTHTTPS=8443&lt;br /&gt;
;DNSIPV4 : Specifies the in-container DNS server IPv4 address for DNS resolution. Overrides the default container runtime DNS server.&lt;br /&gt;
 DNSIPV4=8.8.8.8&lt;br /&gt;
;DNS_DOMAIN : The FQDN of the App Platform that can be used to access the app services. This optional parameter is used as a static DNS entry added to /etc/hosts. The destination IP address is the resolved IP address behind INTERNAL_DNS_DOMAIN or NAMESPACE.&lt;br /&gt;
 DNS_DOMAIN=ap.example.com&lt;br /&gt;
;INTERNAL_DNS_DOMAIN : The internal FQDN of the App Platform. This FQDN is used to resolve the internal IP address of the App Platform, to be mapped from DNS_DOMAIN in /etc/hosts.&lt;br /&gt;
 INTERNAL_DNS_DOMAIN=my-apps-deployment.my-namespace.svc.cluster.local&lt;br /&gt;
;NAMESPACE : The Kubernetes namespace used to build internal FQDN of the App Platform. Used with DNS_DOMAIN to map it to the IP address of ap.my-namespace.svc.cluster.local.&lt;br /&gt;
 NAMESPACE=my-namespace&lt;br /&gt;
;LIMIT_RAM : Sets the RAM limit for the container, in MB, controlling how much memory it may consume. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_RAM=512&lt;br /&gt;
;LIMIT_DISK : Defines the disk space limit in GB for the container to manage storage consumption. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_DISK=10&lt;br /&gt;
;MANAGER_DB_HOST : defines an external database host for the database of the App Platform Manager&lt;br /&gt;
If you hand database settings, the container will work without the local database server and doesn&#039;t need any storage at all (under development).&lt;br /&gt;
 MANAGER_DB_HOST=172.16.14.35:5432 (port is optional)&lt;br /&gt;
;MANAGER_DB_NAME : the external database name&lt;br /&gt;
 MANAGER_DB_NAME=databasename&lt;br /&gt;
;MANAGER_DB_USER : the external database user who has access&lt;br /&gt;
 MANAGER_DB_USER=databaseuser&lt;br /&gt;
;MANAGER_DB_PASSWORD : the password of the user&lt;br /&gt;
 MANAGER_DB_PASSWORD=o1kk2hj312k3&lt;br /&gt;
;DB_PROVISIONER_URL : a websocket URL to an external DBProvisioner App which is used to provide databases&lt;br /&gt;
 DB_PROVISIONER_URL=wss://domain.com/domain.com/dbprovisioner&lt;br /&gt;
&lt;br /&gt;
==Volumes and Mounts==&lt;br /&gt;
This container uses a dedicated internal mount path for the persistent data management across container restarts and updates.&lt;br /&gt;
&lt;br /&gt;
===Internal Data Volume===&lt;br /&gt;
;Mount Path : &amp;lt;code&amp;gt;/mnt/data&amp;lt;/code&amp;gt;&lt;br /&gt;
;Contents:&lt;br /&gt;
*Apps: Installed application binaries.&lt;br /&gt;
*Databases: PostgreSQL files.&lt;br /&gt;
*Logging: Log files for system and application events.&lt;br /&gt;
&lt;br /&gt;
===Mounting===&lt;br /&gt;
To ensure that your data is preserved, map a host directory or Docker named volume to the container&#039;s /mnt/data path when running the container.&lt;br /&gt;
For example:&lt;br /&gt;
 docker run -d -v /path/on/host:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
This setup guarantees that your apps, associated data, databases, and logs persist independently of the container lifecycle.&lt;br /&gt;
&lt;br /&gt;
==Entrypoint==&lt;br /&gt;
The container uses a fixed entrypoint:&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/entrypoint.sh&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
This script prepares the container and starts the AP Manager executable.&lt;br /&gt;
&lt;br /&gt;
==Logging and Monitoring==&lt;br /&gt;
The log of the entrypoint.sh and of the AP manager is avilable as conatiner output. The installed applications store the ir log files under &amp;lt;code&amp;gt;/mnt/data/var/log/apps/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Usage Example==&lt;br /&gt;
 sudo docker run -d --restart unless-stopped --name innovaphoneAP -p 9090:8080 -p 9091:8082 -e WEBSERVERPORTHTTP=8080 -e WEBSERVERPORTHTTPS=8082 -v $(pwd)/myapps/:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
This command runs the container in detached mode with automatic restart. It names the container innovaphoneAP, maps host ports 9090 and 9091 to the container&#039;s HTTP and HTTPS ports, sets the webserver port environment variables, mounts a host directory to /mnt/data, and starts the AP Manager. After container start up the AP manager web UI is accessible via &amp;lt;code&amp;gt;http://localhost:9090&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://localhost:9091&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=79150</id>
		<title>Reference14r2:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=79150"/>
		<updated>2026-03-16T08:32:49Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Gateway */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or above&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
** Proxmox/KVM/Qemu&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How to implement large PBXs#Technical data and recommended number of users supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App services and multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. Before version 130012, you must use ISA, as Virtio was not supported with older versions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
** Proxmox: follow this description here, just with the app-platform-ova.zip: https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Proxmox_VE&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: eg. your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: eg. DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: eg. TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: eg. your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How to retrieve files from the AP| Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nightly database analyse ===&lt;br /&gt;
&lt;br /&gt;
Every database is analysed at night to keep indexes in sync with the data. This triggers a &#039;&#039;vacuumdb -a -z&#039;&#039;, which updates optimizer statistics, but does &#039;&#039;&#039;not&#039;&#039;&#039; shrink the physical size of the database.&amp;lt;br/&amp;gt;&lt;br /&gt;
This must be done manually in the instance settings.&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13 Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
After the update has been downloaded and verified, your App Platform will reboot.&lt;br /&gt;
You can check the installation process after the reboot with the following URL: https://IP-of-AP/manager/ramdisk.log&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: A timezone string which is used by the App Platform Manager to do certain jobs according to the configured timezone.&lt;br /&gt;
** Note that this doesn&#039;t change the timezone of the linux itself!&lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: see [[#Backup_of_the_Apps| Backup of Apps]]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Current Webserver certificates&#039;&#039;: shows the current certificates with the ability to download them. &lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Encrypt ==&lt;br /&gt;
&lt;br /&gt;
Configure the certificate creation by Let&#039;s Encrypt here.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Enable&#039;&#039;: turns the automatic creation on or off&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App URL&#039;&#039;: the URL of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this URL from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App Password&#039;&#039;: the client password of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this password from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Key length&#039;&#039;: 2048, 3072 or 4096 (keep in mind, that [[{{NAMESPACE}}:Certificate_management#Certificate_Key_Length_and_CPU_Usage|a higher value provides higher security but also lower performance!]])&lt;br /&gt;
* &#039;&#039;DNS Name&#039;&#039;: the external DNS names of your device (up to 100 possible)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
Starting with 16r1 you also can configure OAuth2 Authentications. You can have a look into our HowTo Article for assistance: [[Howto16r1:Configure OAuth2 E-Mail]]&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
App Platform [[#App Platform replication|replication settings]]&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Updates the App Platform to the latest image available on the App Store.&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
Restarts the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Shutdown ==&lt;br /&gt;
Shuts down the App Platform.&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 or above on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
**Note: to ensure rapid recognition of the new DNS target, the definition of an appropriate TTL value is recommended&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.innovaphone.com/index.php?title=Howto14r2:Firmware_Upgrade_V14r1_V14r2#App_Platform_and_Apps&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= App Installer PBX Manager Plugin =&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V14 and above&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The app installer plugin allows IT administrator (with access to the PBX Manager) to install/update/delete new apps from the innovaphone app store including Partners apps. It is automatically available with existing app platforms or after adding a new one in the PBX Manager.&lt;br /&gt;
It offers a view to the App Platform Manager‘s App Store with all the available functionalities and simplifies the install, update and uninstall of apps.&lt;br /&gt;
&lt;br /&gt;
== Dedicated AP for each user ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app will install the app service and add a new instance with the user’s domain. The instance is automatically started.&amp;lt;br&amp;gt;&lt;br /&gt;
This further enables the configuration of the instance through its respective PBX Manager plugin. &amp;lt;br&amp;gt;&lt;br /&gt;
Uninstalling the app will remove the app service and the corresponding instance.&lt;br /&gt;
&lt;br /&gt;
== Shared AP between users ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app works in a similar way to that of the dedicated AP. However, each time a new user installs the app, only a new instance is created if the app service is already installed. &amp;lt;br&amp;gt;&lt;br /&gt;
A user can uninstall the app, in this case the corresponding instance is deleted. If no more instances exist, then the app service is uninstalled. &amp;lt;br&amp;gt;&lt;br /&gt;
The administrator can only update the app service in such scenario.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== App Platform doesn&#039;t start after an update ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
Note: This process can take a while, after it&#039;s finished it reboots and automatically change the &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; value. &lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine ===&lt;br /&gt;
&lt;br /&gt;
Boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition.&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
=== It still doesn&#039;t start ===&lt;br /&gt;
&lt;br /&gt;
If it still doesn&#039;t start, configure the App Platform to boot from /dev/sda3 (or inside a VM start the second boot loader entry) and login with SSH as root.&lt;br /&gt;
Then do a first check to verify that you have a specific error due to an incomplete update or a [[Howto15r1:Firmware Upgrade V14r2 V15r1#AP Upgrade to Image 130006|wrong update order]]:&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* /apps/manager/manager&lt;br /&gt;
* if this outputs &#039;&#039;&#039;error while loading shared libraries: libcrypto.so.3:&#039;&#039;&#039; you have a manager version which cannot run on the current image.&lt;br /&gt;
&lt;br /&gt;
In this case you must download an older build (14r1 1410593):&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* wget --no-check-certificate -O /apps/manager/manager https://webbuild.innovaphone.com/1410593/arm/manager/manager &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* wget --no-check-certificate -O /apps/webserver/webserver https://webbuild.innovaphone.com/1410593/arm/webserver/webserver &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* chown root:root /apps/manager/manager&lt;br /&gt;
* chown root:root /apps/webserver/webserver&lt;br /&gt;
* chmod +x /apps/manager/manager&lt;br /&gt;
* chmod +x /apps/webserver/webserver&lt;br /&gt;
* echo 110000 &amp;gt; /mnt/sda1/label&lt;br /&gt;
** this allows the manager to perform an image update again&lt;br /&gt;
* /etc/init.d/S92manager start&lt;br /&gt;
* now perform an image update and &#039;&#039;&#039;afterwards&#039;&#039;&#039; update your apps again&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files|Reference14r2:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine|Reference14r2:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or &#039;&#039;&#039;130007&#039;&#039;&#039; and lower than &#039;&#039;&#039;130015&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 130015 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
&lt;br /&gt;
=== All databases ===&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
=== single database ===&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and the App database is not available during this time&lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 (or /dev/nvme0n1p3) to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt; on IPx10/IPx11 gateways&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt; on IPx10/IPx11 gateways&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/nvme0n1p2&amp;lt;/code&amp;gt; on IPx13 gateways&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/nvme0n1p3&amp;lt;/code&amp;gt; on IPx13 gateways&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt; (IPx10/IPx11) or to &amp;lt;code&amp;gt;root=/dev/nvme0n1p3&amp;lt;/code&amp;gt; (IPx13)&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;br /&gt;
&lt;br /&gt;
== Move instance database to external database host ==&lt;br /&gt;
&lt;br /&gt;
In case you want to use an external database server instead of the integrated:&lt;br /&gt;
&lt;br /&gt;
* download a backup of the specific instance over the App Platform Manager&lt;br /&gt;
* create a postgresql database on the external host:&lt;br /&gt;
** createdb --encoding=UTF-8 exampledb&lt;br /&gt;
* restore the backup&lt;br /&gt;
** pg_restore -d exampledb backup-exampledb.dump&lt;br /&gt;
* change the ownership to a specific postgresql user (which you have to create yourself first)&lt;br /&gt;
** psql -d postgres -c &amp;quot;ALTER DATABASE exampledb OWNER TO exampleuser&amp;quot;&lt;br /&gt;
* configure the database host, name, user and password on the instance inside the App Platform Manager&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_IP&amp;diff=79148</id>
		<title>Reference16r1:Concept App Service IP</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_IP&amp;diff=79148"/>
		<updated>2026-03-16T06:43:46Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
[[Category:Concept|IP]]&lt;br /&gt;
&lt;br /&gt;
The App IP is an app which offers the PBX functionality and further functionalities as App service on our innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone firmware and apps V16&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* innovaphone Application Platform (image version 140011 or higher)&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
The App IP offers modules known from innovaphone gateways, like the PBX, TURN server functionality etc.&lt;br /&gt;
&lt;br /&gt;
==How it works==&lt;br /&gt;
&lt;br /&gt;
=== Single instance mode ===&lt;br /&gt;
Unlike other App Services, the App IP is a single instance App Service, so you can create &#039;&#039;&#039;just&#039;&#039;&#039; a single instance and not multiple instances.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Standard licensing mechanisms apply to the App IP as they apply to innovaphone gateways.&lt;br /&gt;
&lt;br /&gt;
In addition, every port license requires a dedicated IPAP license (similar to the IPVA license for virtual machines).&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
There is no App provided by this App Service.&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
There is no PBX Manager Plugin provided by this App Service.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The configuration is done as an innovaphone gateway is configured too.&lt;br /&gt;
&lt;br /&gt;
=== Advanced UI ===&lt;br /&gt;
The advanced UI is reachable under the webserver path of the App IP instance and /admin.xml?xsl=admin.xsl, e.g.:&lt;br /&gt;
https://domain.com/ip/admin.xml?xsl=admin.xsl&lt;br /&gt;
&lt;br /&gt;
=== IP configuration ===&lt;br /&gt;
As the App IP is just an App on an App Platform, there are no IP4/IP6, NTP etc. settings as on other innovaphone devices.&lt;br /&gt;
&lt;br /&gt;
==== Devices App ====&lt;br /&gt;
If your App Platform which runs the App IP is connected to a Devices App, you can access the Advanced UI with the &#039;&#039;&#039;PBX&#039;&#039;&#039; tab of your App Platform device.&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
The App IP offers standard tracing mechanism for App Services and in addition mechanisms known from innovaphone gateways.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can enable module related trace flags with config change commands or by setting trace flags under Maintenance -&amp;gt; Tracing in the Advanced UI of the App IP.&lt;br /&gt;
&lt;br /&gt;
 Trace files are not found under Maintenance -&amp;gt; Tracing but on the App IP service on your App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==Known issues==&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
* [[Reference16r1:Concept_innovaphone_App_Platform_Docker_Container]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_IP&amp;diff=79147</id>
		<title>Reference16r1:Concept App Service IP</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_IP&amp;diff=79147"/>
		<updated>2026-03-16T06:43:27Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
[[Category:Concept|IP]]&lt;br /&gt;
&lt;br /&gt;
The App IP is an app which offers the PBX functionality and further functionalities as App service on our innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone firmware and apps V16&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* innovaphone Application Platform (image version 140011 or higher)&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
The App IP offers modules known from innovaphone gateways, like the PBX, TURN server functionality etc.&lt;br /&gt;
&lt;br /&gt;
==How it works==&lt;br /&gt;
&lt;br /&gt;
=== Single instance mode ===&lt;br /&gt;
Unlike other App Services, the App IP is a single instance App Service, so you can create &#039;&#039;&#039;just&#039;&#039;&#039; a single instance and not multiple instances.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Standard licensing mechanisms apply to the App IP as they apply to innovaphone gateways.&lt;br /&gt;
&lt;br /&gt;
In addition, every port license requires a dedicated IPAP license (similar to the IPVA license for virtual machines).&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
There is no App provided by this App Service.&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
There is no PBX Manager Plugin provided by this App Service.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The configuration is done as an innovaphone gateway is configured too.&lt;br /&gt;
&lt;br /&gt;
=== IP configuration ===&lt;br /&gt;
As the App IP is just an App on an App Platform, there are no IP4/IP6, NTP etc. settings as on other innovaphone devices.&lt;br /&gt;
&lt;br /&gt;
=== Advanced UI ===&lt;br /&gt;
The advanced UI is reachable under the webserver path of the App IP instance and /admin.xml?xsl=admin.xsl, e.g.:&lt;br /&gt;
https://domain.com/ip/admin.xml?xsl=admin.xsl&lt;br /&gt;
&lt;br /&gt;
==== Devices App ====&lt;br /&gt;
If your App Platform which runs the App IP is connected to a Devices App, you can access the Advanced UI with the &#039;&#039;&#039;PBX&#039;&#039;&#039; tab of your App Platform device.&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
The App IP offers standard tracing mechanism for App Services and in addition mechanisms known from innovaphone gateways.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can enable module related trace flags with config change commands or by setting trace flags under Maintenance -&amp;gt; Tracing in the Advanced UI of the App IP.&lt;br /&gt;
&lt;br /&gt;
 Trace files are not found under Maintenance -&amp;gt; Tracing but on the App IP service on your App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==Known issues==&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
* [[Reference16r1:Concept_innovaphone_App_Platform_Docker_Container]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_IP&amp;diff=79061</id>
		<title>Reference16r1:Concept App Service IP</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_IP&amp;diff=79061"/>
		<updated>2026-03-09T13:52:21Z</updated>

		<summary type="html">&lt;p&gt;Dde: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
[[Category:Concept|IP]]&lt;br /&gt;
&lt;br /&gt;
The App IP is an app which offers the PBX functionality and further functionalities as App service on our innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone firmware and apps V16&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* innovaphone Application Platform (image version 140011 or higher)&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
The App IP offers modules known from innovaphone gateways, like the PBX, TURN server functionality etc.&lt;br /&gt;
&lt;br /&gt;
==How it works==&lt;br /&gt;
&lt;br /&gt;
=== Single instance mode ===&lt;br /&gt;
Unlike other App Services, the App IP is a single instance App Service, so you can create &#039;&#039;&#039;just&#039;&#039;&#039; a single instance and not multiple instances.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Standard licensing mechanisms apply to the App IP as they apply to innovaphone gateways.&lt;br /&gt;
&lt;br /&gt;
In addition, every port license requires a dedicated IPAP license (similar to the IPVA license for virtual machines).&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
There is no App provided by this App Service.&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
There is no PBX Manager Plugin provided by this App Service.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The configuration is done as an innovaphone gateway is configured too.&lt;br /&gt;
&lt;br /&gt;
=== Advanced UI ===&lt;br /&gt;
The advanced UI is reachable under the webserver path of the App IP instance and /admin.xml?xsl=admin.xsl, e.g.:&lt;br /&gt;
https://domain.com/ip/admin.xml?xsl=admin.xsl&lt;br /&gt;
&lt;br /&gt;
==== Devices App ====&lt;br /&gt;
If your App Platform which runs the App IP is connected to a Devices App, you can access the Advanced UI with the &#039;&#039;&#039;PBX&#039;&#039;&#039; tab of your App Platform device.&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
The App IP offers standard tracing mechanism for App Services and in addition mechanisms known from innovaphone gateways.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can enable module related trace flags with config change commands or by setting trace flags under Maintenance -&amp;gt; Tracing in the Advanced UI of the App IP.&lt;br /&gt;
&lt;br /&gt;
 Trace files are not found under Maintenance -&amp;gt; Tracing but on the App IP service on your App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==Known issues==&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
* [[Reference16r1:Concept_innovaphone_App_Platform_Docker_Container]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/NAT&amp;diff=79041</id>
		<title>Reference16r1:General/IP4/General/NAT</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/NAT&amp;diff=79041"/>
		<updated>2026-03-06T11:00:34Z</updated>

		<summary type="html">&lt;p&gt;Dde: Redirected page to Reference13r3:IP4/NAT/General&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Reference13r3:IP4/NAT/General]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/STUN&amp;diff=79040</id>
		<title>Reference16r1:General/IP4/General/STUN</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/STUN&amp;diff=79040"/>
		<updated>2026-03-06T10:58:07Z</updated>

		<summary type="html">&lt;p&gt;Dde: Changed redirect target from Reference16r1:IP4/General/STUN to Reference13r3:IP4/General/STUN&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Reference13r3:IP4/General/STUN]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/STUN&amp;diff=79039</id>
		<title>Reference16r1:General/IP4/General/STUN</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/STUN&amp;diff=79039"/>
		<updated>2026-03-06T10:57:58Z</updated>

		<summary type="html">&lt;p&gt;Dde: Redirected page to Reference16r1:IP4/General/STUN&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Reference16r1:IP4/General/STUN]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/STUN&amp;diff=79038</id>
		<title>Reference16r1:General/IP4/General/STUN</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/STUN&amp;diff=79038"/>
		<updated>2026-03-06T10:55:41Z</updated>

		<summary type="html">&lt;p&gt;Dde: Removed redirect to IP4/General/STUN&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[{{NAMESPACE}}:IP4/General/STUN]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/STUN&amp;diff=79037</id>
		<title>Reference16r1:General/IP4/General/STUN</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/STUN&amp;diff=79037"/>
		<updated>2026-03-06T10:54:33Z</updated>

		<summary type="html">&lt;p&gt;Dde: Changed redirect target from Reference:IP4/General/STUN to IP4/General/STUN&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[:IP4/General/STUN]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/STUN&amp;diff=79036</id>
		<title>Reference16r1:General/IP4/General/STUN</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:General/IP4/General/STUN&amp;diff=79036"/>
		<updated>2026-03-06T10:54:08Z</updated>

		<summary type="html">&lt;p&gt;Dde: Redirected page to Reference:IP4/General/STUN&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Reference:IP4/General/STUN]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference:My_Innovaphone&amp;diff=78972</id>
		<title>Reference:My Innovaphone</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference:My_Innovaphone&amp;diff=78972"/>
		<updated>2026-03-02T13:20:10Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* IPVA MAC exists */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Where is my old my.innovaphone?==&lt;br /&gt;
Don&#039;t worry, just login with your old my.innovaphone account! You will be asked to confirm your forename and surname (just a &#039;&#039;&#039;natural person&#039;&#039;&#039; is allowed) and accept some terms and conditions.&amp;lt;br&amp;gt;&lt;br /&gt;
Afterwards you find the old license/device view inside the [[#Licenses tab| Licenses tab]].&lt;br /&gt;
&lt;br /&gt;
==About==&lt;br /&gt;
my.innovaphone allows the handling of licenses and includes the handling of device warranty and software service agreements.&amp;lt;br&amp;gt;&lt;br /&gt;
You can also sign contracts here for different purposes.&lt;br /&gt;
&lt;br /&gt;
===Project-View===&lt;br /&gt;
My innovaphone offers the possibility for several users to be in one company. This company shares its balance of licenses over all users and can have several projects. Projects have their own balance of license types and devices are bound to a project.&lt;br /&gt;
&lt;br /&gt;
===Language===&lt;br /&gt;
My innovaphone will support multiple languages. You can select your desired language at the top of the page.&amp;lt;br&amp;gt;&lt;br /&gt;
Currently supported languages:&lt;br /&gt;
* English&lt;br /&gt;
* German&lt;br /&gt;
* Italian&lt;br /&gt;
* Dutch&lt;br /&gt;
* French&lt;br /&gt;
* Spanish (partially)&lt;br /&gt;
* Polish (partially)&lt;br /&gt;
&lt;br /&gt;
===Guides===&lt;br /&gt;
&lt;br /&gt;
====Quickstart guide====&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_nl.pdf Dutch quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_en.pdf English quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_fr.pdf French quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_de.pdf German quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_it.pdf Italian quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====SSA guide====&lt;br /&gt;
;V10 and greater:&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10nl.pdf Dutch SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10en.pdf English SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10fr.pdf French SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10de.pdf German SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10it.pdf Italian SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10pl.pdf Polish SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10es.pdf Spanish SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;V8 and greater:&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_en.pdf English SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_fr.pdf French SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_de.pdf German SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_it.pdf Italian SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==First steps==&lt;br /&gt;
Open [https://my.innovaphone.com my.innovaphone.com] and click the &amp;quot;I would like to create a new personal user account&amp;quot; link.&lt;br /&gt;
Enter your personal data and register.&lt;br /&gt;
&lt;br /&gt;
You will receive a registration email with an activation link.&lt;br /&gt;
After account activation you have two options:&lt;br /&gt;
* create a new my.innovaphone company with the &amp;quot;Create company account&amp;quot; button&lt;br /&gt;
* ask another user of your company to invite your email address to an already existing company&lt;br /&gt;
&lt;br /&gt;
If you accidentally created an own my innovaphone company, just ask another user of your company to import your just created company.&lt;br /&gt;
&lt;br /&gt;
If you create a new company, you can &#039;&#039;&#039;optionally&#039;&#039;&#039; enter your innovaphone account ID (which is your customer number with innovaphone) with your postal code, to retrieve your company data.&lt;br /&gt;
&lt;br /&gt;
  Inside the license tab of the my.innovaphone portal, you will see a help link at the right side of the horizontal tab menu. &lt;br /&gt;
  This link shows the corresponding text of the wiki section, when hovering with the mouse over it, &lt;br /&gt;
  and redirects to the corresponding wiki menu, if clicked.&lt;br /&gt;
&lt;br /&gt;
  It is possible, that one user is member of serveral companies!&lt;br /&gt;
&lt;br /&gt;
==Left bar==&lt;br /&gt;
If you open the left bar, you have the options to:&lt;br /&gt;
* select one of your companies&lt;br /&gt;
* edit your personal user account&lt;br /&gt;
** user name&lt;br /&gt;
** email address&lt;br /&gt;
** flag to recieve SSA expiry emails&lt;br /&gt;
** password&lt;br /&gt;
* create a new company&lt;br /&gt;
[[Image:Myinnovaphone bar.png|center|thumb|200px|myinnovaphone_bar.png/|myinnovaphone_bar.png/]]&lt;br /&gt;
&lt;br /&gt;
==Main tabs==&lt;br /&gt;
Inside each company you see the three main tabs:&lt;br /&gt;
* Contracts&lt;br /&gt;
* Authorized persons&lt;br /&gt;
* Licenses (see [[#Licenses tab| Licenses tab]])&lt;br /&gt;
&lt;br /&gt;
You may also have two buttons:&lt;br /&gt;
* Add Contract (just as company administrator or with the contract right)&lt;br /&gt;
* Invite person (just as company administrator)&lt;br /&gt;
&lt;br /&gt;
[[Image:Myinnovaphone main.png|center|thumb|200px|myinnovaphone_main.png/|myinnovaphone_main.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Contracts ===&lt;br /&gt;
Inside the contracts tab, you see all your contracts and you can download these conracts.&amp;lt;br&amp;gt;&lt;br /&gt;
In general, contracts must be first approved by innovaphone, so you see three types of contracts:&lt;br /&gt;
&lt;br /&gt;
* open contracts which must be approved by innovaphone first&lt;br /&gt;
* approved contracts which can be already used&lt;br /&gt;
* cancelled contracts which are not valid anymore&lt;br /&gt;
&lt;br /&gt;
[[Image:Myinnovaphone contracts.png|center|thumb|200px|myinnovaphone_contracts.png/|myinnovaphone_contracts.png/]]&lt;br /&gt;
&lt;br /&gt;
These type of contracts currently exist:&lt;br /&gt;
==== innovaphone myApps Cloud Service ====&lt;br /&gt;
Conclude this contract to use the innovaphone myApps Cloud.&lt;br /&gt;
&lt;br /&gt;
==== innovaphone software rental ====&lt;br /&gt;
Conclude this contract to rent innovaphone software products. You must conclude this contract if you want to use the software rental inside the Devices App.&lt;br /&gt;
&lt;br /&gt;
=== Authorized persons ===&lt;br /&gt;
Here you see all persons which exist inside your company. Each person can have the following rights:&lt;br /&gt;
* Administrator (everything)&lt;br /&gt;
* Contracts (can conclude contracts)&lt;br /&gt;
* Licenses (can work with licenses)&lt;br /&gt;
* Viewer (can just see everything without doing something)&lt;br /&gt;
* Locked (cannot even login to this company anymore)&lt;br /&gt;
&lt;br /&gt;
=== Licenses ===&lt;br /&gt;
Here comes the old my.innovaphone view which allows the handling of devices, licenses, activation keys etc.&lt;br /&gt;
&lt;br /&gt;
==Search (inside licenses tab)==&lt;br /&gt;
At the right top of the licenses tab you have a search field. You can search for different things:&lt;br /&gt;
* Devices (part of a device name or device comment)&lt;br /&gt;
* Projects (part of a project name or project description)&lt;br /&gt;
* Own activation keys (part of an activation key or its description)&lt;br /&gt;
* Hardware rental orders (part of the innovaphone order number or your own order reference or a MAC address of an order)&lt;br /&gt;
&lt;br /&gt;
  You have to enter at least &#039;&#039;&#039;three&#039;&#039;&#039; chars to start a search. To search for activation keys, &lt;br /&gt;
  you have to enter at least &#039;&#039;&#039;five&#039;&#039;&#039; chars.&lt;br /&gt;
* Search for license types. Enter e.g. &amp;quot;PBX-Port8&amp;quot; to find all devices with Port8 licenses or enter &amp;quot;PBX-Port8=100&amp;quot; to find all devices with Port8 licenses &#039;&#039;&#039;&amp;gt;=&#039;&#039;&#039; 100.&lt;br /&gt;
* Search for products, e.g. 01-00811 für IP811 (such a search may take longer!)&lt;br /&gt;
&lt;br /&gt;
==Licenses tab==&lt;br /&gt;
===Projects===&lt;br /&gt;
After creation of an own company, you will have a default project named &amp;quot;DEFAULT&amp;quot;. You can rename this project later.&lt;br /&gt;
You can also create more projects on the projects page with &amp;quot;Create&amp;quot;.&lt;br /&gt;
Each project of a company must have a unique name.&lt;br /&gt;
&lt;br /&gt;
  Do &#039;&#039;&#039;not&#039;&#039;&#039; set SSA, if you want to import your devices from your old license manager account first.&lt;br /&gt;
  If you want SSA and you &#039;&#039;&#039;won&#039;t import&#039;&#039;&#039; devices into this project from your old account, you should set SSA at once.&lt;br /&gt;
&lt;br /&gt;
You can select a certain project by activating it in the project list. This selection is then true for all other pages, as some pages require a selected project.&lt;br /&gt;
&lt;br /&gt;
[[Image:overview.jpg|center|thumb|200px|overview.jpg/|overview.jpg/]]&lt;br /&gt;
&lt;br /&gt;
By activating a project by clicking on the project name in the project list, you can manage this project and its settings.&lt;br /&gt;
&lt;br /&gt;
==== Rental project ====&lt;br /&gt;
You can also manually create a rental project. A rental project is normally created automatically by uploading an activation key inside the Devices App.&amp;lt;br/&amp;gt;&lt;br /&gt;
But if you want to start directly with an Automatic iSC reloading service, you&#039;ll need to create the project manually.&amp;lt;br/&amp;gt;&lt;br /&gt;
Take care that the name &#039;&#039;&#039;equals&#039;&#039;&#039; the domain name in your Devices App.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If the rental tab in your Devices App domain doesn&#039;t show the expected balance/Automatic iSC reloading contract/licenses etc., you may use the Devices App Guid Link mechanism to link the domain to this specific project (see below) (use Devices App &#039;&#039;&#039;13r3 SR12&#039;&#039;&#039; or higher!).&lt;br /&gt;
&lt;br /&gt;
====Properties====&lt;br /&gt;
Rename the project or/and change its description.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure further CC mail addresses inside your &#039;&#039;&#039;License Purchase&#039;&#039;&#039; project, if you have one. If you purchase licenses on credit, the emails will be also sent to theses addresses.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Since version 10, an innovaphone device will automatically connect to http://config.innovaphone.com/init&lt;br /&gt;
This script looks at the project properties of the project, where the device exists.&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure an update &#039;&#039;&#039;URL&#039;&#039;&#039; and a &#039;&#039;&#039;trusted certificate&#039;&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
;Devices App GUID link: This is a GUID which can be entered in the settings of a domain inside the Devices App to link the domain to this specific project, if the names do not match and/or the Devices App has been setup from scratch. The Devices App must use the customer to which this projects belongs to be able to use this GUID.&lt;br /&gt;
&lt;br /&gt;
====Software Service====&lt;br /&gt;
You can put your project under SSA (software service agreement). &lt;br /&gt;
You will be asked to enter a SSA end date. This will be the date, where all SSA licenses of all devices in this project will expire.&lt;br /&gt;
The end date mustn&#039;t be more than one year in the past.&amp;lt;br&amp;gt;&lt;br /&gt;
Optionally you can enter a maximum SSC amount. The SSA end date will be automatically calculated then.&amp;lt;br&amp;gt;&lt;br /&gt;
  If you have entered a maximum SSC amount, you have to use the &#039;&#039;&#039;Recalculate&#039;&#039;&#039; link to calculate a new SSA end date, &lt;br /&gt;
  if you change your license selection.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can also calculate SSA over all projects at once. In this mode, you &#039;&#039;&#039;won&#039;t be able&#039;&#039;&#039; to confirm the calculation. You&#039;ll just see the necessary SSC amount.&lt;br /&gt;
&lt;br /&gt;
After entering a date/SSC amount, you will get a summary of all licenses, which will be put under SSA and the amount of needed SSC licenses.&lt;br /&gt;
The SSC value for each license is calculated by the bind date of the license and the entered SSA end date/SSC amount.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ssa_extend.jpg|center|thumb|200px|ssa_extend.jpg/|ssa_extend.jpg/]]&lt;br /&gt;
&lt;br /&gt;
If you have licenses for an older version than the current version, you have to pay SSCs from the [[#Release dates|release date]] of the next version of the current license version.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  e.g. you have a V7 PBX-PBX7#15 license with bind date 1/1/2010. Version 8 was released on 7/12/2009, so SSA is&lt;br /&gt;
  calculated from 7/12/2009 for this license. You will see the calculation date in the list under &amp;quot;bind date&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If licenses already have a SSA date, just the difference between the current SSA date and the entered SSA end date must be paid.&lt;br /&gt;
If the bind date of the device lies in the past, the difference between the bind date and the current date must be paided twice (this is the column &#039;days*2&#039;).&amp;lt;br&amp;gt;&lt;br /&gt;
If your license is under SSA, which is already over, you also have to pay the time between the old SSA date and the current SSA end date twice.&lt;br /&gt;
&lt;br /&gt;
Here is a short example, how the days are calculated:&lt;br /&gt;
&lt;br /&gt;
Bind date: 24/06/2009&amp;lt;br&amp;gt;&lt;br /&gt;
Current date: 31/08/2009&amp;lt;br&amp;gt;&lt;br /&gt;
SSA end date: 12/12/2011&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You will have to pay from 24/06/2009 to 31/08/2009 twice for 68 days.&lt;br /&gt;
From 31/08/2009 to 12/12/2011 you will then have to pay the normal price for 833 days.&lt;br /&gt;
&lt;br /&gt;
You can also select for each license, if you want SSA for it or not. If not, no SSC is needed and no (new) SSA end date is set for this license.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  You can preview the SSC calculation for another calculation date. Simply change the dropdown&lt;br /&gt;
  selection to get the new SSC value.&lt;br /&gt;
  Of course you can&#039;t confirm this calculation for another date, just for the current date!&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;You may add additional licenses to the calculation, which you will bind later&#039;&#039;. Just click on the &#039;&#039;&#039;+&#039;&#039;&#039; near this text and you can add&lt;br /&gt;
  multiple licenses, which will be added to your calculation after using the recalc link. Listed are licenses of the current version and from&lt;br /&gt;
  your balance.&lt;br /&gt;
&lt;br /&gt;
After confirming your entered SSA end date, each license will have this date as SSA end date and can be downloaded in all versions of this SSA time.&lt;br /&gt;
&lt;br /&gt;
You can now extend the projects SSA end date like as setting a new one.&lt;br /&gt;
The resulting summary is the same as above.&lt;br /&gt;
&lt;br /&gt;
If your user account has the right to buy licenses on credit, just check the checkbox.&lt;br /&gt;
You may enter an order number, which you can use for your order, if you buy on credit.&lt;br /&gt;
&lt;br /&gt;
=====Past SSA end date=====&lt;br /&gt;
&lt;br /&gt;
You can configure a new SSA end date in the past, if you accidentally configured a wrong date.&amp;lt;br&amp;gt;&lt;br /&gt;
No licenses will be changed, if you configure a date in the past, just the SSA end date of the project!&lt;br /&gt;
&lt;br /&gt;
=====SSA Expiry Mail=====&lt;br /&gt;
&lt;br /&gt;
  If project SSA will expire, each company user will receive a reminder mail &#039;&#039;&#039;7&#039;&#039;&#039; weeks before and &lt;br /&gt;
  then every week one mail.&lt;br /&gt;
  You can disable these mails with the checkbox &#039;Send SSA expiry mails&#039;.&lt;br /&gt;
  Note that every user can configure, if he wants to receive mails or not in his account settings.&lt;br /&gt;
&lt;br /&gt;
If you want the end user of the project to receive an expiry mail, you can configure a &#039;&#039;&#039;reseller&#039;&#039;&#039; mail address and end user mail addresses. These end users will then receive an email, 30 days before the project will expire. The default text is:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 Your Software Service Agreement for your innovaphone PBX in project &amp;quot;{$arg[3]}&amp;quot; will expire in {$arg[1]} days. &lt;br /&gt;
 Please contact your reseller {$arg[2]} to upgrade the license.&amp;lt;br&amp;gt;&lt;br /&gt;
 The upgrade of the license is important to secure the phone system!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can change this text as you want. You can use placeholders:&lt;br /&gt;
* &#039;&#039;&#039;{$arg[1]}&#039;&#039;&#039;: days left &lt;br /&gt;
* &#039;&#039;&#039;{$arg[2]}&#039;&#039;&#039;: reseller mail address&lt;br /&gt;
* &#039;&#039;&#039;{$arg[3]}&#039;&#039;&#039;: project name&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can also define a global text for all projects under your [[#Company| Company settings]].&lt;br /&gt;
&lt;br /&gt;
  You can optionally configure to receive project SSA independent reminder mails for each license of a device [[#Company 2|here]].&lt;br /&gt;
&lt;br /&gt;
=====Automatic SSA Extension Service=====&lt;br /&gt;
&lt;br /&gt;
You can request an automatic SSA extension service for a project, which is under SSA. By following this link, you will have the opportunity to request a callback and/or the necessary agreement as PDF file.&lt;br /&gt;
&lt;br /&gt;
 All licenses have to be under SSA to use the automatic SSA extension service!&lt;br /&gt;
&lt;br /&gt;
There are some basics to know, if a project is under automatic SSA:&lt;br /&gt;
* If you bind new/free licenses, they&#039;ll get SSA until the current project SSA date and you will receive an invoice for the SSCs&lt;br /&gt;
* If you move devices into this project, their licenses will get SSA until the current project SSA date and you will receive an invoice for the SSCs&lt;br /&gt;
* You can&#039;t join this project into another project, but you can join another project into this one&lt;br /&gt;
&lt;br /&gt;
====Rights====&lt;br /&gt;
=====Own project=====&lt;br /&gt;
Add or delete company rights for this project. To add a company right, you have to enter the company id of this company.&lt;br /&gt;
Each user of a company with rights on this project can add devices, licenses, activation keys to this specific project, but is restricted in removing devices, editing the project and can&#039;t create activation keys with the projects balance.&lt;br /&gt;
&lt;br /&gt;
  The company id can be found under Licenses-&amp;gt;company and the company tab.&lt;br /&gt;
&lt;br /&gt;
[[Image:Project_rights.jpg|center|thumb|200px|project_rights.jpg/|project_rights.jpg/]]&lt;br /&gt;
&lt;br /&gt;
=====External Project=====&lt;br /&gt;
If another company granted access rights to a project to you, you can unsubscribe from this project here.&lt;br /&gt;
&lt;br /&gt;
====Import====&lt;br /&gt;
The import has been disabled. All old devices are already imported and can be added to your project manually.&lt;br /&gt;
&lt;br /&gt;
====Join====&lt;br /&gt;
Here you can join your currently selected project with another project, which you select from a dropdown box.&amp;lt;br&amp;gt;&lt;br /&gt;
If the other project has SSA, you&#039;ll see the current SSA end date, which you might change for the join process and you will get a list of all licenses, which might be updated to the ssa end date/changed date of the other project. The list equals the list shown under [[#Software Service|Software Service]].&lt;br /&gt;
&lt;br /&gt;
  The selected project will be automatically deleted after the join. You can&#039;t join a project,&lt;br /&gt;
  if it grants external rights to another customer. Delete these rights before.&lt;br /&gt;
&lt;br /&gt;
 You can&#039;t change the SSA end date, if the other project is under automatic SSA! You will receive an invoice for SSCs used for the join.&lt;br /&gt;
&lt;br /&gt;
====Project Move (admin only)====&lt;br /&gt;
A company admin can move a project with its devices, activation keys, balance etc. to another company. You have to know the company ID from this company, which can be found under Licenses-&amp;gt;Company and the company tab.&amp;lt;br&amp;gt;&lt;br /&gt;
The history won&#039;t be moved!&lt;br /&gt;
&lt;br /&gt;
 Projects with negative balances can&#039;t be moved!&lt;br /&gt;
&lt;br /&gt;
 Existing project rights will be deleted.&lt;br /&gt;
&lt;br /&gt;
====Delete====&lt;br /&gt;
Delete the project. Only possible if it has no activation keys, project rights, devices or user rights.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You may [[#Join|join]] your project into another one, if you can&#039;t delete it.&lt;br /&gt;
&lt;br /&gt;
====Project Freed_RMA_licenses====&lt;br /&gt;
If you see a project with this name in your project list, you had a RMA device with not yed moved licenses, which was shipped to innovaphone and reshipped to another customer.&amp;lt;br&amp;gt;&lt;br /&gt;
The licenses of such a device have been moved into the pool of free licenses of the project Freed_RMA_licenses, from where you can assign them to another device.&lt;br /&gt;
&lt;br /&gt;
====Rental====&lt;br /&gt;
Projects starting and ending with the &#039;&#039;&#039;$&#039;&#039;&#039; sign in their name are rental projects.&amp;lt;br&amp;gt;&lt;br /&gt;
The name corresponds to the domain name of a Devices App installation.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
All software licensing and device management can be just done through the Devices App itself, see [[Reference13r1:Concept_App_Service_Devices#Rental_program_and_Payment_method]].&amp;lt;br&amp;gt;&lt;br /&gt;
Just &#039;&#039;&#039;hardware licenses&#039;&#039;&#039; still need to be bound inside my.innovaphone currently and have to be downloaded there and uploaded on the device itself just as usual.&lt;br /&gt;
&lt;br /&gt;
===Balance===&lt;br /&gt;
On the balance page you will see the balance of the currently selected project or the balance of all your projects together.&lt;br /&gt;
The balance is bound to your company and &#039;&#039;&#039;not&#039;&#039;&#039; to your user account. The balance is bound to a specific project, but can be shared for license creation or activation key creation if wished.&amp;lt;br&amp;gt;&lt;br /&gt;
Sharing the balance over several projects is not possible in external projects!&lt;br /&gt;
&lt;br /&gt;
[[Image:Balancepage.jpg|center|thumb|200px|balancepage.jpg/|balancepage.jpg/]]&lt;br /&gt;
&lt;br /&gt;
====Free licenses====&lt;br /&gt;
&lt;br /&gt;
Here you see a list of all your free licenses. If you return licenses from one of your devices, the returned licenses are stored in your free licenses pool. You can assign these licenses to another device (see [[#Add licenses from free licenses|&#039;Add licenses from free licenses&#039;]]).&lt;br /&gt;
&lt;br /&gt;
[[Image:Balance_free_lics.jpg|center|thumb|200px|balance_free_lics.jpg/|balance_free_lics.jpg/]]&lt;br /&gt;
&lt;br /&gt;
The bind date, SSA end date and the external key (like DECT-Multi-Cell-Ari) are stored for each license.&lt;br /&gt;
&lt;br /&gt;
===Activations===&lt;br /&gt;
&lt;br /&gt;
You&#039;ll see a list of all your bound activation keys with their licenses here.&lt;br /&gt;
&lt;br /&gt;
[[Image:Activations.jpg|center|thumb|200px|activations.jpg/|activations.jpg/]]&lt;br /&gt;
&lt;br /&gt;
====Add an activation key====&lt;br /&gt;
To increase your projects balance, select one of your projects, follow the &amp;quot;Add&amp;quot; link and enter the activation key in the corresponding field. You can also enter an optional comment for this key. You will then get a listing of all contained licenses. After commiting this key, your project balance will have been increased by the keys values.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Deselect the current project&amp;quot; to view all activation keys independent of the selected project.&lt;br /&gt;
&lt;br /&gt;
====Search for an activation key by your order number====&lt;br /&gt;
Enter your own order number (or nothing), to view your activation keys for this order.&lt;br /&gt;
&lt;br /&gt;
====License certificate====&lt;br /&gt;
You can always download the innovaphone license certificate for activation keys in your projects. Simply press the download link in the list at the right side.&lt;br /&gt;
&lt;br /&gt;
===Own Activations===&lt;br /&gt;
Here you&#039;ll see a list of all created activation keys in the selected project (or over all projects).&lt;br /&gt;
&lt;br /&gt;
You can create activation keys on the project page for other users/companies or to simply transfer licenses from one project to another.&amp;lt;br&amp;gt;&lt;br /&gt;
You can enter a comment, an order number and an order reference. The &#039;&#039;&#039;order number&#039;&#039;&#039; is your own order number for the key and the &#039;&#039;&#039;order reference&#039;&#039;&#039; is the reference number of the customer, who receives the newly created key.&amp;lt;br&amp;gt;&lt;br /&gt;
The order reference and order number will be shown in the innovaphone license certificate.&lt;br /&gt;
&lt;br /&gt;
[[Image:Created_activations.jpg|center|thumb|200px|created_activations.jpg/|created_activations.jpg/]]&lt;br /&gt;
&lt;br /&gt;
You have to select an activation key in the activation key list to update or delete it.&lt;br /&gt;
&lt;br /&gt;
  Updating and deleting a key is only possible, if this key is not assigned.&lt;br /&gt;
&lt;br /&gt;
====Update====&lt;br /&gt;
Add more licenses to this key or change its comment, order number and order reference.&amp;lt;br&amp;gt;&lt;br /&gt;
You can also remove licenses by entering e.g. -2, if you want to remove 2 licenses from the key.&lt;br /&gt;
&lt;br /&gt;
[[Image:Own activations update.jpg|center|thumb|200px|own_activations_update.jpg/|own_activations_update.jpg/]]&lt;br /&gt;
&lt;br /&gt;
====Delete====&lt;br /&gt;
Delete this key. Its licenses will go back into the balance of the currently selected project.&lt;br /&gt;
&lt;br /&gt;
===Devices===&lt;br /&gt;
To view your devices you first have to click on the &amp;quot;Show&amp;quot; button. You can leave the filter field empty if you want to view all your devices.&lt;br /&gt;
&lt;br /&gt;
[[Image:Devices_page.jpg|center|thumb|200px|devices_page.jpg/|devices_page.jpg/]]&lt;br /&gt;
&lt;br /&gt;
Red marked device names are devices, which are currently in RMA.&lt;br /&gt;
&lt;br /&gt;
  MAC addresses of RMA devices do not longer start with 01-...&lt;br /&gt;
&lt;br /&gt;
====List====&lt;br /&gt;
A List of your devices in the currently selected project.&amp;lt;br&amp;gt;&lt;br /&gt;
You can deselect the current project/device to list all your devices.&lt;br /&gt;
&lt;br /&gt;
Select a certain device from the device list, to manage its properties, licenses etc.&lt;br /&gt;
&lt;br /&gt;
  Actions on multiple devices:&lt;br /&gt;
  * Move: move several devices into another project at once (see [[#Move device|Move Device]])&lt;br /&gt;
  * Remove: remove several devices at once (see [[#Remove|Remove]])&lt;br /&gt;
&lt;br /&gt;
=====Add=====&lt;br /&gt;
Follow the &amp;quot;Add new devices&amp;quot; link on the devices page.&lt;br /&gt;
&lt;br /&gt;
There you have a few options:&lt;br /&gt;
* You can add a single new device&lt;br /&gt;
* You can add devices according to a mac address range (e.g. from 00-90-33-08-20-00 to 00-90-33-08-22-00), maximum 50 at once&lt;br /&gt;
* You can add devices by uploading a text file with mac addresses like this (maximum 50 at once, each line one mac):&lt;br /&gt;
&lt;br /&gt;
  00-90-33-08-20-20&lt;br /&gt;
  00-90-33-08-20-21&lt;br /&gt;
  00-90-33-08-20-22&lt;br /&gt;
  00-90-33-24-20-20&lt;br /&gt;
&lt;br /&gt;
* You can add devices according to your received order number. Just enter you order number and you will get a list of all devices bount to this number.&lt;br /&gt;
&lt;br /&gt;
Note: MAC addresses can be always given like this:&lt;br /&gt;
* 00-90-33-xx-xx-xx&lt;br /&gt;
* 00:90:33:xx:xx:xx&lt;br /&gt;
* 009033xxxxxx&lt;br /&gt;
* xxxxxx (00-90-33- will then be added automatically)&lt;br /&gt;
&lt;br /&gt;
There might be errors, if you try to add a device. They are explained [[#Image explanation|here]].&lt;br /&gt;
&lt;br /&gt;
  As the device warranty will be handled by licenses now, you can also add telephone devices&lt;br /&gt;
  to your projects.&lt;br /&gt;
&lt;br /&gt;
=====Add warranty extensions=====&lt;br /&gt;
&lt;br /&gt;
Here you can add warranty extension licenses for all devices in the currently selected project.&amp;lt;br&amp;gt;&lt;br /&gt;
You&#039;ll get a list of all devices with the corresponding license type(s) and you can specify the years for each device (or for all devices by entering the number in the list header).&amp;lt;br&amp;gt;&lt;br /&gt;
After confirming your selection, you&#039;ll get an overview of all needed licenses, which you have to confirm too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Check licence, SSA and warranty status of a device=====&lt;br /&gt;
Here you can list licenses with ssa and the warranty end date of a device, which is not in one of your projects.&amp;lt;br&amp;gt;&lt;br /&gt;
For this option to work, you have to link your innovaphone customer ID (5 digits) to your my.innovaphone company. (As the warranty is also the one we grant to our distributors, we don&#039;t want to get an end customer confused.)&lt;br /&gt;
&lt;br /&gt;
=====Download devices of an order as CSV=====&lt;br /&gt;
Enter an order number to retrieve all devices for this order in a CSV file.&lt;br /&gt;
&lt;br /&gt;
=====Download devices of an order as PDF with barcodes=====&lt;br /&gt;
Enter an order number to retrieve all devices for this order in a PDF file with a barcode for each MAC address.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Barcode ist vom Typ C128B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Properties====&lt;br /&gt;
&lt;br /&gt;
Change the name and comment of a device.&lt;br /&gt;
  You can only change the name, if it&#039;s no MAC or IPEI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Here you have also the possibility, to directly request RMA for this device with prefilled values.&lt;br /&gt;
&lt;br /&gt;
====Licenses====&lt;br /&gt;
Here you can add, download or move licenses.&lt;br /&gt;
&lt;br /&gt;
=====Add licenses from balance=====&lt;br /&gt;
To create new licenses for a device, you have to add this device first on the devices page and then select a version of the license &lt;br /&gt;
and whether you want to summate the current licencing. If you select current licenses, then older licenses for example V6 or V7 licenses will also be counted as V8 licenses in the next overview. This is necessary if you want to license a V6 unit with V8 licenses, but still want to use it as V6.&lt;br /&gt;
After that click &amp;quot;Next&amp;quot;.&lt;br /&gt;
On the next page you will see a list of all available license types, which depends on your current available license types, of the selected license version and the device type (IP6000, IP800 e.g.):&lt;br /&gt;
[[Image:licenses.jpg|center|thumb|200px|licenses.jpg/|licenses.jpg/]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If your project has a SSA end date, which is not yet over, you&#039;ll have the possibility to set SSA for the new licenses to this SSA end date or you can optionally change this date to another one for the new licenses.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You see the available project balance, the balance over all projects (excluding external projects), the currently installed licenses and the maximum amount for this device type. You can now enter the value of the new license.&lt;br /&gt;
Base/Upgrade licenses can be selected via dropdown box. &lt;br /&gt;
&#039;&#039;&#039;Voicemail and Standby lics must always have the same amount as the selected PBX-PBX... license!&lt;br /&gt;
The maximum amount of PBX-Registration licenses equals the amount of the selected PBX-PBX... license!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The whished overall amount of pbx version 8 and above licenses can be specified here and the concrete amount of license sub types will be requested on the next page.&lt;br /&gt;
&lt;br /&gt;
 You can preview the SSC calculation of the wished licenses without having them in your balance.&lt;br /&gt;
&lt;br /&gt;
[[Image:licenses2.jpg|center|thumb|200px|licenses2.jpg/|licenses2.jpg/]]&lt;br /&gt;
&lt;br /&gt;
The best (cheapest) combination of each v8 pbx license type is already filled in, but you might change the amount of sub types if your does not fit and you do not want to purchase new activation keys for the sub types.&lt;br /&gt;
&lt;br /&gt;
The column SSC/Unit is just shown if your project is currently under SSA and you have entered a SSA end date.&lt;br /&gt;
&lt;br /&gt;
  The SSC multiplicator is the value, which you have to multiplicate with each license unit to get &lt;br /&gt;
  the corresponding SSC amount.&lt;br /&gt;
  E.g. if you have 20 units of PBX-Port8*20 licenses with a SSC value of 54 and a multiplicator of &lt;br /&gt;
  1.0000 (which equals to 365 days) you have to pay 20*54*1.0000 ~ 1080 SSCs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;If you create licenses for an older version than the current version, you have to pay SSCs from the [[#Release dates|release date]] of the next version of the currently selected version twice.&amp;lt;br&amp;gt;&lt;br /&gt;
  e.g.: you want to bind licenses for V6 with SSA, so you have to pay SSCs from the release date of V7&lt;br /&gt;
&amp;lt;br&amp;gt;You can also select for each license, if you want SSA for it or not. If not, no SSC is needed and no (new) SSA end date is set for this license.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 You can&#039;t change the SSA end date, if the project is under automatic SSA! You will receive an invoice for SSCs used for the new binding.&lt;br /&gt;
&lt;br /&gt;
Now confirm your new selection. If you have not enough licenses in your current project, but there are still licenses in other projects, you will get a dropdown box with a list of all projects containing the needed licenses. You can now select all desired/needed projects and confirm your selection again.&lt;br /&gt;
The balance of all selected projects will then be decreased by the needed amount.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If your user account has the right to buy licenses on credit, just check the checkbox.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You may enter an order number, which you can use for your order, if you buy on credit.&lt;br /&gt;
&lt;br /&gt;
=====Add licenses from free licenses=====&lt;br /&gt;
&lt;br /&gt;
Here you can assign licenses, which you returned from other devices.&lt;br /&gt;
You will also have to select the desired version and will than get a list of fitting licenses according to the current device and selected version.&lt;br /&gt;
&lt;br /&gt;
[[Image:licenses_free.jpg|center|thumb|200px|licenses_free.jpg/|licenses_free.jpg/]]&lt;br /&gt;
&lt;br /&gt;
If a license is under SSA, the correct license type is shown in column &#039;License Type&#039; besides the &#039;Original Type&#039;.&lt;br /&gt;
On confirming the selection, a consistency check is done (e.g. only 4 Relay-PRI licenses on an IP6000).&lt;br /&gt;
Bind and SSA end date will be maintained for each license.&lt;br /&gt;
&lt;br /&gt;
As external keys are also maintained, you can select e.g. an old Dect-Multicell-Ari license to have the same ARI on another IP1200.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  If your project has a SSA end date, which is not yet over, you&#039;ll have the possibility to set SSA for the new licenses &lt;br /&gt;
  to this SSA end date or you can optionally change this date to another one for the new licenses.&lt;br /&gt;
  You will have to confirm this after your first license selection (this is the same calculation as [[#Software Service|here]]).&lt;br /&gt;
&lt;br /&gt;
  You can&#039;t change the SSA end date, if the project is under automatic SSA! You will receive an invoice for SSCs used for the binding.&lt;br /&gt;
&lt;br /&gt;
=====Add V7 floating license (slave pbx)=====&lt;br /&gt;
Here you can add a V7 floating license for a slave pbx. A device with a floating license can&#039;t have V7 pbx licenses and a device with V7 pbx licenses can&#039;t have a floating license.&lt;br /&gt;
&lt;br /&gt;
=====Delete V7 floating license=====&lt;br /&gt;
Here you can delete an already existing floating license, if you won&#039;t use it anymore.&lt;br /&gt;
&lt;br /&gt;
=====Add warranty extension licenses=====&lt;br /&gt;
Extend your warranty by adding warranty extension licenses:&lt;br /&gt;
&lt;br /&gt;
[[Image:add_warranty.jpg|center|thumb|200px|add_warranty.jpg/|add_warranty.jpg/]]&lt;br /&gt;
&lt;br /&gt;
  If you add the warranty extension immediately after the receipt of your device,&lt;br /&gt;
  you can add the cheaper warranty extension licenses, otherwise you&#039;ll have to add&lt;br /&gt;
  the more expensive ones.&lt;br /&gt;
&lt;br /&gt;
  You can extend the warranty for a maximum of four years.&lt;br /&gt;
&lt;br /&gt;
=====Download licenses=====&lt;br /&gt;
&lt;br /&gt;
[[Image:Device_download.jpg|center|thumb|200px|device_download.jpg/|device_download.jpg/]]&lt;br /&gt;
&lt;br /&gt;
You will get a dropdown with all available versions. Versions are dependent of your device, your licenses and of the ssa of your licenses.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;From V9 on&#039;&#039;&#039;, you just have one option, which will create a license file, which contains the licenses upgraded to the highest version of their type.&amp;lt;br&amp;gt;&lt;br /&gt;
You are able to download downgraded versions of your licenses. E.g. if you have only V8 licenses, you can download a V7 license file (same restrictions as below).&lt;br /&gt;
&lt;br /&gt;
  Downgrades or only possible down to version 6!&lt;br /&gt;
&lt;br /&gt;
If you do not want to download licenses by version, you have to decide whether to download the licenses encrypted or not.&lt;br /&gt;
&#039;&#039;&#039;If you download the licenses unencrypted, you won&#039;t be able to return those licenses anymore.&#039;&#039;&#039;&lt;br /&gt;
So you won&#039;t be able to return licenses for devices with V5-V7 licenses, as licenses for these versions are not encrypted.&lt;br /&gt;
To return these licenses, you will have to upgrade to a new bootcode, which prevents firmware downgrades to versions below version 8.&amp;lt;br&amp;gt;&lt;br /&gt;
Encrypted licenses are stored in a xml file, which you can then upload on your V8 (or higher) device.&lt;br /&gt;
&lt;br /&gt;
  You can now also download licenses directly from by the web interface of a device. &lt;br /&gt;
  You just have to enter your account data and start downloading the licenses from my.innovaphone.com &lt;br /&gt;
  without having to download/upload a license file.&lt;br /&gt;
&lt;br /&gt;
=====Download test licenses=====&lt;br /&gt;
&lt;br /&gt;
[[Image:Device_download_test.jpg|center|thumb|200px|device_download_test.jpg/|device_download_test.jpg/]]&lt;br /&gt;
&lt;br /&gt;
You can also download test licenses if you want to run tests. You will be asked, which version you want to use, whether the device is used as slave and if not used as slave, how many pbx licenses you want to use.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: Since V11, trial licenses are valid for 3 months and can be released once for a dedicated device. After expiration of those 3 months no further trial license creation for this device is possible.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 V5 does &#039;&#039;&#039;not&#039;&#039;&#039; support test licenses!&lt;br /&gt;
&lt;br /&gt;
=====Download App development license=====&lt;br /&gt;
If you&#039;re an App developer, you have the possibility, to generate a real license for you Apps which will contain your manufacturer prefix.&amp;lt;br/&amp;gt;&lt;br /&gt;
The manufacturer prefix has to deposited at your my.innovaphone company by innovaphone before you can use this feature.&lt;br /&gt;
&lt;br /&gt;
 You can just have up to &#039;&#039;&#039;three&#039;&#039;&#039; different devices per company for which you can create such licenses!&lt;br /&gt;
 These licenses aren&#039;t allowed for production usage!&lt;br /&gt;
&lt;br /&gt;
You see your already used MAC addresses on this page too if you already created such licenses before.&lt;br /&gt;
&lt;br /&gt;
If your manufacturer prefix is &#039;&#039;&#039;innovaphone&#039;&#039;&#039;, you can enter license names like:&lt;br /&gt;
* App(innovaphone-app1)15&lt;br /&gt;
* Service(innovaphone-app2)15&lt;br /&gt;
&lt;br /&gt;
=====Move licenses to another device=====&lt;br /&gt;
If you have the needed account rights or the device is already in RMA, you can move licenses to another device. After moving licenses, the former device will be marked as a RMA device.&lt;br /&gt;
&lt;br /&gt;
  You can just move licenses to devices without licenses!&lt;br /&gt;
&lt;br /&gt;
=====Mix of rental and purchased licenses=====&lt;br /&gt;
From &#039;&#039;&#039;13r2 SR12&#039;&#039;&#039; onwards you can mix rental and purchased licenses.&amp;lt;br/&amp;gt;&lt;br /&gt;
A device with rental licenses will be always inside a rental project (you recognize such a project by it&#039;s starting and ending &#039;&#039;&#039;$&#039;&#039;&#039; in the name).&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now add licenses from the balance to a device in such a rental project.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If you invalidate lifetime licenses on such a device, just purchased licenses are returned. Rental licenses stay bound until you remove them inside your Devices App! (under rental menu)&lt;br /&gt;
Inside my.innovaphone you will always see both rental and purchased licenses. Inside the Devices App, you will just see the rental licenses.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You must download and/or install the purchased licenses as usual.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
A 13r1 PBX or a PBX with an older SR will just recognize rented licenses!&lt;br /&gt;
&lt;br /&gt;
 If your PBX is already inside a non rental project, it will be automatically added to a rental project if you add rental licenses. You then may have the device in two different projects (one rental, one normal), which is no issue.&lt;br /&gt;
&lt;br /&gt;
====Move device====&lt;br /&gt;
Here you can move the current device or the selected devices to another project.&amp;lt;br&amp;gt;&lt;br /&gt;
If you select a SSA project, you can change the SSA end date for the move process.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  If the other project is under SSA, you will first see a SSC calculation, which you have to confirm, &lt;br /&gt;
  as the SSA date for each SSA license will be extended until the given SSA end date &lt;br /&gt;
  (this is the same calculation as adding SSA to an already existing project, see [[#Software Service|here]]).&lt;br /&gt;
&lt;br /&gt;
  You can&#039;t change the SSA end date, if the other project is under automatic SSA! You will receive an invoice for SSCs used for the move.&lt;br /&gt;
&lt;br /&gt;
====Invalidation====&lt;br /&gt;
====Returning of licenses====&lt;br /&gt;
&lt;br /&gt;
By the invalidation, licenses are returned to the free balance of the project to which the device belongs in the Portal my.innovaphone.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can then bind the licenses from the free balance to another device.&lt;br /&gt;
&lt;br /&gt;
=====Requirements=====&lt;br /&gt;
* V8 or higher&lt;br /&gt;
* access to the webinterface&lt;br /&gt;
* a device certificate&lt;br /&gt;
* my.innovaphone login credentials&lt;br /&gt;
* &#039;&#039;&#039;no IPVA device&#039;&#039;&#039;&lt;br /&gt;
* no &#039;In House&#039; licenses&lt;br /&gt;
&lt;br /&gt;
=====Informations=====&lt;br /&gt;
&lt;br /&gt;
You can invalidate V8 (or higher) licenses by uploading the XML file, you got from your device or by returning your licenses over the web interface of your device ([[Reference12r1:Configuration/General/License]]), in order to return [[Reference15r1:Licenses#Gateway Licenses|PBX licenses]] back to the free balance.&lt;br /&gt;
&lt;br /&gt;
V7 licenses can be just returned, if you agree, that you won&#039;t be able to downgrade below V8 anymore. You will need a new bootcode, to use this function. &#039;&#039;&#039;You need a V8 firmware or higher for invalidation.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If your device has access to my.innovaphone.com, you can also invalidate licenses directly from the web interface of the device.&lt;br /&gt;
&lt;br /&gt;
[[Reference15r1:Licenses#Gateway Licenses|Gateway licenses]] and warranty extensions won&#039;t be returned to the balance and remain to be assigned to the device!&lt;br /&gt;
&lt;br /&gt;
The licenses needn&#039;t be present on the local device to perform the invalidation!&lt;br /&gt;
&lt;br /&gt;
SSA are bound to the license and not lost when performing invalidation.&lt;br /&gt;
&lt;br /&gt;
=====Process=====&lt;br /&gt;
&lt;br /&gt;
Steps to invalidate licenses, if your device has internet connectivity:&lt;br /&gt;
# on the web interface of the device go to General-&amp;gt;License and follow the my.innovaphone link&lt;br /&gt;
# enter your my.innovaphone account, the device must be in one of your projects&lt;br /&gt;
# click Invalidate&lt;br /&gt;
# click Transfer (this might fail, if NTP or DNS is not configured properly or device certificate is not installed)&lt;br /&gt;
# reset if asked for&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Steps to invalidate licenses, if your device has no internet connectivity:&lt;br /&gt;
# on the web interface of the device go to General-&amp;gt;License and follow the my.innovaphone link&lt;br /&gt;
# click Invalidate&lt;br /&gt;
# click Backup and upload this file on my.innovaphone [[#Upload the invalidation document to return licenses|here]] (Licenses-&amp;gt;Devices (select the corresponding device)-&amp;gt;Invalidation)&lt;br /&gt;
# you&#039;ll get a confirmation file after uploading the saved file&lt;br /&gt;
# upload this on the device (under Step1)&lt;br /&gt;
# reset if asked for&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;Your IP800 does not have a device certificate on it.&amp;quot; - In this case you need to download a hardware certification,&lt;br /&gt;
  please contact the innovaphone [mailto:license@innovaphone.com license department].&lt;br /&gt;
&lt;br /&gt;
=====Download confirmation file=====&lt;br /&gt;
If you created a new certificate or you invalidated your licenses, you can later download the confirmation file, which you have to upload on the box.&lt;br /&gt;
&lt;br /&gt;
=====Request certificate=====&lt;br /&gt;
If you have the needed rights, you can request a new device certificate for your device.&lt;br /&gt;
&lt;br /&gt;
=====Upload the invalidation document to return licenses=====&lt;br /&gt;
Licenses-&amp;gt;Devices (select the corresponding device)-&amp;gt;Invalidation:&lt;br /&gt;
&lt;br /&gt;
Upload the invalidation document, which you got from the website of the device to return the licenses of this device.&lt;br /&gt;
&lt;br /&gt;
After uploading you&#039;ll get a confirmation file, which you have to upload on your device.&lt;br /&gt;
&lt;br /&gt;
====Remove====&lt;br /&gt;
You can always remove devices from a project. If they have licenses, these won&#039;t be deleted, so you might add the device to another project again.&lt;br /&gt;
&lt;br /&gt;
===History===&lt;br /&gt;
[[Image:history.jpg|center|thumb|200px|history.jpg/|history.jpg/]]&lt;br /&gt;
You can view your history for several contexts:&lt;br /&gt;
* Company: history of all actions in your company&lt;br /&gt;
* User: history of all actions of the selected user&lt;br /&gt;
* Device: history of all actions for the selected device&lt;br /&gt;
&lt;br /&gt;
Each context applies to the currently selected project.&lt;br /&gt;
If you deselect the current project, you will see the history over all projects.&lt;br /&gt;
&lt;br /&gt;
You can select to view the history of the last day, week, month, year or from always. Collecting data might take a while...&lt;br /&gt;
&lt;br /&gt;
===Company===&lt;br /&gt;
Manage users SSA expiry email flag, import other companies or add your companies innovaphone ID.&lt;br /&gt;
&lt;br /&gt;
====Users====&lt;br /&gt;
&lt;br /&gt;
You can just edit the SSA expiry email flag here. The other user settings moved to the [[#Authorized Persons| Authorized persons tab]].&lt;br /&gt;
&lt;br /&gt;
====Join (admin only)====&lt;br /&gt;
As admin you can also join another company into your company by entering an admin account of this company. This might be usefull if one user of your company has accidentally created an own company.&amp;lt;br&amp;gt;&lt;br /&gt;
Everything like projects, users, devices, balance, activations etc. will be imported!&amp;lt;br&amp;gt;&lt;br /&gt;
You also have to enter the company id of the company, which is to be imported. You can find this company under Licenses-&amp;gt;Company and the company tab.&lt;br /&gt;
&lt;br /&gt;
  This is not available for non company admin users.&lt;br /&gt;
&lt;br /&gt;
  The joined company will be deleted afterwards!&lt;br /&gt;
&lt;br /&gt;
====Company====&lt;br /&gt;
&lt;br /&gt;
You can check the &#039;&#039;&#039;Device SSA&#039;&#039;&#039; checkbox, if you want to receive SSA expiry reminder mails for each device independent of the projects SSA end date.&lt;br /&gt;
These mails will be send weekly seven weeks before the SSA for a license a the device expires.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can also enter additional email addresses, which should receive SSA emails.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can define a global &#039;&#039;&#039;end user expiry mail text&#039;&#039;&#039; here, which will be sent to end users, if end users are configured in a [[#SSA Expiry Mail| project]]. This text can be overridden by a text in a project under [[#SSA Expiry Mail| SSA Expiry Mail]].&lt;br /&gt;
&lt;br /&gt;
==RMA==&lt;br /&gt;
Here you can see all your RMA devices, which arrived innovaphone already. The licenses of this macadresses are moveable.&lt;br /&gt;
[[Image:rma.jpg|center|thumb|200px|rma.jpg/|rma.jpg/]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you want to request RMA for a certain device, go to the device properties and follow the &amp;quot;Request RMA&amp;quot; link.&lt;br /&gt;
&lt;br /&gt;
==Support==&lt;br /&gt;
===Mantis===&lt;br /&gt;
Here you&#039;ll get a list of all open cases and [[Understanding the innovaphone trouble ticket status page#Information available| additional info regarding their state]] in our ticket system. This list is composed of all tickets assigned to email addresses of your my.innovaphone users in your company.&amp;lt;br&amp;gt;&lt;br /&gt;
Often used functions:&lt;br /&gt;
* You can click on the ticket number (&amp;quot;ID&amp;quot; column) to open an email prepared with the right emailadress and subject to address this case.&lt;br /&gt;
* You can click on the &#039;&#039;History&#039;&#039; link to get an overview of the already made communication with our support/presales-team.&lt;br /&gt;
* Another important new function is the option to upload larger files to your support/presales tickets using the &#039;&#039;Fileupload&#039;&#039; column.&lt;br /&gt;
&lt;br /&gt;
===Announcements===&lt;br /&gt;
You can convert audio files into G.7xx files which you can use as announcements.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
;Supported input formats:&lt;br /&gt;
* mp3&lt;br /&gt;
* wav&lt;br /&gt;
* ogg&lt;br /&gt;
* flac&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
;Generated output formats:&lt;br /&gt;
* G.711u&lt;br /&gt;
* G.711a&lt;br /&gt;
* G.729&lt;br /&gt;
* G.723&lt;br /&gt;
* G.722&lt;br /&gt;
&lt;br /&gt;
==Image explanation==&lt;br /&gt;
&lt;br /&gt;
===Errors===&lt;br /&gt;
&lt;br /&gt;
====Already In Company====&lt;br /&gt;
[[Image:Icon_in_company_inno_01.png|icon_in_company_inno_01.png/|icon_in_company_inno_01.png/]]&lt;br /&gt;
* This device already exists in your company and can&#039;t be added/imported.&lt;br /&gt;
If you want to import this device anyway, you first have to delete your current device from its project.&lt;br /&gt;
&lt;br /&gt;
====Already Imported====&lt;br /&gt;
[[Image:Icon_imported_inno_01.png|icon_imported_inno_01.png/|icon_imported_inno_01.png/]]&lt;br /&gt;
* This device has been already imported. &lt;br /&gt;
You can&#039;t import it again.&lt;br /&gt;
&lt;br /&gt;
====Not Found====&lt;br /&gt;
[[Image:Icon_not_found_inno_01.png|icon_not_found_inno_01.png/|icon_not_found_inno_01.png/]]&lt;br /&gt;
* This device was not found in the my innovaphone database. &lt;br /&gt;
This should never happen, but if, contact the administrator.&lt;br /&gt;
&lt;br /&gt;
====IPVA MAC exists====&lt;br /&gt;
[[Image:Icon_ip_va_exists_inno_01.png|icon_ip_va_exists_inno_01.png/|icon_ip_va_exists_inno_01.png/]]&lt;br /&gt;
* An IPVA MAC address must be unique and can be assigned to just one company. You tried to add an already existing IPVA MAC.&lt;br /&gt;
Please assign a new one to your IPVA. For further details, see [[Reference13r2:Concept_Innovaphone_Virtual_Appliance#License_Configuration]].&lt;br /&gt;
&lt;br /&gt;
my.innovaphone supports the following MAC address ranges:&lt;br /&gt;
* 00-50-56-...&lt;br /&gt;
* 00-15-5d-...&lt;br /&gt;
* 00-03-ff-...&lt;br /&gt;
* 00-0d-3a-...&lt;br /&gt;
* 00-12-5a-...&lt;br /&gt;
* 00-17-fa-...&lt;br /&gt;
* 00-50-f2-...&lt;br /&gt;
* 00-1d-d8-...&lt;br /&gt;
* 00-05-69-...&lt;br /&gt;
* 00-1c-14-...&lt;br /&gt;
* 00-0c-29-...&lt;br /&gt;
* 00-1d-db-...&lt;br /&gt;
* 5a-ad-1d-...&lt;br /&gt;
* 48-e9-ca-...&lt;br /&gt;
* 02-01-04-...&lt;br /&gt;
* bc-24-...&lt;br /&gt;
* e2-... &#039;&#039;this is an autogenerated MAC address of innovaphone cloud containers&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Warnings===&lt;br /&gt;
&lt;br /&gt;
====Several Companies====&lt;br /&gt;
[[Image:Icon_several_companies_inno_01.png|icon_several_companies_inno_01.png/|icon_several_companies_inno_01.png/]]&lt;br /&gt;
* This device is already in another company.&lt;br /&gt;
This means, that either you do not have the physical device or it once belonged another company.&lt;br /&gt;
You can still import/add this device and you will have access to all of its current licenses.&lt;br /&gt;
&lt;br /&gt;
====Several Users====&lt;br /&gt;
[[Image:Icon several users inno 01.png|icon_several_users_inno_01.png/|icon_several_users_inno_01.png/]]&lt;br /&gt;
* This device has licenses from several users of the old license manager.&lt;br /&gt;
This means, that you are not neccessarily the user, who physically owns this device. If you do not own it, do not import it.&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
====No downgrade====&lt;br /&gt;
[[Image:no_downgrade.png|no_downgrade.png/|no_downgrade.png/]]&lt;br /&gt;
* Licenses, which have been downloaded for V5/V6/V7, were returned from this device, so no downgrade to these versions is allowed any more.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- myinno my innovaphone my_inno my_innovaphone my-innovaphone my-inno--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Release dates==&lt;br /&gt;
V5:  January 1st 2003&amp;lt;br&amp;gt;&lt;br /&gt;
V6:  November 2nd 2006&amp;lt;br&amp;gt;&lt;br /&gt;
V7:  November 14th 2008&amp;lt;br&amp;gt;&lt;br /&gt;
V8:  December 7th 2009&amp;lt;br&amp;gt;&lt;br /&gt;
V9:  April 26th 2011&amp;lt;br&amp;gt;&lt;br /&gt;
V10: July 8th 2013&amp;lt;br&amp;gt;&lt;br /&gt;
V11: February 9th 2015&amp;lt;br&amp;gt;&lt;br /&gt;
V12: July 11th 2016&amp;lt;br&amp;gt;&lt;br /&gt;
V13: May 13th 2019&amp;lt;br&amp;gt;&lt;br /&gt;
V14: December 20th 2023&lt;br /&gt;
&lt;br /&gt;
V15: March 25th 2025&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==myplay==&lt;br /&gt;
[[https://myplay.innovaphone.com myplay]] offers a platform to test all my.innovaphone related content. You can create activation keys, licenses, accounts, projects and so on to learn it or to calculate possible scenarios.&lt;br /&gt;
&lt;br /&gt;
===Base===&lt;br /&gt;
The base of the database is the my.innovaphone database from the 13.8.2010. All accounts, companies and projects have been imported and are available until this date.&amp;lt;br&amp;gt;&lt;br /&gt;
From this date on the databases won&#039;t be synchronised any more (despite of the device table)!&lt;br /&gt;
&lt;br /&gt;
===Balance===&lt;br /&gt;
You can change your balance by yourself. Simply select the license type in the dropdown box on the balance page, enter the desired amount and your balance will be increased by this type.&lt;br /&gt;
&lt;br /&gt;
===Activation keys===&lt;br /&gt;
You can create own activation keys. These will have the prefix &amp;quot;PLAY-&amp;quot; to identify them as play activation keys. You won&#039;t be able to upload them on my.innovaphone.com.&lt;br /&gt;
&lt;br /&gt;
===Licenses===&lt;br /&gt;
After having selected a device under Licenses-&amp;gt;Devices, you can add/change licenses as you want by selecting new ones in the dropdown box or changing existing ones.&lt;br /&gt;
&lt;br /&gt;
====Download====&lt;br /&gt;
You will always just download test licenses here!&lt;br /&gt;
&lt;br /&gt;
====Invalidation====&lt;br /&gt;
Won&#039;t be possible here, because this is hardware related and can&#039;t be simulated.&lt;br /&gt;
&lt;br /&gt;
====Checkbox editing via list====&lt;br /&gt;
* &#039;D&#039; Deletes the license&lt;br /&gt;
* &#039;B&#039; Puts the license back into the projects balance&lt;br /&gt;
* &#039;F&#039; Puts the license into the pool of free licenses&lt;br /&gt;
&lt;br /&gt;
===Device RMA===&lt;br /&gt;
You can put a device under RMA to test this scenario (Licenses-&amp;gt;Devices, select a device and -&amp;gt;Properties). You can also remove the RMA status here.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External interface==&lt;br /&gt;
&lt;br /&gt;
There is an external interface, which you can use to control some functionality without a login to the my.innovaphone web site.&amp;lt;br&amp;gt;&lt;br /&gt;
You can use the interface with an &#039;&#039;&#039;HTTP GET&#039;&#039;&#039; request to the following URL:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;https://my.innovaphone.com/interface.php&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Configure a trust value and a URL (can be a dummy URL if not used otherwise) unter Licenses -&amp;gt; Project -&amp;gt; Properties and tick &amp;quot;Configure Update-URL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===General parameters for all commands===&lt;br /&gt;
:;cmd: the wished command&lt;br /&gt;
:;email: the email address of a user who is registered in my.innovaphone&lt;br /&gt;
:;project_id: the project ID of the project where the user has access to (you can find the project ID under [[#Properties| Licenses-&amp;gt;Projects-&amp;gt;Properties]])&lt;br /&gt;
:;hash: an SHA256 hash value which is computed over all GET parameters but the hash parameter itself plus the &#039;&#039;&#039;trust&#039;&#039;&#039; value of the project (see [[#Properties|Reference:My_Innovaphone#Properties]])&lt;br /&gt;
:;hash: the values of the GET parameters have to be URL encoded before calculation of the hash&lt;br /&gt;
&lt;br /&gt;
;Example: URL &amp;lt;code&amp;gt;https://my.innovaphone.com/interface.php?cmd=addDevice&amp;amp;email=user@example.com&amp;amp;project_id=123456&amp;amp;serial=00-90-33-01-02-03&amp;amp;hash=b62f7948d6383cc365592ed289b6173cd35229cadc347847b953f78c8880d5b9&amp;lt;/code&amp;gt;&lt;br /&gt;
:;project trust value: 1234567890abcdef&lt;br /&gt;
:;the data of the SHA256 hash: ?cmd=addDevice&amp;amp;email=user%40example.com&amp;amp;project_id=123456&amp;amp;serial=00-90-33-01-02-03&amp;amp;trust=1234567890abcdef&lt;br /&gt;
:;example PHP function call to generate the hash: hash(&amp;quot;sha256&amp;quot;, &amp;quot;?cmd=addDevice&amp;amp;email=user%40example.com&amp;amp;project_id=123456&amp;amp;serial=00-90-33-01-02-03&amp;amp;trust=1234567890abcdef&amp;quot;);&lt;br /&gt;
:;with the current values, the function should return: b62f7948d6383cc365592ed289b6173cd35229cadc347847b953f78c8880d5b9&lt;br /&gt;
&lt;br /&gt;
===Add a device to a project===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters&lt;br /&gt;
:;cmd: &#039;&#039;&#039;addDevice&#039;&#039;&#039;&lt;br /&gt;
:;serial: the serial number of the device, e.g. 00-90-33-01-02-03&lt;br /&gt;
:;[device_desc]: optional, a description for the new device&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;example success: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:true }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:;example error: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:false, &amp;quot;error&amp;quot;:&amp;quot;the project with ID 123456 doesn&#039;t exist&amp;quot; }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Remove a device from a project===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters&lt;br /&gt;
:;cmd: &#039;&#039;&#039;delDevice&#039;&#039;&#039;&lt;br /&gt;
:;serial: the serial number of the device, e.g. 00-90-33-01-02-03&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;example success: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:true }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:;example error: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:false, &amp;quot;error&amp;quot;:&amp;quot;the project with ID 123456 doesn&#039;t exist&amp;quot; }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Get the warranty of a device===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters&lt;br /&gt;
:;cmd: &#039;&#039;&#039;getWarranty&#039;&#039;&#039;&lt;br /&gt;
:;serial: the serial number of the device, e.g. 00-90-33-01-02-03&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;warranty: a unix timestamp in seconds since 1970 (timezone Europe/Berlin), e.g. &#039;&#039;&#039;1448492400&#039;&#039;&#039;&lt;br /&gt;
:;warrantyStr: a string like &#039;&#039;&#039;&amp;quot;2015-11-26 00:00:00&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Create a new project===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters: you must use the project_id and trust value of an already existing project!&lt;br /&gt;
:;cmd: &#039;&#039;&#039;createProject&#039;&#039;&#039;&lt;br /&gt;
:;project_name: the name of the new project&lt;br /&gt;
:;[project_desc]: optional, a description for the new project&lt;br /&gt;
:;[update_url]: optional, an update URL for the project (do not forget to URL encode the value inside your HTTP GET request!)&lt;br /&gt;
:;[ssa_due_date]: optional, a unix timestamp in seconds since 1970 (timezone Europe/Berlin), e.g. &#039;&#039;&#039;1448492400&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;projectId: the project id of the created project&lt;br /&gt;
&lt;br /&gt;
 The newly created project is created with the same trust value which was used for the creation request. This allows you to directly use the API with the new project.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
===Smaller issues===&lt;br /&gt;
* Devices where imported into a project with SSA. If this happened to you, please move the corresponding devices into a project &#039;&#039;&#039;without&#039;&#039;&#039; SSA and back into the project &#039;&#039;&#039;with&#039;&#039;&#039; SSA to extend/add SSA for the licenses until the SSA end date.&lt;br /&gt;
* IE7 moves a list under the menu, when a list becomes to wide&lt;br /&gt;
===Licenses don&#039;t work on a device, where an invalidation has been done===&lt;br /&gt;
A possible reason here is, that the invalidation process hasn&#039;t been completed.&lt;br /&gt;
To resolve this issue, follow these steps:&lt;br /&gt;
&lt;br /&gt;
* Download the Confirmation File (Certificate) from http://my.innovaphone.com under [[#Invalidation|Invalidation]] after selecting the project and the device&lt;br /&gt;
* Open [[Reference9:General/License/my.innovaphone|General-&amp;gt;License-&amp;gt;my.innovaphone.com]] on your device&lt;br /&gt;
* Click on &amp;quot;Invalidate&amp;quot; (no my.innovaphone credentials needed)&lt;br /&gt;
* Upload the previously downloaded confirmation file newcert-00-90-33-xx-xx-xx.xml as &amp;quot;Confirmation file&amp;quot;&lt;br /&gt;
* Reset the box&lt;br /&gt;
* Reupload the licenses&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer doesn&#039;t work===&lt;br /&gt;
Yes, that&#039;s correct. Please use an up to date version of Chrome, Firefox or Edge!&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_IP&amp;diff=78954</id>
		<title>Reference16r1:Concept App Service IP</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_IP&amp;diff=78954"/>
		<updated>2026-02-27T12:58:33Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Troubleshooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
[[Category:Concept|IP]]&lt;br /&gt;
&lt;br /&gt;
The App IP is an app which offers the PBX functionality and further functionalities as App service on our innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone firmware and apps V16&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* innovaphone Application Platform (image version 140011 or higher)&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
The App IP offers modules known from innovaphone gateways, like the PBX, TURN server functionality etc.&lt;br /&gt;
&lt;br /&gt;
==How it works==&lt;br /&gt;
&lt;br /&gt;
=== Single instance mode ===&lt;br /&gt;
Unlike other App Services, the App IP is a single instance App Service, so you can create &#039;&#039;&#039;just&#039;&#039;&#039; a single instance and not multiple instances.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Standard licensing mechanisms apply to the App IP as they apply to innovaphone gateways.&lt;br /&gt;
&lt;br /&gt;
In addition, every port license requires a dedicated IPAP license (similar to the IPVA license for virtual machines).&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
There is no App provided by this App Service.&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
There is no PBX Manager Plugin provided by this App Service.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The configuration is done as an innovaphone gateway is configured too.&lt;br /&gt;
&lt;br /&gt;
=== Advanced UI ===&lt;br /&gt;
The advanced UI is reachable under the webserver path of the App IP instance and /admin.xml?xsl=admin.xsl, e.g.:&lt;br /&gt;
https://domain.com/ip/admin.xml?xsl=admin.xsl&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
The App IP offers standard tracing mechanism for App Services and in addition mechanisms known from innovaphone gateways.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can enable module related trace flags with config change commands or by setting trace flags under Maintenance -&amp;gt; Tracing in the Advanced UI of the App IP.&lt;br /&gt;
&lt;br /&gt;
 Trace files are not found under Maintenance -&amp;gt; Tracing but on the App IP service on your App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==Known issues==&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
* [[Reference16r1:Concept_innovaphone_App_Platform_Docker_Container]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_IP&amp;diff=78953</id>
		<title>Reference16r1:Concept App Service IP</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_App_Service_IP&amp;diff=78953"/>
		<updated>2026-02-27T12:56:54Z</updated>

		<summary type="html">&lt;p&gt;Dde: Created page with &amp;quot;Apps IP  The App IP is an app which offers the PBX functionality and further functionalities as App service on our innovaphone App Platform.  == Applies To ==   * innovaphone firmware and apps V16  ==Requirements== * innovaphone Application Platform (image version 140011 or higher)  ==Concept==  The App IP offers modules known from innovaphone gateways, like the PBX, TURN server functionality etc.  ==How it works==  === Single in...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
[[Category:Concept|IP]]&lt;br /&gt;
&lt;br /&gt;
The App IP is an app which offers the PBX functionality and further functionalities as App service on our innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone firmware and apps V16&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
* innovaphone Application Platform (image version 140011 or higher)&lt;br /&gt;
&lt;br /&gt;
==Concept==&lt;br /&gt;
&lt;br /&gt;
The App IP offers modules known from innovaphone gateways, like the PBX, TURN server functionality etc.&lt;br /&gt;
&lt;br /&gt;
==How it works==&lt;br /&gt;
&lt;br /&gt;
=== Single instance mode ===&lt;br /&gt;
Unlike other App Services, the App IP is a single instance App Service, so you can create &#039;&#039;&#039;just&#039;&#039;&#039; a single instance and not multiple instances.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Standard licensing mechanisms apply to the App IP as they apply to innovaphone gateways.&lt;br /&gt;
&lt;br /&gt;
In addition, every port license requires a dedicated IPAP license (similar to the IPVA license for virtual machines).&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
There is no App provided by this App Service.&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
There is no PBX Manager Plugin provided by this App Service.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The configuration is done as an innovaphone gateway is configured too.&lt;br /&gt;
&lt;br /&gt;
=== Advanced UI ===&lt;br /&gt;
The advanced UI is reachable under the webserver path of the App IP instance and /admin.xml?xsl=admin.xsl, e.g.:&lt;br /&gt;
https://domain.com/ip/admin.xml?xsl=admin.xsl&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
The App IP offers standard tracing mechanism for App Services and in addition mechanisms known from innovaphone gateways.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can enable module related trace flags with config change commands or by setting trace flags under Maintenance -&amp;gt; Tracing in the Advanced UI of the App IP.&lt;br /&gt;
&lt;br /&gt;
==Known issues==&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
* [[Reference16r1:Concept_innovaphone_App_Platform_Docker_Container]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Howto:Pcap&amp;diff=78510</id>
		<title>Howto:Pcap</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Howto:Pcap&amp;diff=78510"/>
		<updated>2025-11-19T06:38:50Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With remote PCAP, network traffic can be captured directly from another network device, instead of capturing the network traffic from the own device.&lt;br /&gt;
&lt;br /&gt;
==Remote PCAP==&lt;br /&gt;
===Requirements===&lt;br /&gt;
&lt;br /&gt;
* You should have installed the latest wireshark Stable release 4.4.x - [http://www.wireshark.org/download.html Wireshark Download]&lt;br /&gt;
: You may also use newer builds, but make sure they are supported by our plugin DLL. See [[#Versions | Versions ]] below for a list of supported versions&lt;br /&gt;
* To view the standard debug output of ISDN LAPD/Q.931 packets, you have to install the &#039;&#039;innovaphone plugin&#039;&#039;  (&amp;lt;code&amp;gt;innovaphone_win32.dll&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;innovaphone_win64.dll&amp;lt;/code&amp;gt;, depending on your installed wireshark version, 32 bit or 64 bit). To convert text log output (from the &#039;&#039;Maintenance/Tracing&#039;&#039; page) you can use &#039;&#039;log2pcap.exe&#039;&#039;.&lt;br /&gt;
*To download both items, go to the [http://store.innovaphone.com innovaphone AppStore] under the tab &#039;&#039;&#039;Software&#039;&#039;&#039; , select the latest version of &#039;&#039;&#039;log2pcap&#039;&#039;&#039; and &#039;&#039;&#039;Wireshark DLLs&#039;&#039;&#039; .&lt;br /&gt;
: Again, if you use newer builds, make sure you download the DLLs from the appropriate &#039;&#039;apps&#039;&#039; package (see [[#Versions | Versions ]] below)&lt;br /&gt;
: To &#039;&#039;&#039;install&#039;&#039;&#039; a DLL version &#039;&#039;&#039;1059&#039;&#039;&#039; or previous, just copy it to your wireshark plugin directory and pay attention on your currently used version (e.g.: c:\programme\wireshark\plugins\1.12.0\).  Note that you need to re-install the DLL each time you update wireshark&lt;br /&gt;
: To &#039;&#039;&#039;install&#039;&#039;&#039; a DLL version &#039;&#039;&#039;1060&#039;&#039;&#039; or later, just copy it to your wireshark plugin &#039;&#039;&#039;epan&#039;&#039;&#039; directory and pay attention on your currently used version (e.g.: c:\programme\wireshark\plugins\4.4\epan\).  Note that you need to re-install the DLL each time you update wireshark&lt;br /&gt;
* Open the [http://wiki.innovaphone.com/index.php?title=Image:Pcap_example_isdn.zip example pcap file with lapd and q.931 packets] to check your current installation. It should look like this, if you have the innovaphone_winXX.dll correctly installed:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pcap_sample_isdn.jpg|center|thumb|200px|PCAP ISDN example]]&lt;br /&gt;
&lt;br /&gt;
==== Using Wireshark &#039;&#039;Legacy&#039;&#039; ====&lt;br /&gt;
Starting with version 2, wireshark has a new user interface.  Unfortunately, we found this to be sluggish and buggy.  For that reason, we strongly recommend to use wireshark&#039;s &#039;&#039;legacy&#039;&#039; version.  It is available as an option (&#039;&#039;Wireshark 1, The classic user interface&#039;&#039;) in the installer&#039;s item selection.  You also may want to associate the trace file extensions (.pcap, .pcapng etc.) with &#039;&#039;Wireshark Legacy&#039;&#039; instead of the standard version (also available in the setup dialogue).&lt;br /&gt;
&lt;br /&gt;
===Setting up the rpcap server===&lt;br /&gt;
&lt;br /&gt;
* The rpcap server can be any innovaphone device. &lt;br /&gt;
* The remote pcap server is disabled per default. To enable it, just go to Diagnostics-&amp;gt;Tracing and check the &amp;quot;Enable&amp;quot; flag in the &amp;quot;Remote PCAP&amp;quot; group. If you are experiencing problems, also enable the trace flag with &amp;quot;config add PCAP /trace&amp;quot;.&lt;br /&gt;
* To capture all ip traffic (udp and tcp), enable the &amp;quot;IP (all tcp/udp traffic)&amp;quot; flag in the group &amp;quot;IP&amp;quot;. Otherwise just enable all the trace flags on the modules you want to capture.&lt;br /&gt;
&lt;br /&gt;
===Capturing with wireshark===&lt;br /&gt;
&lt;br /&gt;
===1.x.x - 1.7.x===&lt;br /&gt;
Open your wireshark and the capture options dialogue. Choose &amp;quot;remote&amp;quot; from the dropdown list and &lt;br /&gt;
Type &amp;quot;&amp;lt;IP-ADDRESS&amp;gt;/TRACE&amp;quot; into the host field.&lt;br /&gt;
&lt;br /&gt;
It should look like this: (Screenshot from older Wireshark, v.1.2.2)&lt;br /&gt;
[[Image:Wireshark_1.2.2_trace_settings.PNG|center|thumb|200px|Wireshark capture options]]&lt;br /&gt;
&lt;br /&gt;
Then just click on &amp;quot;Start&amp;quot; to start capturing.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;gt;= 1.8.x ===&lt;br /&gt;
&lt;br /&gt;
Open your wireshark and „Capture Options“-&amp;gt;“Manage Interfaces“-&amp;gt;“Remote Interfaces“. Add the IP address of your device.&amp;lt;br&amp;gt;&lt;br /&gt;
The remote interface will be listed in your interface now and you can select it for capturing data.&lt;br /&gt;
&lt;br /&gt;
[[Image:Wireshark_1.8.6_settings.png|center|thumb|200px|Wireshark capture options]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;gt;= 2.0.0 ===&lt;br /&gt;
&lt;br /&gt;
[[Image:Wireshark_2.0.0_settings.jpg|center|thumb|200px|Wireshark capture options]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;gt;= 3.0.0 ===&lt;br /&gt;
&lt;br /&gt;
With the latest innovaphone Firmware (e.g. 13r1 SR11), Wireshark is supported again if you use the latest wireshark DLL.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you&#039;re running older firmware versions:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The innovaphone.dll is not supported currently with this Wireshark-version. Please do not upgrade to Wireshark 3.0 or up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RCAP does not currently work with innovaphone devices in newer Wireshark versions. If you only want to pull general remote PCAPs with it, you can also try the Wireshark Pipe feature. For this you have to create a new pipe interface in Wireshark in the following format.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rpcap://[ip-address]/trace&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
During our tests we experienced some problems with it. Alternatively, you can add the pipe interface via the command line. First change to the Wireshark directory and replace [ip-address] with the innovaphone IP address.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
C:\Program Files\Wireshark&amp;gt;wireshark -ni rpcap://[ip-address]/trace&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;gt;= 4.0.7 ===&lt;br /&gt;
Wireshark doesn&#039;t support 32bit Windows builds anymore, so there is just a 64bit version of the DLL now.&lt;br /&gt;
&lt;br /&gt;
===Supported protocols===&lt;br /&gt;
&lt;br /&gt;
* ISDN: LAPD L2/L3 with dissector innovaphone.dll (enable Diagnostics-&amp;gt;Tracing TELX/PRIX/PPP)&lt;br /&gt;
* AC DSP: dsp with dissector Ac49xPacketRecording.dll (enable Diagnostics-&amp;gt;Tracing-&amp;gt;VOIP DSP)&lt;br /&gt;
* PPPoE: flag &amp;quot;/pcap&amp;quot; on module(s) PPPOE0/PPPOE1 enables pcap tracing&lt;br /&gt;
&lt;br /&gt;
* All TCP/UDP protocols which are supported by native wireshark dissectors or other dissectors which can be found searching the internet.&lt;br /&gt;
e.g.:&lt;br /&gt;
SIP&lt;br /&gt;
H.323&lt;br /&gt;
H.245&lt;br /&gt;
&lt;br /&gt;
Enable the corresponding flags under Diagnostics-&amp;gt;Tracing, if you only want to see specific UDP/TCP protocols. To see all, enable the &amp;quot;All TCP/UDP Traffic&amp;quot; flag under Diagnostics-&amp;gt;Tracing.&lt;br /&gt;
&lt;br /&gt;
==PCAP Log==&lt;br /&gt;
&lt;br /&gt;
Another possibility to get a pcap log file is to open http://IP/log.pcap&lt;br /&gt;
This file has a limited size just as the normal log file.&lt;br /&gt;
&lt;br /&gt;
==log2pcap==&lt;br /&gt;
&lt;br /&gt;
You need the tool log2pcap from the tools package, if you have a log.txt file, which contains pcap packets and you want to view them in wireshark. You can find the tool in the apps tool package (see above).&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
# log2pcap.exe input1 input2 ... inputX&lt;br /&gt;
# drag&amp;amp;drop one or more files on the log2pcap.exe&lt;br /&gt;
# use an asterisk like &amp;quot;log2pcap c:\*.txt&amp;quot; to convert all txt files into pcap files. Things like c:\test*.txt are not supported.&lt;br /&gt;
&lt;br /&gt;
* The resulting file name is always inputx.pcap (e.g. log.txt is converted into log.txt.pcap).&lt;br /&gt;
&lt;br /&gt;
Note: if you have a trace of a little endian box (e.g. IP3000, IP21) with V6 SR1 or SR2, you have to use the &amp;quot;-srlefix&amp;quot; switch (available since 08-1007):&lt;br /&gt;
&lt;br /&gt;
log2pcap.exe input1 -srlefix&lt;br /&gt;
&lt;br /&gt;
==General Informations==&lt;br /&gt;
&lt;br /&gt;
===Reading PCAP Traces===&lt;br /&gt;
&lt;br /&gt;
====Non-IP Pcap packets==== &lt;br /&gt;
It will nevertheless show source and destination IP addresses.   127.0.0.1 stand in for the traced device.  So if for example a Q.931 SETUP messages is sent from 127.0.0.0 to 127.0.0.1, then it is an incoming setup.&lt;br /&gt;
&lt;br /&gt;
====MAC: 00:90:33:00:00:00====&lt;br /&gt;
Sometimes people wonder why a pcap &#039;&#039;00:90:33:00:00:00&#039;&#039; appears as source or destination mac address.&lt;br /&gt;
The direction of the packets can be analyzed based on the Mac address.&lt;br /&gt;
: We use the devices MAC adress as source only if a packet &#039;&#039;&#039;is sent&#039;&#039;&#039;&lt;br /&gt;
: We use the devices MAC adress as destination only if a packet &#039;&#039;&#039;is received&#039;&#039;&#039;&lt;br /&gt;
The other field will be filled with &#039;&#039;00:90:33:00:00:00&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Disabling PCAP traces===&lt;br /&gt;
&lt;br /&gt;
You can disable the whole pcap tracing. Just configure a /disable-pcap to the CMD0 module. This can be useful if you do not want to see pcap traces in your log file.&lt;br /&gt;
&lt;br /&gt;
===Used ports===&lt;br /&gt;
&lt;br /&gt;
* The debug traces are encapsulated in UDP packets with port 4.&lt;br /&gt;
* The isdn traces are encapsulated in UDP packets with port 4.&lt;br /&gt;
* The ac dsp traces are encapsulated in UDP packets with port 50001.&lt;br /&gt;
* Wireshark uses port 2002 to connect to the running rpcap-server&lt;br /&gt;
* rpcap packets are transfered over a dynamically assigned port between server and client&lt;br /&gt;
&lt;br /&gt;
===Additional Remote PCAP trace===&lt;br /&gt;
&lt;br /&gt;
You can trace the remote pcap protocol with adding the trace flag by &amp;quot;config add PCAP /trace&amp;quot; if you are experiencing connection issues.&lt;br /&gt;
&lt;br /&gt;
===Timestamps===&lt;br /&gt;
&lt;br /&gt;
Since V7 Hotfix 26 and V8 Hotfix 13, the ntp timestamp is used instead of the uptime in rpcap packages. In converted log files with log2pcap, uptime is still used.&lt;br /&gt;
&lt;br /&gt;
===Decode TURN Traffic as RTP===&lt;br /&gt;
RTP Traffic encapsulated in TURN and encoded as STUN per default. You can change this behaviour as global setting in your Wireshark.&amp;lt;br /&amp;gt;&lt;br /&gt;
To activate RTP heuristic for TURN traffic go to &amp;quot;&#039;&#039;Analyze::Enabled Protocols&#039;&#039;&amp;quot; and enable the &amp;quot;&#039;&#039;rtp_stun&#039;&#039;&amp;quot; dissector.&lt;br /&gt;
&lt;br /&gt;
==Versions==&lt;br /&gt;
Older versions can be downloaded from the respective [http://download.innovaphone.com/ice/download/p/6.00/apps/ &#039;&#039;tools&#039;&#039; package]:&lt;br /&gt;
* Wireshark 1.6.8: DLL Version 1043 - V6 6000043 Application Packet&lt;br /&gt;
* Wireshark 1.11.1: DLL Version 1049&lt;br /&gt;
* Wireshark 1.12.2: DLL Version 1055 - V6 6000054 Application Packet&lt;br /&gt;
* Wireshark 2.0.x: DLL Version 1057 - V6 6000055 Application Packet&lt;br /&gt;
* Wireshark 2.2.x: DLL Version 1058 - V6 6000056 Application Packet&lt;br /&gt;
* Wireshark 2.4.x: DLL Version 1059 - V6 6000059 Application Packet&lt;br /&gt;
* Wireshark 2.6.1: DLL Version 1060 - V6 6000061 Application Packet&lt;br /&gt;
&lt;br /&gt;
Newer versions can be downloaded from [https://store.innovaphone.com the store] (look for &#039;&#039;Wireshark DLLs&#039;&#039; in the &#039;&#039;Software&#039;&#039; tab):&lt;br /&gt;
* Wireshark 3.2.x: DLL Version 1061&lt;br /&gt;
* Wireshark 3.4.x: DLL Version 1066&lt;br /&gt;
* Wireshark 4.0.x: DLL Version 1068&lt;br /&gt;
* Wireshark 4.2.x: DLL Version 1069&lt;br /&gt;
* Wireshark 4.4.x: DLL Version 1070&lt;br /&gt;
* Wireshark 4.6.x: DLL Version 1071&lt;br /&gt;
&lt;br /&gt;
== Offline generation of PCAP Files ==&lt;br /&gt;
In version v12r1 and up, you can capture and store PCAP files without running Wireshark. This is done by setting the [[Reference12r1:Maintenance/Diagnostics/Tracing | &#039;&#039;Write PCAP to URL&#039;&#039; property ]] in &#039;&#039;Maintenance/Diagnostics/Tracing&#039;&#039; to an URL which points to a writeable WebDAV folder.&lt;br /&gt;
&lt;br /&gt;
This is useful if you need to trace a device for a long time or if you cannot run Wireshark to capture the trace.  However, it is not useful if the traced device restarts, as the last trace file will be incomplete then (due to buffered IO when writing the file).&lt;br /&gt;
&lt;br /&gt;
When you remove the URL, the current trace file will be flushed and no further one will be created.&lt;br /&gt;
&lt;br /&gt;
=== Using V13 File App ===&lt;br /&gt;
*create a folder in the File App&lt;br /&gt;
*share this folder with username and password&lt;br /&gt;
*copy the URL from this folder&lt;br /&gt;
*go to services/http/client on the innovaphone device for which you need a pcap and store the URL and access data here&lt;br /&gt;
*store the same URL as &amp;quot;Write PCAP to URL&amp;quot; at maintenance/diagnostic/tracing&lt;br /&gt;
&lt;br /&gt;
Attention: &lt;br /&gt;
As soon as the URL was successfully deposited and &amp;quot;OK&amp;quot; was pressed, the trace is written into the folder.&lt;br /&gt;
To end the trace, the URL can simply be removed and confirmed again with &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Known Problems==&lt;br /&gt;
&lt;br /&gt;
* Converting a log from a little endian box (like IP3000 and IP21) with firmware V6 SR1 or SR2 with the tool log2pcap will only work with log2pcap 08-1007 or higher and the switch &amp;quot;-srlefix&amp;quot;, see [[:#log2pcap|log2pcap]].&lt;br /&gt;
* Ac49xPacketRecording.dll works only with 0.99.7. Higher versions of wireshark won&#039;t start, if this dll was copied to the dll folder!&lt;br /&gt;
* Also some other dlls, contained in the tools package, won&#039;t work with each wireshark version. Just innovaphone.dll is always working.&lt;br /&gt;
* Even though &#039;&#039;All TCP/UDP Traffic&#039;&#039; is turned on, packets sent to the box acting as rpcap provider to a port that is not handled by the box (that is, where no listening socket is active) will currently not be shown&lt;br /&gt;
* If you use a 64-bit Windows Pc then you will need another innovaphone.dll, which is also contained in the latest tool package.&lt;br /&gt;
* The custom IP header from captured innovaphone packets contains dummy values for TOS (0), id (0), fragment offset (0) and TTL (128)&lt;br /&gt;
* After version 1.8.6 of wireshark the h225 packets are listed as malformed. So higher versions of wireshark could give troubles debugging the h.323 calls.&lt;br /&gt;
* &#039;&#039;&#039;Couldn&#039;t set the capture buffer size!&#039;&#039;&#039;: if you&#039;re experiencing this error message, please start wireshark with the option &amp;quot;-B 1&amp;quot; to set the buffer size to 1 MB&lt;br /&gt;
&lt;br /&gt;
* Wrong time stamp when using PCAP-to-URL:&lt;br /&gt;
** open the first frame of the trace and expand the &#039;innovaphone: DEBUG&#039;-section&lt;br /&gt;
** last line shows the correct time: &#039;Debug: YYYY-MM-DD HH:MM:SS&#039; in this case&lt;br /&gt;
** Click on &#039;Edit -&amp;gt; Time Shift...&#039; in the menu or use the shortcut Ctrl+Shift+T&lt;br /&gt;
** Tick &#039;Set the time for packet 1 to ...&#039; and fill in the time found in the first frame&lt;br /&gt;
** Click &#039;Apply&#039;&lt;br /&gt;
&lt;br /&gt;
===Missing msvcr120.dll or &amp;quot;module not found&amp;quot;/&amp;quot;Das angegebene Modul wurde nicht gefunden&amp;quot;===&lt;br /&gt;
You have to install the Visual C++ Redistributable Packages für Visual Studio 2013: http://www.microsoft.com/de-de/download/details.aspx?id=40784&lt;br /&gt;
&lt;br /&gt;
===Inconsistent timestamps with Write PCAP to URL===&lt;br /&gt;
There are sporadically inconsistent timestamps where a newer packet might have an older timestamp than the previous packet (a fraction of a second).&amp;lt;br/&amp;gt;&lt;br /&gt;
This issue just happens with Write PCAP to URL and the default configuration. This issue has been [[ReleaseNotes14r1:Firmware#157768_-_Firmware:_fixed_wrong_timestamps_in_%22Write_PCAP_to_URL%22_feature | fixed]] in the 14r1 release, so the workaround below is no longer needed.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If you use Wireshark for jitter analysis and consistent timestamps are important, you may do a configuration change:&lt;br /&gt;
* disable the epoch-ts option on the PCAP module:&lt;br /&gt;
** !config add PCAP /epoch-ts false&lt;br /&gt;
** !config write&lt;br /&gt;
** !reset&lt;br /&gt;
* now the PCAP trace just contains the uptime beginning from 1970-01-01 but without any wrong timestamps&lt;br /&gt;
* Wireshark offers an option to set the time on the first packet, so the time can be manually set to the file creation time (right click first packet -&amp;gt; move time -&amp;gt; second option and enter e.g. &amp;quot;2023-01-03 13:30:00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
* [[Reference12r1:Maintenance/Diagnostics/Tracing]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|{{PAGENAME}}]]&lt;br /&gt;
&amp;lt;!-- Kewwords: sniffer ethereal packet capture network monitor --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:General/Devices-Registration&amp;diff=78366</id>
		<title>Reference14r2:General/Devices-Registration</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:General/Devices-Registration&amp;diff=78366"/>
		<updated>2025-10-23T11:15:44Z</updated>

		<summary type="html">&lt;p&gt;Dde: Created page with &amp;quot;The Devices App URL can be configured here. This URL is used to establish a websocket connection to the Devices App and register there.&amp;lt;br&amp;gt;  Example: &amp;lt;code&amp;gt;wss://ap.innovaphone.com/innovaphone.com/devices/sysclients&amp;lt;/code&amp;gt; The Format is: wss://&amp;#039;&amp;#039;[dns-ap-platform]&amp;#039;&amp;#039;/&amp;#039;&amp;#039;[system domain]&amp;#039;&amp;#039;/devices/sysclients  If the connection between the device and the Devices App is up, there is &amp;quot;Up, X sessions&amp;quot; shown.&amp;lt;br&amp;gt; If there is someone browsing on the UI of the device through the Dev...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Devices App URL can be configured here. This URL is used to establish a websocket connection to the Devices App and register there.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;wss://ap.innovaphone.com/innovaphone.com/devices/sysclients&amp;lt;/code&amp;gt;&lt;br /&gt;
The Format is: wss://&#039;&#039;[dns-ap-platform]&#039;&#039;/&#039;&#039;[system domain]&#039;&#039;/devices/sysclients&lt;br /&gt;
&lt;br /&gt;
If the connection between the device and the Devices App is up, there is &amp;quot;Up, X sessions&amp;quot; shown.&amp;lt;br&amp;gt;&lt;br /&gt;
If there is someone browsing on the UI of the device through the Devices App, the session counter is increased.&lt;br /&gt;
&lt;br /&gt;
==== Implicit changes of the &#039;&#039;Devices App URL&#039;&#039; ====&lt;br /&gt;
The old mechanism to reconfigure devices according to the PBX App object of Devices has been removed in the latest service releases.&amp;lt;br/&amp;gt;&lt;br /&gt;
Instead an expert configuration can be used to rollout a new &#039;&#039;Devices App URL&#039;&#039; to connected devices.&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Devices&amp;diff=78252</id>
		<title>Reference15r1:Concept App Service Devices</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Devices&amp;diff=78252"/>
		<updated>2025-10-15T05:03:38Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Certificates configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
The App Service Devices is an App Service which can be installed on an innovaphone App Platform. It is used to administrate the innovaphone devices which belong to the whole installation.&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX from version 13r1&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
=== Devices App (innovaphone-devices) ===&lt;br /&gt;
This is the standard UI App for Devices.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Websocket: to publish the com.innovaphone.devicesui-API, which can be used to link directly to devices (which is done e.g. inside the Events app)&lt;br /&gt;
&lt;br /&gt;
=== Devices API (innovaphone-devices-api) ===&lt;br /&gt;
This is a hidden App, which provides the Devices API (com.innovaphone.devices). This API can be used to find and communicate with devices which are registered to the Devices App.&lt;br /&gt;
&lt;br /&gt;
Additionally it acts as a provider of the Search API (com.innovaphone.search). So you can find devices and domains in other apps like the Search App.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Hidden: DevicesApi must be a hidden App&lt;br /&gt;
;Websocket: to get the URL of the Devices App itself which is used for provisioning&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
=== Devices ===&lt;br /&gt;
&lt;br /&gt;
With the Devices plugin App objects can be created, edited and deleted for Devices and the Devices API on the PBX.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
All innovaphone hard phones and gateways starting from version 13r1 can establish a registration inside the Devices App and therefor administrative tasks can be performed through the App.&lt;br /&gt;
&lt;br /&gt;
=== Domains ===&lt;br /&gt;
&lt;br /&gt;
In a hosted environment, it might be needed to add multiple domains to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
After the initial installation of Devices through Install, you have administrative rights and can add more domains. &lt;br /&gt;
&lt;br /&gt;
==== Administrative rights ====&lt;br /&gt;
You have administrative rights if the configured PBX App object for Devices uses the password of the instance which is configured in the Manager App and the PBX uses the same domain as this instance.&lt;br /&gt;
&lt;br /&gt;
==== Domain local rights ====&lt;br /&gt;
You have just rights to a certain domain if the configured PBX App object for Devices uses the domain password which can be configured in Devices for each domain and the PBX uses the same domain name as configured in Devices.&lt;br /&gt;
&lt;br /&gt;
==== Assign rights to other domains ====&lt;br /&gt;
Domains can gain access to other domains by configuring these access rights in the Devices App.&lt;br /&gt;
&lt;br /&gt;
==== Deploy passwords and access rights ====&lt;br /&gt;
During install, a domain is created inside the Devices App. There is a checkmark Deploy the domain password on all devices which is set by default and which is the same as the administrative password.&lt;br /&gt;
If you change the domain password, all passwords on all administrative devices and app platforms which are connected to this domain will be also changed.&amp;lt;br/&amp;gt;&lt;br /&gt;
Since 13r2sr25/13r3sr7/14rx: devices which are auto provisioned or provisioned through the Profile/Users Admin App will get a random password instead of the domain password.&lt;br /&gt;
If you add a phone device manually to a domain inside the Devices App, this phone device will also get a random password. Other device types added manually or devices added with a provisioning code which has been created within the Devices App directly, will get the domain password instead.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This will also set the manager password and the SSH passwords of App Platforms.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The clear text random passwords can be requested and viewed in the settings of a device in the Devices App.&lt;br /&gt;
&lt;br /&gt;
 Attention: If you untick the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark, the password won&#039;t be deployed anymore, but also not reconfigured to the default password!&lt;br /&gt;
&lt;br /&gt;
 Attention: After each reconnect of a client, the password will be deployed again.&lt;br /&gt;
 This means, if the checkmark is set and you set another password somewhere else (e.g. under General::Admin),&lt;br /&gt;
 this password will be just valid until the next reboot or reconnect to the Devices App!&lt;br /&gt;
&lt;br /&gt;
;Create new random passwords&lt;br /&gt;
You can rollout new random passwords by unticking the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark and ticking it again.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Devices with multiple domains (Cloud)&lt;br /&gt;
In a hosted environment, you can use the Devices App with multiple domains. The corresponding instance of Devices has a configured domain and an instance password set inside the manager.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hosting PBX has a domain inside Devices with a specific password.&amp;lt;br&amp;gt;&lt;br /&gt;
If this domain name matches the instance domain of the Devices instance and the password matches either the instance password or the domain password, you will be logged in as admin and have access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each newly created domain has its own password inside Devices. If you create an App Object inside a PBX with this domain and the password of this domain (inside Devices), you will just have access to this single domain.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Devices also has the possibility to grant access to other domains for a specific domain.&lt;br /&gt;
&lt;br /&gt;
=== Categories ===&lt;br /&gt;
&lt;br /&gt;
There are two types of categories:&lt;br /&gt;
* provisioning category: used for device configurations and provisioning&lt;br /&gt;
* standard category: used for update/backup jobs and device management&lt;br /&gt;
&lt;br /&gt;
Each device can have just a &#039;&#039;&#039;single&#039;&#039;&#039; provisioning category, as it receives it&#039;s configuration by all configured device configurations for this provisioning category.&lt;br /&gt;
&lt;br /&gt;
In addition, a provisioning category, which is used inside an analogue phone/phone device configuration &#039;&#039;&#039;cannot&#039;&#039;&#039; be used to provision a gateway.&lt;br /&gt;
&lt;br /&gt;
=== Device connections ===&lt;br /&gt;
The Devices registration is done through a websocket connection to the webserver of the App Platform and the Devices instance (standard HTTP/s port).&amp;lt;br&amp;gt;&lt;br /&gt;
The URL used can be configured manually under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration] or through a new provisioning mechanism.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A binary protocol is used to transfer information between the device and the devices App. The MAC address is the unique key to identify a device.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a device is added to a domain in Devices, the device gets a unique random password. Without such a password, a device shows up as &#039;&#039;&#039;unassigned&#039;&#039;&#039; in the Devices app.&lt;br /&gt;
This is also the case after a long reset or when the device lost its configuration.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In such a case, the device has to be manually added again to a domain or it has to be provisioned again.&lt;br /&gt;
&lt;br /&gt;
 If a device is not assigned to a domain or provisioning category, it won&#039;t receive any configurations.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registrations ====&lt;br /&gt;
See [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration]&lt;br /&gt;
&lt;br /&gt;
==== Second Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The firmware has a second SYSCLIENT2 module, which can be configured to point to a different Devices instance and the AP Manager also has a second Devices Registration URL.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you use this configuration option, you should take care and consider:&lt;br /&gt;
&lt;br /&gt;
* if the Devices domain from the second configuration provides a password for all devices, the password is ignored, as it would lead to inconsistend passwords otherwise (from 13r1 SR12 on)&lt;br /&gt;
* the Devices domain from the second configuration should not provide Devices Configurations or Update Jobs as these might collide with configurations from the first Devices instance!&lt;br /&gt;
&lt;br /&gt;
Generally, only one of the two  &#039;&#039;Devices&#039;&#039;  App instances connected to the device must apply changes to the device.&lt;br /&gt;
&lt;br /&gt;
 We strongly discourage the usage of this second configuration option due to unexpected behaviour if incorrectly used!&lt;br /&gt;
 Never use the second URL if you use software or hardware rental!&lt;br /&gt;
&lt;br /&gt;
==== Device information ====&lt;br /&gt;
&lt;br /&gt;
The following data is transferred:&lt;br /&gt;
* MAC address&lt;br /&gt;
* device type (e.g. IPVA, AppPlatform, IP112)&lt;br /&gt;
* IP addresses (IPv4, IPv6)&lt;br /&gt;
* version (not searchable)&lt;br /&gt;
&lt;br /&gt;
You can also search for this data inside the devices tab in the App.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==== Device Advanced UI ====&lt;br /&gt;
By default, Devices administrators and non admins can access the advanced UI of any device without limitations.&amp;lt;br/&amp;gt;&lt;br /&gt;
In certain scenerios (e.g. Cloud), you may want to restrict this access to just the PBX on gateways and IPVAs for non adminstrative users, which just have access to certain domains.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
In this case, you can set the corresponding checkmark in the device settings tab of the specific device.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the flag is set, just the PBX tab of the advanced UI is accessible for non administrative Devices users.&lt;br /&gt;
&lt;br /&gt;
 Technically this means, that every HTTP request is checked if it starts with PBX0 and if not, the request is rejected with 401 unauthorized.&lt;br /&gt;
&lt;br /&gt;
If the device can be accessed directly without Devices, you may need a reverse proxy in between to filter HTTP requests.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Provisioning ===&lt;br /&gt;
Devices can be added by provisioning (both phones and gateways). &lt;br /&gt;
The standard online provisioning looks like this:&lt;br /&gt;
* a user or administrator creates a provisioning code in the Devices or Users App (this stores the Devices URL on the provisioning server side)&lt;br /&gt;
* a device with 13r1 or newer is connected to the network after a long reset&lt;br /&gt;
* the provisioning code has to be entered within one hour (after one hour, the Update URL isn&#039;t polled anymore)&lt;br /&gt;
* the device sends this code to config.innovaphone.com and retrieves the Devices URL&lt;br /&gt;
* the device connects to the Devices URL and is added to the domain where the code has been created&lt;br /&gt;
&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Offline_Provisioning offline provisioning mode].&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Provisioning#Automatic_provisioning automatic provisioning mode].&lt;br /&gt;
&lt;br /&gt;
 Note: provisioning is cancelled if the device already belongs to another domain in the same Devices instance! This prevents the unauthorized move of a device between different domains.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The Devices Registration URL which is set through the provisioning process, always starts with &#039;&#039;&#039;wss&#039;&#039;&#039;. This is not dependent anymore on the App URL which is configured inside the PBX Devices App object.&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
The Devices App can be used to rollout updates.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSON files ====&lt;br /&gt;
The update files have to be acccessible on a webserver without authentication and four json files are used:&lt;br /&gt;
* firmware.json: innovaphone device firmware&lt;br /&gt;
* apps.json: Apps for the App Platform&lt;br /&gt;
* software.json: contains software for DECT handsets&lt;br /&gt;
** just IP64 and IP65 are used and supported&lt;br /&gt;
* phoneplatform.json: contains the phone platform image for e.g. the IP270&lt;br /&gt;
&lt;br /&gt;
You can either use the standard innovaphone App Store for these files or your own local webserver.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update jobs ====&lt;br /&gt;
You can configure several update jobs with different categories to organize your updates.&amp;lt;br&amp;gt;&lt;br /&gt;
Update jobs are always sequentially processed and inside one update job, just &#039;&#039;&#039;20&#039;&#039;&#039; devices are updated at the same time.&lt;br /&gt;
&lt;br /&gt;
==== Device update check after the update job has been already executed====&lt;br /&gt;
If a device goes online, the newest suitable update job is searched for this device (depending on the categories).&amp;lt;br&amp;gt;&lt;br /&gt;
If an update job is found, the update is just performed, if there has been &#039;&#039;&#039;no&#039;&#039;&#039; successfull update for this device in this job before and the version does not match (simply string compare).&lt;br /&gt;
&lt;br /&gt;
====Update errors====&lt;br /&gt;
If an update fails, the Devices App shows an error. You may have to enable further tracing on the updated device itself to find out the reason of the failure.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 module and take a look at the events which may already tell you the reason&lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
 An update job is retried &#039;&#039;&#039;two&#039;&#039;&#039; times if updates inside this job failed. The retry is done &#039;&#039;&#039;ten&#039;&#039;&#039; minutes after the update job finished previously.&lt;br /&gt;
&lt;br /&gt;
====innovaphone myApps====&lt;br /&gt;
The path to the App Store and the used innovaphone myApps version is updated to the version of the gateway on gateways with an enabled PBX after a successfull update.&amp;lt;br&amp;gt;&lt;br /&gt;
This configuration can be found [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:PBX/Config/myApps here]&lt;br /&gt;
&lt;br /&gt;
Inside the configuration on an update job, the flag &amp;quot;Do not update myApps launcher software&amp;quot; disables the update of the innovaphone myApps version inside PBXes.&lt;br /&gt;
&lt;br /&gt;
====DECT handsets====&lt;br /&gt;
If you check the update DECT handsets checkmark, all DECT devices will be configured to rollout updates to DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
The DECT handset firmware will be searched inside the configured software.json.&lt;br /&gt;
&lt;br /&gt;
=== Backups ===&lt;br /&gt;
The Devices App can be used to backup the configuration and data of Apps and devices.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Webserver requirements====&lt;br /&gt;
Backups are stored on a webserver with or without Digest/Basic authentication and with the &#039;&#039;&#039;webdav PUT&#039;&#039;&#039; method.&lt;br /&gt;
&lt;br /&gt;
====Backup jobs====&lt;br /&gt;
Backup jobs are executed sequentially. Inside one backup job, just &#039;&#039;&#039;20&#039;&#039;&#039; backups are performed at the same time.&lt;br /&gt;
&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
The configuration file is stored. Therefor the Devices App tells the device to store the configuration with a !mod cmd UP0 /sync prot URL.&lt;br /&gt;
&lt;br /&gt;
====Apps on an App Platform====&lt;br /&gt;
The databases of all existing instances and the manager are stored.&amp;lt;br&amp;gt;&lt;br /&gt;
Each installed App Service can have multiple instances and each App instance has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
A database contains &#039;&#039;&#039;both&#039;&#039;&#039; configuration and data of an App instance! &amp;lt;br&amp;gt;&lt;br /&gt;
The manager database contains the webserver certificate and further manager related configuration settings.&lt;br /&gt;
&lt;br /&gt;
The Devices App establishes a websocket connection to the manager and tells the manager where to store the backups.&amp;lt;br&amp;gt;&lt;br /&gt;
The manager on the backuped App Platform itself performs the HTTP requests to store the files.&lt;br /&gt;
&lt;br /&gt;
====Backup errors====&lt;br /&gt;
If a backup fails, the Devices App shows an error. You may have to enable further tracing on the backuped device itself to find out the reason of the failure.&lt;br /&gt;
&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 &lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
=== Restore ===&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
Just as always under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Administration/Upload/Config Upload Config].&lt;br /&gt;
&lt;br /&gt;
====Apps====&lt;br /&gt;
The App Service itself has to be installed on the App Platform prior restoring of a single instance.&amp;lt;br&amp;gt;&lt;br /&gt;
The restoring is done in the Manager App on the App Platform itself.&amp;lt;br&amp;gt;&lt;br /&gt;
The intance settings, the configuration and data are restored in a single process.&lt;br /&gt;
&lt;br /&gt;
=== Device Configurations ===&lt;br /&gt;
&lt;br /&gt;
You can define several device configurations. These configurations are either applied to all devices inside this domain or to selected categories.&amp;lt;br/&amp;gt;&lt;br /&gt;
Configurations are applied on creation and on every reconnect of a matching device.&lt;br /&gt;
&lt;br /&gt;
==== Transfer checkmarks ====&lt;br /&gt;
&lt;br /&gt;
Some configuration options have a specific checkmark to enable the transfer of the option.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* Checkmark disabled:&lt;br /&gt;
** configuration option field(s) are disabled &lt;br /&gt;
** option values are &#039;&#039;&#039;not&#039;&#039;&#039; transferred at all&lt;br /&gt;
* Checkmark enabled:&lt;br /&gt;
** configuration option field(s) are enabled&lt;br /&gt;
** option values are transferred, even if field values are empty&lt;br /&gt;
&lt;br /&gt;
==== Expert configuration ====&lt;br /&gt;
&lt;br /&gt;
The expert configuration can be used to configure different settings which are not available inside the other device configurations.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can use the standard syntax of an update server script (see [[ {{NAMESPACE}}:Concept_Update_Server | Concept Update Server ]] for a general overview and the section on [[Howto:PHP_based_Update_Server_V2#Hints_for_writing_your_update_snippets | Hints for writing your update snippets ]] (note that the remainder of this article relates to the now deprecated old mechanism, so please disregard the rest)).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Some hints:&lt;br /&gt;
* the expert configuration is just executed once after a device restarted and on change of the expert configuration itself&lt;br /&gt;
* the expert configuration is executed after all other device configuration types, so that you can override changes&lt;br /&gt;
* to make configuration changes effective, you may also need to issue a final &#039;&#039;config write&#039;&#039;, &#039;&#039;config activate&#039;&#039; and &#039;&#039;iresetn&#039;&#039; command (see the [[ {{NAMESPACE}}:Concept_Update_Server#Check_command | &#039;&#039;check&#039;&#039; command]] for details)&lt;br /&gt;
* some commands shouldn&#039;t be used inside the script:&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Times_command |&#039;&#039;times&#039;&#039;]]: since the expert configuration is executed only once after a reboot of the device and when changes are made, it does not make sense to use the &#039;&#039;times&#039;&#039; command&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Prot_command |&#039;&#039;prot&#039;&#039;]]|[[ {{NAMESPACE}}:Concept_Update_Server#Boot_command |&#039;&#039;boot&#039;&#039;]]: use an update job instead&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Scfg_command |&#039;&#039;scfg&#039;&#039;]]: use a backup job instead&lt;br /&gt;
** [[Howto:PHP_based_Update_Server_V2#Using_vars_create|&#039;&#039;vars create&#039;&#039;]]: this cmd will always raise the &#039;&#039;reset needed condition&#039;&#039; and the aforementioned &#039;&#039;iresetn&#039;&#039; command would always execute therefore.  As a result, the devices would enter a boot loop.  Be sure to avoid this using an appropriate [[ {{NAMESPACE}}:Concept_Update_Server#Check_command |&#039;&#039;check&#039;&#039; command ]] and update its &#039;&#039;&amp;lt;serial&amp;gt;&#039;&#039; properly whenever the expert configuration is changed&lt;br /&gt;
&lt;br /&gt;
==== Certificates configuration ====&lt;br /&gt;
You can use this configuration to rollout certificates to the trust list of your devices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Manual upload certificates.&lt;br /&gt;
* Configure up to five URLs which are polled every 24 hours. They must return files with PEM formatted public keys (one or more) which are then rolled out.&lt;br /&gt;
** certificates are just rolled out if differences are determined, so if URLs are polled and no changes are detected, certificates are not rolled out again. Changes are detected by fingerprint comparison of each embedded certificate&lt;br /&gt;
** if a device restarts, the configuration is applied again. Just the fingerprints of the device trust list are checked against the configuration trust list and just on differences, certificates are rolled out again&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/innovaphone.pem to always have the innovaphone public keys in your trust list (e.g. used for our push service).&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca.pem to always have the innovaphone Device Certification Authority certificates in your trust list.&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca-unverified.pem to always have the innovaphone Unverified Device Certification Authority certificates in your trust list.&lt;br /&gt;
** The Unverified CA is used for non hardware devices, e.g. IPVAs, which are not shipped with an official innovaphone Device Certification Authority certificate, as innovaphone has no control over the serial number here.&lt;br /&gt;
&lt;br /&gt;
 Using this configuration, the trust list can only be managed through &#039;&#039;Devices&#039;&#039; because it is cleared before each rollout.&lt;br /&gt;
&lt;br /&gt;
==== DECT Handsets ====&lt;br /&gt;
&lt;br /&gt;
This configuration can be used to configure specific options like language, voicemail number etc. for DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* all DECT devices like IP1202, IP1203 etc. will receive this configuration (of course just if the configured categories match)&lt;br /&gt;
* Devices configures a URL like https://domain.com/domain.com/devices/parameters/id.xml on the specific DEVMANBW module.&lt;br /&gt;
* This file is then polled by the basestations and the read values are transfered to the DECT handsets.&lt;br /&gt;
* see [[{{NAMESPACE}}:IP1202/IP1203_DECT_System#Configuration_of_Handset_parameters]]&lt;br /&gt;
&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
=== Software rental ===&lt;br /&gt;
Regarding the Software Rental program and the Payment Method, please refer to:&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_Software_Rental|Concept Software Rental]]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
Software rental can be done for innovaphone Cloud installations or for software, which operates on the customer premisis. This could eventually be customer owned hardware or a privat virtual machine, managed by the customer.&lt;br /&gt;
&lt;br /&gt;
==== Hardware licenses ====&lt;br /&gt;
Hardware licenses have to be bound on the specific device in my.innovaphone itself and currently can&#039;t be handled within the Devices App itself. So you also need to download the licenses from my.innovaphone and upload them on the device with the already known methods.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses with software rental =====&lt;br /&gt;
If your device has software rental licenses, you can bind hardware licenses within my.innovaphone in the software rental project itself.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses without software rental =====&lt;br /&gt;
If your device does not have software rental licenses, you should bind hardware licenses in a separate non rental project in my.innovaphone.&lt;br /&gt;
&lt;br /&gt;
==== innovaphone Cloud ====&lt;br /&gt;
Inside the innovaphone Cloud, you just have to upload your activation keys with iSCs to add licenses to one or more gateways.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Email expiry notifications ====&lt;br /&gt;
You will receive an email notification if the rental of a project expires. This notification will be sent &#039;&#039;&#039;seven&#039;&#039;&#039; weeks before the expiry and then once a week until the rental expires.&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure one or more email recipients in the domain settings.&amp;lt;br&amp;gt;&lt;br /&gt;
If no email address is configured, the email address of the logged in user account is used.&lt;br /&gt;
&lt;br /&gt;
==== History ====&lt;br /&gt;
You can download the history in the Devices App. You&#039;ll get a CSV file (semicolon separated). The date and number format depends on the selected language in the UI.&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an API available for automated downloas, which is described [[ {{NAMESPACE}}:Concept_App_Service_Devices#API_to_download_rental_history|here ]].&lt;br /&gt;
&lt;br /&gt;
====Own installation====&lt;br /&gt;
Inside your own installation, you have to register a new my.innovaphone account or you can use an existing account inside the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
One domain inside Devices belongs to one project inside your my.innovaphone company, so you can handle multiple domains with one my.innovaphone account.&lt;br /&gt;
&lt;br /&gt;
====Technical aspects====&lt;br /&gt;
A new rental expiration date is calculated on each license or balance change in the domain.&amp;lt;br&amp;gt;&lt;br /&gt;
So after each change new licenses with a new date are transfered to the gateways and also stored in the Devices App itself.&amp;lt;br&amp;gt;&lt;br /&gt;
If the rental expires, the gateway reboots and the licenses are not available anymore.&amp;lt;br&amp;gt;&lt;br /&gt;
The licenses are also transfered after each reconnect of a gateway to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For license and balance changes, the Devices App must be online and have access to my.innovaphone.com!&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
You have to add (use the + symbol) a PBX and select all licenses you want to rent.&amp;lt;br&amp;gt;&lt;br /&gt;
Use the &#039;&#039;&#039;apply&#039;&#039;&#039; button to really bind these licenses. Without usage of the apply button, you can just see a precalculation of the iSCs/month and the rental end date, but nothing is really charged from your balance.&lt;br /&gt;
&lt;br /&gt;
===Change of IP address/DNS name in PBX object===&lt;br /&gt;
If the IP address or DNS name inside the PBX object of the Devices App changes, all currently connected clients get a new Devices Registration URL and also all clients, which connect afterwards with the old host name.&lt;br /&gt;
&lt;br /&gt;
== Appendix ==&lt;br /&gt;
=== Sample firmware.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;devices&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP101&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP102&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1060&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP111&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP112&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1130&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1260&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP150&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP2000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP200A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP22&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP222&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP230&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP232&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP24&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP240&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP241&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP29&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP302&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP305&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP311&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP411&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP800&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP810&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP811&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IPVA&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;versions&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;text&amp;quot;: &amp;quot;13r1 dvl [131705]&amp;quot;, &amp;quot;wiki&amp;quot;: &amp;quot;&amp;quot; }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample apps.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;apps&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;Apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;The Apidemo&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;AppStore&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;AppStore&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample software.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;software&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myapps.apk&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Android&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Android&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myAppsSetup.msi&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Windows&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Windows&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample phoneplatform.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;arm64&amp;quot;,&lt;br /&gt;
            &amp;quot;text&amp;quot;: &amp;quot;Phone Platform&amp;quot;,&lt;br /&gt;
            &amp;quot;file&amp;quot;: &amp;quot;phone-platform.img&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;yocto2&amp;quot;,&lt;br /&gt;
            &amp;quot;version&amp;quot;: &amp;quot;2063&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;devices&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;IP270&amp;quot;,&lt;br /&gt;
            &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
                &amp;quot;arm64&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API to download rental history ===&lt;br /&gt;
&lt;br /&gt;
You can download the history as a UTF-8 CSV file with simple &#039;&#039;&#039;HTTP GET&#039;&#039;&#039; requests with &#039;&#039;&#039;digest&#039;&#039;&#039; authentication.&amp;lt;br&amp;gt;&lt;br /&gt;
The CSV file uses the semicolon as delimiter.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The URL to download the history is e.g.:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?...&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 You can find this path by editing the instance in the AP manager.&lt;br /&gt;
 In the listed paths, you&#039;ll find something which ends with csvapi&lt;br /&gt;
&lt;br /&gt;
In the innovaphone Cloud environment, the URL can be retrieved by taking a look at the Devices App object inside the cloud PBX and replacing the ending &#039;&#039;&#039;innovaphone-devices&#039;&#039;&#039; with &#039;&#039;&#039;csvapi&#039;&#039;&#039; inside the App URL, so it looks e.g. like this:&lt;br /&gt;
&lt;br /&gt;
 https://cloud-apps0.innovaphone.com/cloud.innovaphone.com/devices/csvapi&lt;br /&gt;
&lt;br /&gt;
====CSV columns====&lt;br /&gt;
Most columns should be self explaining, but the column &#039;&#039;&#039;invoice reference&#039;&#039;&#039; refers to a value which you can configure manually in the domain settings in the Devices App!&lt;br /&gt;
&lt;br /&gt;
====Digest authentication====&lt;br /&gt;
You can login with two different username/password combinations, while the domain is the digest username:&lt;br /&gt;
&lt;br /&gt;
* If you use the domain and password of your Devices App instance inside the AP Manager, you have automatically access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
* If you use the domain name of any domain as digest username and the configured domain password, you&#039;ll have access to this domain and all domains to which this domain has access to&lt;br /&gt;
&lt;br /&gt;
====Query parameters====&lt;br /&gt;
The following query parameters can be used (don&#039;t forget to URL encode the parameter values, if neccessary!):&lt;br /&gt;
* all: if &#039;&#039;&#039;1&#039;&#039;&#039; or &#039;&#039;&#039;true&#039;&#039;&#039;, the history is queried for all domains where the digest user has access to&lt;br /&gt;
* domain: required, if &#039;&#039;all&#039;&#039; is not set&lt;br /&gt;
* lang: the output language of the CSV file, which also controls date and number formats, e.g. &#039;&#039;&#039;en&#039;&#039;&#039;, &#039;&#039;&#039;de&#039;&#039;&#039;, ...&lt;br /&gt;
* tz: the timezone for dates, e.g. &#039;&#039;&#039;Europe/Berlin&#039;&#039;&#039;&lt;br /&gt;
* type: two types are available:&lt;br /&gt;
** &#039;&#039;&#039;history&#039;&#039;&#039;: history which contains changes&lt;br /&gt;
** &#039;&#039;&#039;overview&#039;&#039;&#039;: a monthly overview with the iSC costs at the first of the last months&lt;br /&gt;
* from: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
* to: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
&lt;br /&gt;
====Example requests====&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=history&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;amp;from=1601903431000&amp;amp;to=1601903385000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?all=1&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Supported DECT handsets ===&lt;br /&gt;
&lt;br /&gt;
The following handsets are supported for update jobs and the DECT handsets configuration:&lt;br /&gt;
&lt;br /&gt;
* IP64&lt;br /&gt;
* IP65&lt;br /&gt;
* D81&lt;br /&gt;
* D83&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
===SoftwarePhone===&lt;br /&gt;
The Devices App is not meant to be used with the windows SoftwarPhone standalone installation.&lt;br /&gt;
&lt;br /&gt;
== Related Articles == &lt;br /&gt;
* [[Howto:Software_Rental]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Devices&amp;diff=78251</id>
		<title>Reference15r1:Concept App Service Devices</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Devices&amp;diff=78251"/>
		<updated>2025-10-14T13:14:49Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Certificates configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
The App Service Devices is an App Service which can be installed on an innovaphone App Platform. It is used to administrate the innovaphone devices which belong to the whole installation.&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX from version 13r1&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
=== Devices App (innovaphone-devices) ===&lt;br /&gt;
This is the standard UI App for Devices.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Websocket: to publish the com.innovaphone.devicesui-API, which can be used to link directly to devices (which is done e.g. inside the Events app)&lt;br /&gt;
&lt;br /&gt;
=== Devices API (innovaphone-devices-api) ===&lt;br /&gt;
This is a hidden App, which provides the Devices API (com.innovaphone.devices). This API can be used to find and communicate with devices which are registered to the Devices App.&lt;br /&gt;
&lt;br /&gt;
Additionally it acts as a provider of the Search API (com.innovaphone.search). So you can find devices and domains in other apps like the Search App.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Hidden: DevicesApi must be a hidden App&lt;br /&gt;
;Websocket: to get the URL of the Devices App itself which is used for provisioning&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
=== Devices ===&lt;br /&gt;
&lt;br /&gt;
With the Devices plugin App objects can be created, edited and deleted for Devices and the Devices API on the PBX.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
All innovaphone hard phones and gateways starting from version 13r1 can establish a registration inside the Devices App and therefor administrative tasks can be performed through the App.&lt;br /&gt;
&lt;br /&gt;
=== Domains ===&lt;br /&gt;
&lt;br /&gt;
In a hosted environment, it might be needed to add multiple domains to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
After the initial installation of Devices through Install, you have administrative rights and can add more domains. &lt;br /&gt;
&lt;br /&gt;
==== Administrative rights ====&lt;br /&gt;
You have administrative rights if the configured PBX App object for Devices uses the password of the instance which is configured in the Manager App and the PBX uses the same domain as this instance.&lt;br /&gt;
&lt;br /&gt;
==== Domain local rights ====&lt;br /&gt;
You have just rights to a certain domain if the configured PBX App object for Devices uses the domain password which can be configured in Devices for each domain and the PBX uses the same domain name as configured in Devices.&lt;br /&gt;
&lt;br /&gt;
==== Assign rights to other domains ====&lt;br /&gt;
Domains can gain access to other domains by configuring these access rights in the Devices App.&lt;br /&gt;
&lt;br /&gt;
==== Deploy passwords and access rights ====&lt;br /&gt;
During install, a domain is created inside the Devices App. There is a checkmark Deploy the domain password on all devices which is set by default and which is the same as the administrative password.&lt;br /&gt;
If you change the domain password, all passwords on all administrative devices and app platforms which are connected to this domain will be also changed.&amp;lt;br/&amp;gt;&lt;br /&gt;
Since 13r2sr25/13r3sr7/14rx: devices which are auto provisioned or provisioned through the Profile/Users Admin App will get a random password instead of the domain password.&lt;br /&gt;
If you add a phone device manually to a domain inside the Devices App, this phone device will also get a random password. Other device types added manually or devices added with a provisioning code which has been created within the Devices App directly, will get the domain password instead.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This will also set the manager password and the SSH passwords of App Platforms.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The clear text random passwords can be requested and viewed in the settings of a device in the Devices App.&lt;br /&gt;
&lt;br /&gt;
 Attention: If you untick the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark, the password won&#039;t be deployed anymore, but also not reconfigured to the default password!&lt;br /&gt;
&lt;br /&gt;
 Attention: After each reconnect of a client, the password will be deployed again.&lt;br /&gt;
 This means, if the checkmark is set and you set another password somewhere else (e.g. under General::Admin),&lt;br /&gt;
 this password will be just valid until the next reboot or reconnect to the Devices App!&lt;br /&gt;
&lt;br /&gt;
;Create new random passwords&lt;br /&gt;
You can rollout new random passwords by unticking the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark and ticking it again.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Devices with multiple domains (Cloud)&lt;br /&gt;
In a hosted environment, you can use the Devices App with multiple domains. The corresponding instance of Devices has a configured domain and an instance password set inside the manager.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hosting PBX has a domain inside Devices with a specific password.&amp;lt;br&amp;gt;&lt;br /&gt;
If this domain name matches the instance domain of the Devices instance and the password matches either the instance password or the domain password, you will be logged in as admin and have access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each newly created domain has its own password inside Devices. If you create an App Object inside a PBX with this domain and the password of this domain (inside Devices), you will just have access to this single domain.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Devices also has the possibility to grant access to other domains for a specific domain.&lt;br /&gt;
&lt;br /&gt;
=== Categories ===&lt;br /&gt;
&lt;br /&gt;
There are two types of categories:&lt;br /&gt;
* provisioning category: used for device configurations and provisioning&lt;br /&gt;
* standard category: used for update/backup jobs and device management&lt;br /&gt;
&lt;br /&gt;
Each device can have just a &#039;&#039;&#039;single&#039;&#039;&#039; provisioning category, as it receives it&#039;s configuration by all configured device configurations for this provisioning category.&lt;br /&gt;
&lt;br /&gt;
In addition, a provisioning category, which is used inside an analogue phone/phone device configuration &#039;&#039;&#039;cannot&#039;&#039;&#039; be used to provision a gateway.&lt;br /&gt;
&lt;br /&gt;
=== Device connections ===&lt;br /&gt;
The Devices registration is done through a websocket connection to the webserver of the App Platform and the Devices instance (standard HTTP/s port).&amp;lt;br&amp;gt;&lt;br /&gt;
The URL used can be configured manually under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration] or through a new provisioning mechanism.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A binary protocol is used to transfer information between the device and the devices App. The MAC address is the unique key to identify a device.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a device is added to a domain in Devices, the device gets a unique random password. Without such a password, a device shows up as &#039;&#039;&#039;unassigned&#039;&#039;&#039; in the Devices app.&lt;br /&gt;
This is also the case after a long reset or when the device lost its configuration.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In such a case, the device has to be manually added again to a domain or it has to be provisioned again.&lt;br /&gt;
&lt;br /&gt;
 If a device is not assigned to a domain or provisioning category, it won&#039;t receive any configurations.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registrations ====&lt;br /&gt;
See [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration]&lt;br /&gt;
&lt;br /&gt;
==== Second Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The firmware has a second SYSCLIENT2 module, which can be configured to point to a different Devices instance and the AP Manager also has a second Devices Registration URL.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you use this configuration option, you should take care and consider:&lt;br /&gt;
&lt;br /&gt;
* if the Devices domain from the second configuration provides a password for all devices, the password is ignored, as it would lead to inconsistend passwords otherwise (from 13r1 SR12 on)&lt;br /&gt;
* the Devices domain from the second configuration should not provide Devices Configurations or Update Jobs as these might collide with configurations from the first Devices instance!&lt;br /&gt;
&lt;br /&gt;
Generally, only one of the two  &#039;&#039;Devices&#039;&#039;  App instances connected to the device must apply changes to the device.&lt;br /&gt;
&lt;br /&gt;
 We strongly discourage the usage of this second configuration option due to unexpected behaviour if incorrectly used!&lt;br /&gt;
 Never use the second URL if you use software or hardware rental!&lt;br /&gt;
&lt;br /&gt;
==== Device information ====&lt;br /&gt;
&lt;br /&gt;
The following data is transferred:&lt;br /&gt;
* MAC address&lt;br /&gt;
* device type (e.g. IPVA, AppPlatform, IP112)&lt;br /&gt;
* IP addresses (IPv4, IPv6)&lt;br /&gt;
* version (not searchable)&lt;br /&gt;
&lt;br /&gt;
You can also search for this data inside the devices tab in the App.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==== Device Advanced UI ====&lt;br /&gt;
By default, Devices administrators and non admins can access the advanced UI of any device without limitations.&amp;lt;br/&amp;gt;&lt;br /&gt;
In certain scenerios (e.g. Cloud), you may want to restrict this access to just the PBX on gateways and IPVAs for non adminstrative users, which just have access to certain domains.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
In this case, you can set the corresponding checkmark in the device settings tab of the specific device.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the flag is set, just the PBX tab of the advanced UI is accessible for non administrative Devices users.&lt;br /&gt;
&lt;br /&gt;
 Technically this means, that every HTTP request is checked if it starts with PBX0 and if not, the request is rejected with 401 unauthorized.&lt;br /&gt;
&lt;br /&gt;
If the device can be accessed directly without Devices, you may need a reverse proxy in between to filter HTTP requests.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Provisioning ===&lt;br /&gt;
Devices can be added by provisioning (both phones and gateways). &lt;br /&gt;
The standard online provisioning looks like this:&lt;br /&gt;
* a user or administrator creates a provisioning code in the Devices or Users App (this stores the Devices URL on the provisioning server side)&lt;br /&gt;
* a device with 13r1 or newer is connected to the network after a long reset&lt;br /&gt;
* the provisioning code has to be entered within one hour (after one hour, the Update URL isn&#039;t polled anymore)&lt;br /&gt;
* the device sends this code to config.innovaphone.com and retrieves the Devices URL&lt;br /&gt;
* the device connects to the Devices URL and is added to the domain where the code has been created&lt;br /&gt;
&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Offline_Provisioning offline provisioning mode].&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Provisioning#Automatic_provisioning automatic provisioning mode].&lt;br /&gt;
&lt;br /&gt;
 Note: provisioning is cancelled if the device already belongs to another domain in the same Devices instance! This prevents the unauthorized move of a device between different domains.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The Devices Registration URL which is set through the provisioning process, always starts with &#039;&#039;&#039;wss&#039;&#039;&#039;. This is not dependent anymore on the App URL which is configured inside the PBX Devices App object.&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
The Devices App can be used to rollout updates.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSON files ====&lt;br /&gt;
The update files have to be acccessible on a webserver without authentication and four json files are used:&lt;br /&gt;
* firmware.json: innovaphone device firmware&lt;br /&gt;
* apps.json: Apps for the App Platform&lt;br /&gt;
* software.json: contains software for DECT handsets&lt;br /&gt;
** just IP64 and IP65 are used and supported&lt;br /&gt;
* phoneplatform.json: contains the phone platform image for e.g. the IP270&lt;br /&gt;
&lt;br /&gt;
You can either use the standard innovaphone App Store for these files or your own local webserver.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update jobs ====&lt;br /&gt;
You can configure several update jobs with different categories to organize your updates.&amp;lt;br&amp;gt;&lt;br /&gt;
Update jobs are always sequentially processed and inside one update job, just &#039;&#039;&#039;20&#039;&#039;&#039; devices are updated at the same time.&lt;br /&gt;
&lt;br /&gt;
==== Device update check after the update job has been already executed====&lt;br /&gt;
If a device goes online, the newest suitable update job is searched for this device (depending on the categories).&amp;lt;br&amp;gt;&lt;br /&gt;
If an update job is found, the update is just performed, if there has been &#039;&#039;&#039;no&#039;&#039;&#039; successfull update for this device in this job before and the version does not match (simply string compare).&lt;br /&gt;
&lt;br /&gt;
====Update errors====&lt;br /&gt;
If an update fails, the Devices App shows an error. You may have to enable further tracing on the updated device itself to find out the reason of the failure.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 module and take a look at the events which may already tell you the reason&lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
 An update job is retried &#039;&#039;&#039;two&#039;&#039;&#039; times if updates inside this job failed. The retry is done &#039;&#039;&#039;ten&#039;&#039;&#039; minutes after the update job finished previously.&lt;br /&gt;
&lt;br /&gt;
====innovaphone myApps====&lt;br /&gt;
The path to the App Store and the used innovaphone myApps version is updated to the version of the gateway on gateways with an enabled PBX after a successfull update.&amp;lt;br&amp;gt;&lt;br /&gt;
This configuration can be found [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:PBX/Config/myApps here]&lt;br /&gt;
&lt;br /&gt;
Inside the configuration on an update job, the flag &amp;quot;Do not update myApps launcher software&amp;quot; disables the update of the innovaphone myApps version inside PBXes.&lt;br /&gt;
&lt;br /&gt;
====DECT handsets====&lt;br /&gt;
If you check the update DECT handsets checkmark, all DECT devices will be configured to rollout updates to DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
The DECT handset firmware will be searched inside the configured software.json.&lt;br /&gt;
&lt;br /&gt;
=== Backups ===&lt;br /&gt;
The Devices App can be used to backup the configuration and data of Apps and devices.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Webserver requirements====&lt;br /&gt;
Backups are stored on a webserver with or without Digest/Basic authentication and with the &#039;&#039;&#039;webdav PUT&#039;&#039;&#039; method.&lt;br /&gt;
&lt;br /&gt;
====Backup jobs====&lt;br /&gt;
Backup jobs are executed sequentially. Inside one backup job, just &#039;&#039;&#039;20&#039;&#039;&#039; backups are performed at the same time.&lt;br /&gt;
&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
The configuration file is stored. Therefor the Devices App tells the device to store the configuration with a !mod cmd UP0 /sync prot URL.&lt;br /&gt;
&lt;br /&gt;
====Apps on an App Platform====&lt;br /&gt;
The databases of all existing instances and the manager are stored.&amp;lt;br&amp;gt;&lt;br /&gt;
Each installed App Service can have multiple instances and each App instance has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
A database contains &#039;&#039;&#039;both&#039;&#039;&#039; configuration and data of an App instance! &amp;lt;br&amp;gt;&lt;br /&gt;
The manager database contains the webserver certificate and further manager related configuration settings.&lt;br /&gt;
&lt;br /&gt;
The Devices App establishes a websocket connection to the manager and tells the manager where to store the backups.&amp;lt;br&amp;gt;&lt;br /&gt;
The manager on the backuped App Platform itself performs the HTTP requests to store the files.&lt;br /&gt;
&lt;br /&gt;
====Backup errors====&lt;br /&gt;
If a backup fails, the Devices App shows an error. You may have to enable further tracing on the backuped device itself to find out the reason of the failure.&lt;br /&gt;
&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 &lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
=== Restore ===&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
Just as always under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Administration/Upload/Config Upload Config].&lt;br /&gt;
&lt;br /&gt;
====Apps====&lt;br /&gt;
The App Service itself has to be installed on the App Platform prior restoring of a single instance.&amp;lt;br&amp;gt;&lt;br /&gt;
The restoring is done in the Manager App on the App Platform itself.&amp;lt;br&amp;gt;&lt;br /&gt;
The intance settings, the configuration and data are restored in a single process.&lt;br /&gt;
&lt;br /&gt;
=== Device Configurations ===&lt;br /&gt;
&lt;br /&gt;
You can define several device configurations. These configurations are either applied to all devices inside this domain or to selected categories.&amp;lt;br/&amp;gt;&lt;br /&gt;
Configurations are applied on creation and on every reconnect of a matching device.&lt;br /&gt;
&lt;br /&gt;
==== Transfer checkmarks ====&lt;br /&gt;
&lt;br /&gt;
Some configuration options have a specific checkmark to enable the transfer of the option.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* Checkmark disabled:&lt;br /&gt;
** configuration option field(s) are disabled &lt;br /&gt;
** option values are &#039;&#039;&#039;not&#039;&#039;&#039; transferred at all&lt;br /&gt;
* Checkmark enabled:&lt;br /&gt;
** configuration option field(s) are enabled&lt;br /&gt;
** option values are transferred, even if field values are empty&lt;br /&gt;
&lt;br /&gt;
==== Expert configuration ====&lt;br /&gt;
&lt;br /&gt;
The expert configuration can be used to configure different settings which are not available inside the other device configurations.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can use the standard syntax of an update server script (see [[ {{NAMESPACE}}:Concept_Update_Server | Concept Update Server ]] for a general overview and the section on [[Howto:PHP_based_Update_Server_V2#Hints_for_writing_your_update_snippets | Hints for writing your update snippets ]] (note that the remainder of this article relates to the now deprecated old mechanism, so please disregard the rest)).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Some hints:&lt;br /&gt;
* the expert configuration is just executed once after a device restarted and on change of the expert configuration itself&lt;br /&gt;
* the expert configuration is executed after all other device configuration types, so that you can override changes&lt;br /&gt;
* to make configuration changes effective, you may also need to issue a final &#039;&#039;config write&#039;&#039;, &#039;&#039;config activate&#039;&#039; and &#039;&#039;iresetn&#039;&#039; command (see the [[ {{NAMESPACE}}:Concept_Update_Server#Check_command | &#039;&#039;check&#039;&#039; command]] for details)&lt;br /&gt;
* some commands shouldn&#039;t be used inside the script:&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Times_command |&#039;&#039;times&#039;&#039;]]: since the expert configuration is executed only once after a reboot of the device and when changes are made, it does not make sense to use the &#039;&#039;times&#039;&#039; command&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Prot_command |&#039;&#039;prot&#039;&#039;]]|[[ {{NAMESPACE}}:Concept_Update_Server#Boot_command |&#039;&#039;boot&#039;&#039;]]: use an update job instead&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Scfg_command |&#039;&#039;scfg&#039;&#039;]]: use a backup job instead&lt;br /&gt;
** [[Howto:PHP_based_Update_Server_V2#Using_vars_create|&#039;&#039;vars create&#039;&#039;]]: this cmd will always raise the &#039;&#039;reset needed condition&#039;&#039; and the aforementioned &#039;&#039;iresetn&#039;&#039; command would always execute therefore.  As a result, the devices would enter a boot loop.  Be sure to avoid this using an appropriate [[ {{NAMESPACE}}:Concept_Update_Server#Check_command |&#039;&#039;check&#039;&#039; command ]] and update its &#039;&#039;&amp;lt;serial&amp;gt;&#039;&#039; properly whenever the expert configuration is changed&lt;br /&gt;
&lt;br /&gt;
==== Certificates configuration ====&lt;br /&gt;
You can use this configuration to rollout certificates to the trust list of your devices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Manual upload certificates.&lt;br /&gt;
* Configure up to five URLs which are polled every 24 hours. They must return files with PEM formatted public keys (one or more) which are then rolled out.&lt;br /&gt;
** certificates are just rolled out if differences are determined, so if URLs are polled and no changes are detected, certificates are not rolled out again&lt;br /&gt;
** if a device restarts, the configuration is applied again. Just the fingerprints of the device trust list are checked against the configuration trust list and just on differences, certificates are rolled out again&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/innovaphone.pem to always have the innovaphone public keys in your trust list (e.g. used for our push service).&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca.pem to always have the innovaphone Device Certification Authority certificates in your trust list.&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca-unverified.pem to always have the innovaphone Unverified Device Certification Authority certificates in your trust list.&lt;br /&gt;
** The Unverified CA is used for non hardware devices, e.g. IPVAs, which are not shipped with an official innovaphone Device Certification Authority certificate, as innovaphone has no control over the serial number here.&lt;br /&gt;
&lt;br /&gt;
 Using this configuration, the trust list can only be managed through &#039;&#039;Devices&#039;&#039; because it is cleared before each rollout.&lt;br /&gt;
&lt;br /&gt;
==== DECT Handsets ====&lt;br /&gt;
&lt;br /&gt;
This configuration can be used to configure specific options like language, voicemail number etc. for DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* all DECT devices like IP1202, IP1203 etc. will receive this configuration (of course just if the configured categories match)&lt;br /&gt;
* Devices configures a URL like https://domain.com/domain.com/devices/parameters/id.xml on the specific DEVMANBW module.&lt;br /&gt;
* This file is then polled by the basestations and the read values are transfered to the DECT handsets.&lt;br /&gt;
* see [[{{NAMESPACE}}:IP1202/IP1203_DECT_System#Configuration_of_Handset_parameters]]&lt;br /&gt;
&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
=== Software rental ===&lt;br /&gt;
Regarding the Software Rental program and the Payment Method, please refer to:&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_Software_Rental|Concept Software Rental]]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
Software rental can be done for innovaphone Cloud installations or for software, which operates on the customer premisis. This could eventually be customer owned hardware or a privat virtual machine, managed by the customer.&lt;br /&gt;
&lt;br /&gt;
==== Hardware licenses ====&lt;br /&gt;
Hardware licenses have to be bound on the specific device in my.innovaphone itself and currently can&#039;t be handled within the Devices App itself. So you also need to download the licenses from my.innovaphone and upload them on the device with the already known methods.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses with software rental =====&lt;br /&gt;
If your device has software rental licenses, you can bind hardware licenses within my.innovaphone in the software rental project itself.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses without software rental =====&lt;br /&gt;
If your device does not have software rental licenses, you should bind hardware licenses in a separate non rental project in my.innovaphone.&lt;br /&gt;
&lt;br /&gt;
==== innovaphone Cloud ====&lt;br /&gt;
Inside the innovaphone Cloud, you just have to upload your activation keys with iSCs to add licenses to one or more gateways.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Email expiry notifications ====&lt;br /&gt;
You will receive an email notification if the rental of a project expires. This notification will be sent &#039;&#039;&#039;seven&#039;&#039;&#039; weeks before the expiry and then once a week until the rental expires.&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure one or more email recipients in the domain settings.&amp;lt;br&amp;gt;&lt;br /&gt;
If no email address is configured, the email address of the logged in user account is used.&lt;br /&gt;
&lt;br /&gt;
==== History ====&lt;br /&gt;
You can download the history in the Devices App. You&#039;ll get a CSV file (semicolon separated). The date and number format depends on the selected language in the UI.&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an API available for automated downloas, which is described [[ {{NAMESPACE}}:Concept_App_Service_Devices#API_to_download_rental_history|here ]].&lt;br /&gt;
&lt;br /&gt;
====Own installation====&lt;br /&gt;
Inside your own installation, you have to register a new my.innovaphone account or you can use an existing account inside the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
One domain inside Devices belongs to one project inside your my.innovaphone company, so you can handle multiple domains with one my.innovaphone account.&lt;br /&gt;
&lt;br /&gt;
====Technical aspects====&lt;br /&gt;
A new rental expiration date is calculated on each license or balance change in the domain.&amp;lt;br&amp;gt;&lt;br /&gt;
So after each change new licenses with a new date are transfered to the gateways and also stored in the Devices App itself.&amp;lt;br&amp;gt;&lt;br /&gt;
If the rental expires, the gateway reboots and the licenses are not available anymore.&amp;lt;br&amp;gt;&lt;br /&gt;
The licenses are also transfered after each reconnect of a gateway to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For license and balance changes, the Devices App must be online and have access to my.innovaphone.com!&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
You have to add (use the + symbol) a PBX and select all licenses you want to rent.&amp;lt;br&amp;gt;&lt;br /&gt;
Use the &#039;&#039;&#039;apply&#039;&#039;&#039; button to really bind these licenses. Without usage of the apply button, you can just see a precalculation of the iSCs/month and the rental end date, but nothing is really charged from your balance.&lt;br /&gt;
&lt;br /&gt;
===Change of IP address/DNS name in PBX object===&lt;br /&gt;
If the IP address or DNS name inside the PBX object of the Devices App changes, all currently connected clients get a new Devices Registration URL and also all clients, which connect afterwards with the old host name.&lt;br /&gt;
&lt;br /&gt;
== Appendix ==&lt;br /&gt;
=== Sample firmware.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;devices&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP101&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP102&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1060&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP111&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP112&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1130&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1260&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP150&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP2000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP200A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP22&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP222&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP230&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP232&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP24&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP240&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP241&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP29&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP302&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP305&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP311&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP411&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP800&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP810&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP811&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IPVA&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;versions&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;text&amp;quot;: &amp;quot;13r1 dvl [131705]&amp;quot;, &amp;quot;wiki&amp;quot;: &amp;quot;&amp;quot; }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample apps.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;apps&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;Apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;The Apidemo&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;AppStore&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;AppStore&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample software.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;software&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myapps.apk&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Android&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Android&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myAppsSetup.msi&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Windows&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Windows&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample phoneplatform.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;arm64&amp;quot;,&lt;br /&gt;
            &amp;quot;text&amp;quot;: &amp;quot;Phone Platform&amp;quot;,&lt;br /&gt;
            &amp;quot;file&amp;quot;: &amp;quot;phone-platform.img&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;yocto2&amp;quot;,&lt;br /&gt;
            &amp;quot;version&amp;quot;: &amp;quot;2063&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;devices&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;IP270&amp;quot;,&lt;br /&gt;
            &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
                &amp;quot;arm64&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API to download rental history ===&lt;br /&gt;
&lt;br /&gt;
You can download the history as a UTF-8 CSV file with simple &#039;&#039;&#039;HTTP GET&#039;&#039;&#039; requests with &#039;&#039;&#039;digest&#039;&#039;&#039; authentication.&amp;lt;br&amp;gt;&lt;br /&gt;
The CSV file uses the semicolon as delimiter.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The URL to download the history is e.g.:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?...&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 You can find this path by editing the instance in the AP manager.&lt;br /&gt;
 In the listed paths, you&#039;ll find something which ends with csvapi&lt;br /&gt;
&lt;br /&gt;
In the innovaphone Cloud environment, the URL can be retrieved by taking a look at the Devices App object inside the cloud PBX and replacing the ending &#039;&#039;&#039;innovaphone-devices&#039;&#039;&#039; with &#039;&#039;&#039;csvapi&#039;&#039;&#039; inside the App URL, so it looks e.g. like this:&lt;br /&gt;
&lt;br /&gt;
 https://cloud-apps0.innovaphone.com/cloud.innovaphone.com/devices/csvapi&lt;br /&gt;
&lt;br /&gt;
====CSV columns====&lt;br /&gt;
Most columns should be self explaining, but the column &#039;&#039;&#039;invoice reference&#039;&#039;&#039; refers to a value which you can configure manually in the domain settings in the Devices App!&lt;br /&gt;
&lt;br /&gt;
====Digest authentication====&lt;br /&gt;
You can login with two different username/password combinations, while the domain is the digest username:&lt;br /&gt;
&lt;br /&gt;
* If you use the domain and password of your Devices App instance inside the AP Manager, you have automatically access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
* If you use the domain name of any domain as digest username and the configured domain password, you&#039;ll have access to this domain and all domains to which this domain has access to&lt;br /&gt;
&lt;br /&gt;
====Query parameters====&lt;br /&gt;
The following query parameters can be used (don&#039;t forget to URL encode the parameter values, if neccessary!):&lt;br /&gt;
* all: if &#039;&#039;&#039;1&#039;&#039;&#039; or &#039;&#039;&#039;true&#039;&#039;&#039;, the history is queried for all domains where the digest user has access to&lt;br /&gt;
* domain: required, if &#039;&#039;all&#039;&#039; is not set&lt;br /&gt;
* lang: the output language of the CSV file, which also controls date and number formats, e.g. &#039;&#039;&#039;en&#039;&#039;&#039;, &#039;&#039;&#039;de&#039;&#039;&#039;, ...&lt;br /&gt;
* tz: the timezone for dates, e.g. &#039;&#039;&#039;Europe/Berlin&#039;&#039;&#039;&lt;br /&gt;
* type: two types are available:&lt;br /&gt;
** &#039;&#039;&#039;history&#039;&#039;&#039;: history which contains changes&lt;br /&gt;
** &#039;&#039;&#039;overview&#039;&#039;&#039;: a monthly overview with the iSC costs at the first of the last months&lt;br /&gt;
* from: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
* to: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
&lt;br /&gt;
====Example requests====&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=history&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;amp;from=1601903431000&amp;amp;to=1601903385000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?all=1&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Supported DECT handsets ===&lt;br /&gt;
&lt;br /&gt;
The following handsets are supported for update jobs and the DECT handsets configuration:&lt;br /&gt;
&lt;br /&gt;
* IP64&lt;br /&gt;
* IP65&lt;br /&gt;
* D81&lt;br /&gt;
* D83&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
===SoftwarePhone===&lt;br /&gt;
The Devices App is not meant to be used with the windows SoftwarPhone standalone installation.&lt;br /&gt;
&lt;br /&gt;
== Related Articles == &lt;br /&gt;
* [[Howto:Software_Rental]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=78177</id>
		<title>Reference14r2:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=78177"/>
		<updated>2025-10-07T05:42:28Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* General */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or above&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
** Proxmox/KVM/Qemu&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How to implement large PBXs#Technical data and recommended number of users supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App services and multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. Before version 130012, you must use ISA, as Virtio was not supported with older versions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
** Proxmox: follow this description here, just with the app-platform-ova.zip: https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Proxmox_VE&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: eg. your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: eg. DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: eg. TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: eg. your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How to retrieve files from the AP| Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nightly database analyse ===&lt;br /&gt;
&lt;br /&gt;
Every database is analysed at night to keep indexes in sync with the data. This triggers a &#039;&#039;vacuumdb -a -z&#039;&#039;, which updates optimizer statistics, but does &#039;&#039;&#039;not&#039;&#039;&#039; shrink the physical size of the database.&amp;lt;br/&amp;gt;&lt;br /&gt;
This must be done manually in the instance settings.&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13 Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
After the update has been downloaded and verified, your App Platform will reboot.&lt;br /&gt;
You can check the installation process after the reboot with the following URL: https://IP-of-AP/manager/ramdisk.log&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: A timezone string which is used by the App Platform Manager to do certain jobs according to the configured timezone.&lt;br /&gt;
** Note that this doesn&#039;t change the timezone of the linux itself!&lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: see [[#Backup_of_the_Apps| Backup of Apps]]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Current Webserver certificates&#039;&#039;: shows the current certificates with the ability to download them. &lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Encrypt ==&lt;br /&gt;
&lt;br /&gt;
Configure the certificate creation by Let&#039;s Encrypt here.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Enable&#039;&#039;: turns the automatic creation on or off&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App URL&#039;&#039;: the URL of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this URL from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App Password&#039;&#039;: the client password of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this password from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Key length&#039;&#039;: 2048, 3072 or 4096 (keep in mind, that [[{{NAMESPACE}}:Certificate_management#Certificate_Key_Length_and_CPU_Usage|a higher value provides higher security but also lower performance!]])&lt;br /&gt;
* &#039;&#039;DNS Name&#039;&#039;: the external DNS names of your device (up to 100 possible)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
App Platform [[#App Platform replication|replication settings]]&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Updates the App Platform to the latest image available on the App Store.&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
Restarts the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Shutdown ==&lt;br /&gt;
Shuts down the App Platform.&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 or above on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
**Note: to ensure rapid recognition of the new DNS target, the definition of an appropriate TTL value is recommended&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.innovaphone.com/index.php?title=Howto14r2:Firmware_Upgrade_V14r1_V14r2#App_Platform_and_Apps&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= App Installer PBX Manager Plugin =&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V14 and above&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The app installer plugin allows IT administrator (with access to the PBX Manager) to install/update/delete new apps from the innovaphone app store including Partners apps. It is automatically available with existing app platforms or after adding a new one in the PBX Manager.&lt;br /&gt;
It offers a view to the App Platform Manager‘s App Store with all the available functionalities and simplifies the install, update and uninstall of apps.&lt;br /&gt;
&lt;br /&gt;
== Dedicated AP for each user ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app will install the app service and add a new instance with the user’s domain. The instance is automatically started.&amp;lt;br&amp;gt;&lt;br /&gt;
This further enables the configuration of the instance through its respective PBX Manager plugin. &amp;lt;br&amp;gt;&lt;br /&gt;
Uninstalling the app will remove the app service and the corresponding instance.&lt;br /&gt;
&lt;br /&gt;
== Shared AP between users ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app works in a similar way to that of the dedicated AP. However, each time a new user installs the app, only a new instance is created if the app service is already installed. &amp;lt;br&amp;gt;&lt;br /&gt;
A user can uninstall the app, in this case the corresponding instance is deleted. If no more instances exist, then the app service is uninstalled. &amp;lt;br&amp;gt;&lt;br /&gt;
The administrator can only update the app service in such scenario.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== App Platform doesn&#039;t start after an update ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
Note: This process can take a while, after it&#039;s finished it reboots and automatically change the &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; value. &lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine ===&lt;br /&gt;
&lt;br /&gt;
Boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition.&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
=== It still doesn&#039;t start ===&lt;br /&gt;
&lt;br /&gt;
If it still doesn&#039;t start, configure the App Platform to boot from /dev/sda3 (or inside a VM start the second boot loader entry) and login with SSH as root.&lt;br /&gt;
Then do a first check to verify that you have a specific error due to an incomplete update or a [[Howto15r1:Firmware Upgrade V14r2 V15r1#AP Upgrade to Image 130006|wrong update order]]:&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* /apps/manager/manager&lt;br /&gt;
* if this outputs &#039;&#039;&#039;error while loading shared libraries: libcrypto.so.3:&#039;&#039;&#039; you have a manager version which cannot run on the current image.&lt;br /&gt;
&lt;br /&gt;
In this case you must download an older build (14r1 1410593):&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* wget --no-check-certificate -O /apps/manager/manager https://webbuild.innovaphone.com/1410593/arm/manager/manager &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* wget --no-check-certificate -O /apps/webserver/webserver https://webbuild.innovaphone.com/1410593/arm/webserver/webserver &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* chown root:root /apps/manager/manager&lt;br /&gt;
* chown root:root /apps/webserver/webserver&lt;br /&gt;
* chmod +x /apps/manager/manager&lt;br /&gt;
* chmod +x /apps/webserver/webserver&lt;br /&gt;
* echo 110000 &amp;gt; /mnt/sda1/label&lt;br /&gt;
** this allows the manager to perform an image update again&lt;br /&gt;
* /etc/init.d/S92manager start&lt;br /&gt;
* now perform an image update and &#039;&#039;&#039;afterwards&#039;&#039;&#039; update your apps again&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files|Reference14r2:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine|Reference14r2:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or &#039;&#039;&#039;130007&#039;&#039;&#039; and lower than &#039;&#039;&#039;130015&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 130015 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
&lt;br /&gt;
=== All databases ===&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
=== single database ===&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and the App database is not available during this time&lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;br /&gt;
&lt;br /&gt;
== Move instance database to external database host ==&lt;br /&gt;
&lt;br /&gt;
In case you want to use an external database server instead of the integrated:&lt;br /&gt;
&lt;br /&gt;
* download a backup of the specific instance over the App Platform Manager&lt;br /&gt;
* create a postgresql database on the external host:&lt;br /&gt;
** createdb --encoding=UTF-8 exampledb&lt;br /&gt;
* restore the backup&lt;br /&gt;
** pg_restore -d exampledb backup-exampledb.dump&lt;br /&gt;
* change the ownership to a specific postgresql user (which you have to create yourself first)&lt;br /&gt;
** psql -d postgres -c &amp;quot;ALTER DATABASE exampledb OWNER TO exampleuser&amp;quot;&lt;br /&gt;
* configure the database host, name, user and password on the instance inside the App Platform Manager&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r1:Concept_App_Platform&amp;diff=77518</id>
		<title>Reference14r1:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r1:Concept_App_Platform&amp;diff=77518"/>
		<updated>2025-08-14T07:08:12Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Resizing the disk of a Virtual machine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or above&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
** Proxmox/KVM/Qemu&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How_to_implement_large_PBXs#Technical_data_and_recommended_number_of_users_supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App_services_and_multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. You &#039;&#039;&#039;must&#039;&#039;&#039; use &#039;&#039;&#039;ISA&#039;&#039;&#039;, as Virtio is currently not supported.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
** Proxmox: follow this description here, just with the app-platform-ova.zip: https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Proxmox_VE&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: eg. your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: eg. DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: eg. TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: eg. your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How_to_retrieve_files_from_the_AP | Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13_Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: &lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: obsolete, use the Devices App for backups!&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Current Webserver certificates&#039;&#039;: shows the current certificates with the ability to download them. &lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Encrypt ==&lt;br /&gt;
&lt;br /&gt;
Configure the certificate creation by Let&#039;s Encrypt here.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Enable&#039;&#039;: turns the automatic creation on or off&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App URL&#039;&#039;: the URL of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this URL from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App Password&#039;&#039;: the client password of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this password from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Key length&#039;&#039;: 2048, 3072 or 4096 (keep in mind, that [[{{NAMESPACE}}:Certificate_management#Certificate_Key_Length_and_CPU_Usage|a higher value provides higher security but also lower performance!]])&lt;br /&gt;
* &#039;&#039;DNS Name&#039;&#039;: the external DNS names of your device (up to 100 possible)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
App Platform [[#App_Platform_replication|replication settings]]&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Updates the App Platform to the latest image available on the App Store.&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
Restarts the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Shutdown ==&lt;br /&gt;
Shuts down the App Platform.&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 or above on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= App Installer PBX Manager Plugin =&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V14 and above&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The app installer plugin allows IT administrator (with access to the PBX Manager) to install/update/delete new apps from the innovaphone app store including Partners apps. It is automatically available with existing app platforms or after adding a new one in the PBX Manager.&lt;br /&gt;
It offers a view to the App Platform Manager‘s App Store with all the available functionalities and simplifies the install, update and uninstall of apps.&lt;br /&gt;
&lt;br /&gt;
== Dedicated AP for each user ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app will install the app service and add a new instance with the user’s domain. The instance is automatically started.&amp;lt;br&amp;gt;&lt;br /&gt;
This further enables the configuration of the instance through its respective PBX Manager plugin. &amp;lt;br&amp;gt;&lt;br /&gt;
Uninstalling the app will remove the app service and the corresponding instance.&lt;br /&gt;
&lt;br /&gt;
== Shared AP between users ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app works in a similar way to that of the dedicated AP. However, each time a new user installs the app, only a new instance is created if the app service is already installed. &amp;lt;br&amp;gt;&lt;br /&gt;
A user can uninstall the app, in this case the corresponding instance is deleted. If no more instances exist, then the app service is uninstalled. &amp;lt;br&amp;gt;&lt;br /&gt;
The administrator can only update the app service in such scenario.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update doesn&#039;t start as update is already running ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update because one is already running, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or &#039;&#039;&#039;130007&#039;&#039;&#039; and lower than &#039;&#039;&#039;130015&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 130015 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and CDRs (or other data written to a DB) won&#039;t be received during this time. &lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]] &lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r1:Concept_App_Platform&amp;diff=77517</id>
		<title>Reference13r1:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r1:Concept_App_Platform&amp;diff=77517"/>
		<updated>2025-08-14T07:07:58Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Resizing the disk of a Virtual machine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or up&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the AP (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How_to_implement_large_PBXs#Technical_data_and_recommended_number_of_users_supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the AP in a specific scenario, we see that in a real life environment an AP running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App_services_and_multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
&lt;br /&gt;
* partitions:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access IP addresses available through a VPN connection from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key in PKCS#1 format: your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
or&lt;br /&gt;
 -----BEGIN PRIVATE KEY-----&lt;br /&gt;
 (certificate Key in PKCS#8 format: your_domain_name.key)&lt;br /&gt;
 -----END PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How_to_retrieve_files_from_the_AP | Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/11/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One AP for one customer&lt;br /&gt;
* One AP for many customers&lt;br /&gt;
* Many APs for one customer&lt;br /&gt;
* Many APs for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One AP for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13_Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or APs.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update doesn&#039;t start as update is already running ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the AP doesn&#039;t want to start an update because one is already running, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the AP and &#039;&#039;&#039;Stop&#039;&#039;&#039; it.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the AP now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The AP now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the AP Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the AP again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the AP ==&lt;br /&gt;
To retrieve files from the AP which can not be retrieved via the AP manager UI, you can connect to the AP using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your AP (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the AP)&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your AP (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the AP Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or &#039;&#039;&#039;130007&#039;&#039;&#039; and lower than &#039;&#039;&#039;130015&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 130015 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and CDRs (or other data written to a DB) won&#039;t be received during this time. &lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or AP Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the AP-Plattform.&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]] &lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your AP.&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r2:Concept_App_Platform&amp;diff=77516</id>
		<title>Reference13r2:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r2:Concept_App_Platform&amp;diff=77516"/>
		<updated>2025-08-14T07:07:48Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Resizing the disk of a Virtual machine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or up&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the AP (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How_to_implement_large_PBXs#Technical_data_and_recommended_number_of_users_supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the AP in a specific scenario, we see that in a real life environment an AP running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App_services_and_multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
&lt;br /&gt;
* partitions:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How_to_retrieve_files_from_the_AP | Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/11/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the AP Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the AP uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The AP Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the AP Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple APs (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one AP is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple APs (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One AP for one customer&lt;br /&gt;
* One AP for many customers&lt;br /&gt;
* Many APs for one customer&lt;br /&gt;
* Many APs for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One AP for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13_Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or APs.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: &lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: obsolete, use the Devices App for backups!&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update doesn&#039;t start as update is already running ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the AP doesn&#039;t want to start an update because one is already running, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the AP and &#039;&#039;&#039;Stop&#039;&#039;&#039; it.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the AP now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The AP now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the AP Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the AP again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the AP ==&lt;br /&gt;
To retrieve files from the AP which can not be retrieved via the AP manager UI, you can connect to the AP using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your AP (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the AP)&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your AP (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the AP. You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the AP ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the AP Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or &#039;&#039;&#039;130007&#039;&#039;&#039; and lower than &#039;&#039;&#039;130015&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 130015 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the AP Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and CDRs (or other data written to a DB) won&#039;t be received during this time. &lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or AP Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the AP-Plattform.&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]] &lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your AP.&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Platform&amp;diff=77515</id>
		<title>Reference13r3:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference13r3:Concept_App_Platform&amp;diff=77515"/>
		<updated>2025-08-14T07:07:32Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Resizing the disk of a Virtual machine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or up&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How_to_implement_large_PBXs#Technical_data_and_recommended_number_of_users_supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App_services_and_multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. You &#039;&#039;&#039;must&#039;&#039;&#039; use &#039;&#039;&#039;ISA&#039;&#039;&#039;, as Virtio is currently not supported.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How_to_retrieve_files_from_the_AP | Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13_Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: &lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: obsolete, use the Devices App for backups!&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update doesn&#039;t start as update is already running ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update because one is already running, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or &#039;&#039;&#039;130007&#039;&#039;&#039; and lower than &#039;&#039;&#039;130015&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 130015 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and CDRs (or other data written to a DB) won&#039;t be received during this time. &lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]] &lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=77514</id>
		<title>Reference14r2:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=77514"/>
		<updated>2025-08-14T07:07:06Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Resizing the disk of a Virtual machine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or above&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
** Proxmox/KVM/Qemu&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How to implement large PBXs#Technical data and recommended number of users supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App services and multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. Before version 130012, you must use ISA, as Virtio was not supported with older versions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
** Proxmox: follow this description here, just with the app-platform-ova.zip: https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Proxmox_VE&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: eg. your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: eg. DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: eg. TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: eg. your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How to retrieve files from the AP| Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nightly database analyse ===&lt;br /&gt;
&lt;br /&gt;
Every database is analysed at night to keep indexes in sync with the data. This triggers a &#039;&#039;vacuumdb -a -z&#039;&#039;, which updates optimizer statistics, but does &#039;&#039;&#039;not&#039;&#039;&#039; shrink the physical size of the database.&amp;lt;br/&amp;gt;&lt;br /&gt;
This must be done manually in the instance settings.&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13 Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
After the update has been downloaded and verified, your App Platform will reboot.&lt;br /&gt;
You can check the installation process after the reboot with the following URL: https://IP-of-AP/manager/ramdisk.log&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: A timezone string which is used by the App Platform Manager to do certain jobs according to the configured timezone.&lt;br /&gt;
** Note that this doesn&#039;t change the timezone of the linux itself!&lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: obsolete, use the Devices App for backups!&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Current Webserver certificates&#039;&#039;: shows the current certificates with the ability to download them. &lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Encrypt ==&lt;br /&gt;
&lt;br /&gt;
Configure the certificate creation by Let&#039;s Encrypt here.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Enable&#039;&#039;: turns the automatic creation on or off&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App URL&#039;&#039;: the URL of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this URL from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App Password&#039;&#039;: the client password of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this password from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Key length&#039;&#039;: 2048, 3072 or 4096 (keep in mind, that [[{{NAMESPACE}}:Certificate_management#Certificate_Key_Length_and_CPU_Usage|a higher value provides higher security but also lower performance!]])&lt;br /&gt;
* &#039;&#039;DNS Name&#039;&#039;: the external DNS names of your device (up to 100 possible)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
App Platform [[#App Platform replication|replication settings]]&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Updates the App Platform to the latest image available on the App Store.&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
Restarts the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Shutdown ==&lt;br /&gt;
Shuts down the App Platform.&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 or above on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
**Note: to ensure rapid recognition of the new DNS target, the definition of an appropriate TTL value is recommended&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.innovaphone.com/index.php?title=Howto14r2:Firmware_Upgrade_V14r1_V14r2#App_Platform_and_Apps&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= App Installer PBX Manager Plugin =&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V14 and above&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The app installer plugin allows IT administrator (with access to the PBX Manager) to install/update/delete new apps from the innovaphone app store including Partners apps. It is automatically available with existing app platforms or after adding a new one in the PBX Manager.&lt;br /&gt;
It offers a view to the App Platform Manager‘s App Store with all the available functionalities and simplifies the install, update and uninstall of apps.&lt;br /&gt;
&lt;br /&gt;
== Dedicated AP for each user ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app will install the app service and add a new instance with the user’s domain. The instance is automatically started.&amp;lt;br&amp;gt;&lt;br /&gt;
This further enables the configuration of the instance through its respective PBX Manager plugin. &amp;lt;br&amp;gt;&lt;br /&gt;
Uninstalling the app will remove the app service and the corresponding instance.&lt;br /&gt;
&lt;br /&gt;
== Shared AP between users ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app works in a similar way to that of the dedicated AP. However, each time a new user installs the app, only a new instance is created if the app service is already installed. &amp;lt;br&amp;gt;&lt;br /&gt;
A user can uninstall the app, in this case the corresponding instance is deleted. If no more instances exist, then the app service is uninstalled. &amp;lt;br&amp;gt;&lt;br /&gt;
The administrator can only update the app service in such scenario.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== App Platform doesn&#039;t start after an update ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
Note: This process can take a while, after it&#039;s finished it reboots and automatically change the &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; value. &lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine ===&lt;br /&gt;
&lt;br /&gt;
Boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition.&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
=== It still doesn&#039;t start ===&lt;br /&gt;
&lt;br /&gt;
If it still doesn&#039;t start, configure the App Platform to boot from /dev/sda3 (or inside a VM start the second boot loader entry) and login with SSH as root.&lt;br /&gt;
Then do a first check to verify that you have a specific error due to an incomplete update or a [[Howto15r1:Firmware Upgrade V14r2 V15r1#AP Upgrade to Image 130006|wrong update order]]:&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* /apps/manager/manager&lt;br /&gt;
* if this outputs &#039;&#039;&#039;error while loading shared libraries: libcrypto.so.3:&#039;&#039;&#039; you have a manager version which cannot run on the current image.&lt;br /&gt;
&lt;br /&gt;
In this case you must download an older build (14r1 1410593):&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* wget --no-check-certificate -O /apps/manager/manager https://webbuild.innovaphone.com/1410593/arm/manager/manager &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* wget --no-check-certificate -O /apps/webserver/webserver https://webbuild.innovaphone.com/1410593/arm/webserver/webserver &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* chown root:root /apps/manager/manager&lt;br /&gt;
* chown root:root /apps/webserver/webserver&lt;br /&gt;
* chmod +x /apps/manager/manager&lt;br /&gt;
* chmod +x /apps/webserver/webserver&lt;br /&gt;
* echo 110000 &amp;gt; /mnt/sda1/label&lt;br /&gt;
** this allows the manager to perform an image update again&lt;br /&gt;
* /etc/init.d/S92manager start&lt;br /&gt;
* now perform an image update and &#039;&#039;&#039;afterwards&#039;&#039;&#039; update your apps again&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files|Reference14r2:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine|Reference14r2:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or &#039;&#039;&#039;130007&#039;&#039;&#039; and lower than &#039;&#039;&#039;130015&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 130015 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
&lt;br /&gt;
=== All databases ===&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
=== single database ===&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and the App database is not available during this time&lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;br /&gt;
&lt;br /&gt;
== Move instance database to external database host ==&lt;br /&gt;
&lt;br /&gt;
In case you want to use an external database server instead of the integrated:&lt;br /&gt;
&lt;br /&gt;
* download a backup of the specific instance over the App Platform Manager&lt;br /&gt;
* create a postgresql database on the external host:&lt;br /&gt;
** createdb --encoding=UTF-8 exampledb&lt;br /&gt;
* restore the backup&lt;br /&gt;
** pg_restore -d exampledb backup-exampledb.dump&lt;br /&gt;
* change the ownership to a specific postgresql user (which you have to create yourself first)&lt;br /&gt;
** psql -d postgres -c &amp;quot;ALTER DATABASE exampledb OWNER TO exampleuser&amp;quot;&lt;br /&gt;
* configure the database host, name, user and password on the instance inside the App Platform Manager&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference:My_Innovaphone&amp;diff=77502</id>
		<title>Reference:My Innovaphone</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference:My_Innovaphone&amp;diff=77502"/>
		<updated>2025-08-11T05:20:30Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Download App development license */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Where is my old my.innovaphone?==&lt;br /&gt;
Don&#039;t worry, just login with your old my.innovaphone account! You will be asked to confirm your forename and surname (just a &#039;&#039;&#039;natural person&#039;&#039;&#039; is allowed) and accept some terms and conditions.&amp;lt;br&amp;gt;&lt;br /&gt;
Afterwards you find the old license/device view inside the [[#Licenses tab| Licenses tab]].&lt;br /&gt;
&lt;br /&gt;
==About==&lt;br /&gt;
my.innovaphone allows the handling of licenses and includes the handling of device warranty and software service agreements.&amp;lt;br&amp;gt;&lt;br /&gt;
You can also sign contracts here for different purposes.&lt;br /&gt;
&lt;br /&gt;
===Project-View===&lt;br /&gt;
My innovaphone offers the possibility for several users to be in one company. This company shares its balance of licenses over all users and can have several projects. Projects have their own balance of license types and devices are bound to a project.&lt;br /&gt;
&lt;br /&gt;
===Language===&lt;br /&gt;
My innovaphone will support multiple languages. You can select your desired language at the top of the page.&amp;lt;br&amp;gt;&lt;br /&gt;
Currently supported languages:&lt;br /&gt;
* English&lt;br /&gt;
* German&lt;br /&gt;
* Italian&lt;br /&gt;
* Dutch&lt;br /&gt;
* French&lt;br /&gt;
* Spanish (partially)&lt;br /&gt;
* Polish (partially)&lt;br /&gt;
&lt;br /&gt;
===Guides===&lt;br /&gt;
&lt;br /&gt;
====Quickstart guide====&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_nl.pdf Dutch quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_en.pdf English quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_fr.pdf French quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_de.pdf German quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_it.pdf Italian quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====SSA guide====&lt;br /&gt;
;V10 and greater:&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10nl.pdf Dutch SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10en.pdf English SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10fr.pdf French SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10de.pdf German SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10it.pdf Italian SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10pl.pdf Polish SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10es.pdf Spanish SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;V8 and greater:&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_en.pdf English SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_fr.pdf French SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_de.pdf German SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_it.pdf Italian SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==First steps==&lt;br /&gt;
Open [https://my.innovaphone.com my.innovaphone.com] and click the &amp;quot;I would like to create a new personal user account&amp;quot; link.&lt;br /&gt;
Enter your personal data and register.&lt;br /&gt;
&lt;br /&gt;
You will receive a registration email with an activation link.&lt;br /&gt;
After account activation you have two options:&lt;br /&gt;
* create a new my.innovaphone company with the &amp;quot;Create company account&amp;quot; button&lt;br /&gt;
* ask another user of your company to invite your email address to an already existing company&lt;br /&gt;
&lt;br /&gt;
If you accidentally created an own my innovaphone company, just ask another user of your company to import your just created company.&lt;br /&gt;
&lt;br /&gt;
If you create a new company, you can &#039;&#039;&#039;optionally&#039;&#039;&#039; enter your innovaphone account ID (which is your customer number with innovaphone) with your postal code, to retrieve your company data.&lt;br /&gt;
&lt;br /&gt;
  Inside the license tab of the my.innovaphone portal, you will see a help link at the right side of the horizontal tab menu. &lt;br /&gt;
  This link shows the corresponding text of the wiki section, when hovering with the mouse over it, &lt;br /&gt;
  and redirects to the corresponding wiki menu, if clicked.&lt;br /&gt;
&lt;br /&gt;
  It is possible, that one user is member of serveral companies!&lt;br /&gt;
&lt;br /&gt;
==Left bar==&lt;br /&gt;
If you open the left bar, you have the options to:&lt;br /&gt;
* select one of your companies&lt;br /&gt;
* edit your personal user account&lt;br /&gt;
** user name&lt;br /&gt;
** email address&lt;br /&gt;
** flag to recieve SSA expiry emails&lt;br /&gt;
** password&lt;br /&gt;
* create a new company&lt;br /&gt;
[[Image:Myinnovaphone bar.png|center|thumb|200px|myinnovaphone_bar.png/|myinnovaphone_bar.png/]]&lt;br /&gt;
&lt;br /&gt;
==Main tabs==&lt;br /&gt;
Inside each company you see the three main tabs:&lt;br /&gt;
* Contracts&lt;br /&gt;
* Authorized persons&lt;br /&gt;
* Licenses (see [[#Licenses tab| Licenses tab]])&lt;br /&gt;
&lt;br /&gt;
You may also have two buttons:&lt;br /&gt;
* Add Contract (just as company administrator or with the contract right)&lt;br /&gt;
* Invite person (just as company administrator)&lt;br /&gt;
&lt;br /&gt;
[[Image:Myinnovaphone main.png|center|thumb|200px|myinnovaphone_main.png/|myinnovaphone_main.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Contracts ===&lt;br /&gt;
Inside the contracts tab, you see all your contracts and you can download these conracts.&amp;lt;br&amp;gt;&lt;br /&gt;
In general, contracts must be first approved by innovaphone, so you see three types of contracts:&lt;br /&gt;
&lt;br /&gt;
* open contracts which must be approved by innovaphone first&lt;br /&gt;
* approved contracts which can be already used&lt;br /&gt;
* cancelled contracts which are not valid anymore&lt;br /&gt;
&lt;br /&gt;
[[Image:Myinnovaphone contracts.png|center|thumb|200px|myinnovaphone_contracts.png/|myinnovaphone_contracts.png/]]&lt;br /&gt;
&lt;br /&gt;
These type of contracts currently exist:&lt;br /&gt;
==== innovaphone myApps Cloud Service ====&lt;br /&gt;
Conclude this contract to use the innovaphone myApps Cloud.&lt;br /&gt;
&lt;br /&gt;
==== innovaphone software rental ====&lt;br /&gt;
Conclude this contract to rent innovaphone software products. You must conclude this contract if you want to use the software rental inside the Devices App.&lt;br /&gt;
&lt;br /&gt;
=== Authorized persons ===&lt;br /&gt;
Here you see all persons which exist inside your company. Each person can have the following rights:&lt;br /&gt;
* Administrator (everything)&lt;br /&gt;
* Contracts (can conclude contracts)&lt;br /&gt;
* Licenses (can work with licenses)&lt;br /&gt;
* Viewer (can just see everything without doing something)&lt;br /&gt;
* Locked (cannot even login to this company anymore)&lt;br /&gt;
&lt;br /&gt;
=== Licenses ===&lt;br /&gt;
Here comes the old my.innovaphone view which allows the handling of devices, licenses, activation keys etc.&lt;br /&gt;
&lt;br /&gt;
==Search (inside licenses tab)==&lt;br /&gt;
At the right top of the licenses tab you have a search field. You can search for different things:&lt;br /&gt;
* Devices (part of a device name or device comment)&lt;br /&gt;
* Projects (part of a project name or project description)&lt;br /&gt;
* Own activation keys (part of an activation key or its description)&lt;br /&gt;
* Hardware rental orders (part of the innovaphone order number or your own order reference or a MAC address of an order)&lt;br /&gt;
&lt;br /&gt;
  You have to enter at least &#039;&#039;&#039;three&#039;&#039;&#039; chars to start a search. To search for activation keys, &lt;br /&gt;
  you have to enter at least &#039;&#039;&#039;five&#039;&#039;&#039; chars.&lt;br /&gt;
* Search for license types. Enter e.g. &amp;quot;PBX-Port8&amp;quot; to find all devices with Port8 licenses or enter &amp;quot;PBX-Port8=100&amp;quot; to find all devices with Port8 licenses &#039;&#039;&#039;&amp;gt;=&#039;&#039;&#039; 100.&lt;br /&gt;
* Search for products, e.g. 01-00811 für IP811 (such a search may take longer!)&lt;br /&gt;
&lt;br /&gt;
==Licenses tab==&lt;br /&gt;
===Projects===&lt;br /&gt;
After creation of an own company, you will have a default project named &amp;quot;DEFAULT&amp;quot;. You can rename this project later.&lt;br /&gt;
You can also create more projects on the projects page with &amp;quot;Create&amp;quot;.&lt;br /&gt;
Each project of a company must have a unique name.&lt;br /&gt;
&lt;br /&gt;
  Do &#039;&#039;&#039;not&#039;&#039;&#039; set SSA, if you want to import your devices from your old license manager account first.&lt;br /&gt;
  If you want SSA and you &#039;&#039;&#039;won&#039;t import&#039;&#039;&#039; devices into this project from your old account, you should set SSA at once.&lt;br /&gt;
&lt;br /&gt;
You can select a certain project by activating it in the project list. This selection is then true for all other pages, as some pages require a selected project.&lt;br /&gt;
&lt;br /&gt;
[[Image:overview.jpg|center|thumb|200px|overview.jpg/|overview.jpg/]]&lt;br /&gt;
&lt;br /&gt;
By activating a project by clicking on the project name in the project list, you can manage this project and its settings.&lt;br /&gt;
&lt;br /&gt;
==== Rental project ====&lt;br /&gt;
You can also manually create a rental project. A rental project is normally created automatically by uploading an activation key inside the Devices App.&amp;lt;br/&amp;gt;&lt;br /&gt;
But if you want to start directly with an Automatic iSC reloading service, you&#039;ll need to create the project manually.&amp;lt;br/&amp;gt;&lt;br /&gt;
Take care that the name &#039;&#039;&#039;equals&#039;&#039;&#039; the domain name in your Devices App.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If the rental tab in your Devices App domain doesn&#039;t show the expected balance/Automatic iSC reloading contract/licenses etc., you may use the Devices App Guid Link mechanism to link the domain to this specific project (see below) (use Devices App &#039;&#039;&#039;13r3 SR12&#039;&#039;&#039; or higher!).&lt;br /&gt;
&lt;br /&gt;
====Properties====&lt;br /&gt;
Rename the project or/and change its description.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure further CC mail addresses inside your &#039;&#039;&#039;License Purchase&#039;&#039;&#039; project, if you have one. If you purchase licenses on credit, the emails will be also sent to theses addresses.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Since version 10, an innovaphone device will automatically connect to http://config.innovaphone.com/init&lt;br /&gt;
This script looks at the project properties of the project, where the device exists.&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure an update &#039;&#039;&#039;URL&#039;&#039;&#039; and a &#039;&#039;&#039;trusted certificate&#039;&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
;Devices App GUID link: This is a GUID which can be entered in the settings of a domain inside the Devices App to link the domain to this specific project, if the names do not match and/or the Devices App has been setup from scratch. The Devices App must use the customer to which this projects belongs to be able to use this GUID.&lt;br /&gt;
&lt;br /&gt;
====Software Service====&lt;br /&gt;
You can put your project under SSA (software service agreement). &lt;br /&gt;
You will be asked to enter a SSA end date. This will be the date, where all SSA licenses of all devices in this project will expire.&lt;br /&gt;
The end date mustn&#039;t be more than one year in the past.&amp;lt;br&amp;gt;&lt;br /&gt;
Optionally you can enter a maximum SSC amount. The SSA end date will be automatically calculated then.&amp;lt;br&amp;gt;&lt;br /&gt;
  If you have entered a maximum SSC amount, you have to use the &#039;&#039;&#039;Recalculate&#039;&#039;&#039; link to calculate a new SSA end date, &lt;br /&gt;
  if you change your license selection.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can also calculate SSA over all projects at once. In this mode, you &#039;&#039;&#039;won&#039;t be able&#039;&#039;&#039; to confirm the calculation. You&#039;ll just see the necessary SSC amount.&lt;br /&gt;
&lt;br /&gt;
After entering a date/SSC amount, you will get a summary of all licenses, which will be put under SSA and the amount of needed SSC licenses.&lt;br /&gt;
The SSC value for each license is calculated by the bind date of the license and the entered SSA end date/SSC amount.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ssa_extend.jpg|center|thumb|200px|ssa_extend.jpg/|ssa_extend.jpg/]]&lt;br /&gt;
&lt;br /&gt;
If you have licenses for an older version than the current version, you have to pay SSCs from the [[#Release dates|release date]] of the next version of the current license version.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  e.g. you have a V7 PBX-PBX7#15 license with bind date 1/1/2010. Version 8 was released on 7/12/2009, so SSA is&lt;br /&gt;
  calculated from 7/12/2009 for this license. You will see the calculation date in the list under &amp;quot;bind date&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If licenses already have a SSA date, just the difference between the current SSA date and the entered SSA end date must be paid.&lt;br /&gt;
If the bind date of the device lies in the past, the difference between the bind date and the current date must be paided twice (this is the column &#039;days*2&#039;).&amp;lt;br&amp;gt;&lt;br /&gt;
If your license is under SSA, which is already over, you also have to pay the time between the old SSA date and the current SSA end date twice.&lt;br /&gt;
&lt;br /&gt;
Here is a short example, how the days are calculated:&lt;br /&gt;
&lt;br /&gt;
Bind date: 24/06/2009&amp;lt;br&amp;gt;&lt;br /&gt;
Current date: 31/08/2009&amp;lt;br&amp;gt;&lt;br /&gt;
SSA end date: 12/12/2011&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You will have to pay from 24/06/2009 to 31/08/2009 twice for 68 days.&lt;br /&gt;
From 31/08/2009 to 12/12/2011 you will then have to pay the normal price for 833 days.&lt;br /&gt;
&lt;br /&gt;
You can also select for each license, if you want SSA for it or not. If not, no SSC is needed and no (new) SSA end date is set for this license.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  You can preview the SSC calculation for another calculation date. Simply change the dropdown&lt;br /&gt;
  selection to get the new SSC value.&lt;br /&gt;
  Of course you can&#039;t confirm this calculation for another date, just for the current date!&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;You may add additional licenses to the calculation, which you will bind later&#039;&#039;. Just click on the &#039;&#039;&#039;+&#039;&#039;&#039; near this text and you can add&lt;br /&gt;
  multiple licenses, which will be added to your calculation after using the recalc link. Listed are licenses of the current version and from&lt;br /&gt;
  your balance.&lt;br /&gt;
&lt;br /&gt;
After confirming your entered SSA end date, each license will have this date as SSA end date and can be downloaded in all versions of this SSA time.&lt;br /&gt;
&lt;br /&gt;
You can now extend the projects SSA end date like as setting a new one.&lt;br /&gt;
The resulting summary is the same as above.&lt;br /&gt;
&lt;br /&gt;
If your user account has the right to buy licenses on credit, just check the checkbox.&lt;br /&gt;
You may enter an order number, which you can use for your order, if you buy on credit.&lt;br /&gt;
&lt;br /&gt;
=====Past SSA end date=====&lt;br /&gt;
&lt;br /&gt;
You can configure a new SSA end date in the past, if you accidentally configured a wrong date.&amp;lt;br&amp;gt;&lt;br /&gt;
No licenses will be changed, if you configure a date in the past, just the SSA end date of the project!&lt;br /&gt;
&lt;br /&gt;
=====SSA Expiry Mail=====&lt;br /&gt;
&lt;br /&gt;
  If project SSA will expire, each company user will receive a reminder mail &#039;&#039;&#039;7&#039;&#039;&#039; weeks before and &lt;br /&gt;
  then every week one mail.&lt;br /&gt;
  You can disable these mails with the checkbox &#039;Send SSA expiry mails&#039;.&lt;br /&gt;
  Note that every user can configure, if he wants to receive mails or not in his account settings.&lt;br /&gt;
&lt;br /&gt;
If you want the end user of the project to receive an expiry mail, you can configure a &#039;&#039;&#039;reseller&#039;&#039;&#039; mail address and end user mail addresses. These end users will then receive an email, 30 days before the project will expire. The default text is:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 Your Software Service Agreement for your innovaphone PBX in project &amp;quot;{$arg[3]}&amp;quot; will expire in {$arg[1]} days. &lt;br /&gt;
 Please contact your reseller {$arg[2]} to upgrade the license.&amp;lt;br&amp;gt;&lt;br /&gt;
 The upgrade of the license is important to secure the phone system!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can change this text as you want. You can use placeholders:&lt;br /&gt;
* &#039;&#039;&#039;{$arg[1]}&#039;&#039;&#039;: days left &lt;br /&gt;
* &#039;&#039;&#039;{$arg[2]}&#039;&#039;&#039;: reseller mail address&lt;br /&gt;
* &#039;&#039;&#039;{$arg[3]}&#039;&#039;&#039;: project name&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can also define a global text for all projects under your [[#Company| Company settings]].&lt;br /&gt;
&lt;br /&gt;
  You can optionally configure to receive project SSA independent reminder mails for each license of a device [[#Company 2|here]].&lt;br /&gt;
&lt;br /&gt;
=====Automatic SSA Extension Service=====&lt;br /&gt;
&lt;br /&gt;
You can request an automatic SSA extension service for a project, which is under SSA. By following this link, you will have the opportunity to request a callback and/or the necessary agreement as PDF file.&lt;br /&gt;
&lt;br /&gt;
 All licenses have to be under SSA to use the automatic SSA extension service!&lt;br /&gt;
&lt;br /&gt;
There are some basics to know, if a project is under automatic SSA:&lt;br /&gt;
* If you bind new/free licenses, they&#039;ll get SSA until the current project SSA date and you will receive an invoice for the SSCs&lt;br /&gt;
* If you move devices into this project, their licenses will get SSA until the current project SSA date and you will receive an invoice for the SSCs&lt;br /&gt;
* You can&#039;t join this project into another project, but you can join another project into this one&lt;br /&gt;
&lt;br /&gt;
====Rights====&lt;br /&gt;
=====Own project=====&lt;br /&gt;
Add or delete company rights for this project. To add a company right, you have to enter the company id of this company.&lt;br /&gt;
Each user of a company with rights on this project can add devices, licenses, activation keys to this specific project, but is restricted in removing devices, editing the project and can&#039;t create activation keys with the projects balance.&lt;br /&gt;
&lt;br /&gt;
  The company id can be found under Licenses-&amp;gt;company and the company tab.&lt;br /&gt;
&lt;br /&gt;
[[Image:Project_rights.jpg|center|thumb|200px|project_rights.jpg/|project_rights.jpg/]]&lt;br /&gt;
&lt;br /&gt;
=====External Project=====&lt;br /&gt;
If another company granted access rights to a project to you, you can unsubscribe from this project here.&lt;br /&gt;
&lt;br /&gt;
====Import====&lt;br /&gt;
The import has been disabled. All old devices are already imported and can be added to your project manually.&lt;br /&gt;
&lt;br /&gt;
====Join====&lt;br /&gt;
Here you can join your currently selected project with another project, which you select from a dropdown box.&amp;lt;br&amp;gt;&lt;br /&gt;
If the other project has SSA, you&#039;ll see the current SSA end date, which you might change for the join process and you will get a list of all licenses, which might be updated to the ssa end date/changed date of the other project. The list equals the list shown under [[#Software Service|Software Service]].&lt;br /&gt;
&lt;br /&gt;
  The selected project will be automatically deleted after the join. You can&#039;t join a project,&lt;br /&gt;
  if it grants external rights to another customer. Delete these rights before.&lt;br /&gt;
&lt;br /&gt;
 You can&#039;t change the SSA end date, if the other project is under automatic SSA! You will receive an invoice for SSCs used for the join.&lt;br /&gt;
&lt;br /&gt;
====Project Move (admin only)====&lt;br /&gt;
A company admin can move a project with its devices, activation keys, balance etc. to another company. You have to know the company ID from this company, which can be found under Licenses-&amp;gt;Company and the company tab.&amp;lt;br&amp;gt;&lt;br /&gt;
The history won&#039;t be moved!&lt;br /&gt;
&lt;br /&gt;
 Projects with negative balances can&#039;t be moved!&lt;br /&gt;
&lt;br /&gt;
 Existing project rights will be deleted.&lt;br /&gt;
&lt;br /&gt;
====Delete====&lt;br /&gt;
Delete the project. Only possible if it has no activation keys, project rights, devices or user rights.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You may [[#Join|join]] your project into another one, if you can&#039;t delete it.&lt;br /&gt;
&lt;br /&gt;
====Project Freed_RMA_licenses====&lt;br /&gt;
If you see a project with this name in your project list, you had a RMA device with not yed moved licenses, which was shipped to innovaphone and reshipped to another customer.&amp;lt;br&amp;gt;&lt;br /&gt;
The licenses of such a device have been moved into the pool of free licenses of the project Freed_RMA_licenses, from where you can assign them to another device.&lt;br /&gt;
&lt;br /&gt;
====Rental====&lt;br /&gt;
Projects starting and ending with the &#039;&#039;&#039;$&#039;&#039;&#039; sign in their name are rental projects.&amp;lt;br&amp;gt;&lt;br /&gt;
The name corresponds to the domain name of a Devices App installation.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
All software licensing and device management can be just done through the Devices App itself, see [[Reference13r1:Concept_App_Service_Devices#Rental_program_and_Payment_method]].&amp;lt;br&amp;gt;&lt;br /&gt;
Just &#039;&#039;&#039;hardware licenses&#039;&#039;&#039; still need to be bound inside my.innovaphone currently and have to be downloaded there and uploaded on the device itself just as usual.&lt;br /&gt;
&lt;br /&gt;
===Balance===&lt;br /&gt;
On the balance page you will see the balance of the currently selected project or the balance of all your projects together.&lt;br /&gt;
The balance is bound to your company and &#039;&#039;&#039;not&#039;&#039;&#039; to your user account. The balance is bound to a specific project, but can be shared for license creation or activation key creation if wished.&amp;lt;br&amp;gt;&lt;br /&gt;
Sharing the balance over several projects is not possible in external projects!&lt;br /&gt;
&lt;br /&gt;
[[Image:Balancepage.jpg|center|thumb|200px|balancepage.jpg/|balancepage.jpg/]]&lt;br /&gt;
&lt;br /&gt;
====Free licenses====&lt;br /&gt;
&lt;br /&gt;
Here you see a list of all your free licenses. If you return licenses from one of your devices, the returned licenses are stored in your free licenses pool. You can assign these licenses to another device (see [[#Add licenses from free licenses|&#039;Add licenses from free licenses&#039;]]).&lt;br /&gt;
&lt;br /&gt;
[[Image:Balance_free_lics.jpg|center|thumb|200px|balance_free_lics.jpg/|balance_free_lics.jpg/]]&lt;br /&gt;
&lt;br /&gt;
The bind date, SSA end date and the external key (like DECT-Multi-Cell-Ari) are stored for each license.&lt;br /&gt;
&lt;br /&gt;
===Activations===&lt;br /&gt;
&lt;br /&gt;
You&#039;ll see a list of all your bound activation keys with their licenses here.&lt;br /&gt;
&lt;br /&gt;
[[Image:Activations.jpg|center|thumb|200px|activations.jpg/|activations.jpg/]]&lt;br /&gt;
&lt;br /&gt;
====Add an activation key====&lt;br /&gt;
To increase your projects balance, select one of your projects, follow the &amp;quot;Add&amp;quot; link and enter the activation key in the corresponding field. You can also enter an optional comment for this key. You will then get a listing of all contained licenses. After commiting this key, your project balance will have been increased by the keys values.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Deselect the current project&amp;quot; to view all activation keys independent of the selected project.&lt;br /&gt;
&lt;br /&gt;
====Search for an activation key by your order number====&lt;br /&gt;
Enter your own order number (or nothing), to view your activation keys for this order.&lt;br /&gt;
&lt;br /&gt;
====License certificate====&lt;br /&gt;
You can always download the innovaphone license certificate for activation keys in your projects. Simply press the download link in the list at the right side.&lt;br /&gt;
&lt;br /&gt;
===Own Activations===&lt;br /&gt;
Here you&#039;ll see a list of all created activation keys in the selected project (or over all projects).&lt;br /&gt;
&lt;br /&gt;
You can create activation keys on the project page for other users/companies or to simply transfer licenses from one project to another.&amp;lt;br&amp;gt;&lt;br /&gt;
You can enter a comment, an order number and an order reference. The &#039;&#039;&#039;order number&#039;&#039;&#039; is your own order number for the key and the &#039;&#039;&#039;order reference&#039;&#039;&#039; is the reference number of the customer, who receives the newly created key.&amp;lt;br&amp;gt;&lt;br /&gt;
The order reference and order number will be shown in the innovaphone license certificate.&lt;br /&gt;
&lt;br /&gt;
[[Image:Created_activations.jpg|center|thumb|200px|created_activations.jpg/|created_activations.jpg/]]&lt;br /&gt;
&lt;br /&gt;
You have to select an activation key in the activation key list to update or delete it.&lt;br /&gt;
&lt;br /&gt;
  Updating and deleting a key is only possible, if this key is not assigned.&lt;br /&gt;
&lt;br /&gt;
====Update====&lt;br /&gt;
Add more licenses to this key or change its comment, order number and order reference.&amp;lt;br&amp;gt;&lt;br /&gt;
You can also remove licenses by entering e.g. -2, if you want to remove 2 licenses from the key.&lt;br /&gt;
&lt;br /&gt;
[[Image:Own activations update.jpg|center|thumb|200px|own_activations_update.jpg/|own_activations_update.jpg/]]&lt;br /&gt;
&lt;br /&gt;
====Delete====&lt;br /&gt;
Delete this key. Its licenses will go back into the balance of the currently selected project.&lt;br /&gt;
&lt;br /&gt;
===Devices===&lt;br /&gt;
To view your devices you first have to click on the &amp;quot;Show&amp;quot; button. You can leave the filter field empty if you want to view all your devices.&lt;br /&gt;
&lt;br /&gt;
[[Image:Devices_page.jpg|center|thumb|200px|devices_page.jpg/|devices_page.jpg/]]&lt;br /&gt;
&lt;br /&gt;
Red marked device names are devices, which are currently in RMA.&lt;br /&gt;
&lt;br /&gt;
  MAC addresses of RMA devices do not longer start with 01-...&lt;br /&gt;
&lt;br /&gt;
====List====&lt;br /&gt;
A List of your devices in the currently selected project.&amp;lt;br&amp;gt;&lt;br /&gt;
You can deselect the current project/device to list all your devices.&lt;br /&gt;
&lt;br /&gt;
Select a certain device from the device list, to manage its properties, licenses etc.&lt;br /&gt;
&lt;br /&gt;
  Actions on multiple devices:&lt;br /&gt;
  * Move: move several devices into another project at once (see [[#Move device|Move Device]])&lt;br /&gt;
  * Remove: remove several devices at once (see [[#Remove|Remove]])&lt;br /&gt;
&lt;br /&gt;
=====Add=====&lt;br /&gt;
Follow the &amp;quot;Add new devices&amp;quot; link on the devices page.&lt;br /&gt;
&lt;br /&gt;
There you have a few options:&lt;br /&gt;
* You can add a single new device&lt;br /&gt;
* You can add devices according to a mac address range (e.g. from 00-90-33-08-20-00 to 00-90-33-08-22-00), maximum 50 at once&lt;br /&gt;
* You can add devices by uploading a text file with mac addresses like this (maximum 50 at once, each line one mac):&lt;br /&gt;
&lt;br /&gt;
  00-90-33-08-20-20&lt;br /&gt;
  00-90-33-08-20-21&lt;br /&gt;
  00-90-33-08-20-22&lt;br /&gt;
  00-90-33-24-20-20&lt;br /&gt;
&lt;br /&gt;
* You can add devices according to your received order number. Just enter you order number and you will get a list of all devices bount to this number.&lt;br /&gt;
&lt;br /&gt;
Note: MAC addresses can be always given like this:&lt;br /&gt;
* 00-90-33-xx-xx-xx&lt;br /&gt;
* 00:90:33:xx:xx:xx&lt;br /&gt;
* 009033xxxxxx&lt;br /&gt;
* xxxxxx (00-90-33- will then be added automatically)&lt;br /&gt;
&lt;br /&gt;
There might be errors, if you try to add a device. They are explained [[#Image explanation|here]].&lt;br /&gt;
&lt;br /&gt;
  As the device warranty will be handled by licenses now, you can also add telephone devices&lt;br /&gt;
  to your projects.&lt;br /&gt;
&lt;br /&gt;
=====Add warranty extensions=====&lt;br /&gt;
&lt;br /&gt;
Here you can add warranty extension licenses for all devices in the currently selected project.&amp;lt;br&amp;gt;&lt;br /&gt;
You&#039;ll get a list of all devices with the corresponding license type(s) and you can specify the years for each device (or for all devices by entering the number in the list header).&amp;lt;br&amp;gt;&lt;br /&gt;
After confirming your selection, you&#039;ll get an overview of all needed licenses, which you have to confirm too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Check licence, SSA and warranty status of a device=====&lt;br /&gt;
Here you can list licenses with ssa and the warranty end date of a device, which is not in one of your projects.&amp;lt;br&amp;gt;&lt;br /&gt;
For this option to work, you have to link your innovaphone customer ID (5 digits) to your my.innovaphone company. (As the warranty is also the one we grant to our distributors, we don&#039;t want to get an end customer confused.)&lt;br /&gt;
&lt;br /&gt;
=====Download devices of an order as CSV=====&lt;br /&gt;
Enter an order number to retrieve all devices for this order in a CSV file.&lt;br /&gt;
&lt;br /&gt;
=====Download devices of an order as PDF with barcodes=====&lt;br /&gt;
Enter an order number to retrieve all devices for this order in a PDF file with a barcode for each MAC address.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Barcode ist vom Typ C128B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Properties====&lt;br /&gt;
&lt;br /&gt;
Change the name and comment of a device.&lt;br /&gt;
  You can only change the name, if it&#039;s no MAC or IPEI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Here you have also the possibility, to directly request RMA for this device with prefilled values.&lt;br /&gt;
&lt;br /&gt;
====Licenses====&lt;br /&gt;
Here you can add, download or move licenses.&lt;br /&gt;
&lt;br /&gt;
=====Add licenses from balance=====&lt;br /&gt;
To create new licenses for a device, you have to add this device first on the devices page and then select a version of the license &lt;br /&gt;
and whether you want to summate the current licencing. If you select current licenses, then older licenses for example V6 or V7 licenses will also be counted as V8 licenses in the next overview. This is necessary if you want to license a V6 unit with V8 licenses, but still want to use it as V6.&lt;br /&gt;
After that click &amp;quot;Next&amp;quot;.&lt;br /&gt;
On the next page you will see a list of all available license types, which depends on your current available license types, of the selected license version and the device type (IP6000, IP800 e.g.):&lt;br /&gt;
[[Image:licenses.jpg|center|thumb|200px|licenses.jpg/|licenses.jpg/]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If your project has a SSA end date, which is not yet over, you&#039;ll have the possibility to set SSA for the new licenses to this SSA end date or you can optionally change this date to another one for the new licenses.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You see the available project balance, the balance over all projects (excluding external projects), the currently installed licenses and the maximum amount for this device type. You can now enter the value of the new license.&lt;br /&gt;
Base/Upgrade licenses can be selected via dropdown box. &lt;br /&gt;
&#039;&#039;&#039;Voicemail and Standby lics must always have the same amount as the selected PBX-PBX... license!&lt;br /&gt;
The maximum amount of PBX-Registration licenses equals the amount of the selected PBX-PBX... license!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The whished overall amount of pbx version 8 and above licenses can be specified here and the concrete amount of license sub types will be requested on the next page.&lt;br /&gt;
&lt;br /&gt;
 You can preview the SSC calculation of the wished licenses without having them in your balance.&lt;br /&gt;
&lt;br /&gt;
[[Image:licenses2.jpg|center|thumb|200px|licenses2.jpg/|licenses2.jpg/]]&lt;br /&gt;
&lt;br /&gt;
The best (cheapest) combination of each v8 pbx license type is already filled in, but you might change the amount of sub types if your does not fit and you do not want to purchase new activation keys for the sub types.&lt;br /&gt;
&lt;br /&gt;
The column SSC/Unit is just shown if your project is currently under SSA and you have entered a SSA end date.&lt;br /&gt;
&lt;br /&gt;
  The SSC multiplicator is the value, which you have to multiplicate with each license unit to get &lt;br /&gt;
  the corresponding SSC amount.&lt;br /&gt;
  E.g. if you have 20 units of PBX-Port8*20 licenses with a SSC value of 54 and a multiplicator of &lt;br /&gt;
  1.0000 (which equals to 365 days) you have to pay 20*54*1.0000 ~ 1080 SSCs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;If you create licenses for an older version than the current version, you have to pay SSCs from the [[#Release dates|release date]] of the next version of the currently selected version twice.&amp;lt;br&amp;gt;&lt;br /&gt;
  e.g.: you want to bind licenses for V6 with SSA, so you have to pay SSCs from the release date of V7&lt;br /&gt;
&amp;lt;br&amp;gt;You can also select for each license, if you want SSA for it or not. If not, no SSC is needed and no (new) SSA end date is set for this license.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 You can&#039;t change the SSA end date, if the project is under automatic SSA! You will receive an invoice for SSCs used for the new binding.&lt;br /&gt;
&lt;br /&gt;
Now confirm your new selection. If you have not enough licenses in your current project, but there are still licenses in other projects, you will get a dropdown box with a list of all projects containing the needed licenses. You can now select all desired/needed projects and confirm your selection again.&lt;br /&gt;
The balance of all selected projects will then be decreased by the needed amount.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If your user account has the right to buy licenses on credit, just check the checkbox.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You may enter an order number, which you can use for your order, if you buy on credit.&lt;br /&gt;
&lt;br /&gt;
=====Add licenses from free licenses=====&lt;br /&gt;
&lt;br /&gt;
Here you can assign licenses, which you returned from other devices.&lt;br /&gt;
You will also have to select the desired version and will than get a list of fitting licenses according to the current device and selected version.&lt;br /&gt;
&lt;br /&gt;
[[Image:licenses_free.jpg|center|thumb|200px|licenses_free.jpg/|licenses_free.jpg/]]&lt;br /&gt;
&lt;br /&gt;
If a license is under SSA, the correct license type is shown in column &#039;License Type&#039; besides the &#039;Original Type&#039;.&lt;br /&gt;
On confirming the selection, a consistency check is done (e.g. only 4 Relay-PRI licenses on an IP6000).&lt;br /&gt;
Bind and SSA end date will be maintained for each license.&lt;br /&gt;
&lt;br /&gt;
As external keys are also maintained, you can select e.g. an old Dect-Multicell-Ari license to have the same ARI on another IP1200.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  If your project has a SSA end date, which is not yet over, you&#039;ll have the possibility to set SSA for the new licenses &lt;br /&gt;
  to this SSA end date or you can optionally change this date to another one for the new licenses.&lt;br /&gt;
  You will have to confirm this after your first license selection (this is the same calculation as [[#Software Service|here]]).&lt;br /&gt;
&lt;br /&gt;
  You can&#039;t change the SSA end date, if the project is under automatic SSA! You will receive an invoice for SSCs used for the binding.&lt;br /&gt;
&lt;br /&gt;
=====Add V7 floating license (slave pbx)=====&lt;br /&gt;
Here you can add a V7 floating license for a slave pbx. A device with a floating license can&#039;t have V7 pbx licenses and a device with V7 pbx licenses can&#039;t have a floating license.&lt;br /&gt;
&lt;br /&gt;
=====Delete V7 floating license=====&lt;br /&gt;
Here you can delete an already existing floating license, if you won&#039;t use it anymore.&lt;br /&gt;
&lt;br /&gt;
=====Add warranty extension licenses=====&lt;br /&gt;
Extend your warranty by adding warranty extension licenses:&lt;br /&gt;
&lt;br /&gt;
[[Image:add_warranty.jpg|center|thumb|200px|add_warranty.jpg/|add_warranty.jpg/]]&lt;br /&gt;
&lt;br /&gt;
  If you add the warranty extension immediately after the receipt of your device,&lt;br /&gt;
  you can add the cheaper warranty extension licenses, otherwise you&#039;ll have to add&lt;br /&gt;
  the more expensive ones.&lt;br /&gt;
&lt;br /&gt;
  You can extend the warranty for a maximum of four years.&lt;br /&gt;
&lt;br /&gt;
=====Download licenses=====&lt;br /&gt;
&lt;br /&gt;
[[Image:Device_download.jpg|center|thumb|200px|device_download.jpg/|device_download.jpg/]]&lt;br /&gt;
&lt;br /&gt;
You will get a dropdown with all available versions. Versions are dependent of your device, your licenses and of the ssa of your licenses.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;From V9 on&#039;&#039;&#039;, you just have one option, which will create a license file, which contains the licenses upgraded to the highest version of their type.&amp;lt;br&amp;gt;&lt;br /&gt;
You are able to download downgraded versions of your licenses. E.g. if you have only V8 licenses, you can download a V7 license file (same restrictions as below).&lt;br /&gt;
&lt;br /&gt;
  Downgrades or only possible down to version 6!&lt;br /&gt;
&lt;br /&gt;
If you do not want to download licenses by version, you have to decide whether to download the licenses encrypted or not.&lt;br /&gt;
&#039;&#039;&#039;If you download the licenses unencrypted, you won&#039;t be able to return those licenses anymore.&#039;&#039;&#039;&lt;br /&gt;
So you won&#039;t be able to return licenses for devices with V5-V7 licenses, as licenses for these versions are not encrypted.&lt;br /&gt;
To return these licenses, you will have to upgrade to a new bootcode, which prevents firmware downgrades to versions below version 8.&amp;lt;br&amp;gt;&lt;br /&gt;
Encrypted licenses are stored in a xml file, which you can then upload on your V8 (or higher) device.&lt;br /&gt;
&lt;br /&gt;
  You can now also download licenses directly from by the web interface of a device. &lt;br /&gt;
  You just have to enter your account data and start downloading the licenses from my.innovaphone.com &lt;br /&gt;
  without having to download/upload a license file.&lt;br /&gt;
&lt;br /&gt;
=====Download test licenses=====&lt;br /&gt;
&lt;br /&gt;
[[Image:Device_download_test.jpg|center|thumb|200px|device_download_test.jpg/|device_download_test.jpg/]]&lt;br /&gt;
&lt;br /&gt;
You can also download test licenses if you want to run tests. You will be asked, which version you want to use, whether the device is used as slave and if not used as slave, how many pbx licenses you want to use.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: Since V11, trial licenses are valid for 3 months and can be released once for a dedicated device. After expiration of those 3 months no further trial license creation for this device is possible.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 V5 does &#039;&#039;&#039;not&#039;&#039;&#039; support test licenses!&lt;br /&gt;
&lt;br /&gt;
=====Download App development license=====&lt;br /&gt;
If you&#039;re an App developer, you have the possibility, to generate a real license for you Apps which will contain your manufacturer prefix.&amp;lt;br/&amp;gt;&lt;br /&gt;
The manufacturer prefix has to deposited at your my.innovaphone company by innovaphone before you can use this feature.&lt;br /&gt;
&lt;br /&gt;
 You can just have up to &#039;&#039;&#039;three&#039;&#039;&#039; different devices per company for which you can create such licenses!&lt;br /&gt;
 These licenses aren&#039;t allowed for production usage!&lt;br /&gt;
&lt;br /&gt;
You see your already used MAC addresses on this page too if you already created such licenses before.&lt;br /&gt;
&lt;br /&gt;
If your manufacturer prefix is &#039;&#039;&#039;innovaphone&#039;&#039;&#039;, you can enter license names like:&lt;br /&gt;
* App(innovaphone-app1)15&lt;br /&gt;
* Service(innovaphone-app2)15&lt;br /&gt;
&lt;br /&gt;
=====Move licenses to another device=====&lt;br /&gt;
If you have the needed account rights or the device is already in RMA, you can move licenses to another device. After moving licenses, the former device will be marked as a RMA device.&lt;br /&gt;
&lt;br /&gt;
  You can just move licenses to devices without licenses!&lt;br /&gt;
&lt;br /&gt;
=====Mix of rental and purchased licenses=====&lt;br /&gt;
From &#039;&#039;&#039;13r2 SR12&#039;&#039;&#039; onwards you can mix rental and purchased licenses.&amp;lt;br/&amp;gt;&lt;br /&gt;
A device with rental licenses will be always inside a rental project (you recognize such a project by it&#039;s starting and ending &#039;&#039;&#039;$&#039;&#039;&#039; in the name).&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now add licenses from the balance to a device in such a rental project.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If you invalidate lifetime licenses on such a device, just purchased licenses are returned. Rental licenses stay bound until you remove them inside your Devices App! (under rental menu)&lt;br /&gt;
Inside my.innovaphone you will always see both rental and purchased licenses. Inside the Devices App, you will just see the rental licenses.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You must download and/or install the purchased licenses as usual.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
A 13r1 PBX or a PBX with an older SR will just recognize rented licenses!&lt;br /&gt;
&lt;br /&gt;
 If your PBX is already inside a non rental project, it will be automatically added to a rental project if you add rental licenses. You then may have the device in two different projects (one rental, one normal), which is no issue.&lt;br /&gt;
&lt;br /&gt;
====Move device====&lt;br /&gt;
Here you can move the current device or the selected devices to another project.&amp;lt;br&amp;gt;&lt;br /&gt;
If you select a SSA project, you can change the SSA end date for the move process.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  If the other project is under SSA, you will first see a SSC calculation, which you have to confirm, &lt;br /&gt;
  as the SSA date for each SSA license will be extended until the given SSA end date &lt;br /&gt;
  (this is the same calculation as adding SSA to an already existing project, see [[#Software Service|here]]).&lt;br /&gt;
&lt;br /&gt;
  You can&#039;t change the SSA end date, if the other project is under automatic SSA! You will receive an invoice for SSCs used for the move.&lt;br /&gt;
&lt;br /&gt;
====Invalidation====&lt;br /&gt;
====Returning of licenses====&lt;br /&gt;
&lt;br /&gt;
By the invalidation, licenses are returned to the free balance of the project to which the device belongs in the Portal my.innovaphone.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can then bind the licenses from the free balance to another device.&lt;br /&gt;
&lt;br /&gt;
=====Requirements=====&lt;br /&gt;
* V8 or higher&lt;br /&gt;
* access to the webinterface&lt;br /&gt;
* a device certificate&lt;br /&gt;
* my.innovaphone login credentials&lt;br /&gt;
* &#039;&#039;&#039;no IPVA device&#039;&#039;&#039;&lt;br /&gt;
* no &#039;In House&#039; licenses&lt;br /&gt;
&lt;br /&gt;
=====Informations=====&lt;br /&gt;
&lt;br /&gt;
You can invalidate V8 (or higher) licenses by uploading the XML file, you got from your device or by returning your licenses over the web interface of your device ([[Reference8:Configuration/General/License]]), in order to return [[Reference8:Licenses#Gateway Licenses|PBX licenses]] back to the free balance.&lt;br /&gt;
&lt;br /&gt;
V7 licenses can be just returned, if you agree, that you won&#039;t be able to downgrade below V8 anymore. You will need a new bootcode, to use this function. &#039;&#039;&#039;You need a V8 firmware or higher for invalidation.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  If your device has access to my.innovaphone.com, you can also invalidate licenses directly&lt;br /&gt;
  from the web interface of the device.&lt;br /&gt;
&lt;br /&gt;
  [[Reference8:Licenses#Gateway Licenses|gateway licenses]] and warranty extensions won&#039;t be returned to the balance and remain to be assigned to the device!&lt;br /&gt;
&lt;br /&gt;
  The licenses needn&#039;t be present on the local device to perform the invalidation!&lt;br /&gt;
&lt;br /&gt;
  SSA it&#039;s bound to the license and it&#039;s not lost when performing invalidation.&lt;br /&gt;
&lt;br /&gt;
=====Process=====&lt;br /&gt;
&lt;br /&gt;
Steps to invalidate licenses, if your device has internet connectivity:&lt;br /&gt;
# on the web interface of the device go to General-&amp;gt;License and follow the my.innovaphone link&lt;br /&gt;
# enter your my.innovaphone account, the device must be in one of your projects&lt;br /&gt;
# click Invalidate&lt;br /&gt;
# click Transfer (this might fail, if NTP or DNS is not configured properly or device certificate is not installed)&lt;br /&gt;
# reset if asked for&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Steps to invalidate licenses, if your device has no internet connectivity:&lt;br /&gt;
# on the web interface of the device go to General-&amp;gt;License and follow the my.innovaphone link&lt;br /&gt;
# click Invalidate&lt;br /&gt;
# click Backup and upload this file on my.innovaphone [[#Upload the invalidation document to return licenses|here]] (Licenses-&amp;gt;Devices (select the corresponding device)-&amp;gt;Invalidation)&lt;br /&gt;
# you&#039;ll get a confirmation file after uploading the saved file&lt;br /&gt;
# upload this on the device (under Step1)&lt;br /&gt;
# reset if asked for&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;Your IP800 does not have a device certificate on it.&amp;quot; - In this case you need to download a hardware certification,&lt;br /&gt;
  please contact the innovaphone [mailto:license@innovaphone.com license].&lt;br /&gt;
&lt;br /&gt;
=====Download confirmation file=====&lt;br /&gt;
If you created a new certificate or you invalidated your licenses, you can later download the confirmation file, which you have to upload on the box.&lt;br /&gt;
&lt;br /&gt;
=====Request certificate=====&lt;br /&gt;
If you have the needed rights, you can request a new device certificate for your device.&lt;br /&gt;
&lt;br /&gt;
=====Upload the invalidation document to return licenses=====&lt;br /&gt;
Licenses-&amp;gt;Devices (select the corresponding device)-&amp;gt;Invalidation:&lt;br /&gt;
&lt;br /&gt;
Upload the invalidation document, which you got from the website of the device to return the licenses of this device.&lt;br /&gt;
&lt;br /&gt;
After uploading you&#039;ll get a confirmation file, which you have to upload on your device.&lt;br /&gt;
&lt;br /&gt;
====Remove====&lt;br /&gt;
You can always remove devices from a project. If they have licenses, these won&#039;t be deleted, so you might add the device to another project again.&lt;br /&gt;
&lt;br /&gt;
===History===&lt;br /&gt;
[[Image:history.jpg|center|thumb|200px|history.jpg/|history.jpg/]]&lt;br /&gt;
You can view your history for several contexts:&lt;br /&gt;
* Company: history of all actions in your company&lt;br /&gt;
* User: history of all actions of the selected user&lt;br /&gt;
* Device: history of all actions for the selected device&lt;br /&gt;
&lt;br /&gt;
Each context applies to the currently selected project.&lt;br /&gt;
If you deselect the current project, you will see the history over all projects.&lt;br /&gt;
&lt;br /&gt;
You can select to view the history of the last day, week, month, year or from always. Collecting data might take a while...&lt;br /&gt;
&lt;br /&gt;
===Company===&lt;br /&gt;
Manage users SSA expiry email flag, import other companies or add your companies innovaphone ID.&lt;br /&gt;
&lt;br /&gt;
====Users====&lt;br /&gt;
&lt;br /&gt;
You can just edit the SSA expiry email flag here. The other user settings moved to the [[#Authorized Persons| Authorized persons tab]].&lt;br /&gt;
&lt;br /&gt;
====Join (admin only)====&lt;br /&gt;
As admin you can also join another company into your company by entering an admin account of this company. This might be usefull if one user of your company has accidentally created an own company.&amp;lt;br&amp;gt;&lt;br /&gt;
Everything like projects, users, devices, balance, activations etc. will be imported!&amp;lt;br&amp;gt;&lt;br /&gt;
You also have to enter the company id of the company, which is to be imported. You can find this company under Licenses-&amp;gt;Company and the company tab.&lt;br /&gt;
&lt;br /&gt;
  This is not available for non company admin users.&lt;br /&gt;
&lt;br /&gt;
  The joined company will be deleted afterwards!&lt;br /&gt;
&lt;br /&gt;
====Company====&lt;br /&gt;
&lt;br /&gt;
You can check the &#039;&#039;&#039;Device SSA&#039;&#039;&#039; checkbox, if you want to receive SSA expiry reminder mails for each device independent of the projects SSA end date.&lt;br /&gt;
These mails will be send weekly seven weeks before the SSA for a license a the device expires.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can also enter additional email addresses, which should receive SSA emails.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can define a global &#039;&#039;&#039;end user expiry mail text&#039;&#039;&#039; here, which will be sent to end users, if end users are configured in a [[#SSA Expiry Mail| project]]. This text can be overridden by a text in a project under [[#SSA Expiry Mail| SSA Expiry Mail]].&lt;br /&gt;
&lt;br /&gt;
==RMA==&lt;br /&gt;
Here you can see all your RMA devices, which arrived innovaphone already. The licenses of this macadresses are moveable.&lt;br /&gt;
[[Image:rma.jpg|center|thumb|200px|rma.jpg/|rma.jpg/]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you want to request RMA for a certain device, go to the device properties and follow the &amp;quot;Request RMA&amp;quot; link.&lt;br /&gt;
&lt;br /&gt;
==Support==&lt;br /&gt;
===Mantis===&lt;br /&gt;
Here you&#039;ll get a list of all open cases and [[Understanding the innovaphone trouble ticket status page#Information available| additional info regarding their state]] in our ticket system. This list is composed of all tickets assigned to email addresses of your my.innovaphone users in your company.&amp;lt;br&amp;gt;&lt;br /&gt;
Often used functions:&lt;br /&gt;
* You can click on the ticket number (&amp;quot;ID&amp;quot; column) to open an email prepared with the right emailadress and subject to address this case.&lt;br /&gt;
* You can click on the &#039;&#039;History&#039;&#039; link to get an overview of the already made communication with our support/presales-team.&lt;br /&gt;
* Another important new function is the option to upload larger files to your support/presales tickets using the &#039;&#039;Fileupload&#039;&#039; column.&lt;br /&gt;
&lt;br /&gt;
===Announcements===&lt;br /&gt;
You can convert audio files into G.7xx files which you can use as announcements.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
;Supported input formats:&lt;br /&gt;
* mp3&lt;br /&gt;
* wav&lt;br /&gt;
* ogg&lt;br /&gt;
* flac&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
;Generated output formats:&lt;br /&gt;
* G.711u&lt;br /&gt;
* G.711a&lt;br /&gt;
* G.729&lt;br /&gt;
* G.723&lt;br /&gt;
* G.722&lt;br /&gt;
&lt;br /&gt;
==Image explanation==&lt;br /&gt;
&lt;br /&gt;
===Errors===&lt;br /&gt;
&lt;br /&gt;
====Already In Company====&lt;br /&gt;
[[Image:Icon_in_company_inno_01.png|icon_in_company_inno_01.png/|icon_in_company_inno_01.png/]]&lt;br /&gt;
* This device already exists in your company and can&#039;t be added/imported.&lt;br /&gt;
If you want to import this device anyway, you first have to delete your current device from its project.&lt;br /&gt;
&lt;br /&gt;
====Already Imported====&lt;br /&gt;
[[Image:Icon_imported_inno_01.png|icon_imported_inno_01.png/|icon_imported_inno_01.png/]]&lt;br /&gt;
* This device has been already imported. &lt;br /&gt;
You can&#039;t import it again.&lt;br /&gt;
&lt;br /&gt;
====Not Found====&lt;br /&gt;
[[Image:Icon_not_found_inno_01.png|icon_not_found_inno_01.png/|icon_not_found_inno_01.png/]]&lt;br /&gt;
* This device was not found in the my innovaphone database. &lt;br /&gt;
This should never happen, but if, contact the administrator.&lt;br /&gt;
&lt;br /&gt;
====IPVA MAC exists====&lt;br /&gt;
[[Image:Icon_ip_va_exists_inno_01.png|icon_ip_va_exists_inno_01.png/|icon_ip_va_exists_inno_01.png/]]&lt;br /&gt;
* An IPVA MAC address must be unique and can be assigned to just one company. You tried to add an already existing IPVA MAC.&lt;br /&gt;
Please assign a new one to your IPVA. For further details, see [[Reference13r2:Concept_Innovaphone_Virtual_Appliance#License_Configuration]].&lt;br /&gt;
&lt;br /&gt;
my.innovaphone supports the following MAC address ranges:&lt;br /&gt;
* 00-50-56-...&lt;br /&gt;
* 00-15-5d-...&lt;br /&gt;
* 00-03-ff-...&lt;br /&gt;
* 00-0d-3a-...&lt;br /&gt;
* 00-12-5a-...&lt;br /&gt;
* 00-17-fa-...&lt;br /&gt;
* 00-50-f2-...&lt;br /&gt;
* 00-1d-d8-...&lt;br /&gt;
* 00-05-69-...&lt;br /&gt;
* 00-1c-14-...&lt;br /&gt;
* 00-0c-29-...&lt;br /&gt;
* 00-1d-db-...&lt;br /&gt;
* 5a-ad-1d-...&lt;br /&gt;
* 48-e9-ca-...&lt;br /&gt;
* bc-24-...&lt;br /&gt;
* e2-... &#039;&#039;this is an autogenerated MAC address of innovaphone cloud containers&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Warnings===&lt;br /&gt;
&lt;br /&gt;
====Several Companies====&lt;br /&gt;
[[Image:Icon_several_companies_inno_01.png|icon_several_companies_inno_01.png/|icon_several_companies_inno_01.png/]]&lt;br /&gt;
* This device is already in another company.&lt;br /&gt;
This means, that either you do not have the physical device or it once belonged another company.&lt;br /&gt;
You can still import/add this device and you will have access to all of its current licenses.&lt;br /&gt;
&lt;br /&gt;
====Several Users====&lt;br /&gt;
[[Image:Icon several users inno 01.png|icon_several_users_inno_01.png/|icon_several_users_inno_01.png/]]&lt;br /&gt;
* This device has licenses from several users of the old license manager.&lt;br /&gt;
This means, that you are not neccessarily the user, who physically owns this device. If you do not own it, do not import it.&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
====No downgrade====&lt;br /&gt;
[[Image:no_downgrade.png|no_downgrade.png/|no_downgrade.png/]]&lt;br /&gt;
* Licenses, which have been downloaded for V5/V6/V7, were returned from this device, so no downgrade to these versions is allowed any more.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- myinno my innovaphone my_inno my_innovaphone my-innovaphone my-inno--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Release dates==&lt;br /&gt;
V5:  January 1st 2003&amp;lt;br&amp;gt;&lt;br /&gt;
V6:  November 2nd 2006&amp;lt;br&amp;gt;&lt;br /&gt;
V7:  November 14th 2008&amp;lt;br&amp;gt;&lt;br /&gt;
V8:  December 7th 2009&amp;lt;br&amp;gt;&lt;br /&gt;
V9:  April 26th 2011&amp;lt;br&amp;gt;&lt;br /&gt;
V10: July 8th 2013&amp;lt;br&amp;gt;&lt;br /&gt;
V11: February 9th 2015&amp;lt;br&amp;gt;&lt;br /&gt;
V12: July 11th 2016&amp;lt;br&amp;gt;&lt;br /&gt;
V13: May 13th 2019&amp;lt;br&amp;gt;&lt;br /&gt;
V14: December 20th 2023&lt;br /&gt;
&lt;br /&gt;
V15: March 25th 2025&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==myplay==&lt;br /&gt;
[[https://myplay.innovaphone.com myplay]] offers a platform to test all my.innovaphone related content. You can create activation keys, licenses, accounts, projects and so on to learn it or to calculate possible scenarios.&lt;br /&gt;
&lt;br /&gt;
===Base===&lt;br /&gt;
The base of the database is the my.innovaphone database from the 13.8.2010. All accounts, companies and projects have been imported and are available until this date.&amp;lt;br&amp;gt;&lt;br /&gt;
From this date on the databases won&#039;t be synchronised any more (despite of the device table)!&lt;br /&gt;
&lt;br /&gt;
===Balance===&lt;br /&gt;
You can change your balance by yourself. Simply select the license type in the dropdown box on the balance page, enter the desired amount and your balance will be increased by this type.&lt;br /&gt;
&lt;br /&gt;
===Activation keys===&lt;br /&gt;
You can create own activation keys. These will have the prefix &amp;quot;PLAY-&amp;quot; to identify them as play activation keys. You won&#039;t be able to upload them on my.innovaphone.com.&lt;br /&gt;
&lt;br /&gt;
===Licenses===&lt;br /&gt;
After having selected a device under Licenses-&amp;gt;Devices, you can add/change licenses as you want by selecting new ones in the dropdown box or changing existing ones.&lt;br /&gt;
&lt;br /&gt;
====Download====&lt;br /&gt;
You will always just download test licenses here!&lt;br /&gt;
&lt;br /&gt;
====Invalidation====&lt;br /&gt;
Won&#039;t be possible here, because this is hardware related and can&#039;t be simulated.&lt;br /&gt;
&lt;br /&gt;
====Checkbox editing via list====&lt;br /&gt;
* &#039;D&#039; Deletes the license&lt;br /&gt;
* &#039;B&#039; Puts the license back into the projects balance&lt;br /&gt;
* &#039;F&#039; Puts the license into the pool of free licenses&lt;br /&gt;
&lt;br /&gt;
===Device RMA===&lt;br /&gt;
You can put a device under RMA to test this scenario (Licenses-&amp;gt;Devices, select a device and -&amp;gt;Properties). You can also remove the RMA status here.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External interface==&lt;br /&gt;
&lt;br /&gt;
There is an external interface, which you can use to control some functionality without a login to the my.innovaphone web site.&amp;lt;br&amp;gt;&lt;br /&gt;
You can use the interface with an &#039;&#039;&#039;HTTP GET&#039;&#039;&#039; request to the following URL:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;https://my.innovaphone.com/interface.php&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Configure a trust value and a URL (can be a dummy URL if not used otherwise) unter Licenses -&amp;gt; Project -&amp;gt; Properties and tick &amp;quot;Configure Update-URL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===General parameters for all commands===&lt;br /&gt;
:;cmd: the wished command&lt;br /&gt;
:;email: the email address of a user who is registered in my.innovaphone&lt;br /&gt;
:;project_id: the project ID of the project where the user has access to (you can find the project ID under [[#Properties| Licenses-&amp;gt;Projects-&amp;gt;Properties]])&lt;br /&gt;
:;hash: an SHA256 hash value which is computed over all GET parameters but the hash parameter itself plus the &#039;&#039;&#039;trust&#039;&#039;&#039; value of the project (see [[#Properties|Reference:My_Innovaphone#Properties]])&lt;br /&gt;
:;hash: the values of the GET parameters have to be URL encoded before calculation of the hash&lt;br /&gt;
&lt;br /&gt;
;Example: URL &amp;lt;code&amp;gt;https://my.innovaphone.com/interface.php?cmd=addDevice&amp;amp;email=user@example.com&amp;amp;project_id=123456&amp;amp;serial=00-90-33-01-02-03&amp;amp;hash=b62f7948d6383cc365592ed289b6173cd35229cadc347847b953f78c8880d5b9&amp;lt;/code&amp;gt;&lt;br /&gt;
:;project trust value: 1234567890abcdef&lt;br /&gt;
:;the data of the SHA256 hash: ?cmd=addDevice&amp;amp;email=user%40example.com&amp;amp;project_id=123456&amp;amp;serial=00-90-33-01-02-03&amp;amp;trust=1234567890abcdef&lt;br /&gt;
:;example PHP function call to generate the hash: hash(&amp;quot;sha256&amp;quot;, &amp;quot;?cmd=addDevice&amp;amp;email=user%40example.com&amp;amp;project_id=123456&amp;amp;serial=00-90-33-01-02-03&amp;amp;trust=1234567890abcdef&amp;quot;);&lt;br /&gt;
:;with the current values, the function should return: b62f7948d6383cc365592ed289b6173cd35229cadc347847b953f78c8880d5b9&lt;br /&gt;
&lt;br /&gt;
===Add a device to a project===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters&lt;br /&gt;
:;cmd: &#039;&#039;&#039;addDevice&#039;&#039;&#039;&lt;br /&gt;
:;serial: the serial number of the device, e.g. 00-90-33-01-02-03&lt;br /&gt;
:;[device_desc]: optional, a description for the new device&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;example success: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:true }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:;example error: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:false, &amp;quot;error&amp;quot;:&amp;quot;the project with ID 123456 doesn&#039;t exist&amp;quot; }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Remove a device from a project===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters&lt;br /&gt;
:;cmd: &#039;&#039;&#039;delDevice&#039;&#039;&#039;&lt;br /&gt;
:;serial: the serial number of the device, e.g. 00-90-33-01-02-03&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;example success: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:true }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:;example error: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:false, &amp;quot;error&amp;quot;:&amp;quot;the project with ID 123456 doesn&#039;t exist&amp;quot; }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Get the warranty of a device===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters&lt;br /&gt;
:;cmd: &#039;&#039;&#039;getWarranty&#039;&#039;&#039;&lt;br /&gt;
:;serial: the serial number of the device, e.g. 00-90-33-01-02-03&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;warranty: a unix timestamp in seconds since 1970 (timezone Europe/Berlin), e.g. &#039;&#039;&#039;1448492400&#039;&#039;&#039;&lt;br /&gt;
:;warrantyStr: a string like &#039;&#039;&#039;&amp;quot;2015-11-26 00:00:00&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Create a new project===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters: you must use the project_id and trust value of an already existing project!&lt;br /&gt;
:;cmd: &#039;&#039;&#039;createProject&#039;&#039;&#039;&lt;br /&gt;
:;project_name: the name of the new project&lt;br /&gt;
:;[project_desc]: optional, a description for the new project&lt;br /&gt;
:;[update_url]: optional, an update URL for the project (do not forget to URL encode the value inside your HTTP GET request!)&lt;br /&gt;
:;[ssa_due_date]: optional, a unix timestamp in seconds since 1970 (timezone Europe/Berlin), e.g. &#039;&#039;&#039;1448492400&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;projectId: the project id of the created project&lt;br /&gt;
&lt;br /&gt;
 The newly created project is created with the same trust value which was used for the creation request. This allows you to directly use the API with the new project.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
===Smaller issues===&lt;br /&gt;
* Devices where imported into a project with SSA. If this happened to you, please move the corresponding devices into a project &#039;&#039;&#039;without&#039;&#039;&#039; SSA and back into the project &#039;&#039;&#039;with&#039;&#039;&#039; SSA to extend/add SSA for the licenses until the SSA end date.&lt;br /&gt;
* IE7 moves a list under the menu, when a list becomes to wide&lt;br /&gt;
===Licenses don&#039;t work on a device, where an invalidation has been done===&lt;br /&gt;
A possible reason here is, that the invalidation process hasn&#039;t been completed.&lt;br /&gt;
To resolve this issue, follow these steps:&lt;br /&gt;
&lt;br /&gt;
* Download the Confirmation File (Certificate) from http://my.innovaphone.com under [[#Invalidation|Invalidation]] after selecting the project and the device&lt;br /&gt;
* Open [[Reference9:General/License/my.innovaphone|General-&amp;gt;License-&amp;gt;my.innovaphone.com]] on your device&lt;br /&gt;
* Click on &amp;quot;Invalidate&amp;quot; (no my.innovaphone credentials needed)&lt;br /&gt;
* Upload the previously downloaded confirmation file newcert-00-90-33-xx-xx-xx.xml as &amp;quot;Confirmation file&amp;quot;&lt;br /&gt;
* Reset the box&lt;br /&gt;
* Reupload the licenses&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer doesn&#039;t work===&lt;br /&gt;
Yes, that&#039;s correct. Please use an up to date version of Chrome, Firefox or Edge!&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference:My_Innovaphone&amp;diff=77467</id>
		<title>Reference:My Innovaphone</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference:My_Innovaphone&amp;diff=77467"/>
		<updated>2025-08-06T07:32:15Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Informations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Where is my old my.innovaphone?==&lt;br /&gt;
Don&#039;t worry, just login with your old my.innovaphone account! You will be asked to confirm your forename and surname (just a &#039;&#039;&#039;natural person&#039;&#039;&#039; is allowed) and accept some terms and conditions.&amp;lt;br&amp;gt;&lt;br /&gt;
Afterwards you find the old license/device view inside the [[#Licenses tab| Licenses tab]].&lt;br /&gt;
&lt;br /&gt;
==About==&lt;br /&gt;
my.innovaphone allows the handling of licenses and includes the handling of device warranty and software service agreements.&amp;lt;br&amp;gt;&lt;br /&gt;
You can also sign contracts here for different purposes.&lt;br /&gt;
&lt;br /&gt;
===Project-View===&lt;br /&gt;
My innovaphone offers the possibility for several users to be in one company. This company shares its balance of licenses over all users and can have several projects. Projects have their own balance of license types and devices are bound to a project.&lt;br /&gt;
&lt;br /&gt;
===Language===&lt;br /&gt;
My innovaphone will support multiple languages. You can select your desired language at the top of the page.&amp;lt;br&amp;gt;&lt;br /&gt;
Currently supported languages:&lt;br /&gt;
* English&lt;br /&gt;
* German&lt;br /&gt;
* Italian&lt;br /&gt;
* Dutch&lt;br /&gt;
* French&lt;br /&gt;
* Spanish (partially)&lt;br /&gt;
* Polish (partially)&lt;br /&gt;
&lt;br /&gt;
===Guides===&lt;br /&gt;
&lt;br /&gt;
====Quickstart guide====&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_nl.pdf Dutch quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_en.pdf English quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_fr.pdf French quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_de.pdf German quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://my.innovaphone.com/docs/my_innovaphone_Quick_Start_Guide_it.pdf Italian quickstart guide]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====SSA guide====&lt;br /&gt;
;V10 and greater:&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10nl.pdf Dutch SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10en.pdf English SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10fr.pdf French SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10de.pdf German SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10it.pdf Italian SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10pl.pdf Polish SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_V10es.pdf Spanish SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;V8 and greater:&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_en.pdf English SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_fr.pdf French SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_de.pdf German SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
* [https://my.innovaphone.com/docs/innovaphone_SSA_Leitfaden_it.pdf Italian SSA guide]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==First steps==&lt;br /&gt;
Open [https://my.innovaphone.com my.innovaphone.com] and click the &amp;quot;I would like to create a new personal user account&amp;quot; link.&lt;br /&gt;
Enter your personal data and register.&lt;br /&gt;
&lt;br /&gt;
You will receive a registration email with an activation link.&lt;br /&gt;
After account activation you have two options:&lt;br /&gt;
* create a new my.innovaphone company with the &amp;quot;Create company account&amp;quot; button&lt;br /&gt;
* ask another user of your company to invite your email address to an already existing company&lt;br /&gt;
&lt;br /&gt;
If you accidentally created an own my innovaphone company, just ask another user of your company to import your just created company.&lt;br /&gt;
&lt;br /&gt;
If you create a new company, you can &#039;&#039;&#039;optionally&#039;&#039;&#039; enter your innovaphone account ID (which is your customer number with innovaphone) with your postal code, to retrieve your company data.&lt;br /&gt;
&lt;br /&gt;
  Inside the license tab of the my.innovaphone portal, you will see a help link at the right side of the horizontal tab menu. &lt;br /&gt;
  This link shows the corresponding text of the wiki section, when hovering with the mouse over it, &lt;br /&gt;
  and redirects to the corresponding wiki menu, if clicked.&lt;br /&gt;
&lt;br /&gt;
  It is possible, that one user is member of serveral companies!&lt;br /&gt;
&lt;br /&gt;
==Left bar==&lt;br /&gt;
If you open the left bar, you have the options to:&lt;br /&gt;
* select one of your companies&lt;br /&gt;
* edit your personal user account&lt;br /&gt;
** user name&lt;br /&gt;
** email address&lt;br /&gt;
** flag to recieve SSA expiry emails&lt;br /&gt;
** password&lt;br /&gt;
* create a new company&lt;br /&gt;
[[Image:Myinnovaphone bar.png|center|thumb|200px|myinnovaphone_bar.png/|myinnovaphone_bar.png/]]&lt;br /&gt;
&lt;br /&gt;
==Main tabs==&lt;br /&gt;
Inside each company you see the three main tabs:&lt;br /&gt;
* Contracts&lt;br /&gt;
* Authorized persons&lt;br /&gt;
* Licenses (see [[#Licenses tab| Licenses tab]])&lt;br /&gt;
&lt;br /&gt;
You may also have two buttons:&lt;br /&gt;
* Add Contract (just as company administrator or with the contract right)&lt;br /&gt;
* Invite person (just as company administrator)&lt;br /&gt;
&lt;br /&gt;
[[Image:Myinnovaphone main.png|center|thumb|200px|myinnovaphone_main.png/|myinnovaphone_main.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Contracts ===&lt;br /&gt;
Inside the contracts tab, you see all your contracts and you can download these conracts.&amp;lt;br&amp;gt;&lt;br /&gt;
In general, contracts must be first approved by innovaphone, so you see three types of contracts:&lt;br /&gt;
&lt;br /&gt;
* open contracts which must be approved by innovaphone first&lt;br /&gt;
* approved contracts which can be already used&lt;br /&gt;
* cancelled contracts which are not valid anymore&lt;br /&gt;
&lt;br /&gt;
[[Image:Myinnovaphone contracts.png|center|thumb|200px|myinnovaphone_contracts.png/|myinnovaphone_contracts.png/]]&lt;br /&gt;
&lt;br /&gt;
These type of contracts currently exist:&lt;br /&gt;
==== innovaphone myApps Cloud Service ====&lt;br /&gt;
Conclude this contract to use the innovaphone myApps Cloud.&lt;br /&gt;
&lt;br /&gt;
==== innovaphone software rental ====&lt;br /&gt;
Conclude this contract to rent innovaphone software products. You must conclude this contract if you want to use the software rental inside the Devices App.&lt;br /&gt;
&lt;br /&gt;
=== Authorized persons ===&lt;br /&gt;
Here you see all persons which exist inside your company. Each person can have the following rights:&lt;br /&gt;
* Administrator (everything)&lt;br /&gt;
* Contracts (can conclude contracts)&lt;br /&gt;
* Licenses (can work with licenses)&lt;br /&gt;
* Viewer (can just see everything without doing something)&lt;br /&gt;
* Locked (cannot even login to this company anymore)&lt;br /&gt;
&lt;br /&gt;
=== Licenses ===&lt;br /&gt;
Here comes the old my.innovaphone view which allows the handling of devices, licenses, activation keys etc.&lt;br /&gt;
&lt;br /&gt;
==Search (inside licenses tab)==&lt;br /&gt;
At the right top of the licenses tab you have a search field. You can search for different things:&lt;br /&gt;
* Devices (part of a device name or device comment)&lt;br /&gt;
* Projects (part of a project name or project description)&lt;br /&gt;
* Own activation keys (part of an activation key or its description)&lt;br /&gt;
* Hardware rental orders (part of the innovaphone order number or your own order reference or a MAC address of an order)&lt;br /&gt;
&lt;br /&gt;
  You have to enter at least &#039;&#039;&#039;three&#039;&#039;&#039; chars to start a search. To search for activation keys, &lt;br /&gt;
  you have to enter at least &#039;&#039;&#039;five&#039;&#039;&#039; chars.&lt;br /&gt;
* Search for license types. Enter e.g. &amp;quot;PBX-Port8&amp;quot; to find all devices with Port8 licenses or enter &amp;quot;PBX-Port8=100&amp;quot; to find all devices with Port8 licenses &#039;&#039;&#039;&amp;gt;=&#039;&#039;&#039; 100.&lt;br /&gt;
* Search for products, e.g. 01-00811 für IP811 (such a search may take longer!)&lt;br /&gt;
&lt;br /&gt;
==Licenses tab==&lt;br /&gt;
===Projects===&lt;br /&gt;
After creation of an own company, you will have a default project named &amp;quot;DEFAULT&amp;quot;. You can rename this project later.&lt;br /&gt;
You can also create more projects on the projects page with &amp;quot;Create&amp;quot;.&lt;br /&gt;
Each project of a company must have a unique name.&lt;br /&gt;
&lt;br /&gt;
  Do &#039;&#039;&#039;not&#039;&#039;&#039; set SSA, if you want to import your devices from your old license manager account first.&lt;br /&gt;
  If you want SSA and you &#039;&#039;&#039;won&#039;t import&#039;&#039;&#039; devices into this project from your old account, you should set SSA at once.&lt;br /&gt;
&lt;br /&gt;
You can select a certain project by activating it in the project list. This selection is then true for all other pages, as some pages require a selected project.&lt;br /&gt;
&lt;br /&gt;
[[Image:overview.jpg|center|thumb|200px|overview.jpg/|overview.jpg/]]&lt;br /&gt;
&lt;br /&gt;
By activating a project by clicking on the project name in the project list, you can manage this project and its settings.&lt;br /&gt;
&lt;br /&gt;
==== Rental project ====&lt;br /&gt;
You can also manually create a rental project. A rental project is normally created automatically by uploading an activation key inside the Devices App.&amp;lt;br/&amp;gt;&lt;br /&gt;
But if you want to start directly with an Automatic iSC reloading service, you&#039;ll need to create the project manually.&amp;lt;br/&amp;gt;&lt;br /&gt;
Take care that the name &#039;&#039;&#039;equals&#039;&#039;&#039; the domain name in your Devices App.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If the rental tab in your Devices App domain doesn&#039;t show the expected balance/Automatic iSC reloading contract/licenses etc., you may use the Devices App Guid Link mechanism to link the domain to this specific project (see below) (use Devices App &#039;&#039;&#039;13r3 SR12&#039;&#039;&#039; or higher!).&lt;br /&gt;
&lt;br /&gt;
====Properties====&lt;br /&gt;
Rename the project or/and change its description.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure further CC mail addresses inside your &#039;&#039;&#039;License Purchase&#039;&#039;&#039; project, if you have one. If you purchase licenses on credit, the emails will be also sent to theses addresses.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Since version 10, an innovaphone device will automatically connect to http://config.innovaphone.com/init&lt;br /&gt;
This script looks at the project properties of the project, where the device exists.&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure an update &#039;&#039;&#039;URL&#039;&#039;&#039; and a &#039;&#039;&#039;trusted certificate&#039;&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
;Devices App GUID link: This is a GUID which can be entered in the settings of a domain inside the Devices App to link the domain to this specific project, if the names do not match and/or the Devices App has been setup from scratch. The Devices App must use the customer to which this projects belongs to be able to use this GUID.&lt;br /&gt;
&lt;br /&gt;
====Software Service====&lt;br /&gt;
You can put your project under SSA (software service agreement). &lt;br /&gt;
You will be asked to enter a SSA end date. This will be the date, where all SSA licenses of all devices in this project will expire.&lt;br /&gt;
The end date mustn&#039;t be more than one year in the past.&amp;lt;br&amp;gt;&lt;br /&gt;
Optionally you can enter a maximum SSC amount. The SSA end date will be automatically calculated then.&amp;lt;br&amp;gt;&lt;br /&gt;
  If you have entered a maximum SSC amount, you have to use the &#039;&#039;&#039;Recalculate&#039;&#039;&#039; link to calculate a new SSA end date, &lt;br /&gt;
  if you change your license selection.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can also calculate SSA over all projects at once. In this mode, you &#039;&#039;&#039;won&#039;t be able&#039;&#039;&#039; to confirm the calculation. You&#039;ll just see the necessary SSC amount.&lt;br /&gt;
&lt;br /&gt;
After entering a date/SSC amount, you will get a summary of all licenses, which will be put under SSA and the amount of needed SSC licenses.&lt;br /&gt;
The SSC value for each license is calculated by the bind date of the license and the entered SSA end date/SSC amount.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ssa_extend.jpg|center|thumb|200px|ssa_extend.jpg/|ssa_extend.jpg/]]&lt;br /&gt;
&lt;br /&gt;
If you have licenses for an older version than the current version, you have to pay SSCs from the [[#Release dates|release date]] of the next version of the current license version.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  e.g. you have a V7 PBX-PBX7#15 license with bind date 1/1/2010. Version 8 was released on 7/12/2009, so SSA is&lt;br /&gt;
  calculated from 7/12/2009 for this license. You will see the calculation date in the list under &amp;quot;bind date&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If licenses already have a SSA date, just the difference between the current SSA date and the entered SSA end date must be paid.&lt;br /&gt;
If the bind date of the device lies in the past, the difference between the bind date and the current date must be paided twice (this is the column &#039;days*2&#039;).&amp;lt;br&amp;gt;&lt;br /&gt;
If your license is under SSA, which is already over, you also have to pay the time between the old SSA date and the current SSA end date twice.&lt;br /&gt;
&lt;br /&gt;
Here is a short example, how the days are calculated:&lt;br /&gt;
&lt;br /&gt;
Bind date: 24/06/2009&amp;lt;br&amp;gt;&lt;br /&gt;
Current date: 31/08/2009&amp;lt;br&amp;gt;&lt;br /&gt;
SSA end date: 12/12/2011&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You will have to pay from 24/06/2009 to 31/08/2009 twice for 68 days.&lt;br /&gt;
From 31/08/2009 to 12/12/2011 you will then have to pay the normal price for 833 days.&lt;br /&gt;
&lt;br /&gt;
You can also select for each license, if you want SSA for it or not. If not, no SSC is needed and no (new) SSA end date is set for this license.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  You can preview the SSC calculation for another calculation date. Simply change the dropdown&lt;br /&gt;
  selection to get the new SSC value.&lt;br /&gt;
  Of course you can&#039;t confirm this calculation for another date, just for the current date!&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;You may add additional licenses to the calculation, which you will bind later&#039;&#039;. Just click on the &#039;&#039;&#039;+&#039;&#039;&#039; near this text and you can add&lt;br /&gt;
  multiple licenses, which will be added to your calculation after using the recalc link. Listed are licenses of the current version and from&lt;br /&gt;
  your balance.&lt;br /&gt;
&lt;br /&gt;
After confirming your entered SSA end date, each license will have this date as SSA end date and can be downloaded in all versions of this SSA time.&lt;br /&gt;
&lt;br /&gt;
You can now extend the projects SSA end date like as setting a new one.&lt;br /&gt;
The resulting summary is the same as above.&lt;br /&gt;
&lt;br /&gt;
If your user account has the right to buy licenses on credit, just check the checkbox.&lt;br /&gt;
You may enter an order number, which you can use for your order, if you buy on credit.&lt;br /&gt;
&lt;br /&gt;
=====Past SSA end date=====&lt;br /&gt;
&lt;br /&gt;
You can configure a new SSA end date in the past, if you accidentally configured a wrong date.&amp;lt;br&amp;gt;&lt;br /&gt;
No licenses will be changed, if you configure a date in the past, just the SSA end date of the project!&lt;br /&gt;
&lt;br /&gt;
=====SSA Expiry Mail=====&lt;br /&gt;
&lt;br /&gt;
  If project SSA will expire, each company user will receive a reminder mail &#039;&#039;&#039;7&#039;&#039;&#039; weeks before and &lt;br /&gt;
  then every week one mail.&lt;br /&gt;
  You can disable these mails with the checkbox &#039;Send SSA expiry mails&#039;.&lt;br /&gt;
  Note that every user can configure, if he wants to receive mails or not in his account settings.&lt;br /&gt;
&lt;br /&gt;
If you want the end user of the project to receive an expiry mail, you can configure a &#039;&#039;&#039;reseller&#039;&#039;&#039; mail address and end user mail addresses. These end users will then receive an email, 30 days before the project will expire. The default text is:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 Your Software Service Agreement for your innovaphone PBX in project &amp;quot;{$arg[3]}&amp;quot; will expire in {$arg[1]} days. &lt;br /&gt;
 Please contact your reseller {$arg[2]} to upgrade the license.&amp;lt;br&amp;gt;&lt;br /&gt;
 The upgrade of the license is important to secure the phone system!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can change this text as you want. You can use placeholders:&lt;br /&gt;
* &#039;&#039;&#039;{$arg[1]}&#039;&#039;&#039;: days left &lt;br /&gt;
* &#039;&#039;&#039;{$arg[2]}&#039;&#039;&#039;: reseller mail address&lt;br /&gt;
* &#039;&#039;&#039;{$arg[3]}&#039;&#039;&#039;: project name&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can also define a global text for all projects under your [[#Company| Company settings]].&lt;br /&gt;
&lt;br /&gt;
  You can optionally configure to receive project SSA independent reminder mails for each license of a device [[#Company 2|here]].&lt;br /&gt;
&lt;br /&gt;
=====Automatic SSA Extension Service=====&lt;br /&gt;
&lt;br /&gt;
You can request an automatic SSA extension service for a project, which is under SSA. By following this link, you will have the opportunity to request a callback and/or the necessary agreement as PDF file.&lt;br /&gt;
&lt;br /&gt;
 All licenses have to be under SSA to use the automatic SSA extension service!&lt;br /&gt;
&lt;br /&gt;
There are some basics to know, if a project is under automatic SSA:&lt;br /&gt;
* If you bind new/free licenses, they&#039;ll get SSA until the current project SSA date and you will receive an invoice for the SSCs&lt;br /&gt;
* If you move devices into this project, their licenses will get SSA until the current project SSA date and you will receive an invoice for the SSCs&lt;br /&gt;
* You can&#039;t join this project into another project, but you can join another project into this one&lt;br /&gt;
&lt;br /&gt;
====Rights====&lt;br /&gt;
=====Own project=====&lt;br /&gt;
Add or delete company rights for this project. To add a company right, you have to enter the company id of this company.&lt;br /&gt;
Each user of a company with rights on this project can add devices, licenses, activation keys to this specific project, but is restricted in removing devices, editing the project and can&#039;t create activation keys with the projects balance.&lt;br /&gt;
&lt;br /&gt;
  The company id can be found under Licenses-&amp;gt;company and the company tab.&lt;br /&gt;
&lt;br /&gt;
[[Image:Project_rights.jpg|center|thumb|200px|project_rights.jpg/|project_rights.jpg/]]&lt;br /&gt;
&lt;br /&gt;
=====External Project=====&lt;br /&gt;
If another company granted access rights to a project to you, you can unsubscribe from this project here.&lt;br /&gt;
&lt;br /&gt;
====Import====&lt;br /&gt;
The import has been disabled. All old devices are already imported and can be added to your project manually.&lt;br /&gt;
&lt;br /&gt;
====Join====&lt;br /&gt;
Here you can join your currently selected project with another project, which you select from a dropdown box.&amp;lt;br&amp;gt;&lt;br /&gt;
If the other project has SSA, you&#039;ll see the current SSA end date, which you might change for the join process and you will get a list of all licenses, which might be updated to the ssa end date/changed date of the other project. The list equals the list shown under [[#Software Service|Software Service]].&lt;br /&gt;
&lt;br /&gt;
  The selected project will be automatically deleted after the join. You can&#039;t join a project,&lt;br /&gt;
  if it grants external rights to another customer. Delete these rights before.&lt;br /&gt;
&lt;br /&gt;
 You can&#039;t change the SSA end date, if the other project is under automatic SSA! You will receive an invoice for SSCs used for the join.&lt;br /&gt;
&lt;br /&gt;
====Project Move (admin only)====&lt;br /&gt;
A company admin can move a project with its devices, activation keys, balance etc. to another company. You have to know the company ID from this company, which can be found under Licenses-&amp;gt;Company and the company tab.&amp;lt;br&amp;gt;&lt;br /&gt;
The history won&#039;t be moved!&lt;br /&gt;
&lt;br /&gt;
 Projects with negative balances can&#039;t be moved!&lt;br /&gt;
&lt;br /&gt;
 Existing project rights will be deleted.&lt;br /&gt;
&lt;br /&gt;
====Delete====&lt;br /&gt;
Delete the project. Only possible if it has no activation keys, project rights, devices or user rights.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You may [[#Join|join]] your project into another one, if you can&#039;t delete it.&lt;br /&gt;
&lt;br /&gt;
====Project Freed_RMA_licenses====&lt;br /&gt;
If you see a project with this name in your project list, you had a RMA device with not yed moved licenses, which was shipped to innovaphone and reshipped to another customer.&amp;lt;br&amp;gt;&lt;br /&gt;
The licenses of such a device have been moved into the pool of free licenses of the project Freed_RMA_licenses, from where you can assign them to another device.&lt;br /&gt;
&lt;br /&gt;
====Rental====&lt;br /&gt;
Projects starting and ending with the &#039;&#039;&#039;$&#039;&#039;&#039; sign in their name are rental projects.&amp;lt;br&amp;gt;&lt;br /&gt;
The name corresponds to the domain name of a Devices App installation.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
All software licensing and device management can be just done through the Devices App itself, see [[Reference13r1:Concept_App_Service_Devices#Rental_program_and_Payment_method]].&amp;lt;br&amp;gt;&lt;br /&gt;
Just &#039;&#039;&#039;hardware licenses&#039;&#039;&#039; still need to be bound inside my.innovaphone currently and have to be downloaded there and uploaded on the device itself just as usual.&lt;br /&gt;
&lt;br /&gt;
===Balance===&lt;br /&gt;
On the balance page you will see the balance of the currently selected project or the balance of all your projects together.&lt;br /&gt;
The balance is bound to your company and &#039;&#039;&#039;not&#039;&#039;&#039; to your user account. The balance is bound to a specific project, but can be shared for license creation or activation key creation if wished.&amp;lt;br&amp;gt;&lt;br /&gt;
Sharing the balance over several projects is not possible in external projects!&lt;br /&gt;
&lt;br /&gt;
[[Image:Balancepage.jpg|center|thumb|200px|balancepage.jpg/|balancepage.jpg/]]&lt;br /&gt;
&lt;br /&gt;
====Free licenses====&lt;br /&gt;
&lt;br /&gt;
Here you see a list of all your free licenses. If you return licenses from one of your devices, the returned licenses are stored in your free licenses pool. You can assign these licenses to another device (see [[#Add licenses from free licenses|&#039;Add licenses from free licenses&#039;]]).&lt;br /&gt;
&lt;br /&gt;
[[Image:Balance_free_lics.jpg|center|thumb|200px|balance_free_lics.jpg/|balance_free_lics.jpg/]]&lt;br /&gt;
&lt;br /&gt;
The bind date, SSA end date and the external key (like DECT-Multi-Cell-Ari) are stored for each license.&lt;br /&gt;
&lt;br /&gt;
===Activations===&lt;br /&gt;
&lt;br /&gt;
You&#039;ll see a list of all your bound activation keys with their licenses here.&lt;br /&gt;
&lt;br /&gt;
[[Image:Activations.jpg|center|thumb|200px|activations.jpg/|activations.jpg/]]&lt;br /&gt;
&lt;br /&gt;
====Add an activation key====&lt;br /&gt;
To increase your projects balance, select one of your projects, follow the &amp;quot;Add&amp;quot; link and enter the activation key in the corresponding field. You can also enter an optional comment for this key. You will then get a listing of all contained licenses. After commiting this key, your project balance will have been increased by the keys values.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Deselect the current project&amp;quot; to view all activation keys independent of the selected project.&lt;br /&gt;
&lt;br /&gt;
====Search for an activation key by your order number====&lt;br /&gt;
Enter your own order number (or nothing), to view your activation keys for this order.&lt;br /&gt;
&lt;br /&gt;
====License certificate====&lt;br /&gt;
You can always download the innovaphone license certificate for activation keys in your projects. Simply press the download link in the list at the right side.&lt;br /&gt;
&lt;br /&gt;
===Own Activations===&lt;br /&gt;
Here you&#039;ll see a list of all created activation keys in the selected project (or over all projects).&lt;br /&gt;
&lt;br /&gt;
You can create activation keys on the project page for other users/companies or to simply transfer licenses from one project to another.&amp;lt;br&amp;gt;&lt;br /&gt;
You can enter a comment, an order number and an order reference. The &#039;&#039;&#039;order number&#039;&#039;&#039; is your own order number for the key and the &#039;&#039;&#039;order reference&#039;&#039;&#039; is the reference number of the customer, who receives the newly created key.&amp;lt;br&amp;gt;&lt;br /&gt;
The order reference and order number will be shown in the innovaphone license certificate.&lt;br /&gt;
&lt;br /&gt;
[[Image:Created_activations.jpg|center|thumb|200px|created_activations.jpg/|created_activations.jpg/]]&lt;br /&gt;
&lt;br /&gt;
You have to select an activation key in the activation key list to update or delete it.&lt;br /&gt;
&lt;br /&gt;
  Updating and deleting a key is only possible, if this key is not assigned.&lt;br /&gt;
&lt;br /&gt;
====Update====&lt;br /&gt;
Add more licenses to this key or change its comment, order number and order reference.&amp;lt;br&amp;gt;&lt;br /&gt;
You can also remove licenses by entering e.g. -2, if you want to remove 2 licenses from the key.&lt;br /&gt;
&lt;br /&gt;
[[Image:Own activations update.jpg|center|thumb|200px|own_activations_update.jpg/|own_activations_update.jpg/]]&lt;br /&gt;
&lt;br /&gt;
====Delete====&lt;br /&gt;
Delete this key. Its licenses will go back into the balance of the currently selected project.&lt;br /&gt;
&lt;br /&gt;
===Devices===&lt;br /&gt;
To view your devices you first have to click on the &amp;quot;Show&amp;quot; button. You can leave the filter field empty if you want to view all your devices.&lt;br /&gt;
&lt;br /&gt;
[[Image:Devices_page.jpg|center|thumb|200px|devices_page.jpg/|devices_page.jpg/]]&lt;br /&gt;
&lt;br /&gt;
Red marked device names are devices, which are currently in RMA.&lt;br /&gt;
&lt;br /&gt;
  MAC addresses of RMA devices do not longer start with 01-...&lt;br /&gt;
&lt;br /&gt;
====List====&lt;br /&gt;
A List of your devices in the currently selected project.&amp;lt;br&amp;gt;&lt;br /&gt;
You can deselect the current project/device to list all your devices.&lt;br /&gt;
&lt;br /&gt;
Select a certain device from the device list, to manage its properties, licenses etc.&lt;br /&gt;
&lt;br /&gt;
  Actions on multiple devices:&lt;br /&gt;
  * Move: move several devices into another project at once (see [[#Move device|Move Device]])&lt;br /&gt;
  * Remove: remove several devices at once (see [[#Remove|Remove]])&lt;br /&gt;
&lt;br /&gt;
=====Add=====&lt;br /&gt;
Follow the &amp;quot;Add new devices&amp;quot; link on the devices page.&lt;br /&gt;
&lt;br /&gt;
There you have a few options:&lt;br /&gt;
* You can add a single new device&lt;br /&gt;
* You can add devices according to a mac address range (e.g. from 00-90-33-08-20-00 to 00-90-33-08-22-00), maximum 50 at once&lt;br /&gt;
* You can add devices by uploading a text file with mac addresses like this (maximum 50 at once, each line one mac):&lt;br /&gt;
&lt;br /&gt;
  00-90-33-08-20-20&lt;br /&gt;
  00-90-33-08-20-21&lt;br /&gt;
  00-90-33-08-20-22&lt;br /&gt;
  00-90-33-24-20-20&lt;br /&gt;
&lt;br /&gt;
* You can add devices according to your received order number. Just enter you order number and you will get a list of all devices bount to this number.&lt;br /&gt;
&lt;br /&gt;
Note: MAC addresses can be always given like this:&lt;br /&gt;
* 00-90-33-xx-xx-xx&lt;br /&gt;
* 00:90:33:xx:xx:xx&lt;br /&gt;
* 009033xxxxxx&lt;br /&gt;
* xxxxxx (00-90-33- will then be added automatically)&lt;br /&gt;
&lt;br /&gt;
There might be errors, if you try to add a device. They are explained [[#Image explanation|here]].&lt;br /&gt;
&lt;br /&gt;
  As the device warranty will be handled by licenses now, you can also add telephone devices&lt;br /&gt;
  to your projects.&lt;br /&gt;
&lt;br /&gt;
=====Add warranty extensions=====&lt;br /&gt;
&lt;br /&gt;
Here you can add warranty extension licenses for all devices in the currently selected project.&amp;lt;br&amp;gt;&lt;br /&gt;
You&#039;ll get a list of all devices with the corresponding license type(s) and you can specify the years for each device (or for all devices by entering the number in the list header).&amp;lt;br&amp;gt;&lt;br /&gt;
After confirming your selection, you&#039;ll get an overview of all needed licenses, which you have to confirm too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Check licence, SSA and warranty status of a device=====&lt;br /&gt;
Here you can list licenses with ssa and the warranty end date of a device, which is not in one of your projects.&amp;lt;br&amp;gt;&lt;br /&gt;
For this option to work, you have to link your innovaphone customer ID (5 digits) to your my.innovaphone company. (As the warranty is also the one we grant to our distributors, we don&#039;t want to get an end customer confused.)&lt;br /&gt;
&lt;br /&gt;
=====Download devices of an order as CSV=====&lt;br /&gt;
Enter an order number to retrieve all devices for this order in a CSV file.&lt;br /&gt;
&lt;br /&gt;
=====Download devices of an order as PDF with barcodes=====&lt;br /&gt;
Enter an order number to retrieve all devices for this order in a PDF file with a barcode for each MAC address.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Barcode ist vom Typ C128B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Properties====&lt;br /&gt;
&lt;br /&gt;
Change the name and comment of a device.&lt;br /&gt;
  You can only change the name, if it&#039;s no MAC or IPEI.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Here you have also the possibility, to directly request RMA for this device with prefilled values.&lt;br /&gt;
&lt;br /&gt;
====Licenses====&lt;br /&gt;
Here you can add, download or move licenses.&lt;br /&gt;
&lt;br /&gt;
=====Add licenses from balance=====&lt;br /&gt;
To create new licenses for a device, you have to add this device first on the devices page and then select a version of the license &lt;br /&gt;
and whether you want to summate the current licencing. If you select current licenses, then older licenses for example V6 or V7 licenses will also be counted as V8 licenses in the next overview. This is necessary if you want to license a V6 unit with V8 licenses, but still want to use it as V6.&lt;br /&gt;
After that click &amp;quot;Next&amp;quot;.&lt;br /&gt;
On the next page you will see a list of all available license types, which depends on your current available license types, of the selected license version and the device type (IP6000, IP800 e.g.):&lt;br /&gt;
[[Image:licenses.jpg|center|thumb|200px|licenses.jpg/|licenses.jpg/]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If your project has a SSA end date, which is not yet over, you&#039;ll have the possibility to set SSA for the new licenses to this SSA end date or you can optionally change this date to another one for the new licenses.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You see the available project balance, the balance over all projects (excluding external projects), the currently installed licenses and the maximum amount for this device type. You can now enter the value of the new license.&lt;br /&gt;
Base/Upgrade licenses can be selected via dropdown box. &lt;br /&gt;
&#039;&#039;&#039;Voicemail and Standby lics must always have the same amount as the selected PBX-PBX... license!&lt;br /&gt;
The maximum amount of PBX-Registration licenses equals the amount of the selected PBX-PBX... license!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The whished overall amount of pbx version 8 and above licenses can be specified here and the concrete amount of license sub types will be requested on the next page.&lt;br /&gt;
&lt;br /&gt;
 You can preview the SSC calculation of the wished licenses without having them in your balance.&lt;br /&gt;
&lt;br /&gt;
[[Image:licenses2.jpg|center|thumb|200px|licenses2.jpg/|licenses2.jpg/]]&lt;br /&gt;
&lt;br /&gt;
The best (cheapest) combination of each v8 pbx license type is already filled in, but you might change the amount of sub types if your does not fit and you do not want to purchase new activation keys for the sub types.&lt;br /&gt;
&lt;br /&gt;
The column SSC/Unit is just shown if your project is currently under SSA and you have entered a SSA end date.&lt;br /&gt;
&lt;br /&gt;
  The SSC multiplicator is the value, which you have to multiplicate with each license unit to get &lt;br /&gt;
  the corresponding SSC amount.&lt;br /&gt;
  E.g. if you have 20 units of PBX-Port8*20 licenses with a SSC value of 54 and a multiplicator of &lt;br /&gt;
  1.0000 (which equals to 365 days) you have to pay 20*54*1.0000 ~ 1080 SSCs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;If you create licenses for an older version than the current version, you have to pay SSCs from the [[#Release dates|release date]] of the next version of the currently selected version twice.&amp;lt;br&amp;gt;&lt;br /&gt;
  e.g.: you want to bind licenses for V6 with SSA, so you have to pay SSCs from the release date of V7&lt;br /&gt;
&amp;lt;br&amp;gt;You can also select for each license, if you want SSA for it or not. If not, no SSC is needed and no (new) SSA end date is set for this license.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 You can&#039;t change the SSA end date, if the project is under automatic SSA! You will receive an invoice for SSCs used for the new binding.&lt;br /&gt;
&lt;br /&gt;
Now confirm your new selection. If you have not enough licenses in your current project, but there are still licenses in other projects, you will get a dropdown box with a list of all projects containing the needed licenses. You can now select all desired/needed projects and confirm your selection again.&lt;br /&gt;
The balance of all selected projects will then be decreased by the needed amount.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If your user account has the right to buy licenses on credit, just check the checkbox.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You may enter an order number, which you can use for your order, if you buy on credit.&lt;br /&gt;
&lt;br /&gt;
=====Add licenses from free licenses=====&lt;br /&gt;
&lt;br /&gt;
Here you can assign licenses, which you returned from other devices.&lt;br /&gt;
You will also have to select the desired version and will than get a list of fitting licenses according to the current device and selected version.&lt;br /&gt;
&lt;br /&gt;
[[Image:licenses_free.jpg|center|thumb|200px|licenses_free.jpg/|licenses_free.jpg/]]&lt;br /&gt;
&lt;br /&gt;
If a license is under SSA, the correct license type is shown in column &#039;License Type&#039; besides the &#039;Original Type&#039;.&lt;br /&gt;
On confirming the selection, a consistency check is done (e.g. only 4 Relay-PRI licenses on an IP6000).&lt;br /&gt;
Bind and SSA end date will be maintained for each license.&lt;br /&gt;
&lt;br /&gt;
As external keys are also maintained, you can select e.g. an old Dect-Multicell-Ari license to have the same ARI on another IP1200.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  If your project has a SSA end date, which is not yet over, you&#039;ll have the possibility to set SSA for the new licenses &lt;br /&gt;
  to this SSA end date or you can optionally change this date to another one for the new licenses.&lt;br /&gt;
  You will have to confirm this after your first license selection (this is the same calculation as [[#Software Service|here]]).&lt;br /&gt;
&lt;br /&gt;
  You can&#039;t change the SSA end date, if the project is under automatic SSA! You will receive an invoice for SSCs used for the binding.&lt;br /&gt;
&lt;br /&gt;
=====Add V7 floating license (slave pbx)=====&lt;br /&gt;
Here you can add a V7 floating license for a slave pbx. A device with a floating license can&#039;t have V7 pbx licenses and a device with V7 pbx licenses can&#039;t have a floating license.&lt;br /&gt;
&lt;br /&gt;
=====Delete V7 floating license=====&lt;br /&gt;
Here you can delete an already existing floating license, if you won&#039;t use it anymore.&lt;br /&gt;
&lt;br /&gt;
=====Add warranty extension licenses=====&lt;br /&gt;
Extend your warranty by adding warranty extension licenses:&lt;br /&gt;
&lt;br /&gt;
[[Image:add_warranty.jpg|center|thumb|200px|add_warranty.jpg/|add_warranty.jpg/]]&lt;br /&gt;
&lt;br /&gt;
  If you add the warranty extension immediately after the receipt of your device,&lt;br /&gt;
  you can add the cheaper warranty extension licenses, otherwise you&#039;ll have to add&lt;br /&gt;
  the more expensive ones.&lt;br /&gt;
&lt;br /&gt;
  You can extend the warranty for a maximum of four years.&lt;br /&gt;
&lt;br /&gt;
=====Download licenses=====&lt;br /&gt;
&lt;br /&gt;
[[Image:Device_download.jpg|center|thumb|200px|device_download.jpg/|device_download.jpg/]]&lt;br /&gt;
&lt;br /&gt;
You will get a dropdown with all available versions. Versions are dependent of your device, your licenses and of the ssa of your licenses.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;From V9 on&#039;&#039;&#039;, you just have one option, which will create a license file, which contains the licenses upgraded to the highest version of their type.&amp;lt;br&amp;gt;&lt;br /&gt;
You are able to download downgraded versions of your licenses. E.g. if you have only V8 licenses, you can download a V7 license file (same restrictions as below).&lt;br /&gt;
&lt;br /&gt;
  Downgrades or only possible down to version 6!&lt;br /&gt;
&lt;br /&gt;
If you do not want to download licenses by version, you have to decide whether to download the licenses encrypted or not.&lt;br /&gt;
&#039;&#039;&#039;If you download the licenses unencrypted, you won&#039;t be able to return those licenses anymore.&#039;&#039;&#039;&lt;br /&gt;
So you won&#039;t be able to return licenses for devices with V5-V7 licenses, as licenses for these versions are not encrypted.&lt;br /&gt;
To return these licenses, you will have to upgrade to a new bootcode, which prevents firmware downgrades to versions below version 8.&amp;lt;br&amp;gt;&lt;br /&gt;
Encrypted licenses are stored in a xml file, which you can then upload on your V8 (or higher) device.&lt;br /&gt;
&lt;br /&gt;
  You can now also download licenses directly from by the web interface of a device. &lt;br /&gt;
  You just have to enter your account data and start downloading the licenses from my.innovaphone.com &lt;br /&gt;
  without having to download/upload a license file.&lt;br /&gt;
&lt;br /&gt;
=====Download test licenses=====&lt;br /&gt;
&lt;br /&gt;
[[Image:Device_download_test.jpg|center|thumb|200px|device_download_test.jpg/|device_download_test.jpg/]]&lt;br /&gt;
&lt;br /&gt;
You can also download test licenses if you want to run tests. You will be asked, which version you want to use, whether the device is used as slave and if not used as slave, how many pbx licenses you want to use.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: Since V11, trial licenses are valid for 3 months and can be released once for a dedicated device. After expiration of those 3 months no further trial license creation for this device is possible.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 V5 does &#039;&#039;&#039;not&#039;&#039;&#039; support test licenses!&lt;br /&gt;
&lt;br /&gt;
=====Download App development license=====&lt;br /&gt;
If you&#039;re an App developer, you have the possibility, to generate a real license for you Apps which will contain your manufacturer prefix.&amp;lt;br/&amp;gt;&lt;br /&gt;
The manufacturer prefix has to deposited at your my.innovaphone company by innovaphone before you can use this feature.&lt;br /&gt;
&lt;br /&gt;
 You can just have up to &#039;&#039;&#039;three&#039;&#039;&#039; different devices per company for which you can create such licenses!&lt;br /&gt;
 These licenses aren&#039;t allowed for production usage!&lt;br /&gt;
&lt;br /&gt;
You see your already used MAC addresses on this page too if you already created such licenses before.&lt;br /&gt;
&lt;br /&gt;
=====Move licenses to another device=====&lt;br /&gt;
If you have the needed account rights or the device is already in RMA, you can move licenses to another device. After moving licenses, the former device will be marked as a RMA device.&lt;br /&gt;
&lt;br /&gt;
  You can just move licenses to devices without licenses!&lt;br /&gt;
&lt;br /&gt;
=====Mix of rental and purchased licenses=====&lt;br /&gt;
From &#039;&#039;&#039;13r2 SR12&#039;&#039;&#039; onwards you can mix rental and purchased licenses.&amp;lt;br/&amp;gt;&lt;br /&gt;
A device with rental licenses will be always inside a rental project (you recognize such a project by it&#039;s starting and ending &#039;&#039;&#039;$&#039;&#039;&#039; in the name).&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now add licenses from the balance to a device in such a rental project.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If you invalidate lifetime licenses on such a device, just purchased licenses are returned. Rental licenses stay bound until you remove them inside your Devices App! (under rental menu)&lt;br /&gt;
Inside my.innovaphone you will always see both rental and purchased licenses. Inside the Devices App, you will just see the rental licenses.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You must download and/or install the purchased licenses as usual.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
A 13r1 PBX or a PBX with an older SR will just recognize rented licenses!&lt;br /&gt;
&lt;br /&gt;
 If your PBX is already inside a non rental project, it will be automatically added to a rental project if you add rental licenses. You then may have the device in two different projects (one rental, one normal), which is no issue.&lt;br /&gt;
&lt;br /&gt;
====Move device====&lt;br /&gt;
Here you can move the current device or the selected devices to another project.&amp;lt;br&amp;gt;&lt;br /&gt;
If you select a SSA project, you can change the SSA end date for the move process.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  If the other project is under SSA, you will first see a SSC calculation, which you have to confirm, &lt;br /&gt;
  as the SSA date for each SSA license will be extended until the given SSA end date &lt;br /&gt;
  (this is the same calculation as adding SSA to an already existing project, see [[#Software Service|here]]).&lt;br /&gt;
&lt;br /&gt;
  You can&#039;t change the SSA end date, if the other project is under automatic SSA! You will receive an invoice for SSCs used for the move.&lt;br /&gt;
&lt;br /&gt;
====Invalidation====&lt;br /&gt;
====Returning of licenses====&lt;br /&gt;
&lt;br /&gt;
By the invalidation, licenses are returned to the free balance of the project to which the device belongs in the Portal my.innovaphone.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can then bind the licenses from the free balance to another device.&lt;br /&gt;
&lt;br /&gt;
=====Requirements=====&lt;br /&gt;
* V8 or higher&lt;br /&gt;
* access to the webinterface&lt;br /&gt;
* a device certificate&lt;br /&gt;
* my.innovaphone login credentials&lt;br /&gt;
* &#039;&#039;&#039;no IPVA device&#039;&#039;&#039;&lt;br /&gt;
* no &#039;In House&#039; licenses&lt;br /&gt;
&lt;br /&gt;
=====Informations=====&lt;br /&gt;
&lt;br /&gt;
You can invalidate V8 (or higher) licenses by uploading the XML file, you got from your device or by returning your licenses over the web interface of your device ([[Reference8:Configuration/General/License]]), in order to return [[Reference8:Licenses#Gateway Licenses|PBX licenses]] back to the free balance.&lt;br /&gt;
&lt;br /&gt;
V7 licenses can be just returned, if you agree, that you won&#039;t be able to downgrade below V8 anymore. You will need a new bootcode, to use this function. &#039;&#039;&#039;You need a V8 firmware or higher for invalidation.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  If your device has access to my.innovaphone.com, you can also invalidate licenses directly&lt;br /&gt;
  from the web interface of the device.&lt;br /&gt;
&lt;br /&gt;
  [[Reference8:Licenses#Gateway Licenses|gateway licenses]] and warranty extensions won&#039;t be returned to the balance and remain to be assigned to the device!&lt;br /&gt;
&lt;br /&gt;
  The licenses needn&#039;t be present on the local device to perform the invalidation!&lt;br /&gt;
&lt;br /&gt;
  SSA it&#039;s bound to the license and it&#039;s not lost when performing invalidation.&lt;br /&gt;
&lt;br /&gt;
=====Process=====&lt;br /&gt;
&lt;br /&gt;
Steps to invalidate licenses, if your device has internet connectivity:&lt;br /&gt;
# on the web interface of the device go to General-&amp;gt;License and follow the my.innovaphone link&lt;br /&gt;
# enter your my.innovaphone account, the device must be in one of your projects&lt;br /&gt;
# click Invalidate&lt;br /&gt;
# click Transfer (this might fail, if NTP or DNS is not configured properly or device certificate is not installed)&lt;br /&gt;
# reset if asked for&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Steps to invalidate licenses, if your device has no internet connectivity:&lt;br /&gt;
# on the web interface of the device go to General-&amp;gt;License and follow the my.innovaphone link&lt;br /&gt;
# click Invalidate&lt;br /&gt;
# click Backup and upload this file on my.innovaphone [[#Upload the invalidation document to return licenses|here]] (Licenses-&amp;gt;Devices (select the corresponding device)-&amp;gt;Invalidation)&lt;br /&gt;
# you&#039;ll get a confirmation file after uploading the saved file&lt;br /&gt;
# upload this on the device (under Step1)&lt;br /&gt;
# reset if asked for&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;Your IP800 does not have a device certificate on it.&amp;quot; - In this case you need to download a hardware certification,&lt;br /&gt;
  please contact the innovaphone [mailto:license@innovaphone.com license].&lt;br /&gt;
&lt;br /&gt;
=====Download confirmation file=====&lt;br /&gt;
If you created a new certificate or you invalidated your licenses, you can later download the confirmation file, which you have to upload on the box.&lt;br /&gt;
&lt;br /&gt;
=====Request certificate=====&lt;br /&gt;
If you have the needed rights, you can request a new device certificate for your device.&lt;br /&gt;
&lt;br /&gt;
=====Upload the invalidation document to return licenses=====&lt;br /&gt;
Licenses-&amp;gt;Devices (select the corresponding device)-&amp;gt;Invalidation:&lt;br /&gt;
&lt;br /&gt;
Upload the invalidation document, which you got from the website of the device to return the licenses of this device.&lt;br /&gt;
&lt;br /&gt;
After uploading you&#039;ll get a confirmation file, which you have to upload on your device.&lt;br /&gt;
&lt;br /&gt;
====Remove====&lt;br /&gt;
You can always remove devices from a project. If they have licenses, these won&#039;t be deleted, so you might add the device to another project again.&lt;br /&gt;
&lt;br /&gt;
===History===&lt;br /&gt;
[[Image:history.jpg|center|thumb|200px|history.jpg/|history.jpg/]]&lt;br /&gt;
You can view your history for several contexts:&lt;br /&gt;
* Company: history of all actions in your company&lt;br /&gt;
* User: history of all actions of the selected user&lt;br /&gt;
* Device: history of all actions for the selected device&lt;br /&gt;
&lt;br /&gt;
Each context applies to the currently selected project.&lt;br /&gt;
If you deselect the current project, you will see the history over all projects.&lt;br /&gt;
&lt;br /&gt;
You can select to view the history of the last day, week, month, year or from always. Collecting data might take a while...&lt;br /&gt;
&lt;br /&gt;
===Company===&lt;br /&gt;
Manage users SSA expiry email flag, import other companies or add your companies innovaphone ID.&lt;br /&gt;
&lt;br /&gt;
====Users====&lt;br /&gt;
&lt;br /&gt;
You can just edit the SSA expiry email flag here. The other user settings moved to the [[#Authorized Persons| Authorized persons tab]].&lt;br /&gt;
&lt;br /&gt;
====Join (admin only)====&lt;br /&gt;
As admin you can also join another company into your company by entering an admin account of this company. This might be usefull if one user of your company has accidentally created an own company.&amp;lt;br&amp;gt;&lt;br /&gt;
Everything like projects, users, devices, balance, activations etc. will be imported!&amp;lt;br&amp;gt;&lt;br /&gt;
You also have to enter the company id of the company, which is to be imported. You can find this company under Licenses-&amp;gt;Company and the company tab.&lt;br /&gt;
&lt;br /&gt;
  This is not available for non company admin users.&lt;br /&gt;
&lt;br /&gt;
  The joined company will be deleted afterwards!&lt;br /&gt;
&lt;br /&gt;
====Company====&lt;br /&gt;
&lt;br /&gt;
You can check the &#039;&#039;&#039;Device SSA&#039;&#039;&#039; checkbox, if you want to receive SSA expiry reminder mails for each device independent of the projects SSA end date.&lt;br /&gt;
These mails will be send weekly seven weeks before the SSA for a license a the device expires.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can also enter additional email addresses, which should receive SSA emails.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You can define a global &#039;&#039;&#039;end user expiry mail text&#039;&#039;&#039; here, which will be sent to end users, if end users are configured in a [[#SSA Expiry Mail| project]]. This text can be overridden by a text in a project under [[#SSA Expiry Mail| SSA Expiry Mail]].&lt;br /&gt;
&lt;br /&gt;
==RMA==&lt;br /&gt;
Here you can see all your RMA devices, which arrived innovaphone already. The licenses of this macadresses are moveable.&lt;br /&gt;
[[Image:rma.jpg|center|thumb|200px|rma.jpg/|rma.jpg/]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you want to request RMA for a certain device, go to the device properties and follow the &amp;quot;Request RMA&amp;quot; link.&lt;br /&gt;
&lt;br /&gt;
==Support==&lt;br /&gt;
===Mantis===&lt;br /&gt;
Here you&#039;ll get a list of all open cases and [[Understanding the innovaphone trouble ticket status page#Information available| additional info regarding their state]] in our ticket system. This list is composed of all tickets assigned to email addresses of your my.innovaphone users in your company.&amp;lt;br&amp;gt;&lt;br /&gt;
Often used functions:&lt;br /&gt;
* You can click on the ticket number (&amp;quot;ID&amp;quot; column) to open an email prepared with the right emailadress and subject to address this case.&lt;br /&gt;
* You can click on the &#039;&#039;History&#039;&#039; link to get an overview of the already made communication with our support/presales-team.&lt;br /&gt;
* Another important new function is the option to upload larger files to your support/presales tickets using the &#039;&#039;Fileupload&#039;&#039; column.&lt;br /&gt;
&lt;br /&gt;
===Announcements===&lt;br /&gt;
You can convert audio files into G.7xx files which you can use as announcements.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
;Supported input formats:&lt;br /&gt;
* mp3&lt;br /&gt;
* wav&lt;br /&gt;
* ogg&lt;br /&gt;
* flac&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
;Generated output formats:&lt;br /&gt;
* G.711u&lt;br /&gt;
* G.711a&lt;br /&gt;
* G.729&lt;br /&gt;
* G.723&lt;br /&gt;
* G.722&lt;br /&gt;
&lt;br /&gt;
==Image explanation==&lt;br /&gt;
&lt;br /&gt;
===Errors===&lt;br /&gt;
&lt;br /&gt;
====Already In Company====&lt;br /&gt;
[[Image:Icon_in_company_inno_01.png|icon_in_company_inno_01.png/|icon_in_company_inno_01.png/]]&lt;br /&gt;
* This device already exists in your company and can&#039;t be added/imported.&lt;br /&gt;
If you want to import this device anyway, you first have to delete your current device from its project.&lt;br /&gt;
&lt;br /&gt;
====Already Imported====&lt;br /&gt;
[[Image:Icon_imported_inno_01.png|icon_imported_inno_01.png/|icon_imported_inno_01.png/]]&lt;br /&gt;
* This device has been already imported. &lt;br /&gt;
You can&#039;t import it again.&lt;br /&gt;
&lt;br /&gt;
====Not Found====&lt;br /&gt;
[[Image:Icon_not_found_inno_01.png|icon_not_found_inno_01.png/|icon_not_found_inno_01.png/]]&lt;br /&gt;
* This device was not found in the my innovaphone database. &lt;br /&gt;
This should never happen, but if, contact the administrator.&lt;br /&gt;
&lt;br /&gt;
====IPVA MAC exists====&lt;br /&gt;
[[Image:Icon_ip_va_exists_inno_01.png|icon_ip_va_exists_inno_01.png/|icon_ip_va_exists_inno_01.png/]]&lt;br /&gt;
* An IPVA MAC address must be unique and can be assigned to just one company. You tried to add an already existing IPVA MAC.&lt;br /&gt;
Please assign a new one to your IPVA. For further details, see [[Reference13r2:Concept_Innovaphone_Virtual_Appliance#License_Configuration]].&lt;br /&gt;
&lt;br /&gt;
my.innovaphone supports the following MAC address ranges:&lt;br /&gt;
* 00-50-56-...&lt;br /&gt;
* 00-15-5d-...&lt;br /&gt;
* 00-03-ff-...&lt;br /&gt;
* 00-0d-3a-...&lt;br /&gt;
* 00-12-5a-...&lt;br /&gt;
* 00-17-fa-...&lt;br /&gt;
* 00-50-f2-...&lt;br /&gt;
* 00-1d-d8-...&lt;br /&gt;
* 00-05-69-...&lt;br /&gt;
* 00-1c-14-...&lt;br /&gt;
* 00-0c-29-...&lt;br /&gt;
* 00-1d-db-...&lt;br /&gt;
* 5a-ad-1d-...&lt;br /&gt;
* 48-e9-ca-...&lt;br /&gt;
* bc-24-...&lt;br /&gt;
* e2-... &#039;&#039;this is an autogenerated MAC address of innovaphone cloud containers&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Warnings===&lt;br /&gt;
&lt;br /&gt;
====Several Companies====&lt;br /&gt;
[[Image:Icon_several_companies_inno_01.png|icon_several_companies_inno_01.png/|icon_several_companies_inno_01.png/]]&lt;br /&gt;
* This device is already in another company.&lt;br /&gt;
This means, that either you do not have the physical device or it once belonged another company.&lt;br /&gt;
You can still import/add this device and you will have access to all of its current licenses.&lt;br /&gt;
&lt;br /&gt;
====Several Users====&lt;br /&gt;
[[Image:Icon several users inno 01.png|icon_several_users_inno_01.png/|icon_several_users_inno_01.png/]]&lt;br /&gt;
* This device has licenses from several users of the old license manager.&lt;br /&gt;
This means, that you are not neccessarily the user, who physically owns this device. If you do not own it, do not import it.&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
====No downgrade====&lt;br /&gt;
[[Image:no_downgrade.png|no_downgrade.png/|no_downgrade.png/]]&lt;br /&gt;
* Licenses, which have been downloaded for V5/V6/V7, were returned from this device, so no downgrade to these versions is allowed any more.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- myinno my innovaphone my_inno my_innovaphone my-innovaphone my-inno--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Release dates==&lt;br /&gt;
V5:  January 1st 2003&amp;lt;br&amp;gt;&lt;br /&gt;
V6:  November 2nd 2006&amp;lt;br&amp;gt;&lt;br /&gt;
V7:  November 14th 2008&amp;lt;br&amp;gt;&lt;br /&gt;
V8:  December 7th 2009&amp;lt;br&amp;gt;&lt;br /&gt;
V9:  April 26th 2011&amp;lt;br&amp;gt;&lt;br /&gt;
V10: July 8th 2013&amp;lt;br&amp;gt;&lt;br /&gt;
V11: February 9th 2015&amp;lt;br&amp;gt;&lt;br /&gt;
V12: July 11th 2016&amp;lt;br&amp;gt;&lt;br /&gt;
V13: May 13th 2019&amp;lt;br&amp;gt;&lt;br /&gt;
V14: December 20th 2023&lt;br /&gt;
&lt;br /&gt;
V15: March 25th 2025&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==myplay==&lt;br /&gt;
[[https://myplay.innovaphone.com myplay]] offers a platform to test all my.innovaphone related content. You can create activation keys, licenses, accounts, projects and so on to learn it or to calculate possible scenarios.&lt;br /&gt;
&lt;br /&gt;
===Base===&lt;br /&gt;
The base of the database is the my.innovaphone database from the 13.8.2010. All accounts, companies and projects have been imported and are available until this date.&amp;lt;br&amp;gt;&lt;br /&gt;
From this date on the databases won&#039;t be synchronised any more (despite of the device table)!&lt;br /&gt;
&lt;br /&gt;
===Balance===&lt;br /&gt;
You can change your balance by yourself. Simply select the license type in the dropdown box on the balance page, enter the desired amount and your balance will be increased by this type.&lt;br /&gt;
&lt;br /&gt;
===Activation keys===&lt;br /&gt;
You can create own activation keys. These will have the prefix &amp;quot;PLAY-&amp;quot; to identify them as play activation keys. You won&#039;t be able to upload them on my.innovaphone.com.&lt;br /&gt;
&lt;br /&gt;
===Licenses===&lt;br /&gt;
After having selected a device under Licenses-&amp;gt;Devices, you can add/change licenses as you want by selecting new ones in the dropdown box or changing existing ones.&lt;br /&gt;
&lt;br /&gt;
====Download====&lt;br /&gt;
You will always just download test licenses here!&lt;br /&gt;
&lt;br /&gt;
====Invalidation====&lt;br /&gt;
Won&#039;t be possible here, because this is hardware related and can&#039;t be simulated.&lt;br /&gt;
&lt;br /&gt;
====Checkbox editing via list====&lt;br /&gt;
* &#039;D&#039; Deletes the license&lt;br /&gt;
* &#039;B&#039; Puts the license back into the projects balance&lt;br /&gt;
* &#039;F&#039; Puts the license into the pool of free licenses&lt;br /&gt;
&lt;br /&gt;
===Device RMA===&lt;br /&gt;
You can put a device under RMA to test this scenario (Licenses-&amp;gt;Devices, select a device and -&amp;gt;Properties). You can also remove the RMA status here.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External interface==&lt;br /&gt;
&lt;br /&gt;
There is an external interface, which you can use to control some functionality without a login to the my.innovaphone web site.&amp;lt;br&amp;gt;&lt;br /&gt;
You can use the interface with an &#039;&#039;&#039;HTTP GET&#039;&#039;&#039; request to the following URL:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;https://my.innovaphone.com/interface.php&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Configure a trust value and a URL (can be a dummy URL if not used otherwise) unter Licenses -&amp;gt; Project -&amp;gt; Properties and tick &amp;quot;Configure Update-URL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===General parameters for all commands===&lt;br /&gt;
:;cmd: the wished command&lt;br /&gt;
:;email: the email address of a user who is registered in my.innovaphone&lt;br /&gt;
:;project_id: the project ID of the project where the user has access to (you can find the project ID under [[#Properties| Licenses-&amp;gt;Projects-&amp;gt;Properties]])&lt;br /&gt;
:;hash: an SHA256 hash value which is computed over all GET parameters but the hash parameter itself plus the &#039;&#039;&#039;trust&#039;&#039;&#039; value of the project (see [[#Properties|Reference:My_Innovaphone#Properties]])&lt;br /&gt;
:;hash: the values of the GET parameters have to be URL encoded before calculation of the hash&lt;br /&gt;
&lt;br /&gt;
;Example: URL &amp;lt;code&amp;gt;https://my.innovaphone.com/interface.php?cmd=addDevice&amp;amp;email=user@example.com&amp;amp;project_id=123456&amp;amp;serial=00-90-33-01-02-03&amp;amp;hash=b62f7948d6383cc365592ed289b6173cd35229cadc347847b953f78c8880d5b9&amp;lt;/code&amp;gt;&lt;br /&gt;
:;project trust value: 1234567890abcdef&lt;br /&gt;
:;the data of the SHA256 hash: ?cmd=addDevice&amp;amp;email=user%40example.com&amp;amp;project_id=123456&amp;amp;serial=00-90-33-01-02-03&amp;amp;trust=1234567890abcdef&lt;br /&gt;
:;example PHP function call to generate the hash: hash(&amp;quot;sha256&amp;quot;, &amp;quot;?cmd=addDevice&amp;amp;email=user%40example.com&amp;amp;project_id=123456&amp;amp;serial=00-90-33-01-02-03&amp;amp;trust=1234567890abcdef&amp;quot;);&lt;br /&gt;
:;with the current values, the function should return: b62f7948d6383cc365592ed289b6173cd35229cadc347847b953f78c8880d5b9&lt;br /&gt;
&lt;br /&gt;
===Add a device to a project===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters&lt;br /&gt;
:;cmd: &#039;&#039;&#039;addDevice&#039;&#039;&#039;&lt;br /&gt;
:;serial: the serial number of the device, e.g. 00-90-33-01-02-03&lt;br /&gt;
:;[device_desc]: optional, a description for the new device&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;example success: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:true }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:;example error: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:false, &amp;quot;error&amp;quot;:&amp;quot;the project with ID 123456 doesn&#039;t exist&amp;quot; }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Remove a device from a project===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters&lt;br /&gt;
:;cmd: &#039;&#039;&#039;delDevice&#039;&#039;&#039;&lt;br /&gt;
:;serial: the serial number of the device, e.g. 00-90-33-01-02-03&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;example success: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:true }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:;example error: &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{ &amp;quot;success&amp;quot;:false, &amp;quot;error&amp;quot;:&amp;quot;the project with ID 123456 doesn&#039;t exist&amp;quot; }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Get the warranty of a device===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters&lt;br /&gt;
:;cmd: &#039;&#039;&#039;getWarranty&#039;&#039;&#039;&lt;br /&gt;
:;serial: the serial number of the device, e.g. 00-90-33-01-02-03&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;warranty: a unix timestamp in seconds since 1970 (timezone Europe/Berlin), e.g. &#039;&#039;&#039;1448492400&#039;&#039;&#039;&lt;br /&gt;
:;warrantyStr: a string like &#039;&#039;&#039;&amp;quot;2015-11-26 00:00:00&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Create a new project===&lt;br /&gt;
;HTTP GET parameters:&lt;br /&gt;
:;general parameters: you must use the project_id and trust value of an already existing project!&lt;br /&gt;
:;cmd: &#039;&#039;&#039;createProject&#039;&#039;&#039;&lt;br /&gt;
:;project_name: the name of the new project&lt;br /&gt;
:;[project_desc]: optional, a description for the new project&lt;br /&gt;
:;[update_url]: optional, an update URL for the project (do not forget to URL encode the value inside your HTTP GET request!)&lt;br /&gt;
:;[ssa_due_date]: optional, a unix timestamp in seconds since 1970 (timezone Europe/Berlin), e.g. &#039;&#039;&#039;1448492400&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Return value: a JSON object is returned&lt;br /&gt;
:;success: boolean, either &#039;&#039;&#039;true&#039;&#039;&#039; or &#039;&#039;&#039;false&#039;&#039;&#039;&lt;br /&gt;
:;error: string, a string with an error. Just existent if success is false&lt;br /&gt;
:;projectId: the project id of the created project&lt;br /&gt;
&lt;br /&gt;
 The newly created project is created with the same trust value which was used for the creation request. This allows you to directly use the API with the new project.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
===Smaller issues===&lt;br /&gt;
* Devices where imported into a project with SSA. If this happened to you, please move the corresponding devices into a project &#039;&#039;&#039;without&#039;&#039;&#039; SSA and back into the project &#039;&#039;&#039;with&#039;&#039;&#039; SSA to extend/add SSA for the licenses until the SSA end date.&lt;br /&gt;
* IE7 moves a list under the menu, when a list becomes to wide&lt;br /&gt;
===Licenses don&#039;t work on a device, where an invalidation has been done===&lt;br /&gt;
A possible reason here is, that the invalidation process hasn&#039;t been completed.&lt;br /&gt;
To resolve this issue, follow these steps:&lt;br /&gt;
&lt;br /&gt;
* Download the Confirmation File (Certificate) from http://my.innovaphone.com under [[#Invalidation|Invalidation]] after selecting the project and the device&lt;br /&gt;
* Open [[Reference9:General/License/my.innovaphone|General-&amp;gt;License-&amp;gt;my.innovaphone.com]] on your device&lt;br /&gt;
* Click on &amp;quot;Invalidate&amp;quot; (no my.innovaphone credentials needed)&lt;br /&gt;
* Upload the previously downloaded confirmation file newcert-00-90-33-xx-xx-xx.xml as &amp;quot;Confirmation file&amp;quot;&lt;br /&gt;
* Reset the box&lt;br /&gt;
* Reupload the licenses&lt;br /&gt;
&lt;br /&gt;
===Internet Explorer doesn&#039;t work===&lt;br /&gt;
Yes, that&#039;s correct. Please use an up to date version of Chrome, Firefox or Edge!&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=77318</id>
		<title>Reference16r1:Concept innovaphone App Platform Container</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference16r1:Concept_innovaphone_App_Platform_Container&amp;diff=77318"/>
		<updated>2025-07-16T06:52:14Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Environment Variables (ENVs) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME|reason=Below described feature is experimental and not officially supported for use in productive environments.}}&lt;br /&gt;
The innovaphone App Platform Docker container provides a myApps App Platform instance that includes the AP Manager, Webserver and PostgreSQL. This container offers a ready-to-use environment for myApps applications and the innovaphone PBX.&lt;br /&gt;
&lt;br /&gt;
==Image Information==&lt;br /&gt;
&lt;br /&gt;
This chapter provides details about the Docker image used for the innovaphone App Platform.&lt;br /&gt;
&lt;br /&gt;
===Repository Details===&lt;br /&gt;
&lt;br /&gt;
;Repository Host : docker.innovaphone.com&lt;br /&gt;
;Image Name : cloud/kubernetes/innovaphone-platform-instance&lt;br /&gt;
&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
===Tagging and Versioning===&lt;br /&gt;
The image is usually tagged with the build number according to innovaphone software releases:&lt;br /&gt;
&lt;br /&gt;
;Latest Tag : Use the latest tag for pulling the most recent service release.&lt;br /&gt;
&lt;br /&gt;
;Release Build Number : For production or version-specific deployments, use a specific build number as the tag (e.g., 130006).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker pull docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
===Supported Architecture===&lt;br /&gt;
This Docker image supports the &amp;lt;code&amp;gt;linux/amd64&amp;lt;/code&amp;gt; architecture.&lt;br /&gt;
&lt;br /&gt;
===Image Reference===&lt;br /&gt;
An example of a full image reference using a specific release build number would be:&lt;br /&gt;
 docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
==Ports==&lt;br /&gt;
This chapter outlines the various ports exposed by the Docker container. The webserver ports are available immediately upon container startup, after start of the AP Manager and the Webserver, while the additional application ports become active after the app installation. In most cases, a one-to-one mapping is used, meaning the container port is mapped directly to the same host port unless otherwise specified.&lt;br /&gt;
&lt;br /&gt;
===Webserver Ports===&lt;br /&gt;
;HTTP:&lt;br /&gt;
Container Port: 8080&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
;HTTPS:&lt;br /&gt;
Container Port: 8082&lt;br /&gt;
Description: Used for accessing the built-in webserver immediately upon container startup.&lt;br /&gt;
&lt;br /&gt;
=== Additional Application Ports===&lt;br /&gt;
Following additional container ports are avilable depending on installed and configured applications:&lt;br /&gt;
;H323/TLS : 1300&lt;br /&gt;
;SIP : 5060&lt;br /&gt;
;SIPS : 5061&lt;br /&gt;
;LDAPS : 1636&lt;br /&gt;
;SMTP : 8025&lt;br /&gt;
;SMTPS : 8587&lt;br /&gt;
&#039;&#039;&#039;Additional hint for Portmapping&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d \&lt;br /&gt;
  --name=innovaphone \&lt;br /&gt;
  --restart unless-stopped \&lt;br /&gt;
  -p 9090:8080 \        #Container Host Port (external) 9090:8080 Container Port&lt;br /&gt;
  -p 9091:8082 \&lt;br /&gt;
  -p 5060:5060 \&lt;br /&gt;
  -p 5061:5061 \&lt;br /&gt;
  -p 1300:1300 \&lt;br /&gt;
  -p 1636:1636 \&lt;br /&gt;
  -p 8025:8025 \&lt;br /&gt;
  -p 8587:8587 \&lt;br /&gt;
  -v /path/of/data/innovaphone:/mnt/data \      #in this path you will find Apps, DBs &amp;amp; Logs&lt;br /&gt;
                                                #this path musst be used for backups!!&lt;br /&gt;
  -e WEBSERVERPORTHTTP=8080 \&lt;br /&gt;
  -e WEBSERVERPORTHTTPS=8082 \&lt;br /&gt;
  -e LOG_FLAGS=7 \&lt;br /&gt;
  -e LOG_SIZE=1048576 \&lt;br /&gt;
  -e DNSIPV4=8.8.8.8 \&lt;br /&gt;
  -e LIMIT_RAM=512 \        #Ram limit in MB&lt;br /&gt;
  -e LIMIT_DISK=10 \        #disk size in GB&lt;br /&gt;
  -e TZ=Europe/Berlin \&lt;br /&gt;
  docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Environment Variables (ENVs)==&lt;br /&gt;
This chapter outlines the key environment variables used to configure the behavior of the innovaphone App Platform Docker container. These variables allow you to customize logging, port settings, resource limits, and more during startup and runtime.&lt;br /&gt;
&lt;br /&gt;
;LOG_FLAGS : Defines the integer representation for the trace flags of the AP Manager, according flags activated under the AP Manager / Diagnostics. See browser console message on Save button press (e.g. &amp;quot;logFlags&amp;quot;:1 , if the &amp;quot;App&amp;quot; flag is activated).&lt;br /&gt;
 LOG_FLAGS=7&lt;br /&gt;
;LOG_SIZE : Specifies the maximum size in bytes for logs before rotation or management actions occur. Default: 5242880.&lt;br /&gt;
 LOG_SIZE=1048576&lt;br /&gt;
;WEBSERVERPORTHTTP : Sets the in-container HTTP port for the webserver. Default: 8080.&lt;br /&gt;
 WEBSERVERPORTHTTP=8080&lt;br /&gt;
;WEBSERVERPORTHTTPS : Sets the in-container HTTPS port for the webserver. Default: 8082.&lt;br /&gt;
 WEBSERVERPORTHTTPS=8443&lt;br /&gt;
;DNSIPV4 : Specifies the in-container IPv4 address for DNS resolution. Overrides the deafult container runtime DNS server.&lt;br /&gt;
 DNSIPV4=8.8.8.8&lt;br /&gt;
;LIMIT_RAM : Sets the RAM limit for the container, in MB, controlling how much memory it may consume. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_RAM=512&lt;br /&gt;
;LIMIT_DISK : Defines the disk space limit in GB for the container to manage storage consumption. Used by AP Manager to stop the app instances on overconsumption.&lt;br /&gt;
 LIMIT_DISK=10&lt;br /&gt;
;MANAGER_DB_HOST : defines an external database host for the database of the App Platform Manager&lt;br /&gt;
If you hand database settings, the container will work without the local database server and doesn&#039;t need any storage at all (under development).&lt;br /&gt;
 MANAGER_DB_HOST=172.16.14.35:5432 (port is optional)&lt;br /&gt;
;MANAGER_DB_NAME : the external database name&lt;br /&gt;
 MANAGER_DB_NAME=databasename&lt;br /&gt;
;MANAGER_DB_USER : the external database user who has access&lt;br /&gt;
 MANAGER_DB_USER=databaseuser&lt;br /&gt;
;MANAGER_DB_PASSWORD : the password of the user&lt;br /&gt;
 MANAGER_DB_PASSWORD=o1kk2hj312k3&lt;br /&gt;
;DB_PROVISIONER_URL : a websocket URL to an external DBProvisioner App which is used to provide databases&lt;br /&gt;
 DB_PROVISIONER_URL=wss://domain.com/domain.com/dbprovisioner&lt;br /&gt;
&lt;br /&gt;
==Volumes and Mounts==&lt;br /&gt;
This container uses a dedicated internal mount path for the persistent data management across container restarts and updates.&lt;br /&gt;
&lt;br /&gt;
===Internal Data Volume===&lt;br /&gt;
;Mount Path : &amp;lt;code&amp;gt;/mnt/data&amp;lt;/code&amp;gt;&lt;br /&gt;
;Contents:&lt;br /&gt;
*Apps: Installed application binaries.&lt;br /&gt;
*Databases: PostgreSQL files.&lt;br /&gt;
*Logging: Log files for system and application events.&lt;br /&gt;
&lt;br /&gt;
===Mounting===&lt;br /&gt;
To ensure that your data is preserved, map a host directory or Docker named volume to the container&#039;s /mnt/data path when running the container.&lt;br /&gt;
For example:&lt;br /&gt;
 docker run -d -v /path/on/host:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:130006&lt;br /&gt;
&lt;br /&gt;
This setup guarantees that your apps, associated data, databases, and logs persist independently of the container lifecycle.&lt;br /&gt;
&lt;br /&gt;
==Entrypoint==&lt;br /&gt;
The container uses a fixed entrypoint:&lt;br /&gt;
 ENTRYPOINT [&amp;quot;/entrypoint.sh&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
This script prepares the container and starts the AP Manager executable.&lt;br /&gt;
&lt;br /&gt;
==Logging and Monitoring==&lt;br /&gt;
The log of the entrypoint.sh and of the AP manager is avilable as conatiner output. The installed applications store the ir log files under &amp;lt;code&amp;gt;/mnt/data/var/log/apps/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Usage Example==&lt;br /&gt;
 sudo docker run -d --restart unless-stopped --name innovaphoneAP -p 9090:8080 -p 9091:8082 -e WEBSERVERPORTHTTP=8080 -e WEBSERVERPORTHTTPS=8082 -v $(pwd)/myapps/:/mnt/data docker.innovaphone.com/cloud/kubernetes/innovaphone-platform-instance:latest&lt;br /&gt;
&lt;br /&gt;
This command runs the container in detached mode with automatic restart. It names the container innovaphoneAP, maps host ports 9090 and 9091 to the container&#039;s HTTP and HTTPS ports, sets the webserver port environment variables, mounts a host directory to /mnt/data, and starts the AP Manager. After container start up the AP manager web UI is accessible via &amp;lt;code&amp;gt;http://localhost:9090&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;https://localhost:9091&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Devices&amp;diff=77282</id>
		<title>Reference15r1:Concept App Service Devices</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Devices&amp;diff=77282"/>
		<updated>2025-07-04T12:11:33Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Sample phoneplatform.json */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
The App Service Devices is an App Service which can be installed on an innovaphone App Platform. It is used to administrate the innovaphone devices which belong to the whole installation.&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX from version 13r1&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
=== Devices App (innovaphone-devices) ===&lt;br /&gt;
This is the standard UI App for Devices.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Websocket: to publish the com.innovaphone.devicesui-API, which can be used to link directly to devices (which is done e.g. inside the Events app)&lt;br /&gt;
&lt;br /&gt;
=== Devices API (innovaphone-devices-api) ===&lt;br /&gt;
This is a hidden App, which provides the Devices API (com.innovaphone.devices). This API can be used to find and communicate with devices which are registered to the Devices App.&lt;br /&gt;
&lt;br /&gt;
Additionally it acts as a provider of the Search API (com.innovaphone.search). So you can find devices and domains in other apps like the Search App.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Hidden: DevicesApi must be a hidden App&lt;br /&gt;
;Websocket: to get the URL of the Devices App itself which is used for provisioning&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
=== Devices ===&lt;br /&gt;
&lt;br /&gt;
With the Devices plugin App objects can be created, edited and deleted for Devices and the Devices API on the PBX.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
All innovaphone hard phones and gateways starting from version 13r1 can establish a registration inside the Devices App and therefor administrative tasks can be performed through the App.&lt;br /&gt;
&lt;br /&gt;
=== Domains ===&lt;br /&gt;
&lt;br /&gt;
In a hosted environment, it might be needed to add multiple domains to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
After the initial installation of Devices through Install, you have administrative rights and can add more domains. &lt;br /&gt;
&lt;br /&gt;
==== Administrative rights ====&lt;br /&gt;
You have administrative rights if the configured PBX App object for Devices uses the password of the instance which is configured in the Manager App and the PBX uses the same domain as this instance.&lt;br /&gt;
&lt;br /&gt;
==== Domain local rights ====&lt;br /&gt;
You have just rights to a certain domain if the configured PBX App object for Devices uses the domain password which can be configured in Devices for each domain and the PBX uses the same domain name as configured in Devices.&lt;br /&gt;
&lt;br /&gt;
==== Assign rights to other domains ====&lt;br /&gt;
Domains can gain access to other domains by configuring these access rights in the Devices App.&lt;br /&gt;
&lt;br /&gt;
==== Deploy passwords and access rights ====&lt;br /&gt;
During install, a domain is created inside the Devices App. There is a checkmark Deploy the domain password on all devices which is set by default and which is the same as the administrative password.&lt;br /&gt;
If you change the domain password, all passwords on all administrative devices and app platforms which are connected to this domain will be also changed.&amp;lt;br/&amp;gt;&lt;br /&gt;
Since 13r2sr25/13r3sr7/14rx: devices which are auto provisioned or provisioned through the Profile/Users Admin App will get a random password instead of the domain password.&lt;br /&gt;
If you add a phone device manually to a domain inside the Devices App, this phone device will also get a random password. Other device types added manually or devices added with a provisioning code which has been created within the Devices App directly, will get the domain password instead.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This will also set the manager password and the SSH passwords of App Platforms.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The clear text random passwords can be requested and viewed in the settings of a device in the Devices App.&lt;br /&gt;
&lt;br /&gt;
 Attention: If you untick the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark, the password won&#039;t be deployed anymore, but also not reconfigured to the default password!&lt;br /&gt;
&lt;br /&gt;
 Attention: After each reconnect of a client, the password will be deployed again.&lt;br /&gt;
 This means, if the checkmark is set and you set another password somewhere else (e.g. under General::Admin),&lt;br /&gt;
 this password will be just valid until the next reboot or reconnect to the Devices App!&lt;br /&gt;
&lt;br /&gt;
;Create new random passwords&lt;br /&gt;
You can rollout new random passwords by unticking the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark and ticking it again.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Devices with multiple domains (Cloud)&lt;br /&gt;
In a hosted environment, you can use the Devices App with multiple domains. The corresponding instance of Devices has a configured domain and an instance password set inside the manager.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hosting PBX has a domain inside Devices with a specific password.&amp;lt;br&amp;gt;&lt;br /&gt;
If this domain name matches the instance domain of the Devices instance and the password matches either the instance password or the domain password, you will be logged in as admin and have access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each newly created domain has its own password inside Devices. If you create an App Object inside a PBX with this domain and the password of this domain (inside Devices), you will just have access to this single domain.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Devices also has the possibility to grant access to other domains for a specific domain.&lt;br /&gt;
&lt;br /&gt;
=== Categories ===&lt;br /&gt;
&lt;br /&gt;
There are two types of categories:&lt;br /&gt;
* provisioning category: used for device configurations and provisioning&lt;br /&gt;
* standard category: used for update/backup jobs and device management&lt;br /&gt;
&lt;br /&gt;
Each device can have just a &#039;&#039;&#039;single&#039;&#039;&#039; provisioning category, as it receives it&#039;s configuration by all configured device configurations for this provisioning category.&lt;br /&gt;
&lt;br /&gt;
In addition, a provisioning category, which is used inside an analogue phone/phone device configuration &#039;&#039;&#039;cannot&#039;&#039;&#039; be used to provision a gateway.&lt;br /&gt;
&lt;br /&gt;
=== Device connections ===&lt;br /&gt;
The Devices registration is done through a websocket connection to the webserver of the App Platform and the Devices instance (standard HTTP/s port).&amp;lt;br&amp;gt;&lt;br /&gt;
The URL used can be configured manually under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration] or through a new provisioning mechanism.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A binary protocol is used to transfer information between the device and the devices App. The MAC address is the unique key to identify a device.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a device is added to a domain in Devices, the device gets a unique random password. Without such a password, a device shows up as &#039;&#039;&#039;unassigned&#039;&#039;&#039; in the Devices app.&lt;br /&gt;
This is also the case after a long reset or when the device lost its configuration.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In such a case, the device has to be manually added again to a domain or it has to be provisioned again.&lt;br /&gt;
&lt;br /&gt;
 If a device is not assigned to a domain or provisioning category, it won&#039;t receive any configurations.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registrations ====&lt;br /&gt;
See [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration]&lt;br /&gt;
&lt;br /&gt;
==== Second Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The firmware has a second SYSCLIENT2 module, which can be configured to point to a different Devices instance and the AP Manager also has a second Devices Registration URL.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you use this configuration option, you should take care and consider:&lt;br /&gt;
&lt;br /&gt;
* if the Devices domain from the second configuration provides a password for all devices, the password is ignored, as it would lead to inconsistend passwords otherwise (from 13r1 SR12 on)&lt;br /&gt;
* the Devices domain from the second configuration should not provide Devices Configurations or Update Jobs as these might collide with configurations from the first Devices instance!&lt;br /&gt;
&lt;br /&gt;
Generally, only one of the two  &#039;&#039;Devices&#039;&#039;  App instances connected to the device must apply changes to the device.&lt;br /&gt;
&lt;br /&gt;
 We strongly discourage the usage of this second configuration option due to unexpected behaviour if incorrectly used!&lt;br /&gt;
 Never use the second URL if you use software or hardware rental!&lt;br /&gt;
&lt;br /&gt;
==== Device information ====&lt;br /&gt;
&lt;br /&gt;
The following data is transferred:&lt;br /&gt;
* MAC address&lt;br /&gt;
* device type (e.g. IPVA, AppPlatform, IP112)&lt;br /&gt;
* IP addresses (IPv4, IPv6)&lt;br /&gt;
* version (not searchable)&lt;br /&gt;
&lt;br /&gt;
You can also search for this data inside the devices tab in the App.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==== Device Advanced UI ====&lt;br /&gt;
By default, Devices administrators and non admins can access the advanced UI of any device without limitations.&amp;lt;br/&amp;gt;&lt;br /&gt;
In certain scenerios (e.g. Cloud), you may want to restrict this access to just the PBX on gateways and IPVAs for non adminstrative users, which just have access to certain domains.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
In this case, you can set the corresponding checkmark in the device settings tab of the specific device.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the flag is set, just the PBX tab of the advanced UI is accessible for non administrative Devices users.&lt;br /&gt;
&lt;br /&gt;
 Technically this means, that every HTTP request is checked if it starts with PBX0 and if not, the request is rejected with 401 unauthorized.&lt;br /&gt;
&lt;br /&gt;
If the device can be accessed directly without Devices, you may need a reverse proxy in between to filter HTTP requests.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Provisioning ===&lt;br /&gt;
Devices can be added by provisioning (both phones and gateways). &lt;br /&gt;
The standard online provisioning looks like this:&lt;br /&gt;
* a user or administrator creates a provisioning code in the Devices or Users App (this stores the Devices URL on the provisioning server side)&lt;br /&gt;
* a device with 13r1 or newer is connected to the network after a long reset&lt;br /&gt;
* the provisioning code has to be entered within one hour (after one hour, the Update URL isn&#039;t polled anymore)&lt;br /&gt;
* the device sends this code to config.innovaphone.com and retrieves the Devices URL&lt;br /&gt;
* the device connects to the Devices URL and is added to the domain where the code has been created&lt;br /&gt;
&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Offline_Provisioning offline provisioning mode].&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Provisioning#Automatic_provisioning automatic provisioning mode].&lt;br /&gt;
&lt;br /&gt;
 Note: provisioning is cancelled if the device already belongs to another domain in the same Devices instance! This prevents the unauthorized move of a device between different domains.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The Devices Registration URL which is set through the provisioning process, always starts with &#039;&#039;&#039;wss&#039;&#039;&#039;. This is not dependent anymore on the App URL which is configured inside the PBX Devices App object.&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
The Devices App can be used to rollout updates.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSON files ====&lt;br /&gt;
The update files have to be acccessible on a webserver without authentication and four json files are used:&lt;br /&gt;
* firmware.json: innovaphone device firmware&lt;br /&gt;
* apps.json: Apps for the App Platform&lt;br /&gt;
* software.json: contains software for DECT handsets&lt;br /&gt;
** just IP64 and IP65 are used and supported&lt;br /&gt;
* phoneplatform.json: contains the phone platform image for e.g. the IP270&lt;br /&gt;
&lt;br /&gt;
You can either use the standard innovaphone App Store for these files or your own local webserver.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update jobs ====&lt;br /&gt;
You can configure several update jobs with different categories to organize your updates.&amp;lt;br&amp;gt;&lt;br /&gt;
Update jobs are always sequentially processed and inside one update job, just &#039;&#039;&#039;20&#039;&#039;&#039; devices are updated at the same time.&lt;br /&gt;
&lt;br /&gt;
==== Device update check after the update job has been already executed====&lt;br /&gt;
If a device goes online, the newest suitable update job is searched for this device (depending on the categories).&amp;lt;br&amp;gt;&lt;br /&gt;
If an update job is found, the update is just performed, if there has been &#039;&#039;&#039;no&#039;&#039;&#039; successfull update for this device in this job before and the version does not match (simply string compare).&lt;br /&gt;
&lt;br /&gt;
====Update errors====&lt;br /&gt;
If an update fails, the Devices App shows an error. You may have to enable further tracing on the updated device itself to find out the reason of the failure.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 module and take a look at the events which may already tell you the reason&lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
 An update job is retried &#039;&#039;&#039;two&#039;&#039;&#039; times if updates inside this job failed. The retry is done &#039;&#039;&#039;ten&#039;&#039;&#039; minutes after the update job finished previously.&lt;br /&gt;
&lt;br /&gt;
====innovaphone myApps====&lt;br /&gt;
The path to the App Store and the used innovaphone myApps version is updated to the version of the gateway on gateways with an enabled PBX after a successfull update.&amp;lt;br&amp;gt;&lt;br /&gt;
This configuration can be found [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:PBX/Config/myApps here]&lt;br /&gt;
&lt;br /&gt;
Inside the configuration on an update job, the flag &amp;quot;Do not update myApps launcher software&amp;quot; disables the update of the innovaphone myApps version inside PBXes.&lt;br /&gt;
&lt;br /&gt;
====DECT handsets====&lt;br /&gt;
If you check the update DECT handsets checkmark, all DECT devices will be configured to rollout updates to DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
The DECT handset firmware will be searched inside the configured software.json.&lt;br /&gt;
&lt;br /&gt;
=== Backups ===&lt;br /&gt;
The Devices App can be used to backup the configuration and data of Apps and devices.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Webserver requirements====&lt;br /&gt;
Backups are stored on a webserver with or without Digest/Basic authentication and with the &#039;&#039;&#039;webdav PUT&#039;&#039;&#039; method.&lt;br /&gt;
&lt;br /&gt;
====Backup jobs====&lt;br /&gt;
Backup jobs are executed sequentially. Inside one backup job, just &#039;&#039;&#039;20&#039;&#039;&#039; backups are performed at the same time.&lt;br /&gt;
&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
The configuration file is stored. Therefor the Devices App tells the device to store the configuration with a !mod cmd UP0 /sync prot URL.&lt;br /&gt;
&lt;br /&gt;
====Apps on an App Platform====&lt;br /&gt;
The databases of all existing instances and the manager are stored.&amp;lt;br&amp;gt;&lt;br /&gt;
Each installed App Service can have multiple instances and each App instance has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
A database contains &#039;&#039;&#039;both&#039;&#039;&#039; configuration and data of an App instance! &amp;lt;br&amp;gt;&lt;br /&gt;
The manager database contains the webserver certificate and further manager related configuration settings.&lt;br /&gt;
&lt;br /&gt;
The Devices App establishes a websocket connection to the manager and tells the manager where to store the backups.&amp;lt;br&amp;gt;&lt;br /&gt;
The manager on the backuped App Platform itself performs the HTTP requests to store the files.&lt;br /&gt;
&lt;br /&gt;
====Backup errors====&lt;br /&gt;
If a backup fails, the Devices App shows an error. You may have to enable further tracing on the backuped device itself to find out the reason of the failure.&lt;br /&gt;
&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 &lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
=== Restore ===&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
Just as always under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Administration/Upload/Config Upload Config].&lt;br /&gt;
&lt;br /&gt;
====Apps====&lt;br /&gt;
The App Service itself has to be installed on the App Platform prior restoring of a single instance.&amp;lt;br&amp;gt;&lt;br /&gt;
The restoring is done in the Manager App on the App Platform itself.&amp;lt;br&amp;gt;&lt;br /&gt;
The intance settings, the configuration and data are restored in a single process.&lt;br /&gt;
&lt;br /&gt;
=== Device Configurations ===&lt;br /&gt;
&lt;br /&gt;
You can define several device configurations. These configurations are either applied to all devices inside this domain or to selected categories.&amp;lt;br/&amp;gt;&lt;br /&gt;
Configurations are applied on creation and on every reconnect of a matching device.&lt;br /&gt;
&lt;br /&gt;
==== Transfer checkmarks ====&lt;br /&gt;
&lt;br /&gt;
Some configuration options have a specific checkmark to enable the transfer of the option.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* Checkmark disabled:&lt;br /&gt;
** configuration option field(s) are disabled &lt;br /&gt;
** option values are &#039;&#039;&#039;not&#039;&#039;&#039; transferred at all&lt;br /&gt;
* Checkmark enabled:&lt;br /&gt;
** configuration option field(s) are enabled&lt;br /&gt;
** option values are transferred, even if field values are empty&lt;br /&gt;
&lt;br /&gt;
==== Expert configuration ====&lt;br /&gt;
&lt;br /&gt;
The expert configuration can be used to configure different settings which are not available inside the other device configurations.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can use the standard syntax of an update server script (see [[ {{NAMESPACE}}:Concept_Update_Server | Concept Update Server ]] for a general overview and the section on [[Howto:PHP_based_Update_Server_V2#Hints_for_writing_your_update_snippets | Hints for writing your update snippets ]] (note that the remainder of this article relates to the now deprecated old mechanism, so please disregard the rest)).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Some hints:&lt;br /&gt;
* the expert configuration is just executed once after a device restarted and on change of the expert configuration itself&lt;br /&gt;
* the expert configuration is executed after all other device configuration types, so that you can override changes&lt;br /&gt;
* to make configuration changes effective, you may also need to issue a final &#039;&#039;config write&#039;&#039;, &#039;&#039;config activate&#039;&#039; and &#039;&#039;iresetn&#039;&#039; command (see the [[ {{NAMESPACE}}:Concept_Update_Server#Check_command | &#039;&#039;check&#039;&#039; command]] for details)&lt;br /&gt;
* some commands shouldn&#039;t be used inside the script:&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Times_command |&#039;&#039;times&#039;&#039;]]: since the expert configuration is executed only once after a reboot of the device and when changes are made, it does not make sense to use the &#039;&#039;times&#039;&#039; command&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Prot_command |&#039;&#039;prot&#039;&#039;]]|[[ {{NAMESPACE}}:Concept_Update_Server#Boot_command |&#039;&#039;boot&#039;&#039;]]: use an update job instead&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Scfg_command |&#039;&#039;scfg&#039;&#039;]]: use a backup job instead&lt;br /&gt;
** [[Howto:PHP_based_Update_Server_V2#Using_vars_create|&#039;&#039;vars create&#039;&#039;]]: this cmd will always raise the &#039;&#039;reset needed condition&#039;&#039; and the aforementioned &#039;&#039;iresetn&#039;&#039; command would always execute therefore.  As a result, the devices would enter a boot loop.  Be sure to avoid this using an appropriate [[ {{NAMESPACE}}:Concept_Update_Server#Check_command |&#039;&#039;check&#039;&#039; command ]] and update its &#039;&#039;&amp;lt;serial&amp;gt;&#039;&#039; properly whenever the expert configuration is changed&lt;br /&gt;
&lt;br /&gt;
==== Certificates configuration ====&lt;br /&gt;
You can use this configuration to rollout certificates to the trust list of your devices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Manual upload certificates.&lt;br /&gt;
* Configure up to five URLs which are polled every 24 hours. They must return files with PEM formatted public keys (one or more) which are then rolled out.&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/innovaphone.pem to always have the innovaphone public keys in your trust list (e.g. used for our push service).&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca.pem to always have the innovaphone Device Certification Authority certificates in your trust list.&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca-unverified.pem to always have the innovaphone Unverified Device Certification Authority certificates in your trust list.&lt;br /&gt;
** The Unverified CA is used for non hardware devices, e.g. IPVAs, which are not shipped with an official innovaphone Device Certification Authority certificate, as innovaphone has no control over the serial number here.&lt;br /&gt;
&lt;br /&gt;
 Using this configuration, the trust list can only be managed through &#039;&#039;Devices&#039;&#039; because it is cleared before each rollout.&lt;br /&gt;
&lt;br /&gt;
==== DECT Handsets ====&lt;br /&gt;
&lt;br /&gt;
This configuration can be used to configure specific options like language, voicemail number etc. for DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* all DECT devices like IP1202, IP1203 etc. will receive this configuration (of course just if the configured categories match)&lt;br /&gt;
* Devices configures a URL like https://domain.com/domain.com/devices/parameters/id.xml on the specific DEVMANBW module.&lt;br /&gt;
* This file is then polled by the basestations and the read values are transfered to the DECT handsets.&lt;br /&gt;
* see [[{{NAMESPACE}}:IP1202/IP1203_DECT_System#Configuration_of_Handset_parameters]]&lt;br /&gt;
&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
=== Software rental ===&lt;br /&gt;
Regarding the Software Rental program and the Payment Method, please refer to:&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_Software_Rental|Concept Software Rental]]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
Software rental can be done for innovaphone Cloud installations or for software, which operates on the customer premisis. This could eventually be customer owned hardware or a privat virtual machine, managed by the customer.&lt;br /&gt;
&lt;br /&gt;
==== Hardware licenses ====&lt;br /&gt;
Hardware licenses have to be bound on the specific device in my.innovaphone itself and currently can&#039;t be handled within the Devices App itself. So you also need to download the licenses from my.innovaphone and upload them on the device with the already known methods.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses with software rental =====&lt;br /&gt;
If your device has software rental licenses, you can bind hardware licenses within my.innovaphone in the software rental project itself.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses without software rental =====&lt;br /&gt;
If your device does not have software rental licenses, you should bind hardware licenses in a separate non rental project in my.innovaphone.&lt;br /&gt;
&lt;br /&gt;
==== innovaphone Cloud ====&lt;br /&gt;
Inside the innovaphone Cloud, you just have to upload your activation keys with iSCs to add licenses to one or more gateways.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Email expiry notifications ====&lt;br /&gt;
You will receive an email notification if the rental of a project expires. This notification will be sent &#039;&#039;&#039;seven&#039;&#039;&#039; weeks before the expiry and then once a week until the rental expires.&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure one or more email recipients in the domain settings.&amp;lt;br&amp;gt;&lt;br /&gt;
If no email address is configured, the email address of the logged in user account is used.&lt;br /&gt;
&lt;br /&gt;
==== History ====&lt;br /&gt;
You can download the history in the Devices App. You&#039;ll get a CSV file (semicolon separated). The date and number format depends on the selected language in the UI.&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an API available for automated downloas, which is described [[ {{NAMESPACE}}:Concept_App_Service_Devices#API_to_download_rental_history|here ]].&lt;br /&gt;
&lt;br /&gt;
====Own installation====&lt;br /&gt;
Inside your own installation, you have to register a new my.innovaphone account or you can use an existing account inside the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
One domain inside Devices belongs to one project inside your my.innovaphone company, so you can handle multiple domains with one my.innovaphone account.&lt;br /&gt;
&lt;br /&gt;
====Technical aspects====&lt;br /&gt;
A new rental expiration date is calculated on each license or balance change in the domain.&amp;lt;br&amp;gt;&lt;br /&gt;
So after each change new licenses with a new date are transfered to the gateways and also stored in the Devices App itself.&amp;lt;br&amp;gt;&lt;br /&gt;
If the rental expires, the gateway reboots and the licenses are not available anymore.&amp;lt;br&amp;gt;&lt;br /&gt;
The licenses are also transfered after each reconnect of a gateway to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For license and balance changes, the Devices App must be online and have access to my.innovaphone.com!&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
You have to add (use the + symbol) a PBX and select all licenses you want to rent.&amp;lt;br&amp;gt;&lt;br /&gt;
Use the &#039;&#039;&#039;apply&#039;&#039;&#039; button to really bind these licenses. Without usage of the apply button, you can just see a precalculation of the iSCs/month and the rental end date, but nothing is really charged from your balance.&lt;br /&gt;
&lt;br /&gt;
===Change of IP address/DNS name in PBX object===&lt;br /&gt;
If the IP address or DNS name inside the PBX object of the Devices App changes, all currently connected clients get a new Devices Registration URL and also all clients, which connect afterwards with the old host name.&lt;br /&gt;
&lt;br /&gt;
== Appendix ==&lt;br /&gt;
=== Sample firmware.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;devices&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP101&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP102&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1060&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP111&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP112&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1130&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1260&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP150&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP2000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP200A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP22&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP222&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP230&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP232&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP24&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP240&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP241&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP29&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP302&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP305&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP311&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP411&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP800&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP810&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP811&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IPVA&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;versions&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;text&amp;quot;: &amp;quot;13r1 dvl [131705]&amp;quot;, &amp;quot;wiki&amp;quot;: &amp;quot;&amp;quot; }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample apps.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;apps&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;Apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;The Apidemo&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;AppStore&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;AppStore&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample software.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;software&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myapps.apk&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Android&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Android&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myAppsSetup.msi&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Windows&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Windows&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample phoneplatform.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;arm64&amp;quot;,&lt;br /&gt;
            &amp;quot;text&amp;quot;: &amp;quot;Phone Platform&amp;quot;,&lt;br /&gt;
            &amp;quot;file&amp;quot;: &amp;quot;phone-platform.img&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;yocto2&amp;quot;,&lt;br /&gt;
            &amp;quot;version&amp;quot;: &amp;quot;2063&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;devices&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;IP270&amp;quot;,&lt;br /&gt;
            &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
                &amp;quot;arm64&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API to download rental history ===&lt;br /&gt;
&lt;br /&gt;
You can download the history as a UTF-8 CSV file with simple &#039;&#039;&#039;HTTP GET&#039;&#039;&#039; requests with &#039;&#039;&#039;digest&#039;&#039;&#039; authentication.&amp;lt;br&amp;gt;&lt;br /&gt;
The CSV file uses the semicolon as delimiter.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The URL to download the history is e.g.:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?...&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 You can find this path by editing the instance in the AP manager.&lt;br /&gt;
 In the listed paths, you&#039;ll find something which ends with csvapi&lt;br /&gt;
&lt;br /&gt;
In the innovaphone Cloud environment, the URL can be retrieved by taking a look at the Devices App object inside the cloud PBX and replacing the ending &#039;&#039;&#039;innovaphone-devices&#039;&#039;&#039; with &#039;&#039;&#039;csvapi&#039;&#039;&#039; inside the App URL, so it looks e.g. like this:&lt;br /&gt;
&lt;br /&gt;
 https://cloud-apps0.innovaphone.com/cloud.innovaphone.com/devices/csvapi&lt;br /&gt;
&lt;br /&gt;
====CSV columns====&lt;br /&gt;
Most columns should be self explaining, but the column &#039;&#039;&#039;invoice reference&#039;&#039;&#039; refers to a value which you can configure manually in the domain settings in the Devices App!&lt;br /&gt;
&lt;br /&gt;
====Digest authentication====&lt;br /&gt;
You can login with two different username/password combinations, while the domain is the digest username:&lt;br /&gt;
&lt;br /&gt;
* If you use the domain and password of your Devices App instance inside the AP Manager, you have automatically access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
* If you use the domain name of any domain as digest username and the configured domain password, you&#039;ll have access to this domain and all domains to which this domain has access to&lt;br /&gt;
&lt;br /&gt;
====Query parameters====&lt;br /&gt;
The following query parameters can be used (don&#039;t forget to URL encode the parameter values, if neccessary!):&lt;br /&gt;
* all: if &#039;&#039;&#039;1&#039;&#039;&#039; or &#039;&#039;&#039;true&#039;&#039;&#039;, the history is queried for all domains where the digest user has access to&lt;br /&gt;
* domain: required, if &#039;&#039;all&#039;&#039; is not set&lt;br /&gt;
* lang: the output language of the CSV file, which also controls date and number formats, e.g. &#039;&#039;&#039;en&#039;&#039;&#039;, &#039;&#039;&#039;de&#039;&#039;&#039;, ...&lt;br /&gt;
* tz: the timezone for dates, e.g. &#039;&#039;&#039;Europe/Berlin&#039;&#039;&#039;&lt;br /&gt;
* type: two types are available:&lt;br /&gt;
** &#039;&#039;&#039;history&#039;&#039;&#039;: history which contains changes&lt;br /&gt;
** &#039;&#039;&#039;overview&#039;&#039;&#039;: a monthly overview with the iSC costs at the first of the last months&lt;br /&gt;
* from: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
* to: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
&lt;br /&gt;
====Example requests====&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=history&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;amp;from=1601903431000&amp;amp;to=1601903385000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?all=1&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Supported DECT handsets ===&lt;br /&gt;
&lt;br /&gt;
The following handsets are supported for update jobs and the DECT handsets configuration:&lt;br /&gt;
&lt;br /&gt;
* IP64&lt;br /&gt;
* IP65&lt;br /&gt;
* D81&lt;br /&gt;
* D83&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
===SoftwarePhone===&lt;br /&gt;
The Devices App is not meant to be used with the windows SoftwarPhone standalone installation.&lt;br /&gt;
&lt;br /&gt;
== Related Articles == &lt;br /&gt;
* [[Howto:Software_Rental]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Devices&amp;diff=77281</id>
		<title>Reference15r1:Concept App Service Devices</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_App_Service_Devices&amp;diff=77281"/>
		<updated>2025-07-04T12:11:19Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Sample software.json */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|Apps]]&lt;br /&gt;
The App Service Devices is an App Service which can be installed on an innovaphone App Platform. It is used to administrate the innovaphone devices which belong to the whole installation.&lt;br /&gt;
== Applies To == &lt;br /&gt;
&lt;br /&gt;
* innovaphone PBX from version 13r1&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
=== Devices App (innovaphone-devices) ===&lt;br /&gt;
This is the standard UI App for Devices.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Websocket: to publish the com.innovaphone.devicesui-API, which can be used to link directly to devices (which is done e.g. inside the Events app)&lt;br /&gt;
&lt;br /&gt;
=== Devices API (innovaphone-devices-api) ===&lt;br /&gt;
This is a hidden App, which provides the Devices API (com.innovaphone.devices). This API can be used to find and communicate with devices which are registered to the Devices App.&lt;br /&gt;
&lt;br /&gt;
Additionally it acts as a provider of the Search API (com.innovaphone.search). So you can find devices and domains in other apps like the Search App.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
;Hidden: DevicesApi must be a hidden App&lt;br /&gt;
;Websocket: to get the URL of the Devices App itself which is used for provisioning&lt;br /&gt;
&lt;br /&gt;
== PBX Manager Plugins ==&lt;br /&gt;
&lt;br /&gt;
=== Devices ===&lt;br /&gt;
&lt;br /&gt;
With the Devices plugin App objects can be created, edited and deleted for Devices and the Devices API on the PBX.&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
All innovaphone hard phones and gateways starting from version 13r1 can establish a registration inside the Devices App and therefor administrative tasks can be performed through the App.&lt;br /&gt;
&lt;br /&gt;
=== Domains ===&lt;br /&gt;
&lt;br /&gt;
In a hosted environment, it might be needed to add multiple domains to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
After the initial installation of Devices through Install, you have administrative rights and can add more domains. &lt;br /&gt;
&lt;br /&gt;
==== Administrative rights ====&lt;br /&gt;
You have administrative rights if the configured PBX App object for Devices uses the password of the instance which is configured in the Manager App and the PBX uses the same domain as this instance.&lt;br /&gt;
&lt;br /&gt;
==== Domain local rights ====&lt;br /&gt;
You have just rights to a certain domain if the configured PBX App object for Devices uses the domain password which can be configured in Devices for each domain and the PBX uses the same domain name as configured in Devices.&lt;br /&gt;
&lt;br /&gt;
==== Assign rights to other domains ====&lt;br /&gt;
Domains can gain access to other domains by configuring these access rights in the Devices App.&lt;br /&gt;
&lt;br /&gt;
==== Deploy passwords and access rights ====&lt;br /&gt;
During install, a domain is created inside the Devices App. There is a checkmark Deploy the domain password on all devices which is set by default and which is the same as the administrative password.&lt;br /&gt;
If you change the domain password, all passwords on all administrative devices and app platforms which are connected to this domain will be also changed.&amp;lt;br/&amp;gt;&lt;br /&gt;
Since 13r2sr25/13r3sr7/14rx: devices which are auto provisioned or provisioned through the Profile/Users Admin App will get a random password instead of the domain password.&lt;br /&gt;
If you add a phone device manually to a domain inside the Devices App, this phone device will also get a random password. Other device types added manually or devices added with a provisioning code which has been created within the Devices App directly, will get the domain password instead.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
This will also set the manager password and the SSH passwords of App Platforms.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The clear text random passwords can be requested and viewed in the settings of a device in the Devices App.&lt;br /&gt;
&lt;br /&gt;
 Attention: If you untick the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark, the password won&#039;t be deployed anymore, but also not reconfigured to the default password!&lt;br /&gt;
&lt;br /&gt;
 Attention: After each reconnect of a client, the password will be deployed again.&lt;br /&gt;
 This means, if the checkmark is set and you set another password somewhere else (e.g. under General::Admin),&lt;br /&gt;
 this password will be just valid until the next reboot or reconnect to the Devices App!&lt;br /&gt;
&lt;br /&gt;
;Create new random passwords&lt;br /&gt;
You can rollout new random passwords by unticking the &#039;&#039;&#039;Deploy administrative devices passwords&#039;&#039;&#039; checkmark and ticking it again.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Devices with multiple domains (Cloud)&lt;br /&gt;
In a hosted environment, you can use the Devices App with multiple domains. The corresponding instance of Devices has a configured domain and an instance password set inside the manager.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The hosting PBX has a domain inside Devices with a specific password.&amp;lt;br&amp;gt;&lt;br /&gt;
If this domain name matches the instance domain of the Devices instance and the password matches either the instance password or the domain password, you will be logged in as admin and have access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each newly created domain has its own password inside Devices. If you create an App Object inside a PBX with this domain and the password of this domain (inside Devices), you will just have access to this single domain.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Devices also has the possibility to grant access to other domains for a specific domain.&lt;br /&gt;
&lt;br /&gt;
=== Categories ===&lt;br /&gt;
&lt;br /&gt;
There are two types of categories:&lt;br /&gt;
* provisioning category: used for device configurations and provisioning&lt;br /&gt;
* standard category: used for update/backup jobs and device management&lt;br /&gt;
&lt;br /&gt;
Each device can have just a &#039;&#039;&#039;single&#039;&#039;&#039; provisioning category, as it receives it&#039;s configuration by all configured device configurations for this provisioning category.&lt;br /&gt;
&lt;br /&gt;
In addition, a provisioning category, which is used inside an analogue phone/phone device configuration &#039;&#039;&#039;cannot&#039;&#039;&#039; be used to provision a gateway.&lt;br /&gt;
&lt;br /&gt;
=== Device connections ===&lt;br /&gt;
The Devices registration is done through a websocket connection to the webserver of the App Platform and the Devices instance (standard HTTP/s port).&amp;lt;br&amp;gt;&lt;br /&gt;
The URL used can be configured manually under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration] or through a new provisioning mechanism.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A binary protocol is used to transfer information between the device and the devices App. The MAC address is the unique key to identify a device.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If a device is added to a domain in Devices, the device gets a unique random password. Without such a password, a device shows up as &#039;&#039;&#039;unassigned&#039;&#039;&#039; in the Devices app.&lt;br /&gt;
This is also the case after a long reset or when the device lost its configuration.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In such a case, the device has to be manually added again to a domain or it has to be provisioned again.&lt;br /&gt;
&lt;br /&gt;
 If a device is not assigned to a domain or provisioning category, it won&#039;t receive any configurations.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registrations ====&lt;br /&gt;
See [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:General/Devices_Registration Devices Registration]&lt;br /&gt;
&lt;br /&gt;
==== Second Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The firmware has a second SYSCLIENT2 module, which can be configured to point to a different Devices instance and the AP Manager also has a second Devices Registration URL.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you use this configuration option, you should take care and consider:&lt;br /&gt;
&lt;br /&gt;
* if the Devices domain from the second configuration provides a password for all devices, the password is ignored, as it would lead to inconsistend passwords otherwise (from 13r1 SR12 on)&lt;br /&gt;
* the Devices domain from the second configuration should not provide Devices Configurations or Update Jobs as these might collide with configurations from the first Devices instance!&lt;br /&gt;
&lt;br /&gt;
Generally, only one of the two  &#039;&#039;Devices&#039;&#039;  App instances connected to the device must apply changes to the device.&lt;br /&gt;
&lt;br /&gt;
 We strongly discourage the usage of this second configuration option due to unexpected behaviour if incorrectly used!&lt;br /&gt;
 Never use the second URL if you use software or hardware rental!&lt;br /&gt;
&lt;br /&gt;
==== Device information ====&lt;br /&gt;
&lt;br /&gt;
The following data is transferred:&lt;br /&gt;
* MAC address&lt;br /&gt;
* device type (e.g. IPVA, AppPlatform, IP112)&lt;br /&gt;
* IP addresses (IPv4, IPv6)&lt;br /&gt;
* version (not searchable)&lt;br /&gt;
&lt;br /&gt;
You can also search for this data inside the devices tab in the App.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==== Device Advanced UI ====&lt;br /&gt;
By default, Devices administrators and non admins can access the advanced UI of any device without limitations.&amp;lt;br/&amp;gt;&lt;br /&gt;
In certain scenerios (e.g. Cloud), you may want to restrict this access to just the PBX on gateways and IPVAs for non adminstrative users, which just have access to certain domains.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
In this case, you can set the corresponding checkmark in the device settings tab of the specific device.&amp;lt;br/&amp;gt;&lt;br /&gt;
If the flag is set, just the PBX tab of the advanced UI is accessible for non administrative Devices users.&lt;br /&gt;
&lt;br /&gt;
 Technically this means, that every HTTP request is checked if it starts with PBX0 and if not, the request is rejected with 401 unauthorized.&lt;br /&gt;
&lt;br /&gt;
If the device can be accessed directly without Devices, you may need a reverse proxy in between to filter HTTP requests.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Provisioning ===&lt;br /&gt;
Devices can be added by provisioning (both phones and gateways). &lt;br /&gt;
The standard online provisioning looks like this:&lt;br /&gt;
* a user or administrator creates a provisioning code in the Devices or Users App (this stores the Devices URL on the provisioning server side)&lt;br /&gt;
* a device with 13r1 or newer is connected to the network after a long reset&lt;br /&gt;
* the provisioning code has to be entered within one hour (after one hour, the Update URL isn&#039;t polled anymore)&lt;br /&gt;
* the device sends this code to config.innovaphone.com and retrieves the Devices URL&lt;br /&gt;
* the device connects to the Devices URL and is added to the domain where the code has been created&lt;br /&gt;
&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Offline_Provisioning offline provisioning mode].&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Provisioning#Automatic_provisioning automatic provisioning mode].&lt;br /&gt;
&lt;br /&gt;
 Note: provisioning is cancelled if the device already belongs to another domain in the same Devices instance! This prevents the unauthorized move of a device between different domains.&lt;br /&gt;
&lt;br /&gt;
==== Devices Registration URL ====&lt;br /&gt;
&lt;br /&gt;
The Devices Registration URL which is set through the provisioning process, always starts with &#039;&#039;&#039;wss&#039;&#039;&#039;. This is not dependent anymore on the App URL which is configured inside the PBX Devices App object.&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
The Devices App can be used to rollout updates.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSON files ====&lt;br /&gt;
The update files have to be acccessible on a webserver without authentication and four json files are used:&lt;br /&gt;
* firmware.json: innovaphone device firmware&lt;br /&gt;
* apps.json: Apps for the App Platform&lt;br /&gt;
* software.json: contains software for DECT handsets&lt;br /&gt;
** just IP64 and IP65 are used and supported&lt;br /&gt;
* phoneplatform.json: contains the phone platform image for e.g. the IP270&lt;br /&gt;
&lt;br /&gt;
You can either use the standard innovaphone App Store for these files or your own local webserver.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Update jobs ====&lt;br /&gt;
You can configure several update jobs with different categories to organize your updates.&amp;lt;br&amp;gt;&lt;br /&gt;
Update jobs are always sequentially processed and inside one update job, just &#039;&#039;&#039;20&#039;&#039;&#039; devices are updated at the same time.&lt;br /&gt;
&lt;br /&gt;
==== Device update check after the update job has been already executed====&lt;br /&gt;
If a device goes online, the newest suitable update job is searched for this device (depending on the categories).&amp;lt;br&amp;gt;&lt;br /&gt;
If an update job is found, the update is just performed, if there has been &#039;&#039;&#039;no&#039;&#039;&#039; successfull update for this device in this job before and the version does not match (simply string compare).&lt;br /&gt;
&lt;br /&gt;
====Update errors====&lt;br /&gt;
If an update fails, the Devices App shows an error. You may have to enable further tracing on the updated device itself to find out the reason of the failure.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 module and take a look at the events which may already tell you the reason&lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
 An update job is retried &#039;&#039;&#039;two&#039;&#039;&#039; times if updates inside this job failed. The retry is done &#039;&#039;&#039;ten&#039;&#039;&#039; minutes after the update job finished previously.&lt;br /&gt;
&lt;br /&gt;
====innovaphone myApps====&lt;br /&gt;
The path to the App Store and the used innovaphone myApps version is updated to the version of the gateway on gateways with an enabled PBX after a successfull update.&amp;lt;br&amp;gt;&lt;br /&gt;
This configuration can be found [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:PBX/Config/myApps here]&lt;br /&gt;
&lt;br /&gt;
Inside the configuration on an update job, the flag &amp;quot;Do not update myApps launcher software&amp;quot; disables the update of the innovaphone myApps version inside PBXes.&lt;br /&gt;
&lt;br /&gt;
====DECT handsets====&lt;br /&gt;
If you check the update DECT handsets checkmark, all DECT devices will be configured to rollout updates to DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
The DECT handset firmware will be searched inside the configured software.json.&lt;br /&gt;
&lt;br /&gt;
=== Backups ===&lt;br /&gt;
The Devices App can be used to backup the configuration and data of Apps and devices.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Webserver requirements====&lt;br /&gt;
Backups are stored on a webserver with or without Digest/Basic authentication and with the &#039;&#039;&#039;webdav PUT&#039;&#039;&#039; method.&lt;br /&gt;
&lt;br /&gt;
====Backup jobs====&lt;br /&gt;
Backup jobs are executed sequentially. Inside one backup job, just &#039;&#039;&#039;20&#039;&#039;&#039; backups are performed at the same time.&lt;br /&gt;
&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
The configuration file is stored. Therefor the Devices App tells the device to store the configuration with a !mod cmd UP0 /sync prot URL.&lt;br /&gt;
&lt;br /&gt;
====Apps on an App Platform====&lt;br /&gt;
The databases of all existing instances and the manager are stored.&amp;lt;br&amp;gt;&lt;br /&gt;
Each installed App Service can have multiple instances and each App instance has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
A database contains &#039;&#039;&#039;both&#039;&#039;&#039; configuration and data of an App instance! &amp;lt;br&amp;gt;&lt;br /&gt;
The manager database contains the webserver certificate and further manager related configuration settings.&lt;br /&gt;
&lt;br /&gt;
The Devices App establishes a websocket connection to the manager and tells the manager where to store the backups.&amp;lt;br&amp;gt;&lt;br /&gt;
The manager on the backuped App Platform itself performs the HTTP requests to store the files.&lt;br /&gt;
&lt;br /&gt;
====Backup errors====&lt;br /&gt;
If a backup fails, the Devices App shows an error. You may have to enable further tracing on the backuped device itself to find out the reason of the failure.&lt;br /&gt;
&lt;br /&gt;
* on a gateway/phone add a trace flag to the UP1 and HTTPCLIENT0 &lt;br /&gt;
* on an App Platform, enable the App and HTTP Client trace flag on the manager&lt;br /&gt;
&lt;br /&gt;
=== Restore ===&lt;br /&gt;
====Phones or gateways====&lt;br /&gt;
Just as always under [http://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Administration/Upload/Config Upload Config].&lt;br /&gt;
&lt;br /&gt;
====Apps====&lt;br /&gt;
The App Service itself has to be installed on the App Platform prior restoring of a single instance.&amp;lt;br&amp;gt;&lt;br /&gt;
The restoring is done in the Manager App on the App Platform itself.&amp;lt;br&amp;gt;&lt;br /&gt;
The intance settings, the configuration and data are restored in a single process.&lt;br /&gt;
&lt;br /&gt;
=== Device Configurations ===&lt;br /&gt;
&lt;br /&gt;
You can define several device configurations. These configurations are either applied to all devices inside this domain or to selected categories.&amp;lt;br/&amp;gt;&lt;br /&gt;
Configurations are applied on creation and on every reconnect of a matching device.&lt;br /&gt;
&lt;br /&gt;
==== Transfer checkmarks ====&lt;br /&gt;
&lt;br /&gt;
Some configuration options have a specific checkmark to enable the transfer of the option.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* Checkmark disabled:&lt;br /&gt;
** configuration option field(s) are disabled &lt;br /&gt;
** option values are &#039;&#039;&#039;not&#039;&#039;&#039; transferred at all&lt;br /&gt;
* Checkmark enabled:&lt;br /&gt;
** configuration option field(s) are enabled&lt;br /&gt;
** option values are transferred, even if field values are empty&lt;br /&gt;
&lt;br /&gt;
==== Expert configuration ====&lt;br /&gt;
&lt;br /&gt;
The expert configuration can be used to configure different settings which are not available inside the other device configurations.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can use the standard syntax of an update server script (see [[ {{NAMESPACE}}:Concept_Update_Server | Concept Update Server ]] for a general overview and the section on [[Howto:PHP_based_Update_Server_V2#Hints_for_writing_your_update_snippets | Hints for writing your update snippets ]] (note that the remainder of this article relates to the now deprecated old mechanism, so please disregard the rest)).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Some hints:&lt;br /&gt;
* the expert configuration is just executed once after a device restarted and on change of the expert configuration itself&lt;br /&gt;
* the expert configuration is executed after all other device configuration types, so that you can override changes&lt;br /&gt;
* to make configuration changes effective, you may also need to issue a final &#039;&#039;config write&#039;&#039;, &#039;&#039;config activate&#039;&#039; and &#039;&#039;iresetn&#039;&#039; command (see the [[ {{NAMESPACE}}:Concept_Update_Server#Check_command | &#039;&#039;check&#039;&#039; command]] for details)&lt;br /&gt;
* some commands shouldn&#039;t be used inside the script:&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Times_command |&#039;&#039;times&#039;&#039;]]: since the expert configuration is executed only once after a reboot of the device and when changes are made, it does not make sense to use the &#039;&#039;times&#039;&#039; command&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Prot_command |&#039;&#039;prot&#039;&#039;]]|[[ {{NAMESPACE}}:Concept_Update_Server#Boot_command |&#039;&#039;boot&#039;&#039;]]: use an update job instead&lt;br /&gt;
** [[ {{NAMESPACE}}:Concept_Update_Server#Scfg_command |&#039;&#039;scfg&#039;&#039;]]: use a backup job instead&lt;br /&gt;
** [[Howto:PHP_based_Update_Server_V2#Using_vars_create|&#039;&#039;vars create&#039;&#039;]]: this cmd will always raise the &#039;&#039;reset needed condition&#039;&#039; and the aforementioned &#039;&#039;iresetn&#039;&#039; command would always execute therefore.  As a result, the devices would enter a boot loop.  Be sure to avoid this using an appropriate [[ {{NAMESPACE}}:Concept_Update_Server#Check_command |&#039;&#039;check&#039;&#039; command ]] and update its &#039;&#039;&amp;lt;serial&amp;gt;&#039;&#039; properly whenever the expert configuration is changed&lt;br /&gt;
&lt;br /&gt;
==== Certificates configuration ====&lt;br /&gt;
You can use this configuration to rollout certificates to the trust list of your devices.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Manual upload certificates.&lt;br /&gt;
* Configure up to five URLs which are polled every 24 hours. They must return files with PEM formatted public keys (one or more) which are then rolled out.&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/innovaphone.pem to always have the innovaphone public keys in your trust list (e.g. used for our push service).&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca.pem to always have the innovaphone Device Certification Authority certificates in your trust list.&lt;br /&gt;
* Configure https://download.innovaphone.com/certificates/ca-unverified.pem to always have the innovaphone Unverified Device Certification Authority certificates in your trust list.&lt;br /&gt;
** The Unverified CA is used for non hardware devices, e.g. IPVAs, which are not shipped with an official innovaphone Device Certification Authority certificate, as innovaphone has no control over the serial number here.&lt;br /&gt;
&lt;br /&gt;
 Using this configuration, the trust list can only be managed through &#039;&#039;Devices&#039;&#039; because it is cleared before each rollout.&lt;br /&gt;
&lt;br /&gt;
==== DECT Handsets ====&lt;br /&gt;
&lt;br /&gt;
This configuration can be used to configure specific options like language, voicemail number etc. for DECT handsets.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* all DECT devices like IP1202, IP1203 etc. will receive this configuration (of course just if the configured categories match)&lt;br /&gt;
* Devices configures a URL like https://domain.com/domain.com/devices/parameters/id.xml on the specific DEVMANBW module.&lt;br /&gt;
* This file is then polled by the basestations and the read values are transfered to the DECT handsets.&lt;br /&gt;
* see [[{{NAMESPACE}}:IP1202/IP1203_DECT_System#Configuration_of_Handset_parameters]]&lt;br /&gt;
&lt;br /&gt;
See [[{{NAMESPACE}}:Concept_App_Service_Devices#Supported_DECT_handsets | Supported DECT handsets]].&lt;br /&gt;
&lt;br /&gt;
=== Software rental ===&lt;br /&gt;
Regarding the Software Rental program and the Payment Method, please refer to:&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_Software_Rental|Concept Software Rental]]&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
Software rental can be done for innovaphone Cloud installations or for software, which operates on the customer premisis. This could eventually be customer owned hardware or a privat virtual machine, managed by the customer.&lt;br /&gt;
&lt;br /&gt;
==== Hardware licenses ====&lt;br /&gt;
Hardware licenses have to be bound on the specific device in my.innovaphone itself and currently can&#039;t be handled within the Devices App itself. So you also need to download the licenses from my.innovaphone and upload them on the device with the already known methods.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses with software rental =====&lt;br /&gt;
If your device has software rental licenses, you can bind hardware licenses within my.innovaphone in the software rental project itself.&lt;br /&gt;
&lt;br /&gt;
===== Hardware licenses without software rental =====&lt;br /&gt;
If your device does not have software rental licenses, you should bind hardware licenses in a separate non rental project in my.innovaphone.&lt;br /&gt;
&lt;br /&gt;
==== innovaphone Cloud ====&lt;br /&gt;
Inside the innovaphone Cloud, you just have to upload your activation keys with iSCs to add licenses to one or more gateways.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Email expiry notifications ====&lt;br /&gt;
You will receive an email notification if the rental of a project expires. This notification will be sent &#039;&#039;&#039;seven&#039;&#039;&#039; weeks before the expiry and then once a week until the rental expires.&amp;lt;br&amp;gt;&lt;br /&gt;
You can configure one or more email recipients in the domain settings.&amp;lt;br&amp;gt;&lt;br /&gt;
If no email address is configured, the email address of the logged in user account is used.&lt;br /&gt;
&lt;br /&gt;
==== History ====&lt;br /&gt;
You can download the history in the Devices App. You&#039;ll get a CSV file (semicolon separated). The date and number format depends on the selected language in the UI.&amp;lt;br&amp;gt;&lt;br /&gt;
There is also an API available for automated downloas, which is described [[ {{NAMESPACE}}:Concept_App_Service_Devices#API_to_download_rental_history|here ]].&lt;br /&gt;
&lt;br /&gt;
====Own installation====&lt;br /&gt;
Inside your own installation, you have to register a new my.innovaphone account or you can use an existing account inside the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
One domain inside Devices belongs to one project inside your my.innovaphone company, so you can handle multiple domains with one my.innovaphone account.&lt;br /&gt;
&lt;br /&gt;
====Technical aspects====&lt;br /&gt;
A new rental expiration date is calculated on each license or balance change in the domain.&amp;lt;br&amp;gt;&lt;br /&gt;
So after each change new licenses with a new date are transfered to the gateways and also stored in the Devices App itself.&amp;lt;br&amp;gt;&lt;br /&gt;
If the rental expires, the gateway reboots and the licenses are not available anymore.&amp;lt;br&amp;gt;&lt;br /&gt;
The licenses are also transfered after each reconnect of a gateway to the Devices App.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
For license and balance changes, the Devices App must be online and have access to my.innovaphone.com!&lt;br /&gt;
&lt;br /&gt;
====Usage====&lt;br /&gt;
You have to add (use the + symbol) a PBX and select all licenses you want to rent.&amp;lt;br&amp;gt;&lt;br /&gt;
Use the &#039;&#039;&#039;apply&#039;&#039;&#039; button to really bind these licenses. Without usage of the apply button, you can just see a precalculation of the iSCs/month and the rental end date, but nothing is really charged from your balance.&lt;br /&gt;
&lt;br /&gt;
===Change of IP address/DNS name in PBX object===&lt;br /&gt;
If the IP address or DNS name inside the PBX object of the Devices App changes, all currently connected clients get a new Devices Registration URL and also all clients, which connect afterwards with the old host name.&lt;br /&gt;
&lt;br /&gt;
== Appendix ==&lt;br /&gt;
=== Sample firmware.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;devices&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP0011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP101&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP102&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1060&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP110A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP111&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP112&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1130&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP1260&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP150&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP2000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP200A&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP22&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP222&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP230&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP232&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP24&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP240&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP241&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP29&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP3011&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP302&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP305&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP311&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP411&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6000&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP6010&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP800&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP810&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IP811&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] },&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;IPVA&amp;quot;, &amp;quot;versions&amp;quot;: [ &amp;quot;13r1&amp;quot; ] }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;versions&amp;quot;: [&lt;br /&gt;
    { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;text&amp;quot;: &amp;quot;13r1 dvl [131705]&amp;quot;, &amp;quot;wiki&amp;quot;: &amp;quot;&amp;quot; }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample apps.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;apps&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;Apidemo&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;The Apidemo&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;appstore&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;AppStore&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;AppStore&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample software.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;software&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappsandroid&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myapps.apk&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Android&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Android&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;myappswindows&amp;quot;,&lt;br /&gt;
            &amp;quot;binary&amp;quot;: &amp;quot;myAppsSetup.msi&amp;quot;,&lt;br /&gt;
            &amp;quot;versions&amp;quot;: [&lt;br /&gt;
                { &amp;quot;id&amp;quot;: &amp;quot;13r1&amp;quot;, &amp;quot;build&amp;quot;: &amp;quot;131705&amp;quot;, &amp;quot;label&amp;quot;: &amp;quot;dvl&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot;: &amp;quot;innovaphone&amp;quot;,&lt;br /&gt;
            &amp;quot;title&amp;quot;: &amp;quot;myApps Windows&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;myApps for Windows&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample phoneplatform.json ===&lt;br /&gt;
&amp;lt;code type=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;arm64&amp;quot;,&lt;br /&gt;
            &amp;quot;text&amp;quot;: &amp;quot;Phone Platform&amp;quot;,&lt;br /&gt;
            &amp;quot;file&amp;quot;: &amp;quot;phone-platform.img&amp;quot;,&lt;br /&gt;
            &amp;quot;folder&amp;quot;: &amp;quot;yocto2&amp;quot;,&lt;br /&gt;
            &amp;quot;version&amp;quot;: &amp;quot;2063&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;devices&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;IP270&amp;quot;,&lt;br /&gt;
            &amp;quot;phoneplatforms&amp;quot;: [&lt;br /&gt;
                &amp;quot;arm64&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API to download rental history ===&lt;br /&gt;
&lt;br /&gt;
You can download the history as a UTF-8 CSV file with simple &#039;&#039;&#039;HTTP GET&#039;&#039;&#039; requests with &#039;&#039;&#039;digest&#039;&#039;&#039; authentication.&amp;lt;br&amp;gt;&lt;br /&gt;
The CSV file uses the semicolon as delimiter.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The URL to download the history is e.g.:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?...&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 You can find this path by editing the instance in the AP manager.&lt;br /&gt;
 In the listed paths, you&#039;ll find something which ends with csvapi&lt;br /&gt;
&lt;br /&gt;
In the innovaphone Cloud environment, the URL can be retrieved by taking a look at the Devices App object inside the cloud PBX and replacing the ending &#039;&#039;&#039;innovaphone-devices&#039;&#039;&#039; with &#039;&#039;&#039;csvapi&#039;&#039;&#039; inside the App URL, so it looks e.g. like this:&lt;br /&gt;
&lt;br /&gt;
 https://cloud-apps0.innovaphone.com/cloud.innovaphone.com/devices/csvapi&lt;br /&gt;
&lt;br /&gt;
====CSV columns====&lt;br /&gt;
Most columns should be self explaining, but the column &#039;&#039;&#039;invoice reference&#039;&#039;&#039; refers to a value which you can configure manually in the domain settings in the Devices App!&lt;br /&gt;
&lt;br /&gt;
====Digest authentication====&lt;br /&gt;
You can login with two different username/password combinations, while the domain is the digest username:&lt;br /&gt;
&lt;br /&gt;
* If you use the domain and password of your Devices App instance inside the AP Manager, you have automatically access to all domains.&amp;lt;br&amp;gt;&lt;br /&gt;
* If you use the domain name of any domain as digest username and the configured domain password, you&#039;ll have access to this domain and all domains to which this domain has access to&lt;br /&gt;
&lt;br /&gt;
====Query parameters====&lt;br /&gt;
The following query parameters can be used (don&#039;t forget to URL encode the parameter values, if neccessary!):&lt;br /&gt;
* all: if &#039;&#039;&#039;1&#039;&#039;&#039; or &#039;&#039;&#039;true&#039;&#039;&#039;, the history is queried for all domains where the digest user has access to&lt;br /&gt;
* domain: required, if &#039;&#039;all&#039;&#039; is not set&lt;br /&gt;
* lang: the output language of the CSV file, which also controls date and number formats, e.g. &#039;&#039;&#039;en&#039;&#039;&#039;, &#039;&#039;&#039;de&#039;&#039;&#039;, ...&lt;br /&gt;
* tz: the timezone for dates, e.g. &#039;&#039;&#039;Europe/Berlin&#039;&#039;&#039;&lt;br /&gt;
* type: two types are available:&lt;br /&gt;
** &#039;&#039;&#039;history&#039;&#039;&#039;: history which contains changes&lt;br /&gt;
** &#039;&#039;&#039;overview&#039;&#039;&#039;: a monthly overview with the iSC costs at the first of the last months&lt;br /&gt;
* from: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
* to: unix timestamp (UTC) in milliseconds, ignored for type=overview&lt;br /&gt;
&lt;br /&gt;
====Example requests====&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?domain=mydomain.com&amp;amp;type=history&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;amp;from=1601903431000&amp;amp;to=1601903385000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;https://mydomain.com/mydomain.com/devices/csvapi?all=1&amp;amp;type=overview&amp;amp;lang=en&amp;amp;tz=Europe%2FBerlin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Supported DECT handsets ===&lt;br /&gt;
&lt;br /&gt;
The following handsets are supported for update jobs and the DECT handsets configuration:&lt;br /&gt;
&lt;br /&gt;
* IP64&lt;br /&gt;
* IP65&lt;br /&gt;
* D81&lt;br /&gt;
* D83&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
===SoftwarePhone===&lt;br /&gt;
The Devices App is not meant to be used with the windows SoftwarPhone standalone installation.&lt;br /&gt;
&lt;br /&gt;
== Related Articles == &lt;br /&gt;
* [[Howto:Software_Rental]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_myApps_platform_services&amp;diff=77195</id>
		<title>Reference15r1:Concept myApps platform services</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_myApps_platform_services&amp;diff=77195"/>
		<updated>2025-06-30T08:42:51Z</updated>

		<summary type="html">&lt;p&gt;Dde: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Concept|myApps]]&lt;br /&gt;
&lt;br /&gt;
myApps platform services provide various operating system specific services which can be used by other &#039;&#039;Apps&#039;&#039; running in the [[{{NAMESPACE}}:Concept myApps|myApps client]]. Those services typically are not available in the browser&#039;s JavaScript environment and hence must be implemented in native platform code. Therefore, the platform services are installed as native executable on the respective platform.&lt;br /&gt;
&lt;br /&gt;
When myApps is started in a web browser (and hence has no access to the platform services), some Apps will use [https://en.wikipedia.org/wiki/WebRTC WebRTC] services implemented by the browser instead.  For ease of reference, features available in this scenario are also described here.&lt;br /&gt;
&lt;br /&gt;
On windows, the platform services also come with their own web browser in which the myApps web App will be started then.  This browser is based on google&#039;s [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium] open source software.&lt;br /&gt;
= Applies To =&lt;br /&gt;
&lt;br /&gt;
* [[{{NAMESPACE}}:Concept myApps|myApps]]&lt;br /&gt;
* myApps for Windows&lt;br /&gt;
* myApps for macOS&lt;br /&gt;
* myApps for iOS&lt;br /&gt;
* myApps for Android&lt;br /&gt;
&lt;br /&gt;
* myApps Web App (WebRTC)&lt;br /&gt;
version 14r2&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
Not all features are available or required on all platforms.&lt;br /&gt;
 {|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Feature&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || Windows || iOS || Android || macOS || Browser&amp;lt;ref&amp;gt;This refers to the myApps web application running in a browser with no platform services available&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| audio || manage local audio devices to record and playback audio conversations || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (audio available but devices managed by web browser)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| video || manage local displays and cameras to capture and render video live stream || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; (video available but devices managed by web browser)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| ringer || manage local ringing device || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| application sharing&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;amp;nbsp; presenter || share an application || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;amp;nbsp; consumer  || view an application shared by the peer || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| hot keys || capture key presses for quick invocation of phone apps (e.g. dial selected number) || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| tel: and sip: URI handler || intercept clicks on tel: and sip: links in web sites to invoke phone apps || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| user activity || set presence state according to user activity ||  &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;limited, see [[#User activity|User activity]] below&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| docking || myApps can be docked persistently to the right or left edge of your screens ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| multi-windowing|| Apps can be launched in separate windows||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| recording|| Calls can be recorded to recording app||  &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| notifications || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; display notifications || display notifications with OS standard mechanism ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; push notifications || receive push notifications while myApps is not running  ||  &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The browser needs to be running in order to receive push notifications.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; chat and apps || display notifications for chat and other apps  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; calls || display notifications for incoming calls  ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&amp;lt;ref&amp;gt;Call notifications are only displayed locally while the phone or softphone app is started.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| phone book access || access local phone book ||  &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
| office presence provider || maps PBX presence state to Microsoft office presence state ||  &amp;amp;#10004;  || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| external application start || start arbitrary external applications for calls || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| app proxy|| a caching proxy that provides app persistence  || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| auto update || automatically updates myApps platform services to the same version the PBX has || &amp;amp;#10004;  || &amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&amp;lt;ref&amp;gt;The then-current web app is always loaded from the PBX upon startup and hence up-to-date by definition&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| three party conference || initiate 3-pty-conference using Softphone-App || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| exclude VPN || disable use of VPN connections for audio and appsharing || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
* innovaphone PBX 14r2 and up&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Recommended hardware requirements&lt;br /&gt;
* Processor: Dual-core 2Ghz or higher&lt;br /&gt;
* RAM: 4 Gb&lt;br /&gt;
&lt;br /&gt;
== myApps for Windows ==&lt;br /&gt;
* Windows 10 and up&lt;br /&gt;
* Windows Server 2016 and later versions&lt;br /&gt;
&lt;br /&gt;
=== 32 &amp;amp; 64 bit Windows ===&lt;br /&gt;
* 32 bit Windows: install the myAppsSetup32.msi from the App Store&lt;br /&gt;
* 64 bit Windows: install the myAppsSetup.msi from the App Store&lt;br /&gt;
** the 64 bit variant still installs into Program Files (x86), as the main myApps.exe is still a 32bit application&lt;br /&gt;
** the 64 bit variant just contains an additional 64 bit binary for the outlook search&lt;br /&gt;
&lt;br /&gt;
=== Windows N editions ===&lt;br /&gt;
&lt;br /&gt;
Windows N editions are missing the &#039;&#039;Media Feature Pack&#039;&#039; which is pre installed on other Windows versions.&lt;br /&gt;
&lt;br /&gt;
Please install the pack from [https://www.microsoft.com/en-us/software-download/mediafeaturepack Microsoft (Windows 10 pack)] before you install myApps. The installer will check if the file &amp;lt;code&amp;gt;C:\Windows\SysWOW64\mfplat.dll&amp;lt;/code&amp;gt; exist on your system.&lt;br /&gt;
&lt;br /&gt;
Make sure to install the correct pack depending on your Windows version! There are different packs for Windows 10 1703, 1803, 1809 and 32bit or 64bit etc.&lt;br /&gt;
&lt;br /&gt;
NB: Sometimes the myApps installation will not work even though the media pack is already installed. This is because the installer has no read access to check if the package is already installed. If the above-mentioned file exists and the installer asks to install the Windows Media Feature Pack nevertheless, you have to start the myApps install with administrative rights.&lt;br /&gt;
&lt;br /&gt;
=== Terminal Server environments ===&lt;br /&gt;
&lt;br /&gt;
Audio driver was removed if myApps discovers that it is running in a terminal server environment like Citrix.&lt;br /&gt;
&lt;br /&gt;
The audio driver is needed for the Softphone App but the Softphone App should not use an audio driver at the server side because the audio devices are plugged locally and there would be a delay sending and receiving audio data with the server.&lt;br /&gt;
&lt;br /&gt;
If a customer wants to use the Softphone App at the server side he needs to make use of the myApps Plugin for virtual desktops solution:&lt;br /&gt;
&lt;br /&gt;
[[{{NAMESPACE}}:MyApps_Plugin_for_Virtual_Desktops|Reference15r1:MyApps_Plugin_for_Virtual_Desktops]]&lt;br /&gt;
&lt;br /&gt;
== myApps for macOS ==&lt;br /&gt;
* macOS 10.13 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for iOS ==&lt;br /&gt;
* iOS 12 or higher&lt;br /&gt;
&lt;br /&gt;
== myApps for Android ==&lt;br /&gt;
* Android 6.0 or higher. Android 6.x may need an update of the Chrome browser.&lt;br /&gt;
&lt;br /&gt;
= Licenses =&lt;br /&gt;
* No license needed for myApps platform services&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
myApps platform services is a native executable that is installed using the standard mechanisms on the respective operating system. It provides various advanced services which can be used by the myApps web client code as well as the Apps running in the myApps context. &lt;br /&gt;
&lt;br /&gt;
Also, on Windows, the platform services come with their own, dedicated browser to run myApps in.  This browser is based on [https://en.wikipedia.org/wiki/Chromium_(web_browser) Chromium].  On iOS, macOS and Android, it is based upon native embedded web view facilities (such as WKWebView) instead.&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
=== RTP service for audio and appsharing ===&lt;br /&gt;
The RTP service provides audio and appsharing as a video stream. VoIP RTP endpoints (e.g. for softphones).  It supports STUN, TURN, ICE, SRTP, DTLS. Note however that unlike WebRTC, these endpoints do not &#039;&#039;require&#039;&#039; ICE and DTLS. In other words, they can communicate also with non-compliant (i.e. older) VoIP devices.&lt;br /&gt;
&lt;br /&gt;
Note that the available capabilities when not running the myApps platform services depend on the used browser&#039;s WebRTC implementation. See your browser documentation for details.&lt;br /&gt;
&lt;br /&gt;
Apps can request RTP channels using the [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol]&#039;s &#039;&#039;AllocChannel&#039;&#039; message.&lt;br /&gt;
&lt;br /&gt;
===== RTP ports=====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|  audio || 50000 -&amp;gt; 50099&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| video (app sharing) || 50100 -&amp;gt; 50199&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The RTP service will enumerate all local interfaces and create local HOST candidates for ICE.  There is an option however to disregard VPN interfaces (more precisely such interfaces with type of &#039;&#039;IF_TYPE_PPP&#039;&#039; or &#039;&#039;IF_TYPE_TUNNEL&#039;&#039;).  This can eliminate quality issues when RTP data is transmitted through TCP based VPN tunnels.&lt;br /&gt;
&lt;br /&gt;
SRFLX and RELAY candidates are obtained using the STUN and TURN server configuration passed by the App (e.g the &#039;&#039;softphone&#039;&#039; App) as part of the &#039;&#039;AllocChannel&#039;&#039; request.&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;AllocChannel&amp;quot;,&amp;quot;channel&amp;quot;:&amp;quot;81429cba-396d-43de-8a76-ec020ba8796e&amp;quot;,&amp;quot;iceServers&amp;quot;:[{&amp;quot;urls&amp;quot;:&amp;quot;turn:myturn.domaincom:4077?transport=udp&amp;quot;,&amp;quot;username&amp;quot;:&amp;quot;turnuser&amp;quot;,&amp;quot;credential&amp;quot;:&amp;quot;pwd&amp;quot;,&amp;quot;credentialType&amp;quot;:&amp;quot;password&amp;quot;},{&amp;quot;urls&amp;quot;:&amp;quot;stun:mystun.domain.com:4077&amp;quot;}],&amp;quot;dn&amp;quot;:&amp;quot;Foo Bar&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;RemoteRtp&amp;quot;,&amp;quot;kind&amp;quot;:&amp;quot;video&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Codecs =====&lt;br /&gt;
&lt;br /&gt;
The installed myApps launchers provide codecs that can be used by softphone apps for media streams. When running in a web browser the codecs depend on the browser version and operating system. See the documentation of your browser for details.&lt;br /&gt;
&lt;br /&gt;
The following codecs are supported:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align:left;width:100px;&amp;quot;|Codec&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Windows-Launcher&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Android&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|iOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|macOS&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Firefox (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Chrome (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Edge (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Safari (Browser)&lt;br /&gt;
!style=&amp;quot;width:100px&amp;quot;|Opera (Browser)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Audio&lt;br /&gt;
|-&lt;br /&gt;
|G711A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G711u&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G722&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|G729&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729A&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729B&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|G729AB&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-NB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=Opus OPUS-WB]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Video&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP8 VP8]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=VP9 VP9]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|-&lt;br /&gt;
|[https://caniuse.com/#search=H264 H264]&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔**&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:left; background-color:lightgray&amp;quot; colspan=&amp;quot;10&amp;quot;|Application Sharing&lt;br /&gt;
|-&lt;br /&gt;
|Share&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|-&lt;br /&gt;
|Watch&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔*&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|style=&amp;quot;color:red;text-align:center;font-weight:bold;&amp;quot;|X&lt;br /&gt;
|style=&amp;quot;color:green;text-align:center&amp;quot;|✔&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;* small presentation only&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;** only for 1:1 calls, not for conferences&lt;br /&gt;
&lt;br /&gt;
===== Video capture =====&lt;br /&gt;
&lt;br /&gt;
The default resolution for video capture is 1920x1080 if available.  Otherwise, 1280x720, 640x480, 352x288 or 320x240 will be used.  The frame rate is 30 fps if available, otherwise 15 fps. The resulting average bandwidth could reach 1 Mbps.&lt;br /&gt;
&lt;br /&gt;
===== Application sharing =====&lt;br /&gt;
&lt;br /&gt;
Screen content will be transmitted as video stream by the presenter&lt;br /&gt;
&lt;br /&gt;
===== Device handling =====&lt;br /&gt;
&lt;br /&gt;
The RTP service enumerates microphones, loudspeaker, cameras and ringing devices and notifies apps when devices come and go. It is up to the apps using the devices to store preferences.&lt;br /&gt;
&lt;br /&gt;
The RTP service also enables some extended features (such as hook switch or volume control) for supported USB headsets or Bluetooth headsets connected to myApps.&lt;br /&gt;
The supported headset-SDKs determine which headset vendors are recommended to be used with the myApps softphone app. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this to work, the following vendor specific development kits are integrated in our myApps client. Be aware that the SDK are updated within our Service release :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! SDK Vendor !! Supported OS !! SDK Version !! innovaphone Service Release&lt;br /&gt;
|-&lt;br /&gt;
| Jabra|| MacOS || 1.12.2.0 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 1.12.2.0 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Epos &#039;&#039;(formerly Sennheiser)&#039;&#039; || MacOS || 12.4.0.5478 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || n.a. - [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|to be installed separately]]|| 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Poly &#039;&#039;(formerly Plantronics)&#039;&#039; || MacOS || 3.25.53799.37131 || 13r3sr9&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.25.53800.37131 || 13r3sr10&lt;br /&gt;
|-&lt;br /&gt;
| Yealink || MacOS || 3.1.1.20 || 14r1sr3&lt;br /&gt;
|-&lt;br /&gt;
||| Windows || 3.1.1.20 || 14r1sr3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* It is possible to inhibit the start of the Sennheiser SDK (SenncomSDK.exe) using the &amp;lt;code&amp;gt;DISABLEHEADSETS&amp;lt;/code&amp;gt; directive of the installer (see [[#MSI Parameters and install options|  MSI parameters]]  below).&lt;br /&gt;
&lt;br /&gt;
* Starting with V13r3sr10, the Epos-SDK needs to be installed separately using the Epos Connect software to ensure full compatibility between current Epos headset models and native myApps-Windows client. For details [[Support:13r3 sr10 MyApps Windows Client - Epos/Sennheiser-Headsets require installed Epos-Connect Software|refer to this article]].&lt;br /&gt;
&amp;lt;!--Keywords: myapps softphone supported headsets sdk--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Ring tones =====&lt;br /&gt;
&lt;br /&gt;
Ring tones can be played. Apps can choose the tone from a pre-defined list of ring tones.&lt;br /&gt;
&lt;br /&gt;
On Windows, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;ringtones&amp;lt;/code&amp;gt; sub-directory of myApps&#039; roaming directory (which usually is in &amp;lt;code&amp;gt;C:\Users\...\AppData\Roaming\innovaphone\myApps\ringtones&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
On Android, custom ring tones can be added to the system via Android settings.&lt;br /&gt;
&lt;br /&gt;
On iOS, custom ring tones can be uploaded as .mp3 files to the &amp;lt;code&amp;gt;Ringtones&amp;lt;/code&amp;gt; subdirectory of the myApps file share that is available in iTunes if the iPhone has been connected via USB.&lt;br /&gt;
&lt;br /&gt;
On macOS, custom ring tones can be uploaded as .mp3 files to &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-macos/Data/Documents/Ringtones&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Debugging =====&lt;br /&gt;
For extended debugging, turn on the &#039;&#039;Audio&#039;&#039;, &#039;&#039;Media&#039;&#039; and &#039;&#039;AppSharing&#039;&#039; traces in myApps.&lt;br /&gt;
&lt;br /&gt;
=== Hot keys ===&lt;br /&gt;
On Windows and macOS systems, myApps platform services can listen for hot keys and invoke certain functions. Invocation is done by sending API messages to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
The hot keys can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below. Any of the function keys F1 to F11 (optionally combined with up to two modifier keys &#039;&#039;alt&#039;&#039;, &#039;&#039;ctrl&#039;&#039;, &#039;&#039;shift&#039;&#039; or &#039;&#039;win&#039;&#039;) can be chosen for each function. If you do not want to start the call with &amp;quot;Hotkey+Enter&amp;quot; because you would have to wait for the focus, the hotkey can also be pressed twice and the number is dialled directly.&lt;br /&gt;
&lt;br /&gt;
; dial selected number : Initiates a call using the currently selected text as target.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;text&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:&amp;quot;mt&amp;quot;:&amp;quot;PrepareCall&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;13&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; accept call : Accepts a currently alerting call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;ConnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;ConnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; reject/disconnect call : Rejects a currently alerting call or disconnects an active call.&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;DisconnectCall&#039;&#039; message will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;DisconnectCall&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== URL Handler ===&lt;br /&gt;
&lt;br /&gt;
On Windows systems, two URI-handler are installed with the myApps platform services.  Windows will call up this URI handler when a user clicks on an appropriate link, for example in a web site.&lt;br /&gt;
&lt;br /&gt;
The handler will the send an API message to myApps which passes it to an appropriate API provider (in the cases described here, this will be a &#039;&#039;phone&#039;&#039; or &#039;&#039;softphone&#039;&#039; or &#039;&#039;rcc&#039;&#039; App typically.  See [[{{NAMESPACE}}:Concept_myApps#Client_APIs_and_default_apps | Client APIs and default apps]] for more details about this mechanism.&lt;br /&gt;
&lt;br /&gt;
; tel URI : call a number, e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;num&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;num&amp;quot;:&amp;quot;4711&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; sip URI : call a SIP name, e.g. &amp;lt;code&amp;gt;sip:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;PrepareCall&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text and the &#039;&#039;adjust&#039;&#039; argument set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm &#039;&#039;com.innovaphone.phone&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.phone&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartCall&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;,&amp;quot;adjust&amp;quot;:true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
; im URI : start chat with SIP name, e.g. &amp;lt;code&amp;gt;im:zkl@innovaphone.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: A &#039;&#039;StartChat&#039;&#039; message with the &#039;&#039;sip&#039;&#039; argument set to the selected text will be sent to the [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm &#039;&#039;com.innovaphone.chat&#039;&#039; API].&lt;br /&gt;
:: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.chat&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;@local-ae2fc2ab74-3f1e-4ab9-b215-d42f213520317&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;StartChat&amp;quot;,&amp;quot;sip&amp;quot;:&amp;quot;zkl@innovaphone.com&amp;quot;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On macOS systems myApps might be made the default application to handle tel URI e.g. &amp;lt;code&amp;gt;tel:4711&amp;lt;/code&amp;gt; via Apple FaceTime. Open the &amp;quot;FaceTime&amp;quot; menu &amp;quot;Settings...&amp;quot; and select myApps as &amp;quot;Default for phone calls&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On iOS &#039;&#039;tel&#039;&#039; URIs are always dialed via GSM. Therefore myApps iOS also reacts to URI schemes &#039;&#039;com.innovaphone.tel&#039;&#039;, &#039;&#039;com.innovaphone.sip&#039;&#039; and &#039;&#039;com.innovaphone.im&#039;&#039;, e.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.tel:4711&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.sip:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;com.innovaphone.im:zkl@innovaphone.com&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== User activity ===&lt;br /&gt;
On Windows and macOS systems, the myApps platform services can monitor user keyboard/mouse activity and change the user&#039;s presence state after a certain amount of inactivity.  The timeout can be specified using the &#039;&#039;advanced settings&#039;&#039; user interface (see [[#UI elements| UI elements]] below.&lt;br /&gt;
&lt;br /&gt;
myApps will then send a [https://sdk.innovaphone.com/doc/appwebsocket/myApps.htm#SetUserActivity&#039;&#039;SetUserActivity&#039;&#039;] message to the PBX using the &#039;&#039;myApps&#039;&#039; protocol.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;SetUserActivity&amp;quot;,&amp;quot;inactive&amp;quot;:true}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will change the &#039;&#039;status&#039;&#039; property of the &#039;&#039;im:&#039;&#039; contact for the user&#039;s own presence and hence result in a presence update from the PBX to myApps&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;UpdateOwnPresence&amp;quot;,&amp;quot;presence&amp;quot;:[{...},{&amp;quot;contact&amp;quot;:&amp;quot;im:&amp;quot;,&amp;quot;activity&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;closed&amp;quot;}]}&amp;lt;/code&amp;gt;&lt;br /&gt;
The &#039;&#039;closed&#039;&#039; status is reflected in the grey status color when displaying a contact [[Image:myapps-inactive.png|myapps-inactive.png/|myapps-inactive.png/]].&lt;br /&gt;
&lt;br /&gt;
On iOS and Android, the state is set to &#039;&#039;inactive&#039;&#039; as soon as the App is brought to background.&lt;br /&gt;
When myApps platform services are not available (i.e. when running the web application in a browser solely) a limited user activity monitoring is available: the state is set to active when the web page is not used for more than 5 minutes.&lt;br /&gt;
&lt;br /&gt;
=== Recording ===&lt;br /&gt;
&lt;br /&gt;
The new launcher offers the possibility to record the audio of incoming and outgoing calls. In order to activate that functionality the URL of the recording instance must be configured in either the PBX (PBX-&amp;gt;myApps-&amp;gt;Config: Recording URL) or the softphone App (Settings-&amp;gt;Audio Recording (URL)) &lt;br /&gt;
&lt;br /&gt;
[[Image:PBX-Recording-Settings.png|pbx-recording-settings.png/|pbx-recording-settings.png/]] [[Image:Recording-Softphone-Settings.png|recording-softphone-settings.png/|recording-softphone-settings.png/]]. &lt;br /&gt;
&lt;br /&gt;
As long as that URL is configured the audio data of all calls are stored as pcap-files under that URL.&lt;br /&gt;
If the URL points to a CF device in the PBX, write access must be granted for that URL (PBX-&amp;gt;Services-&amp;gt;HTTP-&amp;gt;Server:Public compact flash access) and if the URL points to the recording app, the files can be accessed via the recording app [[{{NAMESPACE}}:Concept_App_Service_Recordings|recording]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under PBX-&amp;gt;myApps the administrator can set a certain default behaviour of the audio recording like whether or not the recording should start automatically at the beginning of the call (Recording by Default ON/OFF), only calls with external numbers should be recorded (Record external calls only) or whether or not the user should be able to start/stop the recording himself (Allow user incall recording control). Except for the last parameter these parameters can also be modified by the user in its softphone settings if the administrator doesn&#039;t set the FORCE flag.&lt;br /&gt;
&lt;br /&gt;
If the user was allowed by the admin to control the recording a recording switch is active during the call when the &amp;quot;Media&amp;quot; Panel is opened. There the audio recording may be stopped and continued at will. A red recording notice is shown in the top right corner when the recording actually takes place.&lt;br /&gt;
 &lt;br /&gt;
[[Image:Recording-incall-switch.png|recording-incall-switch.png/|recording-incall-switch.png/]]&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services can use the OS specific notification mechanism (e.g. &#039;&#039;desktop notifications&#039;&#039; on Windows) to display messages (e.g. &#039;&#039;incoming new chat message&#039;&#039;) to the user.&lt;br /&gt;
&lt;br /&gt;
Note that the actual rendering of the notification is under control of the OS.  Therefore, myApps must be allowed to show notifications and its appearance can be restricted by OS native settings.&lt;br /&gt;
&lt;br /&gt;
==== Microsoft Windows Notifications ====&lt;br /&gt;
&lt;br /&gt;
Microsoft Windows Server editions (2016, 2019, 2022) are just capable of showing a single &#039;&#039;IncomingCall&#039;&#039; notification at the same time (we couldn&#039;t find a workaround for this limitation).&amp;lt;br/&amp;gt;&lt;br /&gt;
An &#039;&#039;IncomingCall&#039;&#039; notification is visible the whole time instead of being moved to the action center after a certain time.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
A notification about a missed call uses the &#039;&#039;IncomingCall&#039;&#039; type so that this notification is visible until the user returns.&amp;lt;br/&amp;gt;&lt;br /&gt;
Due to the above limitation, on a new arriving call such a missed call notification is transformed to a default notification which will be moved to the action center automatically.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On non server editions, you can have multiple IncomingCall notifications at the same time (so two parallel incoming calls will be indeed notified at the same time), but the missed call notification handling is the same on both platforms!&lt;br /&gt;
&lt;br /&gt;
 Thus there will be always just &#039;&#039;&#039;one&#039;&#039;&#039; missed call notification visible and previous missed calls can be found inside your action center!&lt;br /&gt;
&lt;br /&gt;
To see myApps notifications, ensure:&lt;br /&gt;
* System -&amp;gt; Notifications &lt;br /&gt;
** enable notifications&lt;br /&gt;
** disable &amp;quot;Do not disturb&amp;quot; or allow myApps as priority application while &amp;quot;Do not disturb&amp;quot; is active&lt;br /&gt;
** enable notifications for myApps in the list of applications&lt;br /&gt;
* System -&amp;gt; Focus &lt;br /&gt;
** if a focus session is active and the &amp;quot;Do not disturb&amp;quot; is activated during a focus session, make sure that myApps is a priority application (see above)&lt;br /&gt;
&lt;br /&gt;
==== macOS Notifications ====&lt;br /&gt;
Notifications are the same as on Windows.&lt;br /&gt;
The difference is, that for macOS, notifications need to be allowed in the system settings.&lt;br /&gt;
Go to Notifications - myApps, select Banner and enable all check marks.&lt;br /&gt;
&lt;br /&gt;
=== Local phonebook access ===&lt;br /&gt;
&#039;&#039;&#039;Contact Search:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm &#039;&#039;com.innovaphone.search&#039;&#039; API]]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Search&#039;&#039; request to the API:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;Search&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;search&amp;quot;:&amp;quot;john doe&amp;quot;},&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
Search results are delivered as &#039;&#039;SearchInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{&amp;quot;mt&amp;quot;:&amp;quot;SearchInfo&amp;quot;,&amp;quot;relevance&amp;quot;:2000,&amp;quot;adjust&amp;quot;:true,&amp;quot;type&amp;quot;:&amp;quot;contact&amp;quot;,&amp;quot;contact&amp;quot;:{&amp;quot;givenname&amp;quot;:&amp;quot;John&amp;quot;,&amp;quot;sn&amp;quot;:&amp;quot;Doe&amp;quot;,&amp;quot;company&amp;quot;:&amp;quot;ACME&amp;quot;,&amp;quot;position&amp;quot;:&amp;quot;Head of everything&amp;quot;,&amp;quot;telephonenumber&amp;quot;:[&amp;quot;11111&amp;quot;,&amp;quot;22222&amp;quot;],&amp;quot;homephone&amp;quot;:[&amp;quot;+4944444&amp;quot;,&amp;quot;33333&amp;quot;],&amp;quot;mobile&amp;quot;:[&amp;quot;+49 (123) 55555&amp;quot;]}},&amp;quot;api&amp;quot;:&amp;quot;com.innovaphone.search&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reverse Lookup:&#039;&#039;&#039; The myApps platform services implement an &#039;&#039;API provider&#039;&#039; for the [http://sdk.innovaphone.com/web1/com.innovaphone.phonelookup/lib1_api_phonelookup.htm &#039;&#039;com.innovaphone.phonelookup&#039;&#039; API]. They perform search capabilities on the OS&#039; local phone books which can be used by Apps like the &#039;&#039;phoneapp&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Apps would send a &#039;&#039;Lookup&#039;&#039; request to the API: &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiRequest&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;4&amp;quot;,&amp;quot;msg&amp;quot;:{ mt: &amp;quot;Lookup&amp;quot;, prefixIntl: &amp;quot;000&amp;quot;, prefixNtl: &amp;quot;00&amp;quot;, prefixExt:&amp;quot;0&amp;quot;, area: &amp;quot;7031&amp;quot;, country: &amp;quot;49&amp;quot;, lookup: &amp;quot;0004970311234567&amp;quot; },&amp;quot;apiId&amp;quot;:&amp;quot;com.innovaphone.lookup&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search results are delivered as &#039;&#039;LookupInfo&#039;&#039; messages:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;{&amp;quot;mt&amp;quot;:&amp;quot;ApiResult&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;3&amp;quot;,&amp;quot;provider&amp;quot;:&amp;quot;@local-8125d22e37-519d-4056-bfe5-c52ef2ae8fabb0&amp;quot;,&amp;quot;consumer&amp;quot;:&amp;quot;dev:SwPh_zkl_5e42e884&amp;quot;,&amp;quot;client&amp;quot;:&amp;quot;@client-f62702dd86-be3f-47fc-b4bc-7a21627b75b2ea&amp;quot;,&amp;quot;msg&amp;quot;:{mt: &amp;quot;LookupInfo&amp;quot;, dn: &amp;quot;Jake Blues&amp;quot;, contact: { telephonenumber: [&amp;quot;0004970311234567&amp;quot;], givenname: &amp;quot;Jake&amp;quot;, sn: &amp;quot;Blues&amp;quot;, company: &amp;quot;Blues Brothers&amp;quot; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
On Windows, the search and lookup are performed in all of the user&#039;s Outlook contact folders.  As opposed to the search implemented in the &#039;&#039;Contacts&#039;&#039; and &#039;&#039;Users&#039;&#039; App, all items are returned which match any of the search words (i.e. searching for &#039;&#039;a b&#039;&#039; will return items matching either &#039;&#039;a&#039;&#039; or &#039;&#039;b&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
; searched properties : firstname, lastname&lt;br /&gt;
; returned properties : Following Outlook contact phone number properties are returned  (if available):&lt;br /&gt;
&lt;br /&gt;
:* OFFICE_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* OFFICE2_TELEPHONE_NUMBER as &#039;&#039;telephonenumber&#039;&#039;&lt;br /&gt;
:* HOME_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* HOME2_TELEPHONE_NUMBER as &#039;&#039;homephone&#039;&#039;&lt;br /&gt;
:* MOBILE_TELEPHONE_NUMBER as &#039;&#039;mobile&#039;&#039;&lt;br /&gt;
:* BUSINESS_FAX_NUMBER as &#039;&#039;facsimiletelephonenumber&#039;&#039;&lt;br /&gt;
Note that contact information is cached in the search provider.  Updated contacts may therefore become effective after a while only.&lt;br /&gt;
Outlook search will create its own trace file &amp;lt;code&amp;gt;myAppsOutlookSearch-&amp;lt;/code&amp;gt;&#039;&#039;date-time&#039;&#039;&amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; in the standard trace directory.&lt;br /&gt;
&lt;br /&gt;
This search provider is always installed and can be disabled.  There is no need (nor possibility) to enable it in the &#039;&#039;Apps&#039;&#039; tab of the PBX&#039;s user object.  Also, no &#039;&#039;App&#039;&#039; object needs to be created for it.&lt;br /&gt;
&lt;br /&gt;
==== Android/iOS ====&lt;br /&gt;
The search and lookup are performed in the contacts.&lt;br /&gt;
&lt;br /&gt;
==== macOS ====&lt;br /&gt;
The search and lookup are performed in the contacts. If you wish to disable local contact lookup, go to system settings - Security &amp;amp; Privacy and disable the access to contacts for myapps.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft Office integration ===&lt;br /&gt;
&lt;br /&gt;
The myApps platform services has a &#039;&#039;office presence provider&#039;&#039; that can provide the user&#039;s presence state to Office applications.  See [[{{NAMESPACE}}:Concept_myApps_Office_Integration|myApps Office Integration]] for details.&lt;br /&gt;
&lt;br /&gt;
This feature is installed by default.  However, it can be disabled using the &#039;&#039;OFFICEPRESENCE&#039;&#039; MSI Parameter.  Also, a check-mark is available in the setup dialog.&lt;br /&gt;
&lt;br /&gt;
=== Call an external application for calls ===&lt;br /&gt;
&lt;br /&gt;
Phone Apps (such as the phoneapp or softphone) can initiate the start of an external application when a new call appears (either incoming or outgoing).  The actual spawning of the application is done by the myApps platform service.  Also, the application properties (such as e.g. the executable&#039;s path) is configured in the myApps platform services (see [[#UI elements|Advanced settings]] in the &#039;&#039;UI elements&#039;&#039; section below).&lt;br /&gt;
&lt;br /&gt;
A number of arguments can be passed to the application by substituting $-variables in the &#039;&#039;Parameter&#039;&#039; field:&lt;br /&gt;
&lt;br /&gt;
; $n : phone number as dialed (called party number for outgoing calls) or received (calling party number for incoming calls)&lt;br /&gt;
&lt;br /&gt;
; $N : called or calling party number in &#039;&#039;national&#039;&#039; format (e.g. 07031730090)&lt;br /&gt;
&lt;br /&gt;
; $I : called or calling party number in &#039;&#039;international&#039;&#039; format (e.g. +497031730090)&lt;br /&gt;
&lt;br /&gt;
: note that both $N and $I only work if $n includes both subscriber number and area code (e.g. 07031730090). Otherwise they are equal to $n&lt;br /&gt;
&lt;br /&gt;
; $d : display name of peer (if known)&lt;br /&gt;
&lt;br /&gt;
; $u : URI name of the peer (if available eg with a federation call)&lt;br /&gt;
&lt;br /&gt;
; $c : conference id&lt;br /&gt;
&lt;br /&gt;
: this is a globally unique ID for this call and may be used to relate the call to the &#039;&#039;guid&#039;&#039; found in the CallInfo structure in the [http://wiki.innovaphone.com/index.php?title=Reference10:SOAP_API#CallInfo SOAP-API] and [http://sdk.innovaphone.com/doc/appwebsocket/RCC.htm RCC-API ].  Also, corresponding [[Reference10:Call Detail Record CDR PBX|CDRs]] can be related using the &#039;&#039;event&#039;&#039; tag&#039;s &#039;&#039;conf&#039;&#039; attribute.&lt;br /&gt;
The start of an external application can be requested using the &#039;&#039;com.innovaphone.externalapps&#039;&#039; API.&lt;br /&gt;
&lt;br /&gt;
Some setup examples are [[Howto:Integrate External Apps in innovaphone UC clients|shown here]].&lt;br /&gt;
&lt;br /&gt;
=== Push ===&lt;br /&gt;
&lt;br /&gt;
Mobile operating systems usually inhibit network operation of apps which run in the background or are closed by the user.  This is done in order to reduce battery consumption.  Unfortunately, this also stops such apps to maintain a registration by regularly sending &#039;&#039;keep alive&#039;&#039; messages to a server (in our case to the PBX).  As a result, myApps will be disconnected from the PBX.   When the PBX determines that there is an event for the application which needs a response, it needs to wake up the app using a dedicated channel provided by the operating system.  This mechanism is know as &#039;&#039;push&#039;&#039;. When running on iOS or Android, myApps supports &#039;&#039;push&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;push&#039;&#039; to work, a [[{{NAMESPACE}}:PBX/Objects/Push|&#039;&#039;push object&#039;&#039;]] needs to be configured in the PBX .  Also, it needs to be enabled on the mobile phone for the myApps app.&lt;br /&gt;
This mechanism is quite similar in v12 and v13, so you can refer to [[{{NAMESPACE}}:Concept_Push_Notifications_for_iOS_and_Android|Reference14r2:Concept_Push_Notifications_for_iOS_and_Android]] for more details. &lt;br /&gt;
&lt;br /&gt;
Also, helpful hints can be found in [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]].&lt;br /&gt;
&lt;br /&gt;
=== App Proxy ===&lt;br /&gt;
&lt;br /&gt;
myApps runs further &#039;&#039;Apps&#039;&#039; (such as e.g. the &#039;&#039;phoneapp&#039;&#039;) as a web page in an IFRAME of the browser myApps is running in.  The App&#039;s page code is loaded either from the PBX or from an &#039;&#039;application platform&#039;&#039; (AP).   This however would mean that the App&#039;s IFRAME would remain empty (a dead white screen) when the PBX or AP is not available. To make sure the App can start-up anyway, the myApps platform services feature the so-called &#039;&#039;App Proxy&#039;&#039;.  This is a caching proxy that caches all the App code so it is available even in case of network failure. When myApps runs in the context of the platform services, Apps are therefore not loaded from the App source directly, but from the local App proxy. &lt;br /&gt;
&lt;br /&gt;
The cached files are stored in the PCs local file system in the &amp;lt;code&amp;gt;C:\Users\...\AppData\Local\innovaphone\myApps\appproxy&amp;lt;/path&amp;gt;&amp;lt;/code&amp;gt;.  There is no configuration required.  However, if myApps seems to run with outdated or corrupt cached copies of the App, you can safely delete the entire directory.&lt;br /&gt;
&lt;br /&gt;
=== Auto update ===&lt;br /&gt;
&lt;br /&gt;
On Windows and on macOS, the myApps platform services can auto-update themselves to a common version.  This is controlled by the [[{{NAMESPACE}}:PBX/Config/myApps#Launcher_Software_Update | &#039;&#039;Launcher Software Update&#039;&#039;]] settings under &#039;&#039;PBX/Config/myApps&#039;&#039; in the PBX. &lt;br /&gt;
&lt;br /&gt;
When myApps is started or the user logs in or myApps needs to re-connect to the PBX, the platform services will use the [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client API] to learn the desired version (&#039;&#039;launcherUpdateBuild&#039;&#039;, which is part of the API&#039;s &#039;&#039;model&#039;&#039;). If this differs from the current version, the platform services will try to download the respective new version. &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;mt&amp;quot;: &amp;quot;ApiUpdate&amp;quot;,&lt;br /&gt;
    &amp;quot;apis&amp;quot;: {&lt;br /&gt;
        &amp;quot;com.innovaphone.client&amp;quot;: {&lt;br /&gt;
            &amp;quot;@client&amp;quot;: {&lt;br /&gt;
                &amp;quot;title&amp;quot;: &amp;quot;innovaphone myApps&amp;quot;,&lt;br /&gt;
                &amp;quot;model&amp;quot;: {&lt;br /&gt;
                    &amp;quot;launcher&amp;quot;: true,&lt;br /&gt;
                    &amp;quot;launcherUpdateBuild&amp;quot;: &amp;quot;134906&amp;quot;,&lt;br /&gt;
                    &amp;quot;appStoreUrl&amp;quot;: &amp;quot;http://store.innovaphone.com/release/download/&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The installation of the downloaded version is done by the &#039;&#039;innovaphonemyAppsUpdateService&#039;&#039;. This service is installed and enabled during the initial installation of the myApps platform services.  To disable auto-update, either leave the &#039;&#039;Launcher Software Update&#039;&#039; settings empty or set the service&#039;s start mode to &#039;&#039;disabled&#039;&#039; in the Windows &#039;&#039;services control panel&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that on Windows the update service does not work on terminal servers. Administrators must do myApps base services updates using standard windows mechanisms.&lt;br /&gt;
&lt;br /&gt;
Note that on macOS if myApps has been installed from the Apple Store it is assumed that auto update from the PBX is not desired and disabled therefore.&lt;br /&gt;
&lt;br /&gt;
On Android/iOS/macOS updates can be downloaded from the respective app store.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Devices&#039;&#039; app can not update software installed on Windows PCs directly. However, when the PBX is updated using an &#039;&#039;update job&#039;&#039; in the &#039;&#039;Devices&#039;&#039; App, the &#039;&#039;Launcher Software Update&#039;&#039; settings will be updated accordingly and hence the myApps base services will ultimately also be updated to the same version.&lt;br /&gt;
&lt;br /&gt;
==== Auto update flow on Windows ====&lt;br /&gt;
&lt;br /&gt;
* On start of myApps, myApps checks if an update is available and ready for installation&lt;br /&gt;
** if yes, the update is installed directly, without user interaction (a popup is shown during the installation)&lt;br /&gt;
** if not, myApps starts&lt;br /&gt;
* if an update is available while myApps is already running, an update notification will be shown which let&#039;s the user choose to install the update now or later (the notification will then popup again after one hour)&lt;br /&gt;
&lt;br /&gt;
==UI elements ==&lt;br /&gt;
There are a few user interfaces provided by the platform services:&lt;br /&gt;
===tray-icon (Windows only) ===&lt;br /&gt;
::[[Image:myapps-tray.png|myapps-tray.png/|myapps-tray.png/]]&lt;br /&gt;
:Allows to&lt;br /&gt;
:* terminate myApps&lt;br /&gt;
:* toggle the &#039;&#039;autostart&#039;&#039; state&lt;br /&gt;
:* toggle the &#039;&#039;show in task bar&#039;&#039; state&lt;br /&gt;
:* open the trace folder&lt;br /&gt;
:&lt;br /&gt;
=== PBX connect form===&lt;br /&gt;
:: [[Image:myapps-connect.png|myapps-connect.png/|myapps-connect.png/]]&lt;br /&gt;
: Allows the user to specify the connect data for the PBX (i.e. IP address or DNS name)&lt;br /&gt;
:&lt;br /&gt;
=== Advanced settings===&lt;br /&gt;
::[[Image:myapps-settings0.png|myapps-settings0.png/|myapps-settings0.png/]]&lt;br /&gt;
::[[Image:myapps-settings.png|myapps-settings.png/|myapps-settings.png/]] [[Image:myapps-settings2.png|myapps-settings2.png/|myapps-settings2.png/]] [[Image:myapps-settings3.png|myapps-settings3.png/|myapps-settings3.png/]]&lt;br /&gt;
&lt;br /&gt;
: Allows to modify various platform dependant settings (such as e.g. the hotkey selection on Windows)&lt;br /&gt;
&lt;br /&gt;
== Interfaces ==&lt;br /&gt;
=== Provided APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.search/lib1_api_search.htm com.innovaphone.search] : access to local phone book entries by the [[#Local phonebook access|Local phonebook access]] component.&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.launcher/com.innovaphone.launcher.htm com.innovaphone.launcher] : display of OS specific user notifications and receipt of related user actions&lt;br /&gt;
; com.innovaphone.notificationhandler : reports back click on a notification.&lt;br /&gt;
; com.innovaphone.externalapps : to start external applications, see [[#Call an external application for calls|Call an external application for calls]]  above&lt;br /&gt;
&lt;br /&gt;
=== Used APIs ===&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.phone/com.innovaphone.phone.htm com.innovaphone.phone] : used to initiate new or manipulate existing calls by the [[#Hot keys|Hot keys]] and [[#URL handler|URL handler]] components.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.chat/com.innovaphone.chat.htm com.innovaphone.chat] : used to start a new chat by the [[#URL handler|URL handler]] component.&lt;br /&gt;
&lt;br /&gt;
; [http://sdk.innovaphone.com/web1/com.innovaphone.client/lib1_api_client.htm com.innovaphone.client] : the model is used to learn the update settings, see [[#Auto update|Auto update]] above&lt;br /&gt;
&lt;br /&gt;
=== Protocols ===&lt;br /&gt;
&lt;br /&gt;
; [https://sdk.innovaphone.com/doc/launcher/Media.htm Media Protocol] : used by apps to allocate RTP channels, see [[#RTP service for audio.2C video and data|RTP service for audio, video and data]] above&lt;br /&gt;
&lt;br /&gt;
== Related App Services ==&lt;br /&gt;
&lt;br /&gt;
none&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
; Incoming call as banner on myApps for iOS : Since iOS 14 the iOS CallKit presents incoming calls as a banner leaving the original green answer button of myApps visible. Use only the blue button of the banner to accept the call or change iPhone Settings, App &amp;quot;Phone&amp;quot;, &amp;quot;Incoming Calls&amp;quot; to &amp;quot;Full Screen&amp;quot; to hide the myApps user interface again during call answering.&lt;br /&gt;
&lt;br /&gt;
; Call answer in speakerphone mode even with active Bluetooth headset on myApps for iOS : This causes unwanted speakerphone operation if the smartphone is used with a Bluetooth car audio system. The behaviour can be changed by selecting &#039;&#039;Bluetooth Headset&#039;&#039; in this setting:&lt;br /&gt;
:&#039;&#039;iOS Settings-&amp;gt;Accessibility-&amp;gt;Touch-&amp;gt;Call Audio Routing: Automatic / Bluetooth Headset / Speaker&#039;&#039;&lt;br /&gt;
:&#039;&#039;iOS Einstellungen-&amp;gt;Bedienungshilfen-&amp;gt;Tippen-&amp;gt;Anrufaudioausgabe: Automatisch / Bluetooth-Headset / Lautsprecher&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Windows Server 2016 (Windows 10 Build 1607) : windows just shows the first notification. Further notifications aren&#039;t displayed until the previous ones are removed from the notification center. Current windows builds do not show this behaviour anymore.&lt;br /&gt;
&lt;br /&gt;
; Problems on Mac computers with Yealink USB headsets&lt;br /&gt;
: we have received reports that myApps quits unexpectedly on some Mac computers when a Yealink headset is plugged in.  Unfortunately, we could not find out the cause yet.  If you use Yealink USB headsets and have a similar issue, please open a support ticket and send myApps traces.&lt;br /&gt;
&lt;br /&gt;
; Poly / Plantronics headset buttons only functional if myApps is started with Rosetta&lt;br /&gt;
: myApps macOS supports Apple M1/M2 hardware natively. However, the Poly / Plantronics headset SDK is only available for Intel platform and thus myApps needs to be started via Apple&#039;s Intel emulator Rosetta if a Poly / Plantronics headset is used. This is done with right-click on the myApps executable, &#039;&#039;Information&#039;&#039;, &#039;&#039;Open with Rosetta&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Windows surface devices may not work correctly&lt;br /&gt;
: Chromium does not get touch keyboard events. USB Keyboards may not be recognized either.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Windows using the .msi file found in the &#039;&#039;myApps Windows&#039;&#039; package from [https://store.innovaphone.com/release/download.htm store.innovaphone.com].&lt;br /&gt;
&lt;br /&gt;
myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
=== MSI Parameters and install options ===&lt;br /&gt;
&lt;br /&gt;
The MSI installer of myApps for Windows supports the following parameters and can be edited with [https://docs.microsoft.com/en-us/windows/win32/msi/orca-exe Microsoft Orca]. You can add your parameters in the table &#039;&#039;property&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; SERVER (REG_SZ): the PBX&#039;s server URL&lt;br /&gt;
; OFFICEPRESENCE (REG_DWORD): &#039;&#039;&#039;false&#039;&#039;&#039; to disable presence integration in Microsoft Office&lt;br /&gt;
: this is also available as a check-mark when running the install manually&lt;br /&gt;
&lt;br /&gt;
; DISABLEHEADSETS (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable headsets support, see [[#Device handling|Device handling]] above&lt;br /&gt;
&lt;br /&gt;
; EXTERNALAPPS (REG_SZ): pre-define external applications, see [[#Call an external application for calls|Call an external application for calls]] above&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;&amp;quot;{&amp;quot;&amp;quot;externalApps&amp;quot;&amp;quot;:[{&amp;quot;&amp;quot;id&amp;quot;&amp;quot;:0,&amp;quot;&amp;quot;name&amp;quot;&amp;quot;:&amp;quot;&amp;quot;Wireshark&amp;quot;&amp;quot;,&amp;quot;&amp;quot;path&amp;quot;&amp;quot;:&amp;quot;&amp;quot;C:\\Program Files\\Wireshark\\Wireshark.exe&amp;quot;&amp;quot;,&amp;quot;&amp;quot;param&amp;quot;&amp;quot;:&amp;quot;&amp;quot;test $I&amp;quot;&amp;quot;}]}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; FORCERESTART (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; (or any string ...) kills myApps during the installation and restarts it for the currently logged in user, if it was running&lt;br /&gt;
&lt;br /&gt;
; DISABLELOCALHOST (REG_DWORD): &#039;&#039;&#039;true&#039;&#039;&#039; to disable use of &#039;&#039;&#039;localhost&#039;&#039;&#039; string to access the local webserver. Use &#039;&#039;&#039;127.0.0.1&#039;&#039;&#039; instead&lt;br /&gt;
&lt;br /&gt;
; EXCLUDEINTERFACES (REG_SZ): some VPN interfaces are not detected by Windows as IF_TYPE_PPP or IF_TYPE_TUNNEL and therefore the &#039;&#039;&#039;media outside VPN&#039;&#039;&#039; setting is not taking effect. With this option interfaces can be pre-defined that will not be used for media. Interfaces must be comma separated&lt;br /&gt;
: e.g. &amp;lt;code&amp;gt;EXCLUDEINTERFACES=&amp;quot;172,192.168,10.10&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current settings are stored in the registry at &amp;lt;code&amp;gt;Computer\HKEY_CURRENT_USER\Software\innovaphone\myApps&amp;lt;/code&amp;gt; or at &amp;lt;code&amp;gt;Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\innovaphone\myApps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Boolean values like OfficePresence are stored in registry entries with type REG_DWORD and values 1 or 0. 0 disables the setting and 1 enables it.&lt;br /&gt;
&lt;br /&gt;
== iOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on iOS by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;App Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== macOS ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services might be installed directly from the Apple store. An installer package &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; and a disk image &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; is also available from the innovaphone app store. Install &amp;lt;code&amp;gt;myapps.pkg&amp;lt;/code&amp;gt; by double-click on the file and follow the instructions of the installer. myApps becomes available in the Applications folder and can be opened by double-click. Or download and open &amp;lt;code&amp;gt;myapps.dmg&amp;lt;/code&amp;gt; and double klick myApps. If desired integrate it into the app dock by right click, &#039;&#039;Options, Keep in the dock&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If installed from the innovaphone app store, myApps can update itself automatically, see [[#Auto update|Auto update]] above.&lt;br /&gt;
&lt;br /&gt;
If installed from the Apple store, macOS notifies about updates on the Apple store. myApps [[#Auto update|Auto update]] is disabled then.&lt;br /&gt;
&lt;br /&gt;
If a clean-install of the client is necessary, the folder &amp;quot;/Users/username/Library/Containers/myapps&amp;quot; needs to be deleted. To be on the safe side also delete it from the trash bin.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying this dictionary in the MDM&lt;br /&gt;
 &amp;lt;plist&amp;gt;&lt;br /&gt;
   &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;key&amp;gt;server&amp;lt;/key&amp;gt;&lt;br /&gt;
     &amp;lt;string&amp;gt;pbx.example.com&amp;lt;/string&amp;gt;&lt;br /&gt;
   &amp;lt;/dict&amp;gt;&lt;br /&gt;
 &amp;lt;/plist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Preferences ===&lt;br /&gt;
&lt;br /&gt;
macOS supports preference settings that can be set via a shell command or via Mac remote management&lt;br /&gt;
&lt;br /&gt;
 defaults write com.innovaphone.client-ios-14r1 server &amp;quot;PBX-server-URL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following parameters and can be set through this method:&lt;br /&gt;
&lt;br /&gt;
; server: the PBX&#039;s server URL&lt;br /&gt;
&lt;br /&gt;
=== Setting myApps as Default App for SIP-URLs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add &#039;{&lt;br /&gt;
   LSHandlerURLScheme = sip;&lt;br /&gt;
   LSHandlerRoleAll = &amp;quot;&amp;lt;CFBundleIdentifier&amp;gt;&amp;quot;;&lt;br /&gt;
}&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To find the “CFBundleIdentifier”, proceed as follows:&lt;br /&gt;
* In the Finder under “Applications”, search for the desired myApps client that you want to set as the default app.&lt;br /&gt;
* Right-click on “Show package contents” -&amp;gt; you will find the “CFBundleIdentifier” in the Info.plist file.&lt;br /&gt;
&lt;br /&gt;
A restart of the MAC is required.&lt;br /&gt;
&lt;br /&gt;
=== Using Sennheiser headsets ===&lt;br /&gt;
If you use Sennheiser headsets, you should also install the then-current &amp;lt;code&amp;gt;DSEA_SDK_v&amp;lt;/code&amp;gt;&#039;&#039;version&#039;&#039;&amp;lt;code&amp;gt;.pkg&amp;lt;/code&amp;gt; package, after you installed the myApps client.  Without that, audio will still work, but not the controls on the headset.  You will need to keep that up-to-date yourself, as it is not updated by myApps&#039;s auto-update function.&lt;br /&gt;
&lt;br /&gt;
== Android ==&lt;br /&gt;
&lt;br /&gt;
myApps platform services are installed on Android by loading &#039;&#039;innovaphone myApps&#039;&#039; from the &#039;&#039;Play Store&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Configuration via MDM ===&lt;br /&gt;
&lt;br /&gt;
the PBX&#039;s server URL can be pre-configured by specifying a property &amp;quot;server&amp;quot; with string value &amp;quot;pbx.example.com&amp;quot; in the MDM.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
== Server configuration ==&lt;br /&gt;
When opening myApps for the first time, the user is prompted for the Server. Usually only the hostname (DNS host name or IP address) needs to be configured.&lt;br /&gt;
&lt;br /&gt;
But there are more options for special PBX configurations.&lt;br /&gt;
&lt;br /&gt;
; Non-standard HTTPS port&lt;br /&gt;
: If the PBX uses a non-standard HTTPS port, it must be appended to the host name separated by a colon (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com:4444&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com:4444/PBX0/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; DynPBX module name&lt;br /&gt;
: If the PBX is a DynPBX, the module id must be appended to PBX0 separated - (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com/PBX0-1&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0-1/APPCLIENT/appclient.htm&amp;lt;/code&amp;gt;)&lt;br /&gt;
; Softphone physical location&lt;br /&gt;
: If user defined physical location shall be used for softphone, you can append it using a parameter &amp;lt;code&amp;gt;#phys=&amp;lt;/code&amp;gt;.&lt;br /&gt;
: Example: &amp;lt;code&amp;gt;pbx.example.com#phys=slave&amp;lt;/code&amp;gt; (expands to &amp;lt;code&amp;gt;https://pbx.example.com/PBX0/APPCLIENT/appclient.htm#phys=slave&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Example 1: PBX pbx.example.com with standard configuration&lt;br /&gt;
 pbx.example.com&lt;br /&gt;
&lt;br /&gt;
Example 2: PBX slave.example with DynPBX module ID 1, HTTPS port 4444 and physical location master&lt;br /&gt;
 slave.example.com:4444/PBX0-1#phys=master&lt;br /&gt;
&lt;br /&gt;
=== HTTP proxy support ===&lt;br /&gt;
&lt;br /&gt;
myApps platform services do support operation via HTTP proxy now. If one or more proxies have been configured in the network settings of the operating system for the active network connection, HTTP CONNECT tunnels are established.&lt;br /&gt;
&lt;br /&gt;
On Windows user name and password can be specified for the tunnel servers as generic credentials in the credentials manager (Anmeldeinformationsverwaltung). The name of the credentials must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
On Android user name and password can be specified through Android &#039;&#039;Settings, Accounts&#039;&#039; by adding a myApps &#039;&#039;HTTP Proxy Credentials&#039;&#039; account. The name of the account must be the tunnel server hostname.&lt;br /&gt;
&lt;br /&gt;
== Platform specific settings ==&lt;br /&gt;
When myApps runs under the myApps platform services, it will show various platform specific settings as part of its &#039;&#039;burger menu&#039;&#039;, so the user can set them.  See &#039;&#039;Advanced settings&#039;&#039; in [[#UI elements|UI elements]] above.&lt;br /&gt;
&lt;br /&gt;
Some options can also be set globally for all myApps clients in the PBX&#039;s [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps &#039;&#039;Client Settings&#039;&#039;]]&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Option&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | Where to set&lt;br /&gt;
&lt;br /&gt;
!&lt;br /&gt;
! style=&amp;quot;text-align: left; font-weight: bold&amp;quot;| Availability&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| || || User menu || PBX &#039;&#039;Client Settings&#039;&#039; || Windows || iOS || Android || macOS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Autostart || Launch myApps on login || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Appear offline after || controls after which idle time a user is considered &#039;&#039;inactive&#039;&#039;. See [[#User activity|User activity]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Hotkeys || Hotkeys for call dial, accept, reject. See [[#Hot keys|Hot keys]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Docking || Docking mode (left, right, none). See [[#???|??]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Desktop notifications|| Turn on/off platform notifications. See [[#Notifications|  Notifications]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| VPN || Disable VPN address for ICE candidate selection. See [[#RTP ports| RTP ports]] above || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Show in taskbar|| Show myApps in the taskbar in addition to it&#039;s tray icon.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Log flags || turn on/off certain trace levels. See [[#Troubleshooting|Troubleshooting]] below.  || &amp;amp;#10004; ||&amp;amp;#10004; ||&amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| External applications || define the applications available for Apps to be started. See [[#Call an external application for calls|Call an external application for calls]] above.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Ring in headset || send ring tone for incoming to headset instead of loudspeaker.  || &amp;amp;#10004; ||&amp;amp;#10007; ||&amp;amp;#10004; || &amp;amp;#10007; || &amp;amp;#10007; || &amp;amp;#10007;&lt;br /&gt;
|}&lt;br /&gt;
== Start parameters for Windows ==&lt;br /&gt;
&lt;br /&gt;
On Windows, it is not possible to pass start parameters from the [https://www.chromium.org/developers Chromium documentation] to the myApps process.&lt;br /&gt;
&lt;br /&gt;
== OS Settings for Windows ==&lt;br /&gt;
Windows settings can influence the display of &#039;&#039;Desktop notifications&#039;&#039;. See [https://support.microsoft.com/en-us/help/4028678/windows-10-change-notification-settings Change notification settings in Windows 10/11] for details.&lt;br /&gt;
&lt;br /&gt;
=== Windows 11 ===&lt;br /&gt;
&lt;br /&gt;
* Windows 11 has a feature &amp;quot;do not disturb&amp;quot;. This hides notifications if enabled.&lt;br /&gt;
* Windows 11 has a feature &amp;quot;focus&amp;quot;. This enables &amp;quot;do not disturb&amp;quot; and thus hides notifications too.&lt;br /&gt;
* Windows 11 has priority settings for notifications. Ensure that VoIP notifications for calls are allowed any maybe also include myApps as an App which is allowed to show notifications.&lt;br /&gt;
&lt;br /&gt;
== OS settings for Android ==&lt;br /&gt;
; Events : The appearance of notifications can be controlled here.&lt;br /&gt;
&lt;br /&gt;
; Call accounts : For proper incoming call signaling, the call account &#039;&#039;myApps&#039;&#039; needs to be enabled. Note that on Samsung smartphones the call account switch likely toggles back and a few tries may need to be done until it persists. Please double-check the state.&lt;br /&gt;
&lt;br /&gt;
; Preferred Calling Account : Choose which calling account (myApps/SIM/..) should be used for outgoing calls initiated from within the native phone app / phone book.&lt;br /&gt;
&lt;br /&gt;
; Background data, unlimited data usage : Grant background data use to enable &#039;&#039;myApps&#039;&#039; to connect to the PBX immediately on an incoming call.&lt;br /&gt;
&lt;br /&gt;
; Overlaying : This setting is not needed if call account &#039;&#039;myApps&#039;&#039; has been enabled. Should there be a reason for not enabling call account &#039;&#039;myApps&#039;&#039;, the permission for overlaying needs to be granted on Android 10 or higher for proper call signaling.&lt;br /&gt;
&lt;br /&gt;
Note: If no SIM card is installed some Android smartphones exhibit a problem dialing from the smartphone contacts. The contacts app shows a choice &#039;&#039;Select SIM card for this call&#039;&#039; but all possible dialers are greyed out. In this case make myApps the default phone app in Android settings &#039;&#039;Apps, Default apps, Telephony&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for iOS ==&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in iOS &#039;&#039;Settings, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== OS settings for macOS ==&lt;br /&gt;
&lt;br /&gt;
; Notifications : The appearance of notifications can be controlled in macOS &#039;&#039;Preferences, Notifications, myApps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
myApps platform services can write various traces for debugging.  Trace can be turned on and off selectively in the [[#Advanced settings|Advanced settings]].&lt;br /&gt;
&lt;br /&gt;
The following trace flags can be set:&lt;br /&gt;
&lt;br /&gt;
(&#039;&#039;Recommended trace options are: &#039;&#039;&#039;App, Browser, ICE, TURN, Signaling and Audio&#039;&#039;&#039;. Please do not activate other flags unless innovaphone support says otherwise&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |  Abbreviation&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; |code&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;text-align: left; font-weight: bold&amp;quot; | description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| App||0x000000001|| logs from the App Service itself&lt;br /&gt;
|-&lt;br /&gt;
| DNS||0x000000008|| logs DNS requests and results&lt;br /&gt;
|-&lt;br /&gt;
| HTTP client||0x000000080|| http client logs&lt;br /&gt;
|-&lt;br /&gt;
| TLS||0x000000400|| TLS logs&lt;br /&gt;
|-&lt;br /&gt;
| TCP||0x000000800|| TCP logs&lt;br /&gt;
|-&lt;br /&gt;
| LDS||0x000001000|| local domain sockets&lt;br /&gt;
|-&lt;br /&gt;
| WebSocket client||0x000004000|| logs outgoing websocket connections&lt;br /&gt;
|-&lt;br /&gt;
| App WebSocket||0x000008000|| logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
|-&lt;br /&gt;
| UDP||0x000200000|| UDP logs&lt;br /&gt;
|-&lt;br /&gt;
| DTLS||0x000400000|| logs DTLS handshake and messages&lt;br /&gt;
|-&lt;br /&gt;
| Media||0x000800000|| logs media events&lt;br /&gt;
|-&lt;br /&gt;
| Media channel||0x001000000|| logs RTP/SCTP media connections&lt;br /&gt;
|-&lt;br /&gt;
| ICE||0x002000000|| logs ICE messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| TURN||0x004000000|| logs TURN messages between peers&lt;br /&gt;
|-&lt;br /&gt;
| AppSharing||0x008000000|| logs AppSharing connection&lt;br /&gt;
|-&lt;br /&gt;
| Audio||0x010000000|| logs Audio connection and headset events&lt;br /&gt;
|-&lt;br /&gt;
| Video||0x020000000|| logs video connection and webcam events&lt;br /&gt;
|-&lt;br /&gt;
| Browser||0x040000000|| logs Chromium events&lt;br /&gt;
|-&lt;br /&gt;
| AppProxy||0x080000000|| logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
|-&lt;br /&gt;
| Webserver ||0x200000000|| enables webserver specific logs&lt;br /&gt;
|-&lt;br /&gt;
| Browser Console ||0x400000000|| logs browser console events&lt;br /&gt;
|-&lt;br /&gt;
| Signaling||0x800000000|| enables logs in the signaling module for debugging calls&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;code&#039;&#039; can be or&#039;ed and used as value for the &#039;&#039;Log flags&#039;&#039; field in [[{{NAMESPACE}}:PBX/Config/myApps#Client_Settings|PBX/Config/myApps/Client Settings]].&lt;br /&gt;
&lt;br /&gt;
; Windows :On Windows, traces are written to the &amp;lt;code&amp;gt;C:\Users\[UserName]\AppData\Local\innovaphone\myApps&amp;lt;/code&amp;gt; directory. If you start myApps with --log-size as parameter, you can define the maximum size of a log file (e.g. --log-size=100000000 would be 100MB for each file)&lt;br /&gt;
&lt;br /&gt;
:* myApps-&#039;&#039;date-time&#039;&#039;.txt : main log file for the platform services&lt;br /&gt;
&lt;br /&gt;
:* myAppsOutlookSearch-&#039;&#039;date-time&#039;&#039;.txt : log file for the Outlook phone book access&lt;br /&gt;
&lt;br /&gt;
:* myAppsHookController-&#039;&#039;date-time&#039;&#039;.txt : log file for the hot-key interceptor (see [[#Hot keys|Hot keys]])&lt;br /&gt;
&lt;br /&gt;
; :myApps update installation traces are written to the &amp;lt;code&amp;gt;%windir%\temp\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsInstall.txt: MSI installation file&lt;br /&gt;
&lt;br /&gt;
; :myApps update service traces are written to the &amp;lt;code&amp;gt;%ProgramData%\innovaphone\myAppsUpdateService&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
:* myAppsUpdateService-&#039;&#039;date-time&#039;&#039;.txt: myApps update service traces&lt;br /&gt;
&lt;br /&gt;
;Android : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
: also, an Android device might also be connected to a PC via an USB cable to get the traces. The files can be found in &amp;lt;code&amp;gt;Android/data/com.innovaphone.clientandroid/files&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
; macOS : traces can be sent by e-mail.&lt;br /&gt;
&lt;br /&gt;
: also, the files can be found in &amp;lt;code&amp;gt;~/Library/Containers/com.innovaphone.client-ios/Data/Documents/&amp;lt;/code&amp;gt;. Press &#039;&#039;Alt+N&#039;&#039; followed by space to get tilde &#039;&#039;~&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Known Problems =&lt;br /&gt;
[[:Category:Problem myApps platform services|Known Problems]]&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Redundancy|Reference14r2:Concept_myApps_Redundancy]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myApps_Office_Integration|Reference14r2:Concept_myApps_Office_Integration]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept_myAPPs_Search_in_local-Outlook_Contacts|Reference14r2:Concept_myAPPs_Search_in_local-Outlook_Contacts]]&lt;br /&gt;
* [[{{NAMESPACE}}:Call_Detail_Record_CDR_PBX|Reference14r2:Call_Detail_Record_CDR_PBX]]&lt;br /&gt;
* [[{{NAMESPACE}}:Concept Push Notifications for myPBX iOS and Android|Reference14r2:Concept Push Notifications for myPBX iOS and Android]]&lt;br /&gt;
* [[Howto:Troubleshoot v13 Push with myApps for Android and iOS]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concept myApps platform services]]&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=77078</id>
		<title>Reference14r2:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=77078"/>
		<updated>2025-06-25T07:54:30Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* App Platform - x86-64 (Virtual Machine 64bit) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or above&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
** Proxmox/KVM/Qemu&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How to implement large PBXs#Technical data and recommended number of users supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App services and multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. Before version 130012, you must use ISA, as Virtio was not supported with older versions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
** Proxmox: follow this description here, just with the app-platform-ova.zip: https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Proxmox_VE&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: eg. your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: eg. DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: eg. TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: eg. your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How to retrieve files from the AP| Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nightly database analyse ===&lt;br /&gt;
&lt;br /&gt;
Every database is analysed at night to keep indexes in sync with the data. This triggers a &#039;&#039;vacuumdb -a -z&#039;&#039;, which updates optimizer statistics, but does &#039;&#039;&#039;not&#039;&#039;&#039; shrink the physical size of the database.&amp;lt;br/&amp;gt;&lt;br /&gt;
This must be done manually in the instance settings.&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13 Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
After the update has been downloaded and verified, your App Platform will reboot.&lt;br /&gt;
You can check the installation process after the reboot with the following URL: https://IP-of-AP/manager/ramdisk.log&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: A timezone string which is used by the App Platform Manager to do certain jobs according to the configured timezone.&lt;br /&gt;
** Note that this doesn&#039;t change the timezone of the linux itself!&lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: obsolete, use the Devices App for backups!&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Current Webserver certificates&#039;&#039;: shows the current certificates with the ability to download them. &lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Encrypt ==&lt;br /&gt;
&lt;br /&gt;
Configure the certificate creation by Let&#039;s Encrypt here.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Enable&#039;&#039;: turns the automatic creation on or off&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App URL&#039;&#039;: the URL of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this URL from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App Password&#039;&#039;: the client password of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this password from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Key length&#039;&#039;: 2048, 3072 or 4096 (keep in mind, that [[{{NAMESPACE}}:Certificate_management#Certificate_Key_Length_and_CPU_Usage|a higher value provides higher security but also lower performance!]])&lt;br /&gt;
* &#039;&#039;DNS Name&#039;&#039;: the external DNS names of your device (up to 100 possible)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
App Platform [[#App Platform replication|replication settings]]&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Updates the App Platform to the latest image available on the App Store.&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
Restarts the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Shutdown ==&lt;br /&gt;
Shuts down the App Platform.&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 or above on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
**Note: to ensure rapid recognition of the new DNS target, the definition of an appropriate TTL value is recommended&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.innovaphone.com/index.php?title=Howto14r2:Firmware_Upgrade_V14r1_V14r2#App_Platform_and_Apps&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= App Installer PBX Manager Plugin =&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V14 and above&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The app installer plugin allows IT administrator (with access to the PBX Manager) to install/update/delete new apps from the innovaphone app store including Partners apps. It is automatically available with existing app platforms or after adding a new one in the PBX Manager.&lt;br /&gt;
It offers a view to the App Platform Manager‘s App Store with all the available functionalities and simplifies the install, update and uninstall of apps.&lt;br /&gt;
&lt;br /&gt;
== Dedicated AP for each user ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app will install the app service and add a new instance with the user’s domain. The instance is automatically started.&amp;lt;br&amp;gt;&lt;br /&gt;
This further enables the configuration of the instance through its respective PBX Manager plugin. &amp;lt;br&amp;gt;&lt;br /&gt;
Uninstalling the app will remove the app service and the corresponding instance.&lt;br /&gt;
&lt;br /&gt;
== Shared AP between users ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app works in a similar way to that of the dedicated AP. However, each time a new user installs the app, only a new instance is created if the app service is already installed. &amp;lt;br&amp;gt;&lt;br /&gt;
A user can uninstall the app, in this case the corresponding instance is deleted. If no more instances exist, then the app service is uninstalled. &amp;lt;br&amp;gt;&lt;br /&gt;
The administrator can only update the app service in such scenario.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== App Platform doesn&#039;t start after an update ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
Note: This process can take a while, after it&#039;s finished it reboots and automatically change the &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; value. &lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine ===&lt;br /&gt;
&lt;br /&gt;
Boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition.&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
=== It still doesn&#039;t start ===&lt;br /&gt;
&lt;br /&gt;
If it still doesn&#039;t start, configure the App Platform to boot from /dev/sda3 (or inside a VM start the second boot loader entry) and login with SSH as root.&lt;br /&gt;
Then do a first check to verify that you have a specific error due to an incomplete update or a wrong update order:&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* /apps/manager/manager&lt;br /&gt;
* if this outputs &#039;&#039;&#039;error while loading shared libraries: libcrypto.so.3:&#039;&#039;&#039; you have a manager version which cannot run on the current image.&lt;br /&gt;
&lt;br /&gt;
In this case you must download an older build (14r1 1410593):&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* wget --no-check-certificate -O /apps/manager/manager https://webbuild.innovaphone.com/1410593/arm/manager/manager &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* wget --no-check-certificate -O /apps/webserver/webserver https://webbuild.innovaphone.com/1410593/arm/webserver/webserver &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* chown root:root /apps/manager/manager&lt;br /&gt;
* chown root:root /apps/webserver/webserver&lt;br /&gt;
* chmod +x /apps/manager/manager&lt;br /&gt;
* chmod +x /apps/webserver/webserver&lt;br /&gt;
* echo 110000 &amp;gt; /mnt/sda1/label&lt;br /&gt;
** this allows the manager to perform an image update again&lt;br /&gt;
* /etc/init.d/S92manager start&lt;br /&gt;
* now perform an image update and &#039;&#039;&#039;afterwards&#039;&#039;&#039; update your apps again&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files|Reference14r2:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine|Reference14r2:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 110027 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
&lt;br /&gt;
=== All databases ===&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
=== single database ===&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and the App database is not available during this time&lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;br /&gt;
&lt;br /&gt;
== Move instance database to external database host ==&lt;br /&gt;
&lt;br /&gt;
In case you want to use an external database server instead of the integrated:&lt;br /&gt;
&lt;br /&gt;
* download a backup of the specific instance over the App Platform Manager&lt;br /&gt;
* create a postgresql database on the external host:&lt;br /&gt;
** createdb --encoding=UTF-8 exampledb&lt;br /&gt;
* restore the backup&lt;br /&gt;
** pg_restore -d exampledb backup-exampledb.dump&lt;br /&gt;
* change the ownership to a specific postgresql user (which you have to create yourself first)&lt;br /&gt;
** psql -d postgres -c &amp;quot;ALTER DATABASE exampledb OWNER TO exampleuser&amp;quot;&lt;br /&gt;
* configure the database host, name, user and password on the instance inside the App Platform Manager&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=77077</id>
		<title>Reference14r2:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=77077"/>
		<updated>2025-06-25T07:54:05Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* App Platform - x86-64 (Virtual Machine 64bit) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or above&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
** Proxmox/KVM/Qemu&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How to implement large PBXs#Technical data and recommended number of users supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App services and multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. Before version 130012, you &#039;&#039;&#039;must&#039;&#039;&#039; use &#039;&#039;&#039;ISA&#039;&#039;&#039;, as Virtio was not supported with older versions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
** Proxmox: follow this description here, just with the app-platform-ova.zip: https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Proxmox_VE&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: eg. your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: eg. DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: eg. TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: eg. your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How to retrieve files from the AP| Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nightly database analyse ===&lt;br /&gt;
&lt;br /&gt;
Every database is analysed at night to keep indexes in sync with the data. This triggers a &#039;&#039;vacuumdb -a -z&#039;&#039;, which updates optimizer statistics, but does &#039;&#039;&#039;not&#039;&#039;&#039; shrink the physical size of the database.&amp;lt;br/&amp;gt;&lt;br /&gt;
This must be done manually in the instance settings.&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13 Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
After the update has been downloaded and verified, your App Platform will reboot.&lt;br /&gt;
You can check the installation process after the reboot with the following URL: https://IP-of-AP/manager/ramdisk.log&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: A timezone string which is used by the App Platform Manager to do certain jobs according to the configured timezone.&lt;br /&gt;
** Note that this doesn&#039;t change the timezone of the linux itself!&lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: obsolete, use the Devices App for backups!&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Current Webserver certificates&#039;&#039;: shows the current certificates with the ability to download them. &lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Encrypt ==&lt;br /&gt;
&lt;br /&gt;
Configure the certificate creation by Let&#039;s Encrypt here.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Enable&#039;&#039;: turns the automatic creation on or off&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App URL&#039;&#039;: the URL of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this URL from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App Password&#039;&#039;: the client password of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this password from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Key length&#039;&#039;: 2048, 3072 or 4096 (keep in mind, that [[{{NAMESPACE}}:Certificate_management#Certificate_Key_Length_and_CPU_Usage|a higher value provides higher security but also lower performance!]])&lt;br /&gt;
* &#039;&#039;DNS Name&#039;&#039;: the external DNS names of your device (up to 100 possible)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
App Platform [[#App Platform replication|replication settings]]&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Updates the App Platform to the latest image available on the App Store.&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
Restarts the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Shutdown ==&lt;br /&gt;
Shuts down the App Platform.&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 or above on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
**Note: to ensure rapid recognition of the new DNS target, the definition of an appropriate TTL value is recommended&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.innovaphone.com/index.php?title=Howto14r2:Firmware_Upgrade_V14r1_V14r2#App_Platform_and_Apps&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= App Installer PBX Manager Plugin =&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V14 and above&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The app installer plugin allows IT administrator (with access to the PBX Manager) to install/update/delete new apps from the innovaphone app store including Partners apps. It is automatically available with existing app platforms or after adding a new one in the PBX Manager.&lt;br /&gt;
It offers a view to the App Platform Manager‘s App Store with all the available functionalities and simplifies the install, update and uninstall of apps.&lt;br /&gt;
&lt;br /&gt;
== Dedicated AP for each user ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app will install the app service and add a new instance with the user’s domain. The instance is automatically started.&amp;lt;br&amp;gt;&lt;br /&gt;
This further enables the configuration of the instance through its respective PBX Manager plugin. &amp;lt;br&amp;gt;&lt;br /&gt;
Uninstalling the app will remove the app service and the corresponding instance.&lt;br /&gt;
&lt;br /&gt;
== Shared AP between users ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app works in a similar way to that of the dedicated AP. However, each time a new user installs the app, only a new instance is created if the app service is already installed. &amp;lt;br&amp;gt;&lt;br /&gt;
A user can uninstall the app, in this case the corresponding instance is deleted. If no more instances exist, then the app service is uninstalled. &amp;lt;br&amp;gt;&lt;br /&gt;
The administrator can only update the app service in such scenario.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== App Platform doesn&#039;t start after an update ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
Note: This process can take a while, after it&#039;s finished it reboots and automatically change the &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; value. &lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine ===&lt;br /&gt;
&lt;br /&gt;
Boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition.&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
=== It still doesn&#039;t start ===&lt;br /&gt;
&lt;br /&gt;
If it still doesn&#039;t start, configure the App Platform to boot from /dev/sda3 (or inside a VM start the second boot loader entry) and login with SSH as root.&lt;br /&gt;
Then do a first check to verify that you have a specific error due to an incomplete update or a wrong update order:&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* /apps/manager/manager&lt;br /&gt;
* if this outputs &#039;&#039;&#039;error while loading shared libraries: libcrypto.so.3:&#039;&#039;&#039; you have a manager version which cannot run on the current image.&lt;br /&gt;
&lt;br /&gt;
In this case you must download an older build (14r1 1410593):&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* wget --no-check-certificate -O /apps/manager/manager https://webbuild.innovaphone.com/1410593/arm/manager/manager &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* wget --no-check-certificate -O /apps/webserver/webserver https://webbuild.innovaphone.com/1410593/arm/webserver/webserver &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* chown root:root /apps/manager/manager&lt;br /&gt;
* chown root:root /apps/webserver/webserver&lt;br /&gt;
* chmod +x /apps/manager/manager&lt;br /&gt;
* chmod +x /apps/webserver/webserver&lt;br /&gt;
* echo 110000 &amp;gt; /mnt/sda1/label&lt;br /&gt;
** this allows the manager to perform an image update again&lt;br /&gt;
* /etc/init.d/S92manager start&lt;br /&gt;
* now perform an image update and &#039;&#039;&#039;afterwards&#039;&#039;&#039; update your apps again&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files|Reference14r2:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine|Reference14r2:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 110027 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
&lt;br /&gt;
=== All databases ===&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
=== single database ===&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and the App database is not available during this time&lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;br /&gt;
&lt;br /&gt;
== Move instance database to external database host ==&lt;br /&gt;
&lt;br /&gt;
In case you want to use an external database server instead of the integrated:&lt;br /&gt;
&lt;br /&gt;
* download a backup of the specific instance over the App Platform Manager&lt;br /&gt;
* create a postgresql database on the external host:&lt;br /&gt;
** createdb --encoding=UTF-8 exampledb&lt;br /&gt;
* restore the backup&lt;br /&gt;
** pg_restore -d exampledb backup-exampledb.dump&lt;br /&gt;
* change the ownership to a specific postgresql user (which you have to create yourself first)&lt;br /&gt;
** psql -d postgres -c &amp;quot;ALTER DATABASE exampledb OWNER TO exampleuser&amp;quot;&lt;br /&gt;
* configure the database host, name, user and password on the instance inside the App Platform Manager&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
	<entry>
		<id>https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=76770</id>
		<title>Reference14r2:Concept App Platform</title>
		<link rel="alternate" type="text/html" href="https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform&amp;diff=76770"/>
		<updated>2025-05-27T11:11:12Z</updated>

		<summary type="html">&lt;p&gt;Dde: /* Shrink the physically size of PostgreSQL database files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= General =&lt;br /&gt;
* V13 uses [https://buildroot.org/ buildroot]&lt;br /&gt;
* this is an own (innovaphone) collection of packages&lt;br /&gt;
* For further information see: [https://buildroot.org/docs.html Buildroot Documentations]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V13 or above&lt;br /&gt;
* Gateway (arm): IPx10 (with CF card) or IPx11 (with mSATA SSD) &lt;br /&gt;
* Gateway (arm64): IPx13 (with m2 SSD)&lt;br /&gt;
* Virtual (x86_64)&lt;br /&gt;
** HyperV with [https://docs.microsoft.com/de-de/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server#supported-virtual-machine-configuration-versions VM-configuration Version] 6.2 (minimum: Windows 10 or Windows Server 2016)&lt;br /&gt;
** VMWare&lt;br /&gt;
** Proxmox/KVM/Qemu&lt;br /&gt;
&lt;br /&gt;
== Default credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;During INSTALL, the default passwords are replaced with the global Admin PW!&#039;&#039;&#039;&lt;br /&gt;
* SSH-Login with &#039;&#039;&#039;admin&#039;&#039;&#039; and &#039;&#039;&#039;ipapps&#039;&#039;&#039;&lt;br /&gt;
* root login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039; (the root login is not directly possible, you have to login as admin first and use the command &#039;&#039;su root&#039;&#039;)&lt;br /&gt;
* manager App (web login) &#039;&#039;&#039;pwd&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= App Platform - arm/arm64 (Gateway)=&lt;br /&gt;
&lt;br /&gt;
* The installation image has a size of ~50MB. During installation, the following partitions are created&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 fat32: 200MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
&lt;br /&gt;
When comparing potential performance of the IPxx11 platform compared to the IPxx10 platform, there are some major differences:&lt;br /&gt;
* SSDs found in the xx11 are faster and more reliable than the CF found in the xx10&lt;br /&gt;
* the available RAM for the App Platform (as specified in column &#039;&#039;RAM for LAP (GB) out of RAM&#039;&#039; in chapter &#039;&#039;Technical data and recommended number of users supported&#039;&#039; of [[Howto:How to implement large PBXs#Technical data and recommended number of users supported|How to implement large PBXs]]) is factor 6 larger on the xx11 (1,536 GB) than on the xx10 (0,256 GB))&lt;br /&gt;
* the xx11 has gigabit Ethernet while the xx10 has 100Mbps Ethernet. The xx10 is therefore not well suited for Apps with larger network traffic, such as Recordings&lt;br /&gt;
* the CPU of the xx11 (although it runs on the same frequency) is roughly 20% faster than the xx10&lt;br /&gt;
&lt;br /&gt;
While it is hard to predict the performance of the App Platform in a specific scenario, we see that in a real life environment an App Platform running on an xx11 platform can well support 150 users. The xx10 platform is estimated to support 120 users.  Because CPU performance is the limiting factor, larger setups can be built based on the virtual machine platform (see [[#App services and multi-threading|App services and multi-threading]] below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= App Platform - x86-64 (Virtual Machine 64bit) =&lt;br /&gt;
&lt;br /&gt;
* The default disk size is 16GB. It should be increased &#039;&#039;&#039;before&#039;&#039;&#039; the first start if needed!&lt;br /&gt;
* Multiple CPUs are supported, default is one CPU&lt;br /&gt;
* default RAM: 512MB&lt;br /&gt;
* static IP address, DNS, Gateway can be configured with the command &#039;&#039;&#039;setip&#039;&#039;&#039; on the console. Run &#039;&#039;&#039;setip --help&#039;&#039;&#039; to get a list of parameters. (Example: setip --addr=x.x.x.x --mask=x.x.x.x --gateway=x.x.x.x --dns1=x.x.x.x) &lt;br /&gt;
* If you have permission problems change to su user (Password is iplinux or your new admin password)  &lt;br /&gt;
* To figure out your ip address you can use the command: &#039;&#039;ip address&#039;&#039; on the console.&lt;br /&gt;
* &#039;&#039;&#039;loadkeys de&#039;&#039;&#039; can be used to change to german keyboard layout (etc.)&lt;br /&gt;
* partitions&amp;lt;ref name=&amp;quot;partition-size&amp;quot;&amp;gt;Maximum partition sizes are given. The real sizes are returned by the linux &#039;df -h&#039;-command. These real values will be lower, but can grow in the future with new releases.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
** /dev/sda1 ext2: 350MB (contains ramdisk, rootfs and kernel)&lt;br /&gt;
*** the real partition format size is smaller but there is no need to monitor sda1 as sda1 won&#039;t grow during usage of the App Platform&lt;br /&gt;
*** sda1 is completely exchanged during an image update and its size might have changed but will never exceed these 350MB&lt;br /&gt;
** /dev/sda2 ext4: depends on disk size (contains databases, log files and apps)&lt;br /&gt;
** /dev/sda3 ext4: 500MB (contains the rootfs)&lt;br /&gt;
** /dev/sda4 swap: 512MB&lt;br /&gt;
* VMWare Tools: Open VM Tools&lt;br /&gt;
* Qemu Guest Agent: installed since 110032&lt;br /&gt;
** The qemu guest agent can be configured in Proxmox with &#039;&#039;Virtio&#039;&#039; or &#039;&#039;ISA&#039;&#039;. You &#039;&#039;&#039;must&#039;&#039;&#039; use &#039;&#039;&#039;ISA&#039;&#039;&#039;, as Virtio is currently not supported.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
==ARM Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-armel.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==ARM64 Gateway==&lt;br /&gt;
&lt;br /&gt;
If you setup a Gateway with the install procedure, the App Platform is installed automatically (Https Download has to be allowed and shouldn&#039;t be blocked by any firewall.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
You can also install it manually:&lt;br /&gt;
* Open App Platform -&amp;gt; General and &#039;&#039;&#039;Enable Linux Support&#039;&#039;&#039;. Restart the gateway.&lt;br /&gt;
* You need to enable Proxy-ARP on [[{{NAMESPACE}}:IP4/ETH/IP|ETH0]] or [[{{NAMESPACE}}:IP4/ETH/IP|ETH1]], so your Gateway and the Linux Appliance will share the same physical interface.&lt;br /&gt;
* Open App Platform -&amp;gt; IP and configure the IP settings of the App Platform. Restart the Gateway.&lt;br /&gt;
* Open App Platform -&amp;gt; Installation and select the given version or enter an own path to the &#039;&#039;app-platform-arm64.img&#039;&#039; image file.&lt;br /&gt;
* The installation runs without any further required step.&lt;br /&gt;
&lt;br /&gt;
==Virtual machine==&lt;br /&gt;
&lt;br /&gt;
* Import the image into your server environment.&lt;br /&gt;
** Proxmox: follow this description here, just with the app-platform-ova.zip: https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Proxmox_VE&lt;br /&gt;
* Edit the disk size, if needed.&lt;br /&gt;
* Start the machine and wait until it reboots and starts again.&lt;br /&gt;
* Note: If you need to access an IP addresses available through a VPN connection from from inside the virtual machine, it could be that you need to set the network of your VM to NAT (and also add the URL for an IP to /etc/hosts)&lt;br /&gt;
&lt;br /&gt;
[https://wiki.innovaphone.com/index.php?title={{NAMESPACE}}:Concept_Innovaphone_Virtual_Appliance#Configuration More Configuration Hints regarding VM Ware]&lt;br /&gt;
&lt;br /&gt;
== Backup of the Apps ==&lt;br /&gt;
&lt;br /&gt;
Each App Service can have multiple instances and each instance has its own database. The manager app itself also has its own database.&amp;lt;br&amp;gt;&lt;br /&gt;
There are no other files which need to be backuped.&amp;lt;br&amp;gt;&lt;br /&gt;
The standard way to backup the databases is through the Devices App [[{{NAMESPACE}}:Concept_App_Service_Devices#Backups]].&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An alternate way is to use a command file which is similar to the command files from the firmware.&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
* &#039;&#039;&#039;times&#039;&#039;&#039; 0,12 # backup only at 0 or 12 o&#039;clock&lt;br /&gt;
* &#039;&#039;&#039;backup-instances&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump PUT&lt;br /&gt;
** PUT and POST are supported, all instances including the manager itself are saved&lt;br /&gt;
* &#039;&#039;&#039;backup-instance&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump apidemo example.com PUT&lt;br /&gt;
** backup a single instance with instance name and instance domain&lt;br /&gt;
* &#039;&#039;&#039;backup-manager&#039;&#039;&#039; http://user:pw@ip/path/#I-#D.dump&lt;br /&gt;
&lt;br /&gt;
===Hash parameters===&lt;br /&gt;
* #L App Platform label (neu), e.g. 10024&lt;br /&gt;
* #A App label (neu), e.g. 130004&lt;br /&gt;
* #I instance name (neu), e.g. reporting1&lt;br /&gt;
* #D instance domain (neu), e.g. innovaphone.com&lt;br /&gt;
* #m MAC address of the LAP, e.g. 00ab11eeff&lt;br /&gt;
* #d Current date and time (plain UTC without daylight saving and timezone adjustments) 20051010-170130&lt;br /&gt;
* #bn rolling backup index (n &amp;gt;=0 and &amp;lt;= 9, just one digit)&lt;br /&gt;
* ## escapes a hash mark&lt;br /&gt;
&lt;br /&gt;
= App Platform Infrastructure and Concept =&lt;br /&gt;
== Webserver ==&lt;br /&gt;
The app platform includes a webserver that is highly optimized for handling many Websocket connections at a low memory footprint.&lt;br /&gt;
All apps use that webserver by registering for specific HTTP subpath. So they can all use the same HTTP/HTTPS ports - typically the standard ports.&lt;br /&gt;
&lt;br /&gt;
=== Import Custom SSL Certificate ===&lt;br /&gt;
You have to upload a PEM Certificate with the following chain structure and without password encoding.&lt;br /&gt;
&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (certificate: eg. your_domain_name.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Intermediate certificate: eg. DigiCertCA.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN CERTIFICATE-----&lt;br /&gt;
 (Root certificate: eg. TrustedRoot.crt)&lt;br /&gt;
 -----END CERTIFICATE-----&lt;br /&gt;
 -----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
 (certificate Key: eg. your_domain_name.key)&lt;br /&gt;
 -----END RSA PRIVATE KEY-----&lt;br /&gt;
&lt;br /&gt;
If you have problems generating the complete and correct certificate chain, you can use tools such as https://whatsmychaincert.com/ as an aid.&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that you never give away the private part of your key.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
*The app platform webserver can use only the default http/https ports 80/443.&lt;br /&gt;
*By design, there is no possibility to restore the default webserver certificate on the App Platform, if another certificate was once uploaded.&amp;lt;br /&amp;gt;&lt;br /&gt;
**If nevertheless needed, you must login with Putty (see [[#How to retrieve files from the AP| Retrieve files]]) and execute these commands as root:&lt;br /&gt;
**&#039;&#039;psql -d manager -c &amp;quot;DELETE FROM config WHERE name=&#039;webserverCertificate&#039;&amp;quot;&#039;&#039;&lt;br /&gt;
**&#039;&#039;/etc/init.d/S92manager restart&#039;&#039;&lt;br /&gt;
*The app platform webserver interprets URLs case-sensitive. In other words, &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/file.txt&amp;lt;/nowiki&amp;gt; is not the same as &amp;lt;nowiki&amp;gt;http://&amp;lt;addr&amp;gt;/FILE.TXT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
The app platform creates a database for each app instance with a given password. In the installer there will be used randomly generated passwords. You can set a new database password for every instance in the Application Platform.&lt;br /&gt;
&lt;br /&gt;
The apps should store all data in that database. That makes sure that a consistent backup and restore of app instances can be done by the app platform manager.&lt;br /&gt;
In hosted scenarios, having separate databases for each instance also makes sure that the data of different customers are clearly separated and can easily be moved from one physical platform to another.&lt;br /&gt;
&lt;br /&gt;
The default configuration decline database request from extern. If you need external access you can change the PGSQL configuration (as root) in the file &#039;&#039;/mnt/sda2/pgsql/pg_hba.conf&#039;&#039;.&lt;br /&gt;
After editing pg_hba.conf, the database-service has to be restarted with the command &amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
(Please think about it before you do it, because a better way is to create your own local app with local database access.)&lt;br /&gt;
&lt;br /&gt;
You can find the official documentation for the pg_hba.conf here: https://www.postgresql.org/docs/14/auth-pg-hba-conf.html&lt;br /&gt;
&lt;br /&gt;
 Please note that you do this on your own responsibility, that it makes sense to create a backup of the original pg_hba.conf &lt;br /&gt;
 and that you may break your database server if you do not know exactly what you do!&lt;br /&gt;
&lt;br /&gt;
Sometimes the Apps are not proper working after this. You can wait a while until everything is working again or you go the hard way:&lt;br /&gt;
* stop the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* restart the database-service (maybe not really necessary, but makes a good feeling)&lt;br /&gt;
**&amp;lt;code&amp;gt;/etc/init.d/S50postgresql restart&amp;lt;/code&amp;gt;&lt;br /&gt;
* start the manager&lt;br /&gt;
** &amp;lt;code&amp;gt;/etc/init.d/S92manager start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nightly database analyse ===&lt;br /&gt;
&lt;br /&gt;
Every database is analysed at night to keep indexes in sync with the data. This triggers a &#039;&#039;vacuumdb -a -z&#039;&#039;, which updates optimizer statistics, but does &#039;&#039;&#039;not&#039;&#039;&#039; shrink the physical size of the database.&amp;lt;br/&amp;gt;&lt;br /&gt;
This must be done manually in the instance settings.&lt;br /&gt;
&lt;br /&gt;
== App Platform Manager ==&lt;br /&gt;
The App Platform Manager is the central component of the App Platform. It does the following:&lt;br /&gt;
* Installing app services by downloading the binaries from an app store.&lt;br /&gt;
* Running and monitoring app services. If an app service crashes it is restarted, automatically.&lt;br /&gt;
* Management of app instances and providing them with the environment they need:&lt;br /&gt;
** A database&lt;br /&gt;
** A webserver path&lt;br /&gt;
** A password for authentication&lt;br /&gt;
* Backup and restore of app instances.&lt;br /&gt;
* Collecting debug information like tracing and crash dumps.&lt;br /&gt;
* System monitoring (CPU usage, memory usage, etc).&lt;br /&gt;
&lt;br /&gt;
== App Services ==&lt;br /&gt;
App services are runned by the App Platform Manager. They implement an interface that is used by the manager to start, stop and configure app instances. Each service runs in a separate child process of the manager.&lt;br /&gt;
&lt;br /&gt;
== App Instances ==&lt;br /&gt;
The actual functionality of an app service is provided by app instances. They run in the same process as the app service but have a distinct webserver path and their own database. There can be 0..n instances of an app service. Instances can optionally host (web) apps that can be opened in the myApps client.&lt;br /&gt;
&lt;br /&gt;
Each instance of an App service has two passwords. The instance password itself and a database password. If you want to change it you must update the password on both sides.&amp;lt;br&amp;gt;&lt;br /&gt;
The instance password must match to the password in the corresponding PBX App objects, while one instance can have different App objects.&amp;lt;br&amp;gt;&lt;br /&gt;
The database password must be just known to the manager and not outside of the App Platform.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database name&#039;&#039; and &#039;&#039;Database user&#039;&#039; are both limited to a length of 63 characters.  By default, the App Manager would create &#039;&#039;&amp;lt;domain&amp;gt;&#039;&#039;_&#039;&#039;&amp;lt;instance-name&amp;gt;&#039;&#039; as value for both.  This is why it is recommended to use instance names so that length(name) + length(domain) is less than 63 characters.  However, if this is not possible, you can manually shorten the suggested values (both must still be unique on your App Platform).&lt;br /&gt;
&lt;br /&gt;
=== Cleanup database ===&lt;br /&gt;
You can cleanup the instance database inside the instance settings. This starts the vacuumdb process for the instance database which frees disk space of deleted rows.&lt;br /&gt;
 Note that this process locks the database and that sufficient disk space is needed to complete it!&lt;br /&gt;
&lt;br /&gt;
=== External database host ===&lt;br /&gt;
You can optionally configure an external database host, if the database shall be hosted on an external host.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that the App Platform Manager still creates a local database, which is then not used as long as the external host is configured.&lt;br /&gt;
&lt;br /&gt;
What are external databases useful for?:&lt;br /&gt;
* User data is too large (files are stored as BLOB in the database)&lt;br /&gt;
* Other (non-innovaphone) database servers are to be used due to other regulations&lt;br /&gt;
* There is already an external database cluster with its own backup/restore processes which should be used&lt;br /&gt;
* More performance is required (please note that a local UNIX socket provides much faster results than a remote database server). Depending on the app and the task of the app, it can still be useful to use a separate server if it is faster.&lt;br /&gt;
&lt;br /&gt;
==== Supported database types ====&lt;br /&gt;
In principle, &#039;&#039;PostgreSQL&#039;&#039; and &#039;&#039;MySQL&#039;&#039; are supported. However, please note that the respective app must be designed for the target database server type. If an app has been developed for PostgreSQL, it cannot be operated on a MySQL server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note:&#039;&#039;&#039; All innovaphone apps are developed exclusively as PostgreSQL apps.&lt;br /&gt;
&lt;br /&gt;
MySQL therefore only makes sense if own apps are developed and MySQL or certain MySQL features are to be used. For such apps, it is very important to deactivate the automatic Application Platform APP-Backup.&lt;br /&gt;
The database backup process of the App Platform uses PostgreSQL backup commands, which is why the backup would fail, so the app must be excluded from the backup, and you must take care of the backup yourself.&lt;br /&gt;
&lt;br /&gt;
==== Database creation ====&lt;br /&gt;
If you use an external database, you have to create the database itself.&lt;br /&gt;
The App Platform Manager itself creates a PostgreSQL database like this (you may respect this on your database host to be compatible with the database implementation inside the Apps):&lt;br /&gt;
* CREATE DATABASE &amp;quot;dbname&amp;quot; ENCODING &#039;UTF8&#039;;&lt;br /&gt;
* CREATE USER &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER USER &amp;quot;dbuser&amp;quot; WITH PASSWORD &#039;dbpassword&#039;;&lt;br /&gt;
* GRANT ALL PRIVILEGES ON DATABASE &amp;quot;dbname&amp;quot; TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* ALTER DATABASE &amp;quot;dbname&amp;quot; OWNER TO &amp;quot;dbuser&amp;quot;;&lt;br /&gt;
* REVOKE CONNECT ON DATABASE &amp;quot;dbname&amp;quot; FROM public;&lt;br /&gt;
&lt;br /&gt;
==== Database connection ====&lt;br /&gt;
There are different possibilities to specify the host. You can use a DNS-Name, IPv4 or IPv6. A port can be optionally added with a colon.&lt;br /&gt;
&lt;br /&gt;
Our PostgreSQL implementation sets sslmode=prefer, so SSL is used by default if enabled on the server.&lt;br /&gt;
&lt;br /&gt;
==== Backup/Restore ====&lt;br /&gt;
External databases are still backuped as normal, but you can&#039;t restore such a database with the App Platform Manager on the external host! You must restore such a dump manually on your database host.&lt;br /&gt;
&lt;br /&gt;
==== Database redundancy ====&lt;br /&gt;
In principle, it is possible to create redundancies for failure scenarios through this function.&lt;br /&gt;
&lt;br /&gt;
However, there are different scenarios that need to be evaluated on a case-by-case basis:&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;offline&#039;&#039;&#039;) where multiple apps access the same database.&lt;br /&gt;
** This mode of operation is legal as long as you can really ensure that only one App Platform is active at a time.&lt;br /&gt;
&lt;br /&gt;
* One database, multiple App Platforms (primary online / secondary &#039;&#039;&#039;online&#039;&#039;&#039;) with multiple apps accessing the same database.&lt;br /&gt;
** This operating mode cannot be used for innovaphone apps, as the app itself would have to be developed for such a mode, which it is not.&lt;br /&gt;
&lt;br /&gt;
However, we advise great caution here! The use of the same databases from different nodes may only be used if you can ensure that the databases or runtime environments of apps cannot get into a &#039;&#039;split-brain&#039;&#039; mode.&lt;br /&gt;
&lt;br /&gt;
== Relationship between app instances and app objects in the PBX ==&lt;br /&gt;
Typically an app instance is connected to one or more app objects in a customer PBX. This is done by configuring the same parameters on both sides:&lt;br /&gt;
* URL&lt;br /&gt;
* Password&lt;br /&gt;
The password is used by the PBX for authenticating itself, users and services against the app instance.&lt;br /&gt;
&lt;br /&gt;
Some apps need a websocket connection with the PBX. When &amp;quot;websocket&amp;quot; is activated at the app object, the PBX establishes a websocket connection to the app instance and provides the APIs that are configured at the app object.&lt;br /&gt;
&lt;br /&gt;
=== Supported scenarios ===&lt;br /&gt;
It is important to understand that the concept does not do any assumptions on how PBXes and APs are correlated. So you can have&lt;br /&gt;
* One App Platform for one customer&lt;br /&gt;
* One App Platform for many customers&lt;br /&gt;
* Many App Platforms for one customer&lt;br /&gt;
* Many App Platforms for many customers&lt;br /&gt;
&lt;br /&gt;
Attention: The V13 installer can only configure the scenario &amp;quot;&#039;&#039;One App Platform for one customer&#039;&#039;&amp;quot;. If you want to have a different scenario, you have to configure it manually.&lt;br /&gt;
&lt;br /&gt;
For hosting or cloud scenarios you need special scenarios. Please refer our [[Howto:V13 Hosting| V13 Hosting]] instructions.&lt;br /&gt;
&lt;br /&gt;
=== Restrictions ===&lt;br /&gt;
Currently we don&#039;t have redundancy for app instances or App Platforms.&lt;br /&gt;
&lt;br /&gt;
== Update of the App Platform itself ==&lt;br /&gt;
The App Platform is build on top of buildroot and will receive updates and fixes from time to time.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can update the used build inside the Manager App by using the &#039;&#039;&#039;Update&#039;&#039;&#039; button at the top.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 It is strongly advised to make a full backup (VM) or at least backup all apps (Gateway) before you run such an update!&lt;br /&gt;
&lt;br /&gt;
After the update has been downloaded and verified, your App Platform will reboot.&lt;br /&gt;
You can check the installation process after the reboot with the following URL: https://IP-of-AP/manager/ramdisk.log&lt;br /&gt;
&lt;br /&gt;
== App services and multi-threading ==&lt;br /&gt;
Each App Service runs in a single process with no multi-threading, independent of the instances of the App Service. However, each instance maintains its own database connection and the database responds to this connect with the creation of a new process. Each app service therefore uses 1+&#039;&#039;n&#039;&#039;  threads (where &#039;&#039;n&#039;&#039; is the number of instances).  All communication between app service instances and their clients must pass the single-threaded web server.  On platforms with multi-threading support (i.e. VMware or Hyper-V), up to 1 + &#039;&#039;m&#039;&#039; + &#039;&#039;m&#039;&#039; * &#039;&#039;n&#039;&#039; (with &#039;&#039;m&#039;&#039; being the number of Apps and &#039;&#039;n&#039;&#039; the number of instances per App) threads can be utilized.&lt;br /&gt;
&lt;br /&gt;
= AP Manager settings =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
* &#039;&#039;Enable Developer mode&#039;&#039;: in developer mode, apps can be manually uploaded without an App Store&lt;br /&gt;
* &#039;&#039;Disable App security&#039;&#039;: each App has an own unix user and if this flag is set, the user can login with SSH for debugging&lt;br /&gt;
* &#039;&#039;App Store URL&#039;&#039;: the URL to the App Store where Apps are searched and also an update of the AP image itself&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;: the URL to the Devices App to manage the AP through Devices&lt;br /&gt;
* &#039;&#039;Devices app URL 2&#039;&#039;: don&#039;t use!&lt;br /&gt;
* &#039;&#039;App Platform DNS name&#039;&#039;: currently not used&lt;br /&gt;
* &#039;&#039;NTP server 1/2&#039;&#039;: NTP servers for this AP (in addition to NTP servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Timezone string&#039;&#039;: A timezone string which is used by the App Platform Manager to do certain jobs according to the configured timezone.&lt;br /&gt;
** Note that this doesn&#039;t change the timezone of the linux itself!&lt;br /&gt;
* &#039;&#039;DNS server 1/2&#039;&#039;: DNS servers for this AP (in addition to DNS servers retrieved by DHCP)&lt;br /&gt;
* &#039;&#039;Database optimization time&#039;&#039;: The database optimization process will be started at this hour (local time), with a random offset of up to 7 hours&lt;br /&gt;
* &#039;&#039;Command file&#039;&#039;: obsolete, use the Devices App for backups!&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
* &#039;&#039;Current Webserver certificates&#039;&#039;: shows the current certificates with the ability to download them. &lt;br /&gt;
* &#039;&#039;Webserver certificate&#039;&#039;: upload a webserver certificate in PEM format&lt;br /&gt;
* &#039;&#039;AP Manager password&#039;&#039;: the password to the web interface of the AP Manager (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux root user&#039;&#039;: password of the root user (normally set through Devices)&lt;br /&gt;
* &#039;&#039;Linux admin user&#039;&#039;: password of the admin user (normally set through Devices)&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Encrypt ==&lt;br /&gt;
&lt;br /&gt;
Configure the certificate creation by Let&#039;s Encrypt here.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Enable&#039;&#039;: turns the automatic creation on or off&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App URL&#039;&#039;: the URL of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this URL from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Let&#039;s Encrypt App Password&#039;&#039;: the client password of your Connector for Let&#039;s Encrypt App Service. You can copy&amp;amp;paste this password from your Connector for Let&#039;s Encrypt PBX Manager Plugin&lt;br /&gt;
* &#039;&#039;Key length&#039;&#039;: 2048, 3072 or 4096 (keep in mind, that [[{{NAMESPACE}}:Certificate_management#Certificate_Key_Length_and_CPU_Usage|a higher value provides higher security but also lower performance!]])&lt;br /&gt;
* &#039;&#039;DNS Name&#039;&#039;: the external DNS names of your device (up to 100 possible)&lt;br /&gt;
&lt;br /&gt;
== Alarms and events ==&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;: URL to the Events app&lt;br /&gt;
* &#039;&#039;Username/Password&#039;&#039;: HTTP credentials of the Events app&lt;br /&gt;
* &#039;&#039;Email address&#039;&#039;: an email address which will get emails on full disk alarms/warnings&lt;br /&gt;
* &#039;&#039;Threshold&#039;&#039;: All Apps will be stopped and an hourly email sent on reaching this threshold. An alarm is generated 10% before reaching this threshold and an email is sent every 24 hours.&lt;br /&gt;
&lt;br /&gt;
== SMTP ==&lt;br /&gt;
SMTP server settings for sending emails from within the AP Manager.&lt;br /&gt;
&lt;br /&gt;
== Replication ==&lt;br /&gt;
App Platform [[#App Platform replication|replication settings]]&lt;br /&gt;
&lt;br /&gt;
== Registered Access Domains ==&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Updates the App Platform to the latest image available on the App Store.&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
Restarts the App Platform.&lt;br /&gt;
&lt;br /&gt;
== Shutdown ==&lt;br /&gt;
Shuts down the App Platform.&lt;br /&gt;
&lt;br /&gt;
= App Platform replication =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* 13r3 or above on both standby servers and the primary server&lt;br /&gt;
* at least an App Platform image starting with version 110002 (otherwise postgresql is too old)&lt;br /&gt;
* standby and primary servers must have the same system architecture&lt;br /&gt;
** arm gateways (IPx11) just with arm gateways (IPx11)&lt;br /&gt;
** arm64 gateways (IPx13) just with arm64 gateways (IPx13)&lt;br /&gt;
** x86_64 virtual machines just with x86_64 virtual machines&lt;br /&gt;
* the disk size on standby servers must be at least equal as the disk size on the primary server&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
The configuration is done within the App Platform Manager next to the settings button under &amp;quot;Replication&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Off ===&lt;br /&gt;
No replication is done at all.&lt;br /&gt;
&lt;br /&gt;
=== Primary ===&lt;br /&gt;
The App Platform acts as primary server for one or multiple standby servers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Max 8 standby servers can be configured.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Every standby server must get a unique name on the primary server which is then also configured on the standby server itself. This is due to the fact, that the primary server preserves data for every standby server while it&#039;s not reachable.&amp;lt;br/&amp;gt;&lt;br /&gt;
A standby server name must be a valid domain name, although this name is currently not used as DNS name (but might be used in the future).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
The password is randomly pregenerated and must be used as handed by the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
==== PostgreSQL port ====&lt;br /&gt;
The default PostgreSQL port is 5432 and can&#039;t be changed on the primary. It must be reachable through your firewall or at least forwarded on a different port towards this App Platform on port 5432.&lt;br /&gt;
&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Configure the password from the primary and one of the not yet used standby server names.&amp;lt;br/&amp;gt;&lt;br /&gt;
The host and port must be reachable through the network. You can specify a non default port which then must be forwarded somewhere else to port 5432 on your primary.&lt;br /&gt;
&lt;br /&gt;
*Note: Do &#039;&#039;&#039;not&#039;&#039;&#039; configure the same standby name on different standby servers, as this will break the replication on at least one standby!&amp;lt;br&amp;gt;&lt;br /&gt;
*Note: On a standby, all &#039;&#039;&#039;locally installed apps are removed&#039;&#039;&#039; during installation&lt;br /&gt;
&lt;br /&gt;
== Failure detection ==&lt;br /&gt;
&lt;br /&gt;
The replication state on both primary and standby servers are continuously monitored.&amp;lt;br/&amp;gt;&lt;br /&gt;
In case of a broken connection, an alarm is triggered at once and just cleared if the failure goes away.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If such an alarm lasts for 5 minutes an email is send. The recipient address must be configured in the App Platform Manager settings under &amp;quot;Alarms and Events&amp;quot; and you must also provide a valid SMTP configuration.&lt;br /&gt;
&lt;br /&gt;
== Failover ==&lt;br /&gt;
&lt;br /&gt;
There is no automatic failover procedure. If you detect the failure state, you must get active yourself.&lt;br /&gt;
&lt;br /&gt;
=== Standby down ===&lt;br /&gt;
&lt;br /&gt;
Fix the standby server and see if the replication comes up again. If not, setup a new standby server which will replicate the whole database cluster from scratch.&lt;br /&gt;
&lt;br /&gt;
=== Primary down ===&lt;br /&gt;
&lt;br /&gt;
If the primary is down and cannot be brought into life again, you must take the following steps, depending on your configuration:&lt;br /&gt;
&lt;br /&gt;
==== One standby server ====&lt;br /&gt;
&lt;br /&gt;
* Disable the replication in the replication configuration. You will then have a standalone App Platform afterwards.&lt;br /&gt;
&lt;br /&gt;
==== Multiple standby servers ====&lt;br /&gt;
&lt;br /&gt;
* Change the replication type on one of the standby servers from standby to primary. Please note that the other standby entries must still exist here (they are automatically offered)!&lt;br /&gt;
* Change the host entry on the other standby servers to the new standby server. The standby server will sync the whole database cluster again, which will take time.&lt;br /&gt;
&lt;br /&gt;
==== Configuration changes ====&lt;br /&gt;
&lt;br /&gt;
You must also tell the PBXes and other tools to use the new primary server.&lt;br /&gt;
&lt;br /&gt;
* You may simply change the IP address behind the DNS of your primary server to point to the new primary server.&lt;br /&gt;
**Note: to ensure rapid recognition of the new DNS target, the definition of an appropriate TTL value is recommended&lt;br /&gt;
* Without DNS, you must currently modify the configuration by replacing the IP address of the old primary with the new address. &lt;br /&gt;
** This must be done in every master PBX configuration.&lt;br /&gt;
** This must be done in every App configuration which may use this IP address, e.g. Devices which rolls out an alarm server configuration&lt;br /&gt;
&lt;br /&gt;
== App Platfom update ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running an active standby server and the major version of the PostgreSQL database didn&#039;t change, you can simply update primary and standby servers independently.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If it contains a &#039;&#039;new major version&#039;&#039; of the PostgreSQL database, you must follow these steps:&lt;br /&gt;
&lt;br /&gt;
* deactivate replication on all standby servers (which promotes these standby servers to active servers)&lt;br /&gt;
* ensure that the &#039;&#039;&#039;same&#039;&#039;&#039; App Platform Manager version is running on primary and standby servers!&lt;br /&gt;
* perform the App Platform update on the primary server&lt;br /&gt;
* perform the App Platform update on the standby servers&lt;br /&gt;
* reactivate replication on the standby servers (which will do a full replication again, so it might take some time)&lt;br /&gt;
&lt;br /&gt;
Alternativly you may setup the standby server from scratch directly with the new App Platform image version.&lt;br /&gt;
&lt;br /&gt;
 Sadly there is currently no better method offered by PostgreSQL to perform such an upgrade.&lt;br /&gt;
&lt;br /&gt;
See also https://wiki.innovaphone.com/index.php?title=Howto14r2:Firmware_Upgrade_V14r1_V14r2#App_Platform_and_Apps&lt;br /&gt;
&lt;br /&gt;
== Technical backgrounds ==&lt;br /&gt;
&lt;br /&gt;
=== Streaming replication ===&lt;br /&gt;
&lt;br /&gt;
We use the asynchronous [https://www.postgresql.org/docs/9.3/warm-standby.html#STREAMING-REPLICATION streaming replication of PostgreSQL]. A transaction thus just waits for a commit on the primary server. Standby servers will receive the transaction asynchronously afterwards to avoid a reduced writing performance.&amp;lt;br/&amp;gt;&lt;br /&gt;
A primary server keeps the neccessary WAL files for every standby server until the standby fetched the neccessary information.&amp;lt;br/&amp;gt;&lt;br /&gt;
This fact can lead to higher disk space usage on the primary if one or multiple standby servers are offline for a while.&lt;br /&gt;
&lt;br /&gt;
 Take care to fix broken replications as soon as possible to avoid a full disk on the primary server!&lt;br /&gt;
&lt;br /&gt;
=== What is replicated ===&lt;br /&gt;
The whole database cluster of an app platform is replicated. This includes every database of every instance and the database of the App Platform Manager itself.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Services on standbys ===&lt;br /&gt;
The database of the App Platform Manager itself also contains the App service binaries to be able to restore applications in a failover case.&amp;lt;br/&amp;gt;&lt;br /&gt;
You do not have to install App services on the standby if you install them on the primary.&amp;lt;br/&amp;gt;&lt;br /&gt;
App Platform Manager and Webserver can be updated as usual through the App Store or the Devices App if the standby is connected to Devices.&lt;br /&gt;
&lt;br /&gt;
=== App Platform Manager configuration of the standby server ===&lt;br /&gt;
The App Platform Manager configuration of the standby server cannot be stored inside the database, as the database is readonly. So it is stored inside a configuration JSON file under &#039;&#039;/home/root/standby.conf&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
This configuration is backed up as usual by a Devices backup job and can be also manually restored on a standby (not on a primary though!).&lt;br /&gt;
&lt;br /&gt;
 Configuration options from the primary are not synced to the standby server, as the standby server has its own configuration (as it could be in a different network etc.)!&lt;br /&gt;
&lt;br /&gt;
=== No automatic failover ===&lt;br /&gt;
&lt;br /&gt;
There is currently no automatic failover mechanism. PostgreSQL doesn&#039;t offer multi master replication, so writing is just possible on the primary itself. Standby servers have a readonly database.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Let&#039;s consider the following use case if we would implement an automatic failover with the current technical possibilities:&amp;lt;br/&amp;gt;&lt;br /&gt;
* The primary server is connected to a master PBX.&lt;br /&gt;
* A slave PBX is also connected to the primary server in another location.&lt;br /&gt;
* A standby server is in this location and replicates from the primary.&lt;br /&gt;
* The internet connection between primary and standby fails.&lt;br /&gt;
* The standby promotes itself to primary, so that the master PBX now writes to the old primary and the slave PBX now writes to the &amp;quot;new&amp;quot; primary.&lt;br /&gt;
* The internet connection comes up again and both primary and standby servers now have databases which are out of sync and which cannot be merged.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* port 5432 must be reachable on the App Platform &lt;br /&gt;
* For every standby a PostgreSQL user is created with the REPLICATION role on the primary. Just this user has access to the database server from non localhost connections.&lt;br /&gt;
* You cannot establish a standard connection with such a user and modify/read from tables.&lt;br /&gt;
* The replication connection is established over TLS by default.&lt;br /&gt;
&lt;br /&gt;
= App Installer PBX Manager Plugin =&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* V14 and above&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The app installer plugin allows IT administrator (with access to the PBX Manager) to install/update/delete new apps from the innovaphone app store including Partners apps. It is automatically available with existing app platforms or after adding a new one in the PBX Manager.&lt;br /&gt;
It offers a view to the App Platform Manager‘s App Store with all the available functionalities and simplifies the install, update and uninstall of apps.&lt;br /&gt;
&lt;br /&gt;
== Dedicated AP for each user ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app will install the app service and add a new instance with the user’s domain. The instance is automatically started.&amp;lt;br&amp;gt;&lt;br /&gt;
This further enables the configuration of the instance through its respective PBX Manager plugin. &amp;lt;br&amp;gt;&lt;br /&gt;
Uninstalling the app will remove the app service and the corresponding instance.&lt;br /&gt;
&lt;br /&gt;
== Shared AP between users ==&lt;br /&gt;
&lt;br /&gt;
Installing a new app works in a similar way to that of the dedicated AP. However, each time a new user installs the app, only a new instance is created if the app service is already installed. &amp;lt;br&amp;gt;&lt;br /&gt;
A user can uninstall the app, in this case the corresponding instance is deleted. If no more instances exist, then the app service is uninstalled. &amp;lt;br&amp;gt;&lt;br /&gt;
The administrator can only update the app service in such scenario.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update hangs (ARM gateway) ==&lt;br /&gt;
&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t recover after the reboot, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
If &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; is set to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;, the App Platform booted the ramdisk.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to fetch the upgrade log file:&lt;br /&gt;
https://[APP-PLATFROM-IP/DNS]/manager/ramdisk.log&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this doesn&#039;t work, try to login with putty in this case (default credentials admin/ipapps and root/iplinux) and issue this command:&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;cat /apps/install_step1.log&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If this file contains &#039;&#039;&#039;finished&#039;&#039;&#039; at the end, you can reconfigure the settings under App Platform -&amp;gt; General:&amp;lt;br&amp;gt;&lt;br /&gt;
* press &#039;&#039;&#039;Stop&#039;&#039;&#039;&lt;br /&gt;
* Initrd file: empty&lt;br /&gt;
* Kernel command line: &#039;&#039;&#039;root=/dev/sda3&#039;&#039;&#039;&lt;br /&gt;
* Ramdisk size: empty&lt;br /&gt;
* press &#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The App Platform should boot and run the already updated image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;color: red; font-size:150%;&amp;quot;&amp;gt;---WARNING---&lt;br /&gt;
 If the file doesn&#039;t contain &amp;quot;finished&amp;quot; at the end, you may still need to wait, as an upgrade may take some time!&lt;br /&gt;
 Do not reconfigure without being sure that the upgrade has finished, otherwise your system may won&#039;t run!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot after an image update boots always into rescue mode (virtual machine) ==&lt;br /&gt;
&lt;br /&gt;
This most likely means that the image installation didn&#039;t finish the first time and was interrupted before the bootloader settings could be changed back to the default partition.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform doesn&#039;t boot or isn&#039;t normally accessible after manual selection of the standard entry in the boot menu, you need to &#039;&#039;&#039;revert&#039;&#039;&#039; to a &#039;&#039;&#039;snapshot/backup&#039;&#039;&#039; prior to the update.&amp;lt;br/&amp;gt;&lt;br /&gt;
If your App Platform runs normally though, you can follow this instruction to change the default boot entry:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition&lt;br /&gt;
* login with root/iplinux&lt;br /&gt;
* edit the file /boot/grub/grub.cfg&lt;br /&gt;
** search the line with &#039;&#039;&#039;set default=0&#039;&#039;&#039; and change it to &#039;&#039;&#039;set default=1&#039;&#039;&#039;&lt;br /&gt;
** reboot&lt;br /&gt;
&lt;br /&gt;
== App Platform doesn&#039;t start after an update ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
If it happens, that the App Platform doesn&#039;t want to start an update, please open the Admin UI of the corresponding gateway and take a look at App Platform -&amp;gt; General.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Shutdown&#039;&#039;&#039; the App Platform and &#039;&#039;&#039;Stop&#039;&#039;&#039; it&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; to &#039;&#039;&#039;/dev/ram0&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Initrd file&#039;&#039;&#039; to &#039;&#039;&#039;ramdisk.ext2.xz&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Set &#039;&#039;&#039;Ramdisk size&#039;&#039;&#039; to &#039;&#039;&#039;100000&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Start&#039;&#039;&#039; the App Platform now.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
Note: This process can take a while, after it&#039;s finished it reboots and automatically change the &#039;&#039;&#039;Kernel command line&#039;&#039;&#039; value. &lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine ===&lt;br /&gt;
&lt;br /&gt;
Boot into the &#039;&#039;&#039;rescue&#039;&#039;&#039; partition.&lt;br /&gt;
&lt;br /&gt;
The App Platform now either applies the image update or it reboots into the old image. Try the image update afterwards again.&lt;br /&gt;
&lt;br /&gt;
=== It still doesn&#039;t start ===&lt;br /&gt;
&lt;br /&gt;
If it still doesn&#039;t start, configure the App Platform to boot from /dev/sda3 (or inside a VM start the second boot loader entry) and login with SSH as root.&lt;br /&gt;
Then do a first check to verify that you have a specific error due to an incomplete update or a wrong update order:&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* /apps/manager/manager&lt;br /&gt;
* if this outputs &#039;&#039;&#039;error while loading shared libraries: libcrypto.so.3:&#039;&#039;&#039; you have a manager version which cannot run on the current image.&lt;br /&gt;
&lt;br /&gt;
In this case you must download an older build (14r1 1410593):&lt;br /&gt;
&lt;br /&gt;
* /etc/init.d/S92manager stop&lt;br /&gt;
* wget --no-check-certificate -O /apps/manager/manager https://webbuild.innovaphone.com/1410593/arm/manager/manager &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* wget --no-check-certificate -O /apps/webserver/webserver https://webbuild.innovaphone.com/1410593/arm/webserver/webserver &lt;br /&gt;
** inside a virtual machine, use &#039;&#039;&#039;x86_64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
** on an IP6013, use &#039;&#039;&#039;arm64&#039;&#039;&#039; inside the path instead of &#039;&#039;&#039;arm&#039;&#039;&#039;&lt;br /&gt;
* chown root:root /apps/manager/manager&lt;br /&gt;
* chown root:root /apps/webserver/webserver&lt;br /&gt;
* chmod +x /apps/manager/manager&lt;br /&gt;
* chmod +x /apps/webserver/webserver&lt;br /&gt;
* echo 110000 &amp;gt; /mnt/sda1/label&lt;br /&gt;
** this allows the manager to perform an image update again&lt;br /&gt;
* /etc/init.d/S92manager start&lt;br /&gt;
* now perform an image update and &#039;&#039;&#039;afterwards&#039;&#039;&#039; update your apps again&lt;br /&gt;
&lt;br /&gt;
== Webserver doesn&#039;t respond after an image update ==&lt;br /&gt;
&lt;br /&gt;
If you can&#039;t reach the web UI after an image update, please try to connect with SSH as admin user and delete old coredumps, which may prevent the App Platform Manager from starting correctly:&lt;br /&gt;
* su root (become root)&lt;br /&gt;
* rm -f /mnt/sda2/log/core_dumps/*/*&lt;br /&gt;
* /etc/init.d/S92manager restart&lt;br /&gt;
&lt;br /&gt;
Check if you can now reach the App Platform again.&lt;br /&gt;
&lt;br /&gt;
= Tracing =&lt;br /&gt;
Each App Service has its own log file, which can be accessed through the Manager App. You can configure a log file size for each App Service.&amp;lt;br&amp;gt;&lt;br /&gt;
Each App Intance has its own trace flags. The following trace flags can be set:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Alarm client: used by the manager to send alarms to an alarm server&lt;br /&gt;
* App: logs from the App Service itself&lt;br /&gt;
* App WebSocket: logs app websocket connections (e.g. from PBX objects to an App Service or from the UI to the App Service)&lt;br /&gt;
* AppSharing: just native clients&lt;br /&gt;
* AppProxy: just native clients, logs requests which are proxied between the local webserver and the remote server&lt;br /&gt;
* Audio: just native clients&lt;br /&gt;
* Browser: just native clients&lt;br /&gt;
* Command: the command interface is used to execute shell commands, e.g. used by the manager App&lt;br /&gt;
* Config: logs config changes of an App&lt;br /&gt;
* Database: database logs&lt;br /&gt;
* DB files: database file logs&lt;br /&gt;
* DNS: DNS request logging&lt;br /&gt;
* DTLS: just native clients, DTLS request logging&lt;br /&gt;
* Ethernet: interface to get ethernet adapater infos, just manager App&lt;br /&gt;
* File: logs for file system access (synchronous), e.g. manager App&lt;br /&gt;
* Files: logs for file system access (asynchronous)&lt;br /&gt;
* HTTP client: http client logs&lt;br /&gt;
* HTTP file: logs for static HTTP files&lt;br /&gt;
* ICE: just native clients&lt;br /&gt;
* LDS: local domain sockets &lt;br /&gt;
* Media: just native clients&lt;br /&gt;
* Media channel: just native clients&lt;br /&gt;
* Process: IProcess interface logs which is used for spawning, killing processes etc.&lt;br /&gt;
* SMTP: SMTP client logs&lt;br /&gt;
* TCP: TCP logs&lt;br /&gt;
* Time: ITime interface logs&lt;br /&gt;
* TLS: TLS logs&lt;br /&gt;
* TURN: just native clients&lt;br /&gt;
* UDP: UDP logs&lt;br /&gt;
* Video: just native clients&lt;br /&gt;
* WebSocket client: logs outgoing websocket connections&lt;br /&gt;
* Webserver traffic: logs incoming HTTP traffic, which is forwarded from the webserver to the App&lt;br /&gt;
* WebDAV service: logs WebDAV requests to the App&lt;br /&gt;
* Webserver: enables webserver specific logs&lt;br /&gt;
&lt;br /&gt;
== RPCAP ==&lt;br /&gt;
&lt;br /&gt;
If you open the Manager App, click on the Manager in the left list and then on the Diagnostics button, you can enable RPCAP.&amp;lt;br&amp;gt;&lt;br /&gt;
You can add the interface in wireshark with the string:&lt;br /&gt;
 rpcap://&amp;lt;APP-Platform-IP&amp;gt;/eth0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please don&#039;t forget to disable RPCAP after your testing!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= How-Tos =&lt;br /&gt;
&lt;br /&gt;
== How to retrieve files from the App Platform ==&lt;br /&gt;
To retrieve files from the App Platform which can not be retrieved via the App Platform manager UI, you can connect to the App Platform using the SCP protocol on port 22.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
First copy files to /home/admin as root with Putty or another SSH client:&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;su root&#039;&#039; to be root (&#039;&#039;iplinux&#039;&#039; as default password)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now copy files to &#039;&#039;/home/admin&#039;&#039; (e.g. from /var/log/apps/manager/...).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
You can create a tar archive with all logs like this:&lt;br /&gt;
* cd /home/admin&lt;br /&gt;
* tar -cf - /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
** you may want to exclude coredumps (due to their size):&lt;br /&gt;
** tar -cf - --exclude=/var/log/core_dumps/* /var/log/* | xz -z - &amp;gt; log.tar.xz&lt;br /&gt;
* chown admin:admin /home/admin/log.tar.xz&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Then copy the files to your local system, e.g. with WinSCP&amp;lt;br/&amp;gt;&lt;br /&gt;
* use &#039;&#039;SCP&#039;&#039; as protocol (NB: WebDAV is not supported on most of the directories on the App Platform )&lt;br /&gt;
* use the &#039;&#039;DNS&#039;&#039; name or IP address of your App Platform (not the PBX)&lt;br /&gt;
* use user &#039;&#039;admin&#039;&#039; and the appropriate password (&#039;&#039;ipapps&#039;&#039; by default)&lt;br /&gt;
* use &#039;&#039;/home/admin&#039;&#039; as start directory&lt;br /&gt;
* copy the needed files&lt;br /&gt;
&lt;br /&gt;
== App Platform disk space warning ==&lt;br /&gt;
&lt;br /&gt;
If the configured threshold is reached, all Apps are stopped inside the App Platform . You must then free disk space somehow.&lt;br /&gt;
&lt;br /&gt;
=== Find large instances ===&lt;br /&gt;
Click through your apps in the tree on the left side and take a look at the database size of each instance.&lt;br /&gt;
&lt;br /&gt;
=== Delete data inside an instance ===&lt;br /&gt;
It depends on the type of app if you can delete data or not. E.g. you can start the Files app and delete files inside this app.&amp;lt;br&amp;gt;&lt;br /&gt;
This won&#039;t reclaim disk space though due to the way how PostgreSQL databases work, so you need to follow this guide to reclaim the disk space:&lt;br /&gt;
&lt;br /&gt;
* start the corresponding App&lt;br /&gt;
* delete data inside the App&lt;br /&gt;
* optimize disk usage of the database by cliking on the button &amp;quot;Clean up database&amp;quot; under Edit instance. If this does not help, continue with the following steps. &lt;br /&gt;
* stop the corresponding App again&lt;br /&gt;
* download a backup of the instance (backup button at the top), this backup contains the whole instance data, also the password of the instance&lt;br /&gt;
* delete this specific instance&lt;br /&gt;
* restore the downloaded backup (restore button at the top)&lt;br /&gt;
&lt;br /&gt;
 Depending on the hardware and the size of the instance, this process may take hours to complete!&lt;br /&gt;
&lt;br /&gt;
=== Resize the disk ===&lt;br /&gt;
The resizing of a disk is just possible for virtual machines, see [[#Resizing the disk of a Virtual machine|Resizing the disk of a Virtual machine]].&lt;br /&gt;
&lt;br /&gt;
=== Delete the whole instance ===&lt;br /&gt;
If there is no other possibility, you can delete the whole instance. Afterwards you recreate the instance with the same values and a new random password. Don&#039;t forget to set this password in the corresponding PBX App objects though!&lt;br /&gt;
&lt;br /&gt;
=== Restart the Apps or the App Platform ===&lt;br /&gt;
If you have enough disk space again, you must either restart the whole App Platform or you manually start all Apps again.&lt;br /&gt;
&lt;br /&gt;
== App Platform/Apps app not online anymore due to full disk ==&lt;br /&gt;
If the apps app is not online anymore and you can&#039;t access any apps anymore, try to login with an SSH client to see if your disk is full.&lt;br /&gt;
Login as admin and afterwards as root (su root).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* issue &#039;&#039;&#039;df -h&#039;&#039;&#039; and see the disk usage of /dev/sda2, if this is 100%, your disk is too full&lt;br /&gt;
* stop the manager&lt;br /&gt;
** /etc/init.d/S92manager stop&lt;br /&gt;
* empty the 500 MB file, which is exactly for this case here (manager must be 13r1 SR9 or higher to have this file)&lt;br /&gt;
** echo &amp;quot;&amp;quot; &amp;gt; /mnt/sda2/empty_if_no_space&lt;br /&gt;
* delete log files to recover some space&lt;br /&gt;
** rm /var/log/apps/*/*&lt;br /&gt;
** rm /var/log/core_dumps/*/*&lt;br /&gt;
* restart the postgresql server (see the output if this worked or not)&lt;br /&gt;
** /etc/init.d/S50postgresql restart&lt;br /&gt;
* restart the manager&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
* wait until everything is online again&lt;br /&gt;
* open the Apps app and try to find the instance which uses the most disk space and try to delete files/content from it&lt;br /&gt;
** you may want to stop all app services first to prevent more writes to the database&lt;br /&gt;
** if not possible, you can delete this instance, but you&#039;ll loose all data from this instance then!&lt;br /&gt;
* after that you can try [[{{NAMESPACE}}:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files|Reference14r2:Concept_App_Platform#Shrink_the_physically_size_of_PostgreSQL_database_files]] to free up space&lt;br /&gt;
** If this does not work you can create a backup from the database, delete the database and import the database again.&lt;br /&gt;
* free up at least 500 MB so that the manager can create the file again&lt;br /&gt;
* delete /mnt/sda2/empty_if_no_space if you are done and restart the manager:&lt;br /&gt;
** rm /mnt/sda2/empty_if_no_space&lt;br /&gt;
** /etc/init.d/S92manager restart&lt;br /&gt;
** the manager restart automatically recreates the empty_if_no_space file if this file doesn&#039;t exist&lt;br /&gt;
&lt;br /&gt;
 Make sure, that you do &#039;&#039;&#039;not&#039;&#039;&#039; have backups configured to a local files instance while this files instance is not excluded from backups.&lt;br /&gt;
 An instance can be excluded from backups in the instance settings in the App Platform Manager.&lt;br /&gt;
&lt;br /&gt;
If all of this doesn&#039;t help, you can resize the file system on a VM:&lt;br /&gt;
* proceed with [[{{NAMESPACE}}:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine|Reference14r2:Concept_App_Platform#Resizing_the_disk_of_a_Virtual_machine]]&lt;br /&gt;
&lt;br /&gt;
== Resizing the disk of a Virtual machine ==&lt;br /&gt;
&lt;br /&gt;
 Do &#039;&#039;&#039;NOT&#039;&#039;&#039; resize if you&#039;re running an App Platform version higher than &#039;&#039;&#039;110000&#039;&#039;&#039; and lower than &#039;&#039;&#039;110027&#039;&#039;&#039; or your data will be lost!&lt;br /&gt;
 Please update your App Platform to version 110027 or higher before you start resizing your disk.&lt;br /&gt;
&lt;br /&gt;
* stop the VM&lt;br /&gt;
* expand the disk using your VM utilities&lt;br /&gt;
* start the VM and boot from the first boot entry &#039;&#039;&#039;rescue/setup&#039;&#039;&#039;&lt;br /&gt;
* login with &#039;&#039;&#039;root&#039;&#039;&#039; and &#039;&#039;&#039;iplinux&#039;&#039;&#039;&lt;br /&gt;
* execute this command: &#039;&#039;&#039;/home/root/install_step1.sh log.txt resize&#039;&#039;&#039;&lt;br /&gt;
* the VM reboots automatically after a successful resize&lt;br /&gt;
&lt;br /&gt;
== Shrink the physically size of PostgreSQL database files ==&lt;br /&gt;
Tuples that are deleted in your database are not physically removed from the database-file. So the claimed space on the harddisk is still in use after the delete operation. &lt;br /&gt;
If you need to free up some disk space you can force to reorganize the physically database-file on your harddisk.&lt;br /&gt;
&lt;br /&gt;
 You can also start this process through the instance settings as long as the App Platform Manager is still running.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important: You are operating on the Database, you have to make a Backup of your Database before you do this!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Login via SSH to the APPlatform with the &#039;&#039;admin&#039;&#039; User&lt;br /&gt;
 su root&lt;br /&gt;
&lt;br /&gt;
=== All databases ===&lt;br /&gt;
 /etc/init.d/S92manager stop  # not always needed, but in case of database errors recommended, of course no app is online then&lt;br /&gt;
 sudo -u postgres reindexdb -a&lt;br /&gt;
 sudo -u postgres vacuumdb -a -f&lt;br /&gt;
 /etc/init.d/S92manager restart # just execute if the manager has been stopped above&lt;br /&gt;
&lt;br /&gt;
=== single database ===&lt;br /&gt;
 sudo -u postgres reindexdb -d dbname # for a single database with dbname&lt;br /&gt;
 sudo -u postgres vacuumdb -d dbname -f # for a single database with dbname&lt;br /&gt;
&lt;br /&gt;
Note: This may take some time and the App database is not available during this time&lt;br /&gt;
&lt;br /&gt;
After the process you can check the free dispace via &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;. You can check the claimed space from the database file with the command &amp;lt;code&amp;gt;du -sh /mnt/sda2/pgsql/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Change IP Addresses / DNS Names / System Name ==&lt;br /&gt;
&lt;br /&gt;
If you want to change the System Name or the DNS Name of the PBX and/or App Platform Platform you must change records manually &#039;&#039;&#039;in the described order&#039;&#039;&#039;!&lt;br /&gt;
You have to know the Admin password to directly Login to the App Platform .&lt;br /&gt;
&lt;br /&gt;
=== App Platform ===&lt;br /&gt;
; Settings - General&lt;br /&gt;
* &#039;&#039;Devices app URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;App platform DNS name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Settings - Alarms and Events&lt;br /&gt;
* &#039;&#039;URL&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; All Instances&lt;br /&gt;
* &#039;&#039;Domain&#039;&#039;&lt;br /&gt;
* &#039;&#039;Webserver path&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== PBX ===&lt;br /&gt;
Download the configuration and &#039;&#039;search/replace&#039;&#039; in the config file. Upload the config file and reboot.&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
* &#039;&#039;URL&#039;&#039; in all PBX Object (Apps, Voicemail ...)&lt;br /&gt;
* [[{{NAMESPACE}}:Gateway/CDR|CDRx]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/General|IP address for App Platform]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/myApps|Reset Password Page]]&lt;br /&gt;
* [[{{NAMESPACE}}:PBX/Config/Authentication|Verification link]]&lt;br /&gt;
&lt;br /&gt;
Depending on your change you have to activate/deactivate the Setting [[{{NAMESPACE}}:PBX/Config/General|Operation without DNS]]&lt;br /&gt;
&lt;br /&gt;
=== Additional Devices / Steps ===&lt;br /&gt;
* &#039;&#039;Devices Registration URL&#039;&#039;&lt;br /&gt;
** There is no automatism to change the URL on all devices in your setup.&lt;br /&gt;
** If you have the option to use DHCP, you can temporarily overwrite the [[{{NAMESPACE}}:Services/Update|Update URL]] and execute a [[{{NAMESPACE}}:Concept_Update_Server|custom update script]] to change the &#039;&#039;Device Registration URL&#039;&#039;&lt;br /&gt;
* &#039;&#039;Alarm server&#039;&#039;&lt;br /&gt;
* Reverse Proxy configuration&lt;br /&gt;
* Change &#039;&#039;Domain Name&#039;&#039; in Devices if you have also changed the system name&lt;br /&gt;
&lt;br /&gt;
== How to recover from a broken File System ==&lt;br /&gt;
Sometimes you may find messages in the &#039;&#039;messages&#039;&#039; log file (in &#039;&#039;var/log&#039;&#039;) like&lt;br /&gt;
&lt;br /&gt;
 initial error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
 last error at 1500329378: ext4_journal_start_sb:328&lt;br /&gt;
&lt;br /&gt;
Or you get events like &amp;quot;Broken file system&amp;quot; from your App Platform .&lt;br /&gt;
&lt;br /&gt;
This indicates a file system failure on the Linux Installation.&lt;br /&gt;
&lt;br /&gt;
When the Linux file system is broken, you can try to repair it using some command line Linux tools.&lt;br /&gt;
&lt;br /&gt;
If this doesn&#039;t fix your issue, you need to replace the SSD with a new one, re-install the App Platform and any applications and restore your backups.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
&lt;br /&gt;
* Open the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the Kernel command line from root=/dev/sda3 to root=/dev/ram0&lt;br /&gt;
** modify the Initrd file to ramdisk.ext2.xz&lt;br /&gt;
** modify the ramdisk size to 100000&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on another (hopefully sane) partition.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
&lt;br /&gt;
* go back to the WebGUI of the gateway running your LAP and proceed to &#039;&#039;App Platform/General&#039;&#039;&lt;br /&gt;
** terminate Linux (&#039;&#039;Status/Stop&#039;&#039;)&lt;br /&gt;
** modify the &#039;&#039;Kernel command line&#039;&#039; from &#039;&#039;root=/dev/ram0&#039;&#039; to &amp;lt;code&amp;gt;root=/dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
** clear the Initrd file field&lt;br /&gt;
** clear the ramdisk size field&lt;br /&gt;
** start Linux again&lt;br /&gt;
:: This will run Linux on the original partition.&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
Restart the VM and select the first entry in the boot menu from grub.&lt;br /&gt;
&lt;br /&gt;
* use [https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html putty] to log in to the LAP&#039;s command line ( try either user: root, pw: iplinux &#039;&#039;&#039;OR&#039;&#039;&#039; user: admin, pw: ipapps)&lt;br /&gt;
** use this to be root &amp;lt;code&amp;gt;su - root&amp;lt;/code&amp;gt; (password iplinux)&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda2&amp;lt;/code&amp;gt;&lt;br /&gt;
** on the command prompt, use &amp;lt;code&amp;gt;e2fsck -p -f /dev/sda3&amp;lt;/code&amp;gt;&lt;br /&gt;
:: this should fix any issue on the file system&lt;br /&gt;
* Reboot your VM&lt;br /&gt;
[[Category:Concept]]&lt;br /&gt;
&lt;br /&gt;
== How to create a memory dump of a running process ==&lt;br /&gt;
&lt;br /&gt;
Sometimes it&#039;s usefull to have a memory dump of a running process to investigate certain issues.&lt;br /&gt;
&lt;br /&gt;
* login with SSH and become root&lt;br /&gt;
* find out the PID of the relevant process, e.g. with &#039;&#039;ps aux | grep /apps/manager/manager | grep -v grep&#039;&#039;&lt;br /&gt;
* gdb --pid PID -ex gcore --batch&lt;br /&gt;
* this creates a core file core.PID&lt;br /&gt;
* download this core file with WinSCP or similar tools&lt;br /&gt;
&lt;br /&gt;
== Move instance database to external database host ==&lt;br /&gt;
&lt;br /&gt;
In case you want to use an external database server instead of the integrated:&lt;br /&gt;
&lt;br /&gt;
* download a backup of the specific instance over the App Platform Manager&lt;br /&gt;
* create a postgresql database on the external host:&lt;br /&gt;
** createdb --encoding=UTF-8 exampledb&lt;br /&gt;
* restore the backup&lt;br /&gt;
** pg_restore -d exampledb backup-exampledb.dump&lt;br /&gt;
* change the ownership to a specific postgresql user (which you have to create yourself first)&lt;br /&gt;
** psql -d postgres -c &amp;quot;ALTER DATABASE exampledb OWNER TO exampleuser&amp;quot;&lt;br /&gt;
* configure the database host, name, user and password on the instance inside the App Platform Manager&lt;/div&gt;</summary>
		<author><name>Dde</name></author>
	</entry>
</feed>