diff --git a/404.html b/404.html index ebe83c7350..6d14fc78e4 100644 --- a/404.html +++ b/404.html @@ -103,9 +103,10 @@
  • Backups in CHT 4.x

    Which data to backup when hosting the CHT 4.x

    This guide is about backups in CHT 4.x - there’s the self hosted guide for 3.x which includes backups for 3.x.

    Introduction

    As CHT 4.x uses a container per service, the only data that needs to be backed up is:

    This is because Docker containers are inherently stateless so all the important binaries are already stored in CHT’s Docker images. Docker Compose files, including the .env file, store all of your deployment’s configuration. Finally, the TLS certificates should be backed up to reduce recovery time.

    How to backup each of these three pieces of data is covered below.

    Therefore, you do not need to back up the docker images for:

    Assumptions

    This guide assumes you have an Ubuntu server running CHT 4.x in Docker as described in our Self Hosting in CHT 4.x - Single CouchDB Node guide. If you run docker ps --format '{{.Names}}' you should see something like this:

    cht_nginx_1
    + Create documentation issue
    + Create project issue

    Backups in CHT 4.x

    Which data to backup when hosting the CHT 4.x

    This guide is about backups in CHT 4.x - there’s the self hosted guide for 3.x which includes backups for 3.x.

    Introduction

    As CHT 4.x uses a container per service, the only data that needs to be backed up is:

    • CouchDB database
    • Docker Compose and .env files
    • TLS certificates

    This is because Docker containers are inherently stateless so all the important binaries are already stored in CHT’s Docker images. Docker Compose files, including the .env file, store all of your deployment’s configuration. Finally, the TLS certificates should be backed up to reduce recovery time.

    How to backup each of these three pieces of data is covered below.

    Therefore, you do not need to back up the docker images for:

    • nginx
    • sentinel
    • api
    • haproxy
    • couchdb
    • healthcheck
    • upgrade-service

    Assumptions

    This guide assumes you have an Ubuntu server running CHT 4.x in Docker as described in our Self Hosting in CHT 4.x - Single CouchDB Node guide. If you run docker ps --format '{{.Names}}' you should see something like this:

    cht_nginx_1
     cht_sentinel_1
     cht_api_1
     cht_haproxy_1
    @@ -284,8 +285,8 @@
     

    Note - In the volumes listed above, there is no volume for CouchDB data. This is because the compose file declares this as a bind mount. Bind mounts use the host file system directly and do not show up in docker volume ls calls. It’s therefore assumed your CouchDB data location is declared in /home/ubuntu/cht/upgrade-service/.env which sets it with COUCHDB_DATA=/home/ubuntu/cht/couchdb.

    You should have SSH access to the server with root access.

    Backup software

    It’s assumed you are using which ever tool you’re familiar with which might include rsync, borg, duplicity or other solution. The locations of the backups should follow the 3-2-1 rule:

    There should be at least 3 copies of the data, stored on 2 different types of storage media, and one copy should be kept offsite, in a remote location. - Wikipedia

    Duplicity has the handy benefit of offering built in encryption using GPG. Consider using this if you don’t have an existing solution for encrypted backups.

    CouchDB

    Assuming your CouchDB is stored in /home/ubuntu/cht/couchdb, you should use these steps to back it up:

    1. While you don’t need to stop CouchDB to back it up, ensure you follow best practices to back it up. See the CouchDB site for more info. Note that Medic recommends NOT using replication for backup.
    2. It is strongly recommended you encrypt your backups given the sensitivity of the contents. Do this now before copying the backup files to their long term location.
    3. Backup the CouchDB files using the software specified above

    Docker Compose files

    All compose files, and the corresponding .env file, are in these three locations:

    • /home/ubuntu/cht/compose/*.yml
    • /home/ubuntu/cht/upgrade-service/*.yml
    • /home/ubuntu/cht/upgrade-service/.env

    While all three of these are trivial to recreate by downloading them again, they may change over time so should be archived with your CouchDB data. Further, when there’s been a critical failure of a production CHT instance, you want to be sure to make the restore process as speedy as possible.

    As all of these files are only read when Docker first loads a service, you can simply copy them whenever you want without stopping any of the CHT services. They should be copied with the same frequency and put in the same location as the CouchDB data using the backup software specified above.

    TLS certificates

    Like the compose files, the TLS certificate files can easily be regenerated or re-downloaded from your Certificate Authority, like Let’s Encrypt for example. However, you want to have a backup of the at the ready to ease the restore process.

    1. Copy the cert and key files from the nginx container:

      docker cp cht_nginx_1:/etc/nginx/private/key.pem .
       docker cp cht_nginx_1:/etc/nginx/private/cert.pem .
       
    2. Back the up to the same location and frequency as the CouchDB data using the backup software specified above.

    Testing backups

    A backup that isn’t tested, is effectively not a backup. For a backup to be successful, a complete restore from all locations in the 3-2-1 plan need to be fully tested and documented as to how a restore works. The more practiced and better documented the restore process, the less downtime a production CHT instance will have after data loss.

    -

    \ No newline at end of file diff --git a/apps/guides/hosting/4.x/data-migration/index.html b/apps/guides/hosting/4.x/data-migration/index.html index 4e5de8640d..fe476a0c72 100644 --- a/apps/guides/hosting/4.x/data-migration/index.html +++ b/apps/guides/hosting/4.x/data-migration/index.html @@ -107,9 +107,10 @@
  • 4.x

    Guides for hosting CHT 4.x applications

    Before beginning any of these guides, be sure to meet all of the CHT hosting requirements first.

    To host a production instance of CHT, use either the Self Hosting in CHT 4.x guide. To do app development, see our App Developer hosting guide.

    To view 3.x hosting options, see the 3.x hosting section


    Migration from CHT 3.x to CHT 4.x

    Guide to migrate existent data from CHT 3.x to CHT 4.x

    Self Hosting in CHT 4.x - Single CouchDB Node

    Self Hosting in CHT 4.x - Single CouchDB Node

    Self Hosting in CHT 4.x - Multiple CouchDB Nodes

    Hosting the CHT on self run infrastructure with horizontally scaled CouchDB nodes

    App Developer Hosting in CHT 4.x

    Hosting the CHT when developing apps

    Adding TLS certificates in CHT 4.x

    How to add TLS certificates to your docker hosted CHT 4.x instance

    Viewing server logs in CHT 4.x

    What to do when you need to find server side errors in CHT 4.x

    Backups in CHT 4.x

    Which data to backup when hosting the CHT 4.x


    CHT Applications > + Create documentation issue + Create project issue

    4.x

    Guides for hosting CHT 4.x applications

    Before beginning any of these guides, be sure to meet all of the CHT hosting requirements first.

    To host a production instance of CHT, use the Self Hosting in CHT 4.x guide. To do app development, see our App Developer hosting guide.

    To view 3.x hosting options, see the 3.x hosting section


    Migration from CHT 3.x to CHT 4.x

    Guide to migrate existent data from CHT 3.x to CHT 4.x

    Self Hosting in CHT 4.x

    Details for hosting the CHT on self run infrastructure

    App Developer Hosting in CHT 4.x

    Hosting the CHT when developing apps

    Adding TLS certificates in CHT 4.x

    How to add TLS certificates to your docker hosted CHT 4.x instance

    Viewing server logs in CHT 4.x

    What to do when you need to find server side errors in CHT 4.x

    Backups in CHT 4.x

    Which data to backup when hosting the CHT 4.x


    CHT Applications > Quick Guides > Updates > Preparing to upgrade to CHT 4.0

    Steps to ensure your CHT App will run smoothly on CHT 4.0 and later

    -

    \ No newline at end of file diff --git a/apps/guides/hosting/4.x/index.xml b/apps/guides/hosting/4.x/index.xml index 0b617a9c9a..024c3ed7ab 100644 --- a/apps/guides/hosting/4.x/index.xml +++ b/apps/guides/hosting/4.x/index.xml @@ -189,323 +189,72 @@ To get the correct <code>docker-network-name</code> and <code>docker-se <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>docker-compose run couch-migration remove-node couchdb@127.0.0.1 </span></span></code></pre></div><p>j) Run the <code>verify</code> command to check whether the migration was successful.</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>docker-compose run couch-migration verify -</span></span></code></pre></div><p>If all checks pass, you should see a message <code>Migration verification passed</code>. It is then safe to proceed with starting CHT-Core 4.x, using the same environment variables you saved in <code>~/couchdb-cluster/.env</code>.</p>Apps: Self Hosting in CHT 4.x - Single CouchDB Nodehttps://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting-single-node/Mon, 01 Jan 0001 00:00:00 +0000https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting-single-node/ -<div class="pageinfo pageinfo-primary"> -<p>This for a single node CHT 4.x instance and is the recommended solution for most deployments. While not recommended, if you want a more powerful setup, check out <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/requirements/">the 4.x multi-node install docs</a>. As well, there&rsquo;s the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/self-hosting/">self hosted guide for CHT 3.x</a>.</p> -</div> -<h2 id="prerequisites">Prerequisites</h2> -<p>Be sure you have followed <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/requirements/">the requirements document</a> including installing Docker and Docker Compose. This guide assumes you&rsquo;re using the <code>ubuntu</code> user and that it <a href="https://askubuntu.com/a/477554">has <code>sudo-less</code> access to Docker</a>.</p> -<h2 id="directory-structure">Directory Structure</h2> -<p>Create the following directory structure:</p> -<pre tabindex="0"><code>|-- /home/ubuntu/cht/ -|-- compose/ -|-- certs/ -|-- couchdb/ -|-- upgrade-service/ -</code></pre><p>By calling this <code>mkdir</code> commands:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>mkdir -p /home/ubuntu/cht/<span style="color:#ce5c00;font-weight:bold">{</span>compose,certs,upgrade-service,couchdb<span style="color:#ce5c00;font-weight:bold">}</span> -</span></span></code></pre></div><ol> -<li><code>compose</code> - docker-compose files for cht-core and CouchDB</li> -<li><code>certs</code> - TLS certificates directory</li> -<li><code>upgrade-service</code> - where docker-compose file for the upgrade-service</li> -<li><code>couchdb</code> - the path for the docker-compose file of the upgrade-service (not used in multi-node)</li> -</ol> -<h2 id="download-required-docker-compose-files">Download required docker-compose files</h2> -<p>The following 3 <code>curl</code> commands download CHT version <code>4.0.1</code> compose files, which you can change as needed. Otherwise, call:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht/ -</span></span><span style="display:flex;"><span>curl -s -o ./compose/cht-core.yml https://staging.dev.medicmobile.org/_couch/builds_4/medic:medic:4.3.1/docker-compose/cht-core.yml -</span></span><span style="display:flex;"><span>curl -s -o ./compose/cht-couchdb.yml https://staging.dev.medicmobile.org/_couch/builds_4/medic:medic:4.3.1/docker-compose/cht-couchdb.yml -</span></span><span style="display:flex;"><span>curl -s -o ./upgrade-service/docker-compose.yml https://raw.githubusercontent.com/medic/cht-upgrade-service/main/docker-compose.yml -</span></span></code></pre></div><h2 id="prepare-environment-variables-file">Prepare Environment Variables file</h2> -<p>Prepare a <code>.env</code> file by running this code:</p> -<pre tabindex="0"><code>sudo apt install wamerican -uuid=$(uuidgen) -couchdb_secret=$(shuf -n7 /usr/share/dict/words --random-source=/dev/random | tr &#39;\n&#39; &#39;-&#39; | tr -d &#34;&#39;&#34; | cut -d&#39;-&#39; -f1,2,3,4,5,6,7) -couchdb_password=$(shuf -n7 /usr/share/dict/words --random-source=/dev/random | tr &#39;\n&#39; &#39;-&#39; | tr -d &#34;&#39;&#34; | cut -d&#39;-&#39; -f1,2,3,4,5,6,7) -cat &gt; /home/ubuntu/cht/upgrade-service/.env &lt;&lt; EOF -CHT_COMPOSE_PROJECT_NAME=cht -COUCHDB_SECRET=${couchdb_secret} -DOCKER_CONFIG_PATH=/home/ubuntu/cht/upgrade-service -COUCHDB_DATA=/home/ubuntu/cht/couchdb -CHT_COMPOSE_PATH=/home/ubuntu/cht/compose -COUCHDB_USER=medic -COUCHDB_PASSWORD=${couchdb_password} -COUCHDB_UUID=${uuid} -EOF -</code></pre><p>Note that secure passwords and UUIDs were generated on the first four calls and saved in the resulting <code>.env</code> file.</p> -<h2 id="launch-containers">Launch containers</h2> -<div class="alert alert-primary" role="alert"> -<h4 class="alert-heading">Note</h4> -This section has the first use of <code>docker compose</code>. This should work, but you may need to use the older style <code>docker-compose</code> if you get an error <code>docker: 'compose' is not a docker command.</code>. -</div> -<p>To start your CHT instance, run the following</p> -<pre tabindex="0"><code>cd /home/ubuntu/cht/upgrade-service -docker compose up --detach -</code></pre><p>Docker will start the upgrade service, which in turn pulls the required images and starts all the services as defined by the compose files in <code>/home/ubuntu/cht/compose</code>.</p> -<p>To follow the progress tail the log of the upgrade service container by running this:</p> -<p><code>docker logs -f upgrade-service_cht-upgrade-service_1</code></p> -<p>To make sure everything is running correctly, call <code>docker ps</code> and make sure that 7 CHT containers show:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -</span></span><span style="display:flex;"><span>8c1c22d526f3 public.ecr.aws/s5s3h4s7/cht-nginx:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;/docker-entrypoint.…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes 0.0.0.0:80-&gt;80/tcp, :::80-&gt;80/tcp, 0.0.0.0:443-&gt;443/tcp, :::443-&gt;443/tcp cht_nginx_1 -</span></span><span style="display:flex;"><span>f7b596be2721 public.ecr.aws/s5s3h4s7/cht-api:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;/bin/bash /api/dock…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes 5988/tcp cht_api_1 -</span></span><span style="display:flex;"><span>029cd86ac721 public.ecr.aws/s5s3h4s7/cht-sentinel:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;/bin/bash /sentinel…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes cht_sentinel_1 -</span></span><span style="display:flex;"><span>61ee1e0b377b public.ecr.aws/s5s3h4s7/cht-haproxy-healthcheck:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;/bin/sh -c \&#34;/app/ch…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes cht_healthcheck_1 -</span></span><span style="display:flex;"><span>87415a2d91ea public.ecr.aws/s5s3h4s7/cht-haproxy:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;/entrypoint.sh -f /…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes 5984/tcp cht_haproxy_1 -</span></span><span style="display:flex;"><span>58454457467a public.ecr.aws/s5s3h4s7/cht-couchdb:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;tini -- /docker-ent…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes 4369/tcp, 5984/tcp, 9100/tcp cht_couchdb_1 -</span></span><span style="display:flex;"><span>d01343658f3f public.ecr.aws/s5s3h4s7/cht-upgrade-service:latest <span style="color:#4e9a06">&#34;node /app/src/index…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes upgrade-service-cht-upgrade-service-1 -</span></span></code></pre></div><p>This should show related to the CHT core are running</p> -<ul> -<li>cht_nginx</li> -<li>cht_api</li> -<li>cht_sentinel</li> -<li>cht_couchdb</li> -<li>cht_healthcheck</li> -<li>cht_haproxy</li> -<li>cht-upgrade-service</li> -</ul> -<p>Take note of the <code>STATUS</code> column and make sure no errors are displayed there. If any container is restarting or mentioning any other error, check the logs using the <code>docker logs &lt;container-name&gt;</code> command.</p> -<p>If all has gone well, nginx should now be listening at both port 80 and port 443. Port 80 has a permanent redirect to port 443, so you can only access the CHT using https.</p> -<p>To login as the <code>medic</code> user in the web app, you can find your password with this command:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>grep COUCHDB_PASSWORD /home/ubuntu/cht/upgrade-service/.env <span style="color:#000;font-weight:bold">|</span> cut -d<span style="color:#4e9a06">&#39;=&#39;</span> -f2 -</span></span></code></pre></div><h2 id="tls-certificates">TLS Certificates</h2> -<p>See the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/adding-tls-certificates/">TLS Certificates page</a> for how to import your certificates.</p> -<h2 id="upgrades">Upgrades</h2> -<p>During upgrades, the CHT upgrade service updates the docker-compose files located in <code>/home/ubuntu/cht/compose/</code>. This means that any and all changes made to the docker-compose files will be overwritten. If there is ever a need to make any changes to the docker-compose files, be sure to re-do them post upgrades or should consider implementing them outside of those docker-compose files.</p>Apps: Self Hosting in CHT 4.x - Multiple CouchDB Nodeshttps://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting-multiple-nodes/Mon, 01 Jan 0001 00:00:00 +0000https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting-multiple-nodes/ -<div class="pageinfo pageinfo-primary"> -<p>The clustered multi-node hosting described below is only recommended for deployments that need extreme performance gains. These gains will greatly increase the complexity of troubleshooting and decrease the ease ongoing maintenance.</p> -<p>Instead, we recommended most deployment go with the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting-single-node/">single node hosting</a>.</p> -<p>As well, there&rsquo;s the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/self-hosting/">self hosted guide for 3.x</a>.</p> -</div> -<h3 id="about-clustered-deployments">About clustered deployments</h3> -<p>In a clustered CHT setup, there are multiple CouchDB nodes responding to users. The ability to <a href="https://en.wikipedia.org/wiki/Horizontal_scaling#Horizontal_(scale_out)_and_vertical_scaling_(scale_up)">horizontally scale</a> a CHT instance was added in version CHT 4.0.0. In this document we set up a three node CouchDB cluster. We require all three CouchDB nodes to be running and healthy before installing the CHT. Our healthcheck service determines the health of the CouchDB nodes and turns off the CHT if any single node is not functional.</p> -<h3 id="nodes">Nodes</h3> -<ul> -<li>CHT Core (1x) - Core functionality of the CHT including API and sentinel</li> -<li>CouchDB (3x) - 3 node CouchDB cluster</li> -</ul> -<h2 id="prerequisites">Prerequisites</h2> -<h3 id="servers">Servers</h3> -<p>Provision four Ubuntu servers (22.04 as of this writing) that meet our <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/requirements/">hosting requirements</a> including installing Docker and Docker Compose on all of them. This guide assumes you&rsquo;re using the <code>ubuntu</code> user, with a home directory of <code>/home/ubuntu</code> and that it <a href="https://askubuntu.com/a/477554">has <code>sudo-less</code> access to Docker</a>.</p> -<h3 id="network">Network</h3> -<p>Make sure the following ports are open for all nodes:</p> -<ul> -<li><code>7946 TCP/UDP</code> - For Docker communication amongst nodes</li> -<li><code>2377 TCP</code> - Docker cluster management communication</li> -<li><code>4789 UDP</code> - Docker overlay network traffic</li> -<li><code>ICMP</code> - For ping</li> -</ul> -<p>As a security measure, be sure to restrict the IP addresses of the four nodes only to be able to connect to these ports.</p> -<h2 id="create-an-overlay-network">Create an Overlay Network</h2> -<p>To set up a private network that only the four nodes can use, we&rsquo;ll use <code>docker swarm</code>&rsquo;s overlay network feature. You&rsquo;ll first need to initialize the swarm on the CHT Core node and then join the swarm on each of the three CouchDB nodes.</p> -<h3 id="cht-core-node">CHT Core node</h3> -<p>Initialize swarm mode by running:</p> -<pre tabindex="0"><code>docker swarm init -</code></pre><p>This will output:</p> -<div class="highlight"><div style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"> -<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"> -<pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1 -</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2 -</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3 -</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4 -</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5 -</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6 -</span></code></pre></td> -<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"> -<pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>Swarm initialized: current node <span style="color:#ce5c00;font-weight:bold">(</span>ca7z1v4tm9q4kf9uimreqoauj<span style="color:#ce5c00;font-weight:bold">)</span> is now a manager. -</span></span><span style="display:flex;"><span>To add a worker to this swarm, run the following command: -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> docker swarm join --token &lt;very-long-token-value&gt; &lt;main-server-private-ip&gt;:2377 -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>To add a manager to this swarm, run <span style="color:#4e9a06">&#39;docker swarm join-token manager&#39;</span> and follow the instructions. </span></span></code></pre></td></tr></table> -</div> -</div> -<p>Then create overlay network by calling:</p> -<pre tabindex="0"><code>docker network create --driver=overlay --attachable cht-net -</code></pre><h3 id="couchdb-nodes">CouchDB nodes</h3> -<p>On each of these three CouchDB nodes run the <code>docker swarm join</code> command given to you in <a href="#cht-core-node">line 4 above in &ldquo;CHT Core node&rdquo;</a>:</p> -<pre><code>docker swarm join --token &lt;very-long-token-value&gt; &lt;main-server-private-ip&gt;:2377` -</code></pre> -<h3 id="confirm-swarm">Confirm swarm</h3> -<p>Back on the CHT Core node, run <code>docker node ls</code> and ensure you see 4 nodes listed as <code>STATUS</code> of <code>Ready</code> and <code>AVAILABILITY</code> of <code>Active</code></p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION -</span></span><span style="display:flex;"><span>zolpxb5jpej8yiq9gcyv2nrdj * cht-core Ready Active Leader 20.10.23 -</span></span><span style="display:flex;"><span>y9giir8c3ydifxvwozs3sn8vw couchdb1 Ready Active 20.10.23 -</span></span><span style="display:flex;"><span>mi3vj0prd76djbvxms43urqiv couchdb2 Ready Active 20.10.23 -</span></span><span style="display:flex;"><span>kcpxlci3jjjtm6xjz7v50ef7k couchdb3 Ready Active 20.10.23 -</span></span></code></pre></div><h2 id="cht-core-installation">CHT Core installation</h2> -<p>Create the following directory structure:</p> -<pre tabindex="0"><code>|-- /home/ubuntu/cht/ -|-- compose/ -|-- certs/ -|-- couchdb/ -|-- upgrade-service/ -</code></pre><p>By calling this <code>mkdir</code> commands:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>mkdir -p /home/ubuntu/cht/<span style="color:#ce5c00;font-weight:bold">{</span>compose,certs,upgrade-service,couchdb<span style="color:#ce5c00;font-weight:bold">}</span> -</span></span></code></pre></div><ol> -<li><code>compose</code> - docker-compose files for cht-core and CouchDB</li> -<li><code>certs</code> - TLS certificates directory</li> -<li><code>upgrade-service</code> - where docker-compose file for the upgrade-service</li> -<li><code>couchdb</code> - the path for the docker-compose file of the upgrade-service (not used in multi-node)</li> -</ol> -<h3 id="prepare-environment-variables-file">Prepare Environment Variables file</h3> -<p>Prepare an <code>.env</code> file by running this code:</p> -<pre tabindex="0"><code>sudo apt install wamerican -uuid=$(uuidgen) -couchdb_secret=$(shuf -n7 /usr/share/dict/words --random-source=/dev/random | tr &#39;\n&#39; &#39;-&#39; | tr -d &#34;&#39;&#34; | cut -d&#39;-&#39; -f1,2,3,4,5,6,7) -couchdb_password=$(shuf -n7 /usr/share/dict/words --random-source=/dev/random | tr &#39;\n&#39; &#39;-&#39; | tr -d &#34;&#39;&#34; | cut -d&#39;-&#39; -f1,2,3,4,5,6,7) -cat &gt; /home/ubuntu/cht/upgrade-service/.env &lt;&lt; EOF -CHT_COMPOSE_PROJECT_NAME=cht -DOCKER_CONFIG_PATH=/home/ubuntu/cht/upgrade-service -CHT_COMPOSE_PATH=/home/ubuntu/cht/compose -COUCHDB_USER=medic -COUCHDB_PASSWORD=${couchdb_password} -COUCHDB_SERVERS=couchdb-1.local,couchdb-2.local,couchdb-3.local -EOF -</code></pre><p>Note that secure passwords and UUIDs were generated on the first four calls and saved in the resulting <code>.env</code> file.</p> -<h3 id="download-compose-files">Download compose files</h3> -<p>The following 2 <code>curl</code> commands download CHT version <code>4.0.1</code> compose files, which you can change as needed. Otherwise, call:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht/ -</span></span><span style="display:flex;"><span>curl -s -o ./compose/cht-core.yml https://staging.dev.medicmobile.org/_couch/builds_4/medic:medic:4.3.1/docker-compose/cht-core.yml -</span></span><span style="display:flex;"><span>curl -s -o ./upgrade-service/docker-compose.yml https://raw.githubusercontent.com/medic/cht-upgrade-service/main/docker-compose.yml -</span></span></code></pre></div><h4 id="compose-file-overrides">Compose file overrides</h4> -<p>We need to override the <code>networks:</code> in the two compose files we just created. Create the override file with this code:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>cat &gt; /home/ubuntu/cht/compose/cluster-overrides.yml <span style="color:#4e9a06">&lt;&lt; EOF -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">version: &#39;3.9&#39; -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">networks: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> cht-net: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> driver: overlay -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> external: true -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">EOF</span> -</span></span></code></pre></div><h3 id="tls-certificates">TLS Certificates</h3> -<div class="alert alert-primary" role="alert"> -<h4 class="alert-heading">Note</h4> -This section has the first use of <code>docker compose</code>. This should work, but you may need to use the older style <code>docker-compose</code> if you get an error <code>docker: 'compose' is not a docker command</code>. -</div> -<p>To ensure the needed docker volume is created, start the CHT Core services, which will intentionally all fail as the CouchDB nodes don&rsquo;t exist. We&rsquo;ll then ensure they&rsquo;re all stopped with the <code>docker kill</code> at the end. Note that this command has will <code>sleep 120</code> (wait for 2 minutes) in hopes of</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht/upgrade-service/ -</span></span><span style="display:flex;"><span>docker compose up -d -</span></span><span style="display:flex;"><span>sleep <span style="color:#0000cf;font-weight:bold">120</span> -</span></span><span style="display:flex;"><span>docker <span style="color:#204a87">kill</span> <span style="color:#204a87;font-weight:bold">$(</span>docker ps --quiet<span style="color:#204a87;font-weight:bold">)</span> -</span></span></code></pre></div><p>With docker volume having been created, see the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/adding-tls-certificates/">TLS Certificates page</a> for how to import your certificates on the CHT Core node.</p> -<h2 id="couchdb-installation-on-3-nodes">CouchDB installation on 3 nodes</h2> -<p>Now that CHT Core is installed, we need to install CouchDB on the three nodes. Be sure all 3 nodes <a href="#prerequisites">meet the prerequisites</a> before proceeding.</p> -<h3 id="prepare-environment-variables-file-1">Prepare Environment Variables file</h3> -<p>First, <strong>on the CHT Core node</strong>, get your CouchDB password with this command:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>grep COUCHDB_PASSWORD /home/ubuntu/cht/upgrade-service/.env <span style="color:#000;font-weight:bold">|</span> cut -d<span style="color:#4e9a06">&#39;=&#39;</span> -f2 -</span></span></code></pre></div><p>Now, <strong>on all 3 CouchDB nodes</strong>, create an <code>.env</code> file by running this code. You&rsquo;ll need to replace <code>PASSWORD-FROM-ABOVE</code> so it is the same on all three nodes:</p> -<pre tabindex="0"><code>sudo apt install wamerican -mkdir -p /home/ubuntu/cht/srv -uuid=$(uuidgen) -couchdb_secret=$(shuf -n7 /usr/share/dict/words --random-source=/dev/random | tr &#39;\n&#39; &#39;-&#39; | tr -d &#34;&#39;&#34; | cut -d&#39;-&#39; -f1,2,3,4,5,6,7) -cat &gt; /home/ubuntu/cht/.env &lt;&lt; EOF -CHT_COMPOSE_PROJECT_NAME=cht -COUCHDB_SECRET=${couchdb_secret} -COUCHDB_DATA=/home/ubuntu/cht/couchdb -COUCHDB_USER=medic -COUCHDB_PASSWORD=PASSWORD-FROM-ABOVE -COUCHDB_UUID=${uuid} -EOF -</code></pre><p>Note that secure passwords and UUIDs were generated and saved in the resulting <code>.env</code> file.</p> -<h4 id="couchdb-node-1">CouchDB Node 1</h4> -<p>Create <code>/home/ubuntu/cht/docker-compose.yml</code> on Node 1 by running this code:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht/ -</span></span><span style="display:flex;"><span>curl -s -o ./docker-compose.yml https://staging.dev.medicmobile.org/_couch/builds_4/medic:medic:4.3.1/docker-compose/cht-couchdb.yml -</span></span></code></pre></div><p>Now create the override file to have Node 1 join the <code>cht-net</code> overlay network we created above. As well, we&rsquo;ll set some <code>services:</code> specific overrides:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>cat &gt; /home/ubuntu/cht/cluster-overrides.yml <span style="color:#4e9a06">&lt;&lt; EOF -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">version: &#39;3.9&#39; -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">services: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> couchdb: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> container_name: couchdb-1.local -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> environment: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> - &#34;SVC_NAME=${SVC1_NAME:-couchdb-1.local}&#34; -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> - &#34;CLUSTER_PEER_IPS=couchdb-2.local,couchdb-3.local&#34; -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">networks: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> cht-net: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> driver: overlay -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> external: true -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">EOF</span> -</span></span></code></pre></div><h4 id="couchdb-node-2">CouchDB Node 2</h4> -<p>Like we did for Node 1, create <code>/home/ubuntu/cht/docker-compose.yml</code> and the <code>cluster-overrides.yml</code> file on Node 2 by running this code:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht/ -</span></span><span style="display:flex;"><span>curl -s -o ./docker-compose.yml https://staging.dev.medicmobile.org/_couch/builds_4/medic:medic:4.3.1/docker-compose/cht-couchdb.yml -</span></span><span style="display:flex;"><span>cat &gt; /home/ubuntu/cht/cluster-overrides.yml <span style="color:#4e9a06">&lt;&lt; EOF -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">version: &#39;3.9&#39; -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">services: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> couchdb: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> container_name: couchdb-2.local -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> environment: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> - &#34;SVC_NAME=couchdb-2.local&#34; -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> - &#34;COUCHDB_SYNC_ADMINS_NODE=${COUCHDB_SYNC_ADMINS_NODE:-couchdb-1.local}&#34; -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">networks: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> cht-net: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> driver: overlay -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> external: true -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">EOF</span> -</span></span></code></pre></div><h4 id="couchdb-node-3">CouchDB Node 3</h4> -<p>Finally, we&rsquo;ll match Node 3 up with the others by running this code:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht/ -</span></span><span style="display:flex;"><span>curl -s -o ./docker-compose.yml https://staging.dev.medicmobile.org/_couch/builds_4/medic:medic:4.3.1/docker-compose/cht-couchdb.yml -</span></span><span style="display:flex;"><span>cat &gt; /home/ubuntu/cht/cluster-overrides.yml <span style="color:#4e9a06">&lt;&lt; EOF -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">version: &#39;3.9&#39; -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">services: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> couchdb: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> container_name: couchdb-3.local -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> environment: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> - &#34;SVC_NAME=couchdb-3.local&#34; -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> - &#34;COUCHDB_SYNC_ADMINS_NODE=${COUCHDB_SYNC_ADMINS_NODE:-couchdb-1.local}&#34; -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">networks: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> cht-net: -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> driver: overlay -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06"> external: true -</span></span></span><span style="display:flex;"><span><span style="color:#4e9a06">EOF</span> -</span></span></code></pre></div><h2 id="starting-services">Starting Services</h2> -<h3 id="couchdb-nodes-1">CouchDB Nodes</h3> -<ol> -<li> -<p>On each of the three CouchDB nodes starting with node 3, then 2 then 1. Be sure to wait until <code>docker-compose</code> is finished running and has returned you to the command prompt before continuing to the next node:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht -</span></span><span style="display:flex;"><span>docker compose -f docker-compose.yml -f cluster-overrides.yml up -d -</span></span></code></pre></div></li> -<li> -<p>Watch the logs and wait for everything to be up and running. You can run this on each node to watch the logs:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht -</span></span><span style="display:flex;"><span>docker compose logs --follow -</span></span></code></pre></div><p>Nodes 2 and 3 should show output like <code>couchdb is ready</code> after node 1 has started.</p> -<p>Node 1 will show this when it has added all nodes:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>cht-couchdb-1.local-1 <span style="color:#000;font-weight:bold">|</span> <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;ok&#34;</span>:true<span style="color:#ce5c00;font-weight:bold">}</span> -</span></span><span style="display:flex;"><span>cht-couchdb-1.local-1 <span style="color:#000;font-weight:bold">|</span> <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;all_nodes&#34;</span>:<span style="color:#ce5c00;font-weight:bold">[</span><span style="color:#4e9a06">&#34;couchdb@couchdb-1.local&#34;</span>,<span style="color:#4e9a06">&#34;couchdb@couchdb-2.local&#34;</span>,<span style="color:#4e9a06">&#34;couchdb@couchdb-3.local&#34;</span><span style="color:#ce5c00;font-weight:bold">]</span>,<span style="color:#4e9a06">&#34;cluster_nodes&#34;</span>:<span style="color:#ce5c00;font-weight:bold">[</span><span style="color:#4e9a06">&#34;couchdb@couchdb-1.local&#34;</span>,<span style="color:#4e9a06">&#34;couchdb@couchdb-2.local&#34;</span>,<span style="color:#4e9a06">&#34;couchdb@couchdb-3.local&#34;</span><span style="color:#ce5c00;font-weight:bold">]}</span> -</span></span></code></pre></div></li> -</ol> -<h3 id="cht-core">CHT Core</h3> -<p>Now that CouchDB is running on all the nodes, start the CHT Core:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht/upgrade-service/ -</span></span><span style="display:flex;"><span>docker compose -f docker-compose.yml -f ../compose/cluster-overrides.yml up -d -</span></span></code></pre></div><p>To follow the progress tail the log of the upgrade service container by running:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht/upgrade-service/ -</span></span><span style="display:flex;"><span>docker compose logs --follow -</span></span></code></pre></div><p>To make sure everything is running correctly, call <code>docker ps</code> and make sure that 6 CHT containers show:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -</span></span><span style="display:flex;"><span>8c1c22d526f3 public.ecr.aws/s5s3h4s7/cht-nginx:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;/docker-entrypoint.…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes 0.0.0.0:80-&gt;80/tcp, :::80-&gt;80/tcp, 0.0.0.0:443-&gt;443/tcp, :::443-&gt;443/tcp cht_nginx_1 -</span></span><span style="display:flex;"><span>f7b596be2721 public.ecr.aws/s5s3h4s7/cht-api:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;/bin/bash /api/dock…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes 5988/tcp cht_api_1 -</span></span><span style="display:flex;"><span>029cd86ac721 public.ecr.aws/s5s3h4s7/cht-sentinel:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;/bin/bash /sentinel…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes cht_sentinel_1 -</span></span><span style="display:flex;"><span>61ee1e0b377b public.ecr.aws/s5s3h4s7/cht-haproxy-healthcheck:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;/bin/sh -c \&#34;/app/ch…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes cht_healthcheck_1 -</span></span><span style="display:flex;"><span>87415a2d91ea public.ecr.aws/s5s3h4s7/cht-haproxy:4.0.1-4.0.1 <span style="color:#4e9a06">&#34;/entrypoint.sh -f /…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes 5984/tcp cht_haproxy_1 cht_couchdb_1 -</span></span><span style="display:flex;"><span>d01343658f3f public.ecr.aws/s5s3h4s7/cht-upgrade-service:latest <span style="color:#4e9a06">&#34;node /app/src/index…&#34;</span> <span style="color:#0000cf;font-weight:bold">17</span> minutes ago Up <span style="color:#0000cf;font-weight:bold">8</span> minutes upgrade-service-cht-upgrade-service-1 -</span></span></code></pre></div><p>This should show related to the CHT core are running</p> -<ul> -<li>cht_nginx</li> -<li>cht_api</li> -<li>cht_sentinel</li> -<li>cht_healthcheck</li> -<li>cht_haproxy</li> -<li>cht-upgrade-service</li> -</ul> -<p>Take note of the <code>STATUS</code> column and make sure no errors are displayed. If any container is restarting or mentioning any other error, check the logs using the <code>docker logs &lt;container-name&gt;</code> command.</p> -<p>If all has gone well, <code>nginx</code> should now be listening at both port 80 and port 443. Port 80 has a permanent redirect to port 443, so you can only access the CHT using https.</p> -<p>To login as the medic user in the web app, you can find your password with this command:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>grep COUCHDB_PASSWORD /home/ubuntu/cht/upgrade-service/.env <span style="color:#000;font-weight:bold">|</span> cut -d<span style="color:#4e9a06">&#39;=&#39;</span> -f2 -</span></span></code></pre></div><h2 id="upgrades">Upgrades</h2> -<p>Upgrades are completely manual for the clustered setup right now. You have to go into each of the docker compose files and modify the image tag and take containers down and restart them.</p>Apps: App Developer Hosting in CHT 4.xhttps://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/app-developer/Mon, 01 Jan 0001 00:00:00 +0000https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/app-developer/ +</span></span></code></pre></div><p>If all checks pass, you should see a message <code>Migration verification passed</code>. It is then safe to proceed with starting CHT-Core 4.x, using the same environment variables you saved in <code>~/couchdb-cluster/.env</code>.</p>Apps: Self Hosting in CHT 4.xhttps://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/Mon, 01 Jan 0001 00:00:00 +0000https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/ +<h1 id="recommendations-and-considerations">Recommendations and considerations</h1> +<h2 id="multi-vs-single-node-couchdb-requirements">Multi vs Single node couchdb requirements</h2> +<p>For smaller deployments a <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/single-node/">single node CouchDB</a> instance can be used, for larger deployments a <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/multiple-nodes/">multi-node CouchDB</a> cluster is generally recommended</p> +<table> +<thead> +<tr> +<th>Consideration</th> +<th><a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/single-node/">Single node CouchDB</a></th> +<th><a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/multiple-nodes/">Multi-node clustered CouchDB</a></th> +</tr> +</thead> +<tbody> +<tr> +<td>Less than +4 000 users</td> +<td><span title="Yes">✔</span></td> +<td><span title="Yes">✔</span></td> +</tr> +<tr> +<td>More than +4 000 users</td> +<td><span title="No">❌</span></td> +<td><span title="Yes">✔</span></td> +</tr> +<tr> +<td>Less than +10 000 documents per day</td> +<td><span title="Yes">✔</span></td> +<td><span title="Yes">✔</span></td> +</tr> +<tr> +<td>More than +10 000 documents per day</td> +<td><span title="No">❌</span></td> +<td><span title="Yes">✔</span></td> +</tr> +<tr> +<td>Seamless upgrade with multi-node docker compose</td> +<td><span title="Yes">✔</span></td> +<td><span title="No">❌</span></td> +</tr> +<tr> +<td>Seamless upgrade with multi-node kubernetes/k3s</td> +<td><span title="Yes">✔</span></td> +<td><span title="Yes">✔</span></td> +</tr> +</tbody> +</table> +<h2 id="cloud-provider-vs-bare-metal">Cloud provider vs Bare metal</h2> +<table> +<thead> +<tr> +<th>Consideration</th> +<th>Cloud provider</th> +<th>Bare Metal</th> +</tr> +</thead> +<tbody> +<tr> +<td>Data needs to be in-country</td> +<td><span title="No">❌</span></td> +<td><span title="Yes">✔</span></td> +</tr> +</tbody> +</table>Apps: App Developer Hosting in CHT 4.xhttps://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/app-developer/Mon, 01 Jan 0001 00:00:00 +0000https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/app-developer/ <div class="pageinfo pageinfo-primary"> <p>This guide assumes you are a CHT app developer wanting to either run concurrent instances of the CHT, or easily be able to switch between different instances without losing any data while doing so. To do development on the CHT Core Framework itself, see the <a href="https://docs.communityhealthtoolkit.org/contribute/code/core/dev-environment/">development guide</a>.</p> <p>To deploy the CHT 3.x in production, see either <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/ec2-setup-guide/">AWS hosting</a> or <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/self-hosting/">Self hosting</a>. 4.x production hosting guides are coming soon!</p> @@ -815,7 +564,7 @@ RES c656ecc7-e6af-4564-ad63-2cab2c42844a 10.131.161.1 - GET /medic/_all_docs?inc <li>upgrade-service</li> </ul> <h2 id="assumptions">Assumptions</h2> -<p>This guide assumes you have an Ubuntu server running CHT 4.x in Docker as described in our <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting-single-node/">Self Hosting in CHT 4.x - Single CouchDB Node</a> guide. If you run <code>docker ps --format '{{.Names}}'</code> you should see something like this:</p> +<p>This guide assumes you have an Ubuntu server running CHT 4.x in Docker as described in our <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/single-node/">Self Hosting in CHT 4.x - Single CouchDB Node</a> guide. If you run <code>docker ps --format '{{.Names}}'</code> you should see something like this:</p> <pre tabindex="0"><code>cht_nginx_1 cht_sentinel_1 cht_api_1 diff --git a/apps/guides/hosting/4.x/logs/index.html b/apps/guides/hosting/4.x/logs/index.html index 439f916f3c..ecf8f2263e 100644 --- a/apps/guides/hosting/4.x/logs/index.html +++ b/apps/guides/hosting/4.x/logs/index.html @@ -107,9 +107,10 @@
    • -
    • -
    • -
    • +
    • +
    • diff --git a/apps/guides/hosting/index.xml b/apps/guides/hosting/index.xml index 4133d347db..9076ed5a44 100644 --- a/apps/guides/hosting/index.xml +++ b/apps/guides/hosting/index.xml @@ -13,14 +13,14 @@ These requirements apply to both 3.x and 4.x CHT hosting <li>A DNS Entry pointing to the IP</li> <li>TLS certificates</li> </ul> -<h2 id="hardware-requirements">Hardware Requirements</h2> +<h2 id="minimum-hardware-requirements">Minimum Hardware Requirements</h2> <ul> <li>4 GiB RAM</li> <li>2 CPU/vCPU</li> <li>8 GB Hard Disk (SSD preferred)</li> <li>Root Access</li> </ul> -<p>Depending on the scale of your operation these may need to be adjusted. Be sure to monitor disk usage so that the 8 GB can be increased as needed.</p> +<p>Depending on the scale of your operation these may need to be increased. Be sure to monitor disk usage so that the 8 GB can be increased as needed.</p> <h2 id="docker">Docker</h2> <p>Install both <code>docker</code> and <code>docker-compose</code> to run CHT and related containers.</p> <div class="alert alert-primary" role="alert"> @@ -117,5 +117,5 @@ display: flex; To get an overview on how these hosting solutions use <code>docker</code> and <code>docker-compose</code>, as well as other key CHT concepts, be sure to read the <a href="https://docs.communityhealthtoolkit.org/apps/tutorials/local-setup/">guide on a Local Setup</a>. </div> <p>Before beginning any of these guides, be sure to meet all of the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/requirements/">CHT hosting requirements</a> first.</p> -<p>To host a production instance of CHT, use either the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting-single-node/">Self Hosting in CHT 4.x</a> guide. To do app development, see our <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/app-developer/">App Developer</a> hosting guide.</p> +<p>To host a production instance of CHT, use the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/">Self Hosting in CHT 4.x</a> guide. To do app development, see our <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/app-developer/">App Developer</a> hosting guide.</p> <p>To view 3.x hosting options, see the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/">3.x hosting section</a></p>Apps: Monitoring and Alertinghttps://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/Mon, 01 Jan 0001 00:00:00 +0000https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/ \ No newline at end of file diff --git a/apps/guides/hosting/monitoring/index.html b/apps/guides/hosting/monitoring/index.html index a4a28a8504..b9b76ffcc5 100644 --- a/apps/guides/hosting/monitoring/index.html +++ b/apps/guides/hosting/monitoring/index.html @@ -107,9 +107,10 @@
    • -
    • -
    • -
    • +
    • +
    • diff --git a/apps/guides/hosting/monitoring/index.xml b/apps/guides/hosting/monitoring/index.xml index 669cb0e41d..40eee0e238 100644 --- a/apps/guides/hosting/monitoring/index.xml +++ b/apps/guides/hosting/monitoring/index.xml @@ -965,7 +965,7 @@ cAdvisor["cAdvisor (8443)"] --> Prometheus </span></span></span><span style="display:flex;"><span><span style="color:#f8f8f8;text-decoration:underline"> </span>- <span style="color:#000">cht-net</span><span style="color:#f8f8f8;text-decoration:underline"> </span></span></span></code></pre></div><h4 id="start-cadvisor-caddy-and-cht-core-with-docker">Start cAdvisor, Caddy and CHT Core with Docker</h4> <p>Now that we have all the config files in place, you need to have Docker start everything together. This is so that the containers can see each other on the same <code>CHT Net</code> Docker network. You will need to specify each of the compose files every time you start, stop or restart CHT instance so all the services stay running and connected.</p> -<p>Assuming you followed the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting-single-node/">production steps</a> to install the CHT, you use this Compose call to first stop all containers and then start them all up, including the new services:</p> +<p>Assuming you followed the <a href="https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/">production steps</a> to install the CHT, you use this Compose call to first stop all containers and then start them all up, including the new services:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#204a87">cd</span> /home/ubuntu/cht/upgrade-service </span></span><span style="display:flex;"><span>docker stop <span style="color:#204a87;font-weight:bold">$(</span>docker ps --quiet<span style="color:#204a87;font-weight:bold">)</span> </span></span><span style="display:flex;"><span>docker compose up --detach diff --git a/apps/guides/hosting/monitoring/integration/index.html b/apps/guides/hosting/monitoring/integration/index.html index b9229a5fd2..c1e6ba2d3e 100644 --- a/apps/guides/hosting/monitoring/integration/index.html +++ b/apps/guides/hosting/monitoring/integration/index.html @@ -1,7 +1,7 @@ Integrating CHT Watchdog | Community Health Toolkit
  • Integrating CHT Watchdog

    Scraping and alerting external sources with CHT Watchdog

    These instructions apply to both CHT 3.x (beyond 3.12) and CHT 4.x.

    Going beyond basic setup

    After you have done the setup of CHT Watchdog and configured it to run with TLS and have backups enabled, you may want to extend it to scrape other Prometheus data sources so that Grafana can send alerts on non-CHT Core metrics.

    This guide uses example instances of CHT Core (cht.example.com) and CHT Watchdog (watchdog.example.com). When deploying, be sure to replace with your own hostnames.

    Default Flow

    Let’s look at how the default deployment of Watchdog works when configured to only gather metrics from CHT Core’s monitoring API:

    flowchart LR subgraph core["cht.example.com"] mon_api["Monitoring API (443)"]:::client_node @@ -326,7 +327,7 @@ - /home/ubuntu/Caddyfile:/etc/caddy/Caddyfile networks: - cht-net -

    Start cAdvisor, Caddy and CHT Core with Docker

    Now that we have all the config files in place, you need to have Docker start everything together. This is so that the containers can see each other on the same CHT Net Docker network. You will need to specify each of the compose files every time you start, stop or restart CHT instance so all the services stay running and connected.

    Assuming you followed the production steps to install the CHT, you use this Compose call to first stop all containers and then start them all up, including the new services:

    cd /home/ubuntu/cht/upgrade-service
    +

    Start cAdvisor, Caddy and CHT Core with Docker

    Now that we have all the config files in place, you need to have Docker start everything together. This is so that the containers can see each other on the same CHT Net Docker network. You will need to specify each of the compose files every time you start, stop or restart CHT instance so all the services stay running and connected.

    Assuming you followed the production steps to install the CHT, you use this Compose call to first stop all containers and then start them all up, including the new services:

    cd /home/ubuntu/cht/upgrade-service
     docker stop $(docker ps --quiet)
     docker compose up --detach
     

    Note that the CHT Upgrade Service will process all Docker Compose file in the /home/ubuntu/cht/compose directory for us and we don’t need to explicity specify them in the docker compose up command.

    On CHT Watchdog

    Scrape config

    We’ll first create the ~/cadvisor-prometheus-conf.yml file and point the config to our CHT Core URL:

    scrape_configs:
    @@ -343,8 +344,8 @@
     

    Load new Compose files with existing ones

    Now that you’ve added the new configuration files, we can load it alongside the existing ones. Assuming you’ve followed the Watchdog Setup, this would be:

    cd ~/cht-monitoring
     docker compose -f docker-compose.yml -f ../cadvisor-compose.yml up -d
     

    Import Grafana Dashboard

    Now that cAdvisor is running on your CHT Core instance and CHT Watchdog’s Prometheus has additional scrape configs to ingest the cAdvisor metrics, we can now visualize it in a Grafana Dashboard and then alert on it.

    1. Log into your Watchdog instance
    2. Click the upper left hamburger menu and click “Dashboards”
    3. Find the “New” button on the left, click and choose “Import” from the drop down
    4. On the next page, scroll down to find “Import via grafana.com”, enter ID 193 (for the Docker monitoring dashboard) and click “Load”
    5. Confirm the “Name” and “Folder” values and select “Prometheus” as the data source in the dropdown. Finally, click the “Import” button at the bottom of the page.

    That’s it! After following these steps, you should be looking at the cAdvisor dashboard as shown above. From here, you can both customize this dashboard as well as add alerts as needed.

    -

    diff --git a/apps/guides/hosting/monitoring/introduction/index.html b/apps/guides/hosting/monitoring/introduction/index.html index f5440d5dc3..7ae9de64c1 100644 --- a/apps/guides/hosting/monitoring/introduction/index.html +++ b/apps/guides/hosting/monitoring/introduction/index.html @@ -107,9 +107,10 @@
  • Requirements

    Requirements for hosting CHT

    For production CHT deployments, Linux is recommended, with Ubuntu the most commonly used. For CHT development, Linux or macOS may be used. Windows can be used for either, but without recommendation.

    Hosting a CHT instance in a cloud provider like AWS or on bare-metal requires you have sufficient hardware specifications, Docker and Docker Compose installed and other infrastructure requirements met.

    Infrastructure Requirements

    • A static IP
    • A DNS Entry pointing to the IP
    • TLS certificates

    Hardware Requirements

    • 4 GiB RAM
    • 2 CPU/vCPU
    • 8 GB Hard Disk (SSD preferred)
    • Root Access

    Depending on the scale of your operation these may need to be adjusted. Be sure to monitor disk usage so that the 8 GB can be increased as needed.

    Docker

    Install both docker and docker-compose to run CHT and related containers.

    Linux

    Depending on which distro you run, install the Docker packages from Docker’s Linux options. Historically, Medic runs Ubuntu: see Docker CE and Docker-compose install pages.

    Windows

    Docker Desktop for Windows needs either Hyper-V support or Windows Subsystem for Linux 2 (WSL 2). Docker’s Windows Docker Desktop install page covers both scenarios.

    macOS

    See Docker’s macOS Docker Desktop install page.

    Verify install

    Test that docker and docker-compose installed correctly by showing their versions with sudo docker-compose --version and sudo docker --version. Note, your version may be different:

    Requirements

    Requirements for hosting CHT

    For production CHT deployments, Linux is recommended, with Ubuntu the most commonly used. For CHT development, Linux or macOS may be used. Windows can be used for either, but without recommendation.

    Hosting a CHT instance in a cloud provider like AWS or on bare-metal requires you have sufficient hardware specifications, Docker and Docker Compose installed and other infrastructure requirements met.

    Infrastructure Requirements

    • A static IP
    • A DNS Entry pointing to the IP
    • TLS certificates

    Minimum Hardware Requirements

    • 4 GiB RAM
    • 2 CPU/vCPU
    • 8 GB Hard Disk (SSD preferred)
    • Root Access

    Depending on the scale of your operation these may need to be increased. Be sure to monitor disk usage so that the 8 GB can be increased as needed.

    Docker

    Install both docker and docker-compose to run CHT and related containers.

    Linux

    Depending on which distro you run, install the Docker packages from Docker’s Linux options. Historically, Medic runs Ubuntu: see Docker CE and Docker-compose install pages.

    Windows

    Docker Desktop for Windows needs either Hyper-V support or Windows Subsystem for Linux 2 (WSL 2). Docker’s Windows Docker Desktop install page covers both scenarios.

    macOS

    See Docker’s macOS Docker Desktop install page.

    Verify install

    Test that docker and docker-compose installed correctly by showing their versions with sudo docker-compose --version and sudo docker --version. Note, your version may be different:

    
     sudo docker-compose --version
     docker-compose version 1.27.1, build 509cfb99
     
    @@ -286,8 +287,8 @@
     Hosting >
     3.x >
     AWS Hosting

    Hosting the CHT on Amazon EC2

    -

    \ No newline at end of file diff --git a/apps/guides/hosting/vertical-vs-horizontal/index.html b/apps/guides/hosting/vertical-vs-horizontal/index.html index 4ae4196d52..583bb5dcc7 100644 --- a/apps/guides/hosting/vertical-vs-horizontal/index.html +++ b/apps/guides/hosting/vertical-vs-horizontal/index.html @@ -1,7 +1,7 @@ Vertical vs Horizontal scaling | Community Health Toolkit

    Vertical vs Horizontal scaling

    The power of clustered CouchDB to horizontally scale the CHT

    Introduction

    Horizontally scaling is the ability to add more servers to an application to make it more performant. This often yields better performance than vertical scaling, which is adding more resources like RAM or CPU to a single server.

    CHT Core 4.0.0 introduces a new architecture for hosting which gives it the ability to easily scale horizontally. This enables large deployments to support more concurrent users and better utilize the underlying server hardware.

    Vertical scaling in 3.x and 4.x

    Before getting into how the CHT horizontally scales, it should be well understood the importance of vertical scaling and what it is. This is the ability of the CHT to support more users by adding more RAM and CPU to either the bare-metal or virtual machine host. This ensures key services like API, Sentinel and, most importantly, CouchDB, can operate without performance degradation.

    When thousands of users are simultaneously trying to synchronize with the CHT, the load can overwhelm CouchDB. As discovered through extensive research and large production deployments, administrators will start to see errors in their logs and end users will complain of slow sync times. Before moving to more CouchDB nodes, administrators should consider adding more RAM and CPU to the single server where the CHT is hosted. This applies to both CHT 3.x and CHT 4.x. Given the easy of allocating more resources, presumably in virtualized environment like EC2, Proxmox or ESXi, this is much easier than moving to from a single to multi-node CouchDB instance.

    Here we see a normal deployment following the bare minimum hosting requirements for the CHT. We’ll call this a “short” deployment because it is not yet vertically scaled:

    flowchart TD subgraph couch1[" CouchDB - Single ''short'' Node "] couchInner1["2 CPU/4 GB RAM"] @@ -285,19 +286,20 @@ couchInner5["6 CPU/6 GB RAM "] couchInner6["6 CPU/6 GB RAM "] end -API["API"] --> HAProxy --> couch4

    To read up on how to migrate your data from a single to multi-node, please see the data migration guide.

    It should be noted that, unlike vertical scaling, horizontal scaling of a large, existing dataset can take a while to prepare the transfer (hours to days) and may involve a brief service outage. This should be taken into consideration when planning a move of a CHT instance with a lot of data.


    CHT Applications > +API["API"] --> HAProxy --> couch4

    To read up on how to migrate your data from a single to multi-node, please see the data migration guide.

    It should be noted that, unlike vertical scaling, horizontal scaling of a large, existing dataset can take a while to prepare the transfer (hours to days) and may involve a brief service outage. This should be taken into consideration when planning a move of a CHT instance with a lot of data.


    CHT Applications > Quick Guides > Hosting > 4.x > -Self Hosting - Multiple Nodes

    Hosting the CHT on self run infrastructure with horizontally scaled CouchDB nodes

    CHT Applications > +Self Hosting > +Multiple Nodes

    Hosting the CHT on self run infrastructure with horizontally scaled CouchDB nodes

    CHT Applications > Quick Guides > Hosting > 4.x > Data migration to 4.x

    Guide to migrate existent data from CHT 3.x to CHT 4.x

    CHT Core Framework > Overview > CHT Core

    The different pieces of a CHT project, how they interact, and what they’re used for

    -

    diff --git a/apps/guides/index.html b/apps/guides/index.html index 142d73d352..ea619d2082 100644 --- a/apps/guides/index.html +++ b/apps/guides/index.html @@ -107,9 +107,10 @@
  • Local Docker Setup

    curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
     # OPTIONAL: Allow user to run Docker without sudo
     dockerd-rootless-setuptool.sh install
     echo "export PATH=/usr/bin:$PATH" >> ~/.$(basename $SHELL)rc
     echo "export DOCKER_HOST=unix:///run/user/1000/docker.sock" >> ~/.$(basename $SHELL)rc
     . ~/.$(basename $SHELL)rc
    -

    Download and install Docker Desktop.

    Download and install Docker Desktop.

    Restart your entire machine to finish initializing Docker.

    After restarting, verify Docker is running as expected. Run the simple hello-world Docker container. This should output “Hello from Docker!” as well as some other intro text:

    docker run hello-world
    +

    Download and install Docker Desktop or Colima.

    Download and install Docker Desktop.

    Restart your entire machine to finish initializing Docker.

    After restarting, verify Docker is running as expected. Run the simple hello-world Docker container. This should output “Hello from Docker!” as well as some other intro text:

    docker run hello-world
     
    -

    \ No newline at end of file diff --git a/apps/tutorials/app-forms/index.html b/apps/tutorials/app-forms/index.html index 19f26726b2..e24d7e7033 100644 --- a/apps/tutorials/app-forms/index.html +++ b/apps/tutorials/app-forms/index.html @@ -107,9 +107,10 @@
    • -
    • -
    • -
    • +
    • +
    • diff --git a/apps/tutorials/index.xml b/apps/tutorials/index.xml index f41c588bc5..ca94c81e12 100644 --- a/apps/tutorials/index.xml +++ b/apps/tutorials/index.xml @@ -60,7 +60,7 @@ id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab"> </div> <div class="tab-body tab-pane fade" id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab"> -<p>Download and install <a href="https://www.docker.com/products/docker-desktop">Docker Desktop</a>.</p> +<p>Download and install <a href="https://www.docker.com/products/docker-desktop">Docker Desktop</a> or <a href="https://github.com/abiosoft/colima#readme">Colima</a>.</p> </div> <div class="tab-body tab-pane fade" id="tabs-00-02" role="tabpanel" aria-labelled-by="tabs-00-02-tab"> @@ -72,7 +72,7 @@ id="tabs-00-02" role="tabpanel" aria-labelled-by="tabs-00-02-tab"> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>docker run hello-world </span></span></code></pre></div> <h3 id="initialize-project-directory">Initialize project directory</h3> -<p>Using the terminal (or the WLS shell on Windows: <em>Start &gt; wsl</em>), run the following commands to create a new project directory for your CHT app:</p> +<p>Using the terminal (or the WSL shell on Windows: <em>Start &gt; wsl</em>), run the following commands to create a new project directory for your CHT app:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>mkdir -p ~/cht-project </span></span><span style="display:flex;"><span><span style="color:#204a87">cd</span> ~/cht-project </span></span></code></pre></div><hr> @@ -3719,7 +3719,7 @@ id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab"> </div> <div class="tab-body tab-pane fade" id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab"> -<p>Download and install <a href="https://www.docker.com/products/docker-desktop">Docker Desktop</a>.</p> +<p>Download and install <a href="https://www.docker.com/products/docker-desktop">Docker Desktop</a> or <a href="https://github.com/abiosoft/colima#readme">Colima</a>.</p> </div> <div class="tab-body tab-pane fade" id="tabs-00-02" role="tabpanel" aria-labelled-by="tabs-00-02-tab"> diff --git a/apps/tutorials/local-setup/index.html b/apps/tutorials/local-setup/index.html index 7da883f1da..bf4400ca75 100644 --- a/apps/tutorials/local-setup/index.html +++ b/apps/tutorials/local-setup/index.html @@ -1,7 +1,7 @@ Getting started building a CHT app | Community Health Toolkit
  • Getting started building a CHT app

    Setting up a local environment to build and test CHT 4.x applications

    This tutorial will take you through setting up a local environment to build and test CHT applications on CHT version 4.x. This includes setting up the necessary tools to download and run the CHT public docker image as well as a command line interface tool to manage and build CHT apps.

    By the end of the tutorial you should be able to:

    • View the login page to CHT webapp on localhost
    • Upload default settings to localhost

    Brief Overview of Key Concepts

    The CHT Core Framework makes it faster to build full-featured, scalable digital health apps by providing a foundation developers can build on. These apps can support most languages, are Offline-First, and work on basic phones (via SMS), smartphones, tablets, and computers.

    CHT Project Configurer also known as cht-conf is a command-line interface tool to manage and configure CHT apps.

    Docker is a tool designed to make it easier to create, deploy, and run applications by using containers.

    Containers allow a developer to package up an application with all of the parts it needs, such as libraries and other dependencies, and deploy it as one package.

    Setup environment

    CHT app development can be done on Linux, macOS, or Windows (using the Windows Subsystem for Linux (WSL2)).

    CHT apps can be built on your local system (with the necessary libraries installed and configured) or they can be built from within VS Code Dev Containers.

    Before you begin, ensure you have the following tools:

    Installing Docker

    curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
     # OPTIONAL: Allow user to run Docker without sudo
    @@ -278,8 +279,8 @@
     echo "export PATH=/usr/bin:$PATH" >> ~/.$(basename $SHELL)rc
     echo "export DOCKER_HOST=unix:///run/user/1000/docker.sock" >> ~/.$(basename $SHELL)rc
     . ~/.$(basename $SHELL)rc
    -

    Download and install Docker Desktop.

    Download and install Docker Desktop.

    Restart your entire machine to finish initializing Docker.

    After restarting, verify Docker is running as expected. Run the simple hello-world Docker container. This should output “Hello from Docker!” as well as some other intro text:

    docker run hello-world
    -

    Initialize project directory

    Using the terminal (or the WLS shell on Windows: Start > wsl), run the following commands to create a new project directory for your CHT app:

    mkdir -p ~/cht-project
    +

    Download and install Docker Desktop or Colima.

    Download and install Docker Desktop.

    Restart your entire machine to finish initializing Docker.

    After restarting, verify Docker is running as expected. Run the simple hello-world Docker container. This should output “Hello from Docker!” as well as some other intro text:

    docker run hello-world
    +

    Initialize project directory

    Using the terminal (or the WSL shell on Windows: Start > wsl), run the following commands to create a new project directory for your CHT app:

    mkdir -p ~/cht-project
     cd ~/cht-project
     

    Developing locally

    To build CHT apps on your local system, you need to have some additional tools:

    sudo apt update && sudo apt -y dist-upgrade
     sudo apt -y install python3-pip python3-setuptools python3-wheel xsltproc
    @@ -329,8 +330,8 @@
     Hosting >
     3.x >
     AWS Hosting

    Hosting the CHT on Amazon EC2

    -

    \ No newline at end of file diff --git a/apps/tutorials/localizing-cht/index.html b/apps/tutorials/localizing-cht/index.html index 77dedb7cee..64e40022d9 100644 --- a/apps/tutorials/localizing-cht/index.html +++ b/apps/tutorials/localizing-cht/index.html @@ -107,9 +107,10 @@
    • -
    • -
    • -
    • +
    • +
    • diff --git a/contribute/code/core/index.xml b/contribute/code/core/index.xml index a7e64c76d1..e17b0d463c 100644 --- a/contribute/code/core/index.xml +++ b/contribute/code/core/index.xml @@ -104,7 +104,7 @@ id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab"> </div> <div class="tab-body tab-pane fade" id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab"> -<p>Download and install <a href="https://www.docker.com/products/docker-desktop">Docker Desktop</a>.</p> +<p>Download and install <a href="https://www.docker.com/products/docker-desktop">Docker Desktop</a> or <a href="https://github.com/abiosoft/colima#readme">Colima</a>.</p> </div> <div class="tab-body tab-pane fade" id="tabs-00-02" role="tabpanel" aria-labelled-by="tabs-00-02-tab"> diff --git a/contribute/code/core/run-multiple-chrome-versions/index.html b/contribute/code/core/run-multiple-chrome-versions/index.html index 442d68762d..fc5e72bc5d 100644 --- a/contribute/code/core/run-multiple-chrome-versions/index.html +++ b/contribute/code/core/run-multiple-chrome-versions/index.html @@ -107,9 +107,10 @@
    • -
    • -
    • -
    • +
    • +
    • diff --git a/sitemap.xml b/sitemap.xml index a13ffb8e31..46fb60c6ae 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://docs.communityhealthtoolkit.org/apps/concepts/access/2022-04-21T14:42:21-07:00https://docs.communityhealthtoolkit.org/apps/features/integrations/android/2021-11-08T18:53:31-03:00https://docs.communityhealthtoolkit.org/apps/reference/api/2023-09-19T18:48:09+03:00https://docs.communityhealthtoolkit.org/core/overview/architecture/2023-09-06T17:50:27-07:00https://docs.communityhealthtoolkit.org/contribute/code/core/dev-environment/2023-08-24T14:32:33+12:00https://docs.communityhealthtoolkit.org/core/overview/watchdog/2023-05-14T19:26:31-07:00https://docs.communityhealthtoolkit.org/design/personas/chw-janet/2020-10-09T16:17:31-07:00https://docs.communityhealthtoolkit.org/contribute/code/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/continuous-discovery-overview/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/apps/features/integrations/custom/2022-01-13T15:14:41-05:00https://docs.communityhealthtoolkit.org/apps/features/integrations/dhis2/2021-04-19T17:24:37-04:00https://docs.communityhealthtoolkit.org/2023-05-04T13:34:05+03:00https://docs.communityhealthtoolkit.org/contribute/docs/2020-06-22T21:46:00-04:00https://docs.communityhealthtoolkit.org/contribute/code/releasing/feature_releases/2023-06-02T12:58:08-07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/focused-groups/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/design/icons/forms_tasks_targets/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/apps/tutorials/local-setup/2023-08-07T03:00:23+05:45https://docs.communityhealthtoolkit.org/design/personas/partners/implementers/2020-06-01T11:01:54-07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/key-concepts/2023-05-16T13:11:09-07:00https://docs.communityhealthtoolkit.org/apps/examples/anc/2023-04-12T17:35:29+00:00https://docs.communityhealthtoolkit.org/design/icons/people_and_places/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/design/personas/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/product-trio/product-trio-activities/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/design/guides/designing-interviews/2022-04-28T12:11:31+03:00https://docs.communityhealthtoolkit.org/why-the-cht/2022-12-02T21:41:51-05:00https://docs.communityhealthtoolkit.org/contribute/docs/workflow/2023-04-12T10:00:06+00:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/about-interviews/2023-05-16T13:11:09-07:00https://docs.communityhealthtoolkit.org/contribute/code/android/development-setup/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/design/best-practices/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/2022-02-24T07:18:33+13:00https://docs.communityhealthtoolkit.org/core/2022-02-24T07:18:33+13:00https://docs.communityhealthtoolkit.org/core/overview/data-flows-for-analytics/cht-sync/2023-07-21T11:53:12+03:00https://docs.communityhealthtoolkit.org/design/personas/chw-supervisor-ann/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/apps/concepts/2020-12-15T09:40:02-06:00https://docs.communityhealthtoolkit.org/apps/tutorials/couch2pg-setup/2023-06-02T12:58:08-07:00https://docs.communityhealthtoolkit.org/core/overview/db-schema/2023-08-07T01:42:44-07:00https://docs.communityhealthtoolkit.org/apps/guides/data/hydration/2021-03-24T06:41:04+02:00https://docs.communityhealthtoolkit.org/apps/reference/forms/2020-10-19T08:47:55-07:00https://docs.communityhealthtoolkit.org/design/personas/partners/local-governments/2020-06-01T11:01:54-07:00https://docs.communityhealthtoolkit.org/apps/concepts/navigation/2023-05-12T08:26:27+07:00https://docs.communityhealthtoolkit.org/core/overview/offline-first/2022-02-24T07:18:33+13:00https://docs.communityhealthtoolkit.org/apps/features/integrations/openmrs/2022-02-04T18:14:48-05:00https://docs.communityhealthtoolkit.org/core/overview/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/contribute/medic/product-core-competencies/2023-05-03T09:56:16+00:00https://docs.communityhealthtoolkit.org/core/overview/pwa/2022-04-08T10:38:39+12:00https://docs.communityhealthtoolkit.org/core/releases/2023-09-26T16:07:53+13:00https://docs.communityhealthtoolkit.org/apps/reference/resources/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/schedule-of-events/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/apps/reference/translations/2023-05-16T17:55:12+02:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/adding-nuggets/2023-05-16T13:11:09-07:00https://docs.communityhealthtoolkit.org/design/components/2023-05-19T14:14:18+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/contact-and-users-1/2023-03-29T07:55:19-05:00https://docs.communityhealthtoolkit.org/core/overview/data-flows-for-analytics/2023-05-16T06:46:30+00:00https://docs.communityhealthtoolkit.org/design/guides/empathy-map/2022-04-19T07:42:28+03:00https://docs.communityhealthtoolkit.org/apps/features/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/apps/concepts/forms/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/design/personas/partners/national-governments/2020-06-01T11:01:54-07:00https://docs.communityhealthtoolkit.org/contribute/medic/onboarding/2023-05-03T09:56:16+00:00https://docs.communityhealthtoolkit.org/apps/features/integrations/oppia/2020-12-17T15:05:43-08:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/product-trio/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/apps/features/integrations/rapidpro/2020-08-20T16:45:11-04:00https://docs.communityhealthtoolkit.org/design/personas/regional-manager-christina/2023-02-19T20:45:44+03:00https://docs.communityhealthtoolkit.org/contribute/code/android/releasing/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/contribute/tech-radar/2023-09-27T11:58:54+03:00https://docs.communityhealthtoolkit.org/contribute/medic/onboarding/technical-resources/2023-09-18T08:02:15-07:00https://docs.communityhealthtoolkit.org/apps/concepts/care-guides/2020-09-16T20:06:56-07:00https://docs.communityhealthtoolkit.org/contribute/code-of-conduct/2023-09-27T11:58:54+03:00https://docs.communityhealthtoolkit.org/apps/features/contacts/2022-09-15T09:07:15+07:00https://docs.communityhealthtoolkit.org/apps/tutorials/contact-and-users-2/2023-03-29T07:55:19-05:00https://docs.communityhealthtoolkit.org/apps/examples/2020-09-22T16:00:38-05:00https://docs.communityhealthtoolkit.org/design/icons/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/design/personas/nurse-mary/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/design/guides/problem-statement/2022-04-19T07:42:28+03:00https://docs.communityhealthtoolkit.org/apps/guides/android/publishing/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/contribute/code/releasing/publish-docker-image/2023-05-16T10:46:37-05:00https://docs.communityhealthtoolkit.org/core/overview/transitions/2023-06-14T09:53:43+03:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/synthesizing-nuggets/2023-05-16T13:11:09-07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/accept_case_reports/2020-06-27T01:28:28-04:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/hierarchy/2022-06-17T14:30:45-05:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/dhis2/2020-07-09T16:39:14-07:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/forms/2022-05-03T07:56:17+05:45https://docs.communityhealthtoolkit.org/apps/reference/app-settings/header_tabs/2020-07-03T11:25:34+03:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/outbound/2023-08-10T09:19:48-05:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/patient_reports/2021-03-24T06:41:04+02:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/user-permissions/2023-08-14T19:41:47+07:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/registrations/2021-11-24T07:30:29+05:45https://docs.communityhealthtoolkit.org/apps/reference/app-settings/reminders/2020-07-14T15:02:10+12:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/replication_depth/2020-07-13T16:54:46+03:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/replications/2020-10-02T12:20:59-04:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/user-roles/2020-06-04T15:06:42-04:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/schedules/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/sms/2022-11-24T11:08:37+13:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/token_login/2020-07-28T02:48:35+03:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/transitions/2023-04-03T21:22:37-04:00https://docs.communityhealthtoolkit.org/apps/reference/forms/app/2023-04-04T14:00:43+12:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/2023-08-31T09:59:32+05:45https://docs.communityhealthtoolkit.org/contribute/medic/2023-09-27T11:58:54+03:00https://docs.communityhealthtoolkit.org/contribute/code/repository-checklist/2023-05-08T14:34:53+00:00https://docs.communityhealthtoolkit.org/apps/reference/forms/collect/2021-10-05T16:38:24-04:00https://docs.communityhealthtoolkit.org/apps/reference/forms/contact/2022-07-27T06:52:39-07:00https://docs.communityhealthtoolkit.org/apps/reference/contact-page/2023-03-03T09:50:54-06:00https://docs.communityhealthtoolkit.org/design/personas/data-manager-paul/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/design/2020-06-01T11:16:07-07:00https://docs.communityhealthtoolkit.org/apps/reference/extension-libs/2023-05-08T06:38:08+12:00https://docs.communityhealthtoolkit.org/design/guides/mapping-hierarchy/2022-04-19T07:42:28+03:00https://docs.communityhealthtoolkit.org/apps/features/messaging/2020-09-21T15:56:39-07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/publishing-insights/2023-05-16T13:11:09-07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/quality-assistance/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/design/guides/2021-04-15T13:04:40+03:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/requirements/2023-03-31T12:24:09-07:00https://docs.communityhealthtoolkit.org/apps/tutorials/sms-forms/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/reference/targets/2022-12-06T01:01:56-05:00https://docs.communityhealthtoolkit.org/apps/reference/tasks/2023-04-20T11:51:49+12:00https://docs.communityhealthtoolkit.org/core/overview/translations/2022-12-22T19:50:08+05:45https://docs.communityhealthtoolkit.org/apps/tutorials/2020-06-03T10:27:10-07:00https://docs.communityhealthtoolkit.org/apps/guides/forms/uhc-mode/2022-01-13T14:48:44-05:00https://docs.communityhealthtoolkit.org/apps/concepts/workflows/2020-12-10T15:03:59-05:00https://docs.communityhealthtoolkit.org/design/personas/app-builder/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/apps/tutorials/application-settings/2023-05-12T08:26:27+07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/code-health/2023-04-04T10:38:58+12:00https://docs.communityhealthtoolkit.org/apps/concepts/hierarchy/2023-05-18T15:48:07-07:00https://docs.communityhealthtoolkit.org/apps/guides/2020-06-03T14:28:04-04:00https://docs.communityhealthtoolkit.org/apps/features/reports/2023-04-12T17:35:29+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/sms-schedules/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/contribute/code/workflow/2023-05-18T06:09:56+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/app-forms/2021-11-24T09:47:58+03:00https://docs.communityhealthtoolkit.org/apps/reference/2020-07-09T15:36:57-04:00https://docs.communityhealthtoolkit.org/contribute/code/releasing/2023-04-18T12:42:52+00:00https://docs.communityhealthtoolkit.org/apps/features/supervision/2023-06-26T07:18:05+03:00https://docs.communityhealthtoolkit.org/apps/features/tasks/2022-07-19T14:00:29-04:00https://docs.communityhealthtoolkit.org/apps/concepts/users/2022-01-13T15:14:41-05:00https://docs.communityhealthtoolkit.org/contribute/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/form-properties/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/concepts/interoperability/2023-08-25T09:16:39+12:00https://docs.communityhealthtoolkit.org/design/personas/partners/2020-06-01T11:16:07-07:00https://docs.communityhealthtoolkit.org/apps/features/targets/2022-06-21T13:27:00+03:00https://docs.communityhealthtoolkit.org/contribute/code/core/update-dependencies/2023-09-15T08:43:47+07:00https://docs.communityhealthtoolkit.org/apps/concepts/prerequisites/2023-05-14T21:33:28+03:00https://docs.communityhealthtoolkit.org/contribute/code/static-analysis/2023-08-30T14:41:42-05:00https://docs.communityhealthtoolkit.org/contribute/code/style-guide/2023-03-07T11:04:23+13:00https://docs.communityhealthtoolkit.org/apps/tutorials/tasks-1/2022-04-25T14:22:54+12:00https://docs.communityhealthtoolkit.org/apps/features/training/2023-04-11T06:24:09+07:00https://docs.communityhealthtoolkit.org/contribute/code/using-npm/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/ec2-setup-guide/2023-03-27T11:25:13-07:00https://docs.communityhealthtoolkit.org/contribute/code/core/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/gateway/2021-11-08T18:53:31-03:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/gateway/configuration/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/data-migration/2023-09-15T06:38:42+03:00https://docs.communityhealthtoolkit.org/glossary/2023-09-06T01:29:21-07:00https://docs.communityhealthtoolkit.org/apps/features/muting/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/core/overview/roadmap/2023-05-14T14:06:36-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting-single-node/2023-09-06T08:46:19-07:00https://docs.communityhealthtoolkit.org/contribute/docs/style-guide/2023-08-21T14:01:53+12:00https://docs.communityhealthtoolkit.org/apps/tutorials/targets/2022-02-08T10:50:49+03:00https://docs.communityhealthtoolkit.org/apps/tutorials/contact-summary/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/tutorials/death-reporting/2021-11-29T11:05:14-08:00https://docs.communityhealthtoolkit.org/apps/features/uhc-mode/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/features/admin/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/tutorials/condition-cards/2023-03-09T11:48:26+03:00https://docs.communityhealthtoolkit.org/contribute/code/core/fixing-e2e-tests/2023-06-23T11:33:32-06:00https://docs.communityhealthtoolkit.org/apps/guides/android/branding/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/tutorials/localizing-cht/2023-04-12T17:35:29+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/application-graphics/2022-07-13T02:44:45+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/application-tests/2023-04-12T10:00:06+00:00https://docs.communityhealthtoolkit.org/apps/guides/data/users-bulk-load/2022-11-29T21:49:50-08:00https://docs.communityhealthtoolkit.org/apps/guides/training/onboarding/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/guides/training/training-cards/2023-04-11T06:24:09+07:00https://docs.communityhealthtoolkit.org/apps/guides/training/training-cards-resources/2023-05-12T08:24:25+07:00https://docs.communityhealthtoolkit.org/apps/guides/data/training-instance/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/contribute/code/core/using-windows/2023-08-21T14:01:53+12:00https://docs.communityhealthtoolkit.org/contribute/code/core/run-multiple-chrome-versions/2023-09-07T14:16:27-04:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/africas-talking/2022-07-22T08:43:15+12:00https://docs.communityhealthtoolkit.org/contribute/code/android/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/2021-05-18T17:45:42-04:00https://docs.communityhealthtoolkit.org/apps/features/integrations/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/gateway/phones/2021-11-08T18:53:31-03:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/rapidpro/2022-12-08T13:31:35+01:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/self-hosting/2023-04-12T17:35:29+00:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting-multiple-nodes/2023-09-06T08:46:19-07:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/sms-states/2021-11-08T18:53:31-03:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/vertical-vs-horizontal/2023-09-06T17:50:27-07:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/shortcodes/2021-05-18T17:45:42-04:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/app-developer/2023-06-02T12:58:08-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/app-developer/2023-08-07T23:04:24+03:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/ssl-cert-install/2022-10-31T14:34:56-07:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/message-loops/2021-05-18T17:45:42-04:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/gateway/troubleshooting/2023-03-10T04:36:47+05:45https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/2023-03-27T11:25:13-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/2023-03-27T10:14:03-07:00https://docs.communityhealthtoolkit.org/apps/guides/privacy/privacy-policy/2022-10-10T16:14:15-07:00https://docs.communityhealthtoolkit.org/apps/guides/data/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/database/2022-07-22T08:43:15+12:00https://docs.communityhealthtoolkit.org/apps/guides/debugging/2022-02-16T12:15:00+13:00https://docs.communityhealthtoolkit.org/apps/guides/forms/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/2023-03-27T11:25:13-07:00https://docs.communityhealthtoolkit.org/apps/guides/integrations/2022-07-05T04:16:58+03:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/introduction/2023-05-23T09:47:40-05:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/2023-05-03T16:27:47-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/offline/2023-06-02T12:58:08-07:00https://docs.communityhealthtoolkit.org/apps/guides/performance/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/privacy/2021-04-19T17:19:45-07:00https://docs.communityhealthtoolkit.org/apps/guides/security/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/setup/2023-09-19T08:44:27-05:00https://docs.communityhealthtoolkit.org/apps/guides/tasks/2022-01-07T17:06:14-05:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/adding-tls-certificates/2023-08-07T15:49:41-07:00https://docs.communityhealthtoolkit.org/apps/guides/training/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/guides/updates/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/android/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/production/2023-05-23T09:47:40-05:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/logs/2023-06-02T12:58:08-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/backups/2023-03-27T11:25:13-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/postgres-ingest/2023-09-06T13:24:27-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/integration/2023-05-16T13:59:22-07:00https://docs.communityhealthtoolkit.org/search/2022-07-27T20:41:57-05:00https://docs.communityhealthtoolkit.org/core/releases/0.4.15-and-earlier/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.10.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.10.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.10.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.10.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.11.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.11.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.11.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.11.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.4/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.5/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.4/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.5/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.6/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.7/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.14.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.14.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.14.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.14.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.15.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.16.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.16.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.17.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.18.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.18.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.6.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.6.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.6.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.6.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.7.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.7.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.7.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.7.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.4/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.5/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.9.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.9.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.0.0/2022-02-21T09:32:58-06:00https://docs.communityhealthtoolkit.org/core/releases/3.1.0/2022-02-21T09:32:58-06:00https://docs.communityhealthtoolkit.org/core/releases/3.10.0/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.10.1/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.10.2/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.10.3/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.10.4/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.10.5/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.11.0/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.11.1/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.11.2/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.11.3/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.12.0/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.12.1/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.13.0/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.14.0/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.14.1/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.14.2/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.15.0/2022-05-05T09:06:44+12:00https://docs.communityhealthtoolkit.org/core/releases/3.16.0/2022-08-10T08:20:54-05:00https://docs.communityhealthtoolkit.org/core/releases/3.16.1/2022-12-02T09:34:55+02:00https://docs.communityhealthtoolkit.org/core/releases/3.17.0/2022-10-11T09:43:26+07:00https://docs.communityhealthtoolkit.org/core/releases/3.17.1/2022-12-02T09:35:08+02:00https://docs.communityhealthtoolkit.org/core/releases/3.2.0/2022-10-31T16:02:09-04:00https://docs.communityhealthtoolkit.org/core/releases/3.2.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.3.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.4.0/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.4.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.5.0/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.6.0/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.6.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.6.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.7.0/2022-08-01T16:02:39+12:00https://docs.communityhealthtoolkit.org/core/releases/3.7.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.8.0/2022-02-21T09:32:58-06:00https://docs.communityhealthtoolkit.org/core/releases/3.8.1/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.8.2/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.9.0/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.9.1/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.9.2/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/4.0.0/2022-12-13T11:43:27+13:00https://docs.communityhealthtoolkit.org/core/releases/4.0.1/2022-12-01T17:04:46+02:00https://docs.communityhealthtoolkit.org/core/releases/4.1.0/2022-12-13T10:21:02+01:00https://docs.communityhealthtoolkit.org/core/releases/4.1.1/2023-03-21T13:03:08+00:00https://docs.communityhealthtoolkit.org/core/releases/4.1.2/2023-06-21T07:36:02+12:00https://docs.communityhealthtoolkit.org/core/releases/4.2.0/2023-05-25T10:01:43+07:00https://docs.communityhealthtoolkit.org/core/releases/4.2.1/2023-06-10T09:20:32+03:00https://docs.communityhealthtoolkit.org/core/releases/4.2.2/2023-07-07T21:11:26+03:00https://docs.communityhealthtoolkit.org/core/releases/4.2.3/2023-09-25T14:17:56+02:00https://docs.communityhealthtoolkit.org/core/releases/4.3.0/2023-08-18T11:58:28+03:00https://docs.communityhealthtoolkit.org/core/releases/4.3.1/2023-08-30T15:37:03+12:00https://docs.communityhealthtoolkit.org/core/releases/4.4.0/2023-09-20T15:41:16-06:00https://docs.communityhealthtoolkit.org/apps/guides/forms/additional-docs/2022-06-17T14:30:45-05:00https://docs.communityhealthtoolkit.org/apps/guides/forms/app-form-sms/2023-06-27T05:11:38+05:45https://docs.communityhealthtoolkit.org/apps/guides/debugging/obtaining-logs/2023-05-16T09:10:36-05:00https://docs.communityhealthtoolkit.org/apps/reference/_partial_cht_api/2023-04-06T14:38:13-04:00https://docs.communityhealthtoolkit.org/apps/guides/data/impact-metrics/2021-11-23T17:44:50-08:00https://docs.communityhealthtoolkit.org/apps/tutorials/tasks-2/2023-04-06T14:38:13-04:00https://docs.communityhealthtoolkit.org/apps/guides/database/muting_in_dashboards/2021-10-08T08:43:53+03:00https://docs.communityhealthtoolkit.org/apps/examples/contact-tracing/2020-09-23T18:04:11-04:00https://docs.communityhealthtoolkit.org/apps/guides/database/couch2pg-oom-errors/2022-10-31T14:34:56-07:00https://docs.communityhealthtoolkit.org/apps/guides/database/couchdb-authentication/2022-11-22T08:13:16+13:00https://docs.communityhealthtoolkit.org/apps/examples/phc-covid/2020-09-23T18:04:11-04:00https://docs.communityhealthtoolkit.org/apps/examples/covid-education/2021-01-11T16:12:16-05:00https://docs.communityhealthtoolkit.org/apps/examples/covid-rdt-reference-app/2021-09-27T06:46:22-07:00https://docs.communityhealthtoolkit.org/apps/guides/data/csv-to-docs/2022-08-01T12:26:34+03:00https://docs.communityhealthtoolkit.org/apps/guides/database/database-conflicts/2022-11-22T08:13:16+13:00https://docs.communityhealthtoolkit.org/apps/guides/integrations/dhis2-aggregate/2020-07-09T16:39:14-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/_partial_docker_directories/2023-04-06T14:38:13-04:00https://docs.communityhealthtoolkit.org/apps/examples/ebs/2020-09-23T18:04:11-04:00https://docs.communityhealthtoolkit.org/apps/guides/updates/feature-flags/2023-05-04T10:39:42-04:00https://docs.communityhealthtoolkit.org/apps/guides/forms/google-drive/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/guides/forms/form-inputs/2023-05-17T09:14:24-05:00https://docs.communityhealthtoolkit.org/apps/guides/data/invalid-reports/2021-03-24T06:41:04+02:00https://docs.communityhealthtoolkit.org/apps/examples/learning-care/2021-03-03T16:27:50-05:00https://docs.communityhealthtoolkit.org/apps/tutorials/_partial_docker_setup/2023-05-03T08:31:09-05:00https://docs.communityhealthtoolkit.org/apps/examples/interoperability/2023-05-31T18:07:44+03:00https://docs.communityhealthtoolkit.org/apps/guides/privacy/policy/2023-06-29T09:58:29+12:00https://docs.communityhealthtoolkit.org/design/mockups/2023-03-10T03:00:38+03:00https://docs.communityhealthtoolkit.org/apps/guides/updates/moving-contacts/2021-10-22T17:25:03-04:00https://docs.communityhealthtoolkit.org/apps/guides/forms/multimedia/2022-06-17T14:30:45-05:00https://docs.communityhealthtoolkit.org/apps/guides/integrations/openmrs/2023-04-12T17:35:29+00:00https://docs.communityhealthtoolkit.org/apps/guides/integrations/oppia/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/guides/tasks/pass-data-to-form/2023-04-06T14:38:13-04:00https://docs.communityhealthtoolkit.org/apps/examples/pih/2022-11-18T06:41:57+03:00https://docs.communityhealthtoolkit.org/apps/guides/updates/preparing-for-4/2023-04-18T12:42:52+00:00https://docs.communityhealthtoolkit.org/apps/guides/debugging/replicating-production-data-locally/2023-08-21T14:01:53+12:00https://docs.communityhealthtoolkit.org/apps/guides/performance/purging/2023-08-17T01:04:57+03:00https://docs.communityhealthtoolkit.org/apps/guides/tasks/query-task-data/2021-11-29T11:05:14-08:00https://docs.communityhealthtoolkit.org/apps/guides/forms/wealth-quintiles/2020-12-16T14:58:49-05:00https://docs.communityhealthtoolkit.org/apps/guides/integrations/rapidpro/2023-09-08T10:15:34+03:00https://docs.communityhealthtoolkit.org/apps/guides/database/rdbms-from-mac/2021-03-03T16:27:50-05:00https://docs.communityhealthtoolkit.org/apps/guides/database/rdbms-from-windows/2020-08-18T10:29:41-07:00https://docs.communityhealthtoolkit.org/apps/guides/updates/collect-forms-update/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/examples/training/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/guides/performance/replication/2020-08-19T12:19:51-07:00https://docs.communityhealthtoolkit.org/apps/guides/forms/report-titles/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/debugging/secure-sharing-of-developer-instance/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/security/securing-android/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/debugging/sharing-4x-logs/2023-05-16T09:10:36-05:00https://docs.communityhealthtoolkit.org/apps/examples/stock-monitoring/2022-08-31T13:55:06-07:00https://docs.communityhealthtoolkit.org/apps/examples/supervisor-reference-app/2023-03-18T15:29:21+03:00https://docs.communityhealthtoolkit.org/apps/guides/tasks/task-schema-parameters/2021-11-29T11:05:14-08:00https://docs.communityhealthtoolkit.org/apps/guides/performance/telemetry/2023-09-07T11:07:58+12:00https://docs.communityhealthtoolkit.org/apps/reference/_partial_utils/2023-04-06T14:38:13-04:00https://docs.communityhealthtoolkit.org/apps/guides/forms/versioning/2022-08-05T10:25:51+12:00 \ No newline at end of file +https://docs.communityhealthtoolkit.org/apps/concepts/access/2022-04-21T14:42:21-07:00https://docs.communityhealthtoolkit.org/apps/features/integrations/android/2021-11-08T18:53:31-03:00https://docs.communityhealthtoolkit.org/apps/reference/api/2023-09-19T18:48:09+03:00https://docs.communityhealthtoolkit.org/core/overview/architecture/2023-09-06T17:50:27-07:00https://docs.communityhealthtoolkit.org/contribute/code/core/dev-environment/2023-08-24T14:32:33+12:00https://docs.communityhealthtoolkit.org/core/overview/watchdog/2023-05-14T19:26:31-07:00https://docs.communityhealthtoolkit.org/design/personas/chw-janet/2020-10-09T16:17:31-07:00https://docs.communityhealthtoolkit.org/contribute/code/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/continuous-discovery-overview/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/apps/features/integrations/custom/2022-01-13T15:14:41-05:00https://docs.communityhealthtoolkit.org/apps/features/integrations/dhis2/2021-04-19T17:24:37-04:00https://docs.communityhealthtoolkit.org/2023-05-04T13:34:05+03:00https://docs.communityhealthtoolkit.org/contribute/docs/2020-06-22T21:46:00-04:00https://docs.communityhealthtoolkit.org/contribute/code/releasing/feature_releases/2023-06-02T12:58:08-07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/focused-groups/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/design/icons/forms_tasks_targets/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/apps/tutorials/local-setup/2023-10-06T16:32:03+02:00https://docs.communityhealthtoolkit.org/design/personas/partners/implementers/2020-06-01T11:01:54-07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/key-concepts/2023-05-16T13:11:09-07:00https://docs.communityhealthtoolkit.org/apps/examples/anc/2023-04-12T17:35:29+00:00https://docs.communityhealthtoolkit.org/design/icons/people_and_places/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/design/personas/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/product-trio/product-trio-activities/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/design/guides/designing-interviews/2022-04-28T12:11:31+03:00https://docs.communityhealthtoolkit.org/why-the-cht/2022-12-02T21:41:51-05:00https://docs.communityhealthtoolkit.org/contribute/docs/workflow/2023-04-12T10:00:06+00:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/about-interviews/2023-05-16T13:11:09-07:00https://docs.communityhealthtoolkit.org/contribute/code/android/development-setup/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/design/best-practices/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/2022-02-24T07:18:33+13:00https://docs.communityhealthtoolkit.org/core/2022-02-24T07:18:33+13:00https://docs.communityhealthtoolkit.org/core/overview/data-flows-for-analytics/cht-sync/2023-07-21T11:53:12+03:00https://docs.communityhealthtoolkit.org/design/personas/chw-supervisor-ann/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/apps/concepts/2020-12-15T09:40:02-06:00https://docs.communityhealthtoolkit.org/apps/tutorials/couch2pg-setup/2023-06-02T12:58:08-07:00https://docs.communityhealthtoolkit.org/core/overview/db-schema/2023-08-07T01:42:44-07:00https://docs.communityhealthtoolkit.org/apps/guides/data/hydration/2021-03-24T06:41:04+02:00https://docs.communityhealthtoolkit.org/apps/reference/forms/2020-10-19T08:47:55-07:00https://docs.communityhealthtoolkit.org/design/personas/partners/local-governments/2020-06-01T11:01:54-07:00https://docs.communityhealthtoolkit.org/apps/concepts/navigation/2023-05-12T08:26:27+07:00https://docs.communityhealthtoolkit.org/core/overview/offline-first/2022-02-24T07:18:33+13:00https://docs.communityhealthtoolkit.org/apps/features/integrations/openmrs/2022-02-04T18:14:48-05:00https://docs.communityhealthtoolkit.org/core/overview/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/contribute/medic/product-core-competencies/2023-05-03T09:56:16+00:00https://docs.communityhealthtoolkit.org/core/overview/pwa/2022-04-08T10:38:39+12:00https://docs.communityhealthtoolkit.org/core/releases/2023-09-26T16:07:53+13:00https://docs.communityhealthtoolkit.org/apps/reference/resources/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/schedule-of-events/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/apps/reference/translations/2023-05-16T17:55:12+02:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/adding-nuggets/2023-05-16T13:11:09-07:00https://docs.communityhealthtoolkit.org/design/components/2023-05-19T14:14:18+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/contact-and-users-1/2023-03-29T07:55:19-05:00https://docs.communityhealthtoolkit.org/core/overview/data-flows-for-analytics/2023-05-16T06:46:30+00:00https://docs.communityhealthtoolkit.org/design/guides/empathy-map/2022-04-19T07:42:28+03:00https://docs.communityhealthtoolkit.org/apps/features/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/apps/concepts/forms/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/design/personas/partners/national-governments/2020-06-01T11:01:54-07:00https://docs.communityhealthtoolkit.org/contribute/medic/onboarding/2023-05-03T09:56:16+00:00https://docs.communityhealthtoolkit.org/apps/features/integrations/oppia/2020-12-17T15:05:43-08:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/product-trio/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/apps/features/integrations/rapidpro/2020-08-20T16:45:11-04:00https://docs.communityhealthtoolkit.org/design/personas/regional-manager-christina/2023-02-19T20:45:44+03:00https://docs.communityhealthtoolkit.org/contribute/code/android/releasing/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/contribute/tech-radar/2023-09-27T11:58:54+03:00https://docs.communityhealthtoolkit.org/contribute/medic/onboarding/technical-resources/2023-09-18T08:02:15-07:00https://docs.communityhealthtoolkit.org/apps/concepts/care-guides/2020-09-16T20:06:56-07:00https://docs.communityhealthtoolkit.org/contribute/code-of-conduct/2023-09-27T11:58:54+03:00https://docs.communityhealthtoolkit.org/apps/features/contacts/2022-09-15T09:07:15+07:00https://docs.communityhealthtoolkit.org/apps/tutorials/contact-and-users-2/2023-03-29T07:55:19-05:00https://docs.communityhealthtoolkit.org/apps/examples/2020-09-22T16:00:38-05:00https://docs.communityhealthtoolkit.org/design/icons/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/design/personas/nurse-mary/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/design/guides/problem-statement/2022-04-19T07:42:28+03:00https://docs.communityhealthtoolkit.org/apps/guides/android/publishing/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/contribute/code/releasing/publish-docker-image/2023-05-16T10:46:37-05:00https://docs.communityhealthtoolkit.org/core/overview/transitions/2023-06-14T09:53:43+03:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/synthesizing-nuggets/2023-05-16T13:11:09-07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/accept_case_reports/2020-06-27T01:28:28-04:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/hierarchy/2022-06-17T14:30:45-05:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/dhis2/2020-07-09T16:39:14-07:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/forms/2022-05-03T07:56:17+05:45https://docs.communityhealthtoolkit.org/apps/reference/app-settings/header_tabs/2020-07-03T11:25:34+03:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/outbound/2023-08-10T09:19:48-05:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/patient_reports/2021-03-24T06:41:04+02:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/user-permissions/2023-08-14T19:41:47+07:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/registrations/2021-11-24T07:30:29+05:45https://docs.communityhealthtoolkit.org/apps/reference/app-settings/reminders/2020-07-14T15:02:10+12:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/replication_depth/2020-07-13T16:54:46+03:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/replications/2020-10-02T12:20:59-04:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/user-roles/2020-06-04T15:06:42-04:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/schedules/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/sms/2022-11-24T11:08:37+13:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/token_login/2020-07-28T02:48:35+03:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/transitions/2023-04-03T21:22:37-04:00https://docs.communityhealthtoolkit.org/apps/reference/forms/app/2023-04-04T14:00:43+12:00https://docs.communityhealthtoolkit.org/apps/reference/app-settings/2023-08-31T09:59:32+05:45https://docs.communityhealthtoolkit.org/contribute/medic/2023-09-27T11:58:54+03:00https://docs.communityhealthtoolkit.org/contribute/code/repository-checklist/2023-05-08T14:34:53+00:00https://docs.communityhealthtoolkit.org/apps/reference/forms/collect/2021-10-05T16:38:24-04:00https://docs.communityhealthtoolkit.org/apps/reference/forms/contact/2022-07-27T06:52:39-07:00https://docs.communityhealthtoolkit.org/apps/reference/contact-page/2023-03-03T09:50:54-06:00https://docs.communityhealthtoolkit.org/design/personas/data-manager-paul/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/design/2020-06-01T11:16:07-07:00https://docs.communityhealthtoolkit.org/apps/reference/extension-libs/2023-05-08T06:38:08+12:00https://docs.communityhealthtoolkit.org/design/guides/mapping-hierarchy/2022-04-19T07:42:28+03:00https://docs.communityhealthtoolkit.org/apps/features/messaging/2020-09-21T15:56:39-07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/ux-research-repo/publishing-insights/2023-05-16T13:11:09-07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/quality-assistance/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/design/guides/2021-04-15T13:04:40+03:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/requirements/2023-10-06T16:32:03+02:00https://docs.communityhealthtoolkit.org/apps/tutorials/sms-forms/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/reference/targets/2022-12-06T01:01:56-05:00https://docs.communityhealthtoolkit.org/apps/reference/tasks/2023-04-20T11:51:49+12:00https://docs.communityhealthtoolkit.org/core/overview/translations/2022-12-22T19:50:08+05:45https://docs.communityhealthtoolkit.org/apps/tutorials/2020-06-03T10:27:10-07:00https://docs.communityhealthtoolkit.org/apps/guides/forms/uhc-mode/2022-01-13T14:48:44-05:00https://docs.communityhealthtoolkit.org/apps/concepts/workflows/2020-12-10T15:03:59-05:00https://docs.communityhealthtoolkit.org/design/personas/app-builder/2020-05-30T19:36:05-04:00https://docs.communityhealthtoolkit.org/apps/tutorials/application-settings/2023-05-12T08:26:27+07:00https://docs.communityhealthtoolkit.org/contribute/medic/product-development-process/code-health/2023-04-04T10:38:58+12:00https://docs.communityhealthtoolkit.org/apps/concepts/hierarchy/2023-05-18T15:48:07-07:00https://docs.communityhealthtoolkit.org/apps/guides/2020-06-03T14:28:04-04:00https://docs.communityhealthtoolkit.org/apps/features/reports/2023-04-12T17:35:29+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/sms-schedules/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/contribute/code/workflow/2023-05-18T06:09:56+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/app-forms/2021-11-24T09:47:58+03:00https://docs.communityhealthtoolkit.org/apps/reference/2020-07-09T15:36:57-04:00https://docs.communityhealthtoolkit.org/contribute/code/releasing/2023-04-18T12:42:52+00:00https://docs.communityhealthtoolkit.org/apps/features/supervision/2023-06-26T07:18:05+03:00https://docs.communityhealthtoolkit.org/apps/features/tasks/2022-07-19T14:00:29-04:00https://docs.communityhealthtoolkit.org/apps/concepts/users/2022-01-13T15:14:41-05:00https://docs.communityhealthtoolkit.org/contribute/2023-02-22T11:12:03+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/form-properties/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/concepts/interoperability/2023-08-25T09:16:39+12:00https://docs.communityhealthtoolkit.org/design/personas/partners/2020-06-01T11:16:07-07:00https://docs.communityhealthtoolkit.org/apps/features/targets/2022-06-21T13:27:00+03:00https://docs.communityhealthtoolkit.org/contribute/code/core/update-dependencies/2023-09-15T08:43:47+07:00https://docs.communityhealthtoolkit.org/apps/concepts/prerequisites/2023-05-14T21:33:28+03:00https://docs.communityhealthtoolkit.org/contribute/code/static-analysis/2023-08-30T14:41:42-05:00https://docs.communityhealthtoolkit.org/contribute/code/style-guide/2023-03-07T11:04:23+13:00https://docs.communityhealthtoolkit.org/apps/tutorials/tasks-1/2022-04-25T14:22:54+12:00https://docs.communityhealthtoolkit.org/apps/features/training/2023-04-11T06:24:09+07:00https://docs.communityhealthtoolkit.org/contribute/code/using-npm/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/ec2-setup-guide/2023-03-27T11:25:13-07:00https://docs.communityhealthtoolkit.org/contribute/code/core/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/gateway/2021-11-08T18:53:31-03:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/gateway/configuration/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/data-migration/2023-09-15T06:38:42+03:00https://docs.communityhealthtoolkit.org/glossary/2023-09-06T01:29:21-07:00https://docs.communityhealthtoolkit.org/apps/features/muting/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/core/overview/roadmap/2023-05-14T14:06:36-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/2023-10-06T16:32:03+02:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/single-node/2023-10-06T16:32:03+02:00https://docs.communityhealthtoolkit.org/contribute/docs/style-guide/2023-08-21T14:01:53+12:00https://docs.communityhealthtoolkit.org/apps/tutorials/targets/2022-02-08T10:50:49+03:00https://docs.communityhealthtoolkit.org/apps/tutorials/contact-summary/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/tutorials/death-reporting/2021-11-29T11:05:14-08:00https://docs.communityhealthtoolkit.org/apps/features/uhc-mode/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/features/admin/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/tutorials/condition-cards/2023-03-09T11:48:26+03:00https://docs.communityhealthtoolkit.org/contribute/code/core/fixing-e2e-tests/2023-06-23T11:33:32-06:00https://docs.communityhealthtoolkit.org/apps/guides/android/branding/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/tutorials/localizing-cht/2023-04-12T17:35:29+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/application-graphics/2022-07-13T02:44:45+00:00https://docs.communityhealthtoolkit.org/apps/tutorials/application-tests/2023-04-12T10:00:06+00:00https://docs.communityhealthtoolkit.org/apps/guides/data/users-bulk-load/2022-11-29T21:49:50-08:00https://docs.communityhealthtoolkit.org/apps/guides/training/onboarding/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/guides/training/training-cards/2023-04-11T06:24:09+07:00https://docs.communityhealthtoolkit.org/apps/guides/training/training-cards-resources/2023-05-12T08:24:25+07:00https://docs.communityhealthtoolkit.org/apps/guides/data/training-instance/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/contribute/code/core/using-windows/2023-08-21T14:01:53+12:00https://docs.communityhealthtoolkit.org/contribute/code/core/run-multiple-chrome-versions/2023-09-07T14:16:27-04:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/africas-talking/2022-07-22T08:43:15+12:00https://docs.communityhealthtoolkit.org/contribute/code/android/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/2021-05-18T17:45:42-04:00https://docs.communityhealthtoolkit.org/apps/features/integrations/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/self-hosting/multiple-nodes/2023-10-06T16:32:03+02:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/gateway/phones/2021-11-08T18:53:31-03:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/rapidpro/2022-12-08T13:31:35+01:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/self-hosting/2023-04-12T17:35:29+00:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/sms-states/2021-11-08T18:53:31-03:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/vertical-vs-horizontal/2023-10-06T16:32:03+02:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/shortcodes/2021-05-18T17:45:42-04:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/app-developer/2023-06-02T12:58:08-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/app-developer/2023-08-07T23:04:24+03:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/ssl-cert-install/2022-10-31T14:34:56-07:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/message-loops/2021-05-18T17:45:42-04:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/gateways/gateway/troubleshooting/2023-03-10T04:36:47+05:45https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/2023-03-27T11:25:13-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/2023-10-06T16:32:03+02:00https://docs.communityhealthtoolkit.org/apps/guides/privacy/privacy-policy/2022-10-10T16:14:15-07:00https://docs.communityhealthtoolkit.org/apps/guides/data/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/database/2022-07-22T08:43:15+12:00https://docs.communityhealthtoolkit.org/apps/guides/debugging/2022-02-16T12:15:00+13:00https://docs.communityhealthtoolkit.org/apps/guides/forms/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/2023-03-27T11:25:13-07:00https://docs.communityhealthtoolkit.org/apps/guides/integrations/2022-07-05T04:16:58+03:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/introduction/2023-05-23T09:47:40-05:00https://docs.communityhealthtoolkit.org/apps/guides/messaging/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/2023-05-03T16:27:47-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/3.x/offline/2023-06-02T12:58:08-07:00https://docs.communityhealthtoolkit.org/apps/guides/performance/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/privacy/2021-04-19T17:19:45-07:00https://docs.communityhealthtoolkit.org/apps/guides/security/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/setup/2023-09-19T08:44:27-05:00https://docs.communityhealthtoolkit.org/apps/guides/tasks/2022-01-07T17:06:14-05:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/adding-tls-certificates/2023-08-07T15:49:41-07:00https://docs.communityhealthtoolkit.org/apps/guides/training/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/guides/updates/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/android/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/production/2023-05-23T09:47:40-05:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/logs/2023-06-02T12:58:08-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/backups/2023-10-06T16:32:03+02:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/postgres-ingest/2023-09-06T13:24:27-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/monitoring/integration/2023-10-06T16:32:03+02:00https://docs.communityhealthtoolkit.org/search/2022-07-27T20:41:57-05:00https://docs.communityhealthtoolkit.org/core/releases/0.4.15-and-earlier/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.10.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.10.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.10.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.10.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.11.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.11.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.11.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.11.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.4/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.12.5/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.4/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.5/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.6/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.13.7/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.14.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.14.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.14.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.14.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.15.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.16.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.16.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.17.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.18.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.18.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.6.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.6.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.6.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.6.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.7.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.7.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.7.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.7.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.3/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.4/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.8.5/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.9.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/2.9.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.0.0/2022-02-21T09:32:58-06:00https://docs.communityhealthtoolkit.org/core/releases/3.1.0/2022-02-21T09:32:58-06:00https://docs.communityhealthtoolkit.org/core/releases/3.10.0/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.10.1/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.10.2/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.10.3/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.10.4/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.10.5/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.11.0/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.11.1/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.11.2/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.11.3/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.12.0/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.12.1/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.13.0/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.14.0/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.14.1/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.14.2/2022-11-04T11:12:06-07:00https://docs.communityhealthtoolkit.org/core/releases/3.15.0/2022-05-05T09:06:44+12:00https://docs.communityhealthtoolkit.org/core/releases/3.16.0/2022-08-10T08:20:54-05:00https://docs.communityhealthtoolkit.org/core/releases/3.16.1/2022-12-02T09:34:55+02:00https://docs.communityhealthtoolkit.org/core/releases/3.17.0/2022-10-11T09:43:26+07:00https://docs.communityhealthtoolkit.org/core/releases/3.17.1/2022-12-02T09:35:08+02:00https://docs.communityhealthtoolkit.org/core/releases/3.2.0/2022-10-31T16:02:09-04:00https://docs.communityhealthtoolkit.org/core/releases/3.2.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.3.0/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.4.0/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.4.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.5.0/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.6.0/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.6.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.6.2/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.7.0/2022-08-01T16:02:39+12:00https://docs.communityhealthtoolkit.org/core/releases/3.7.1/2021-11-24T11:32:41+13:00https://docs.communityhealthtoolkit.org/core/releases/3.8.0/2022-02-21T09:32:58-06:00https://docs.communityhealthtoolkit.org/core/releases/3.8.1/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.8.2/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.9.0/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.9.1/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/3.9.2/2022-01-14T11:19:07-05:00https://docs.communityhealthtoolkit.org/core/releases/4.0.0/2022-12-13T11:43:27+13:00https://docs.communityhealthtoolkit.org/core/releases/4.0.1/2022-12-01T17:04:46+02:00https://docs.communityhealthtoolkit.org/core/releases/4.1.0/2022-12-13T10:21:02+01:00https://docs.communityhealthtoolkit.org/core/releases/4.1.1/2023-03-21T13:03:08+00:00https://docs.communityhealthtoolkit.org/core/releases/4.1.2/2023-06-21T07:36:02+12:00https://docs.communityhealthtoolkit.org/core/releases/4.2.0/2023-05-25T10:01:43+07:00https://docs.communityhealthtoolkit.org/core/releases/4.2.1/2023-06-10T09:20:32+03:00https://docs.communityhealthtoolkit.org/core/releases/4.2.2/2023-07-07T21:11:26+03:00https://docs.communityhealthtoolkit.org/core/releases/4.2.3/2023-09-25T14:17:56+02:00https://docs.communityhealthtoolkit.org/core/releases/4.3.0/2023-08-18T11:58:28+03:00https://docs.communityhealthtoolkit.org/core/releases/4.3.1/2023-08-30T15:37:03+12:00https://docs.communityhealthtoolkit.org/core/releases/4.4.0/2023-09-20T15:41:16-06:00https://docs.communityhealthtoolkit.org/apps/guides/forms/additional-docs/2022-06-17T14:30:45-05:00https://docs.communityhealthtoolkit.org/apps/guides/forms/app-form-sms/2023-06-27T05:11:38+05:45https://docs.communityhealthtoolkit.org/apps/guides/debugging/obtaining-logs/2023-05-16T09:10:36-05:00https://docs.communityhealthtoolkit.org/apps/reference/_partial_cht_api/2023-04-06T14:38:13-04:00https://docs.communityhealthtoolkit.org/apps/guides/data/impact-metrics/2021-11-23T17:44:50-08:00https://docs.communityhealthtoolkit.org/apps/tutorials/tasks-2/2023-04-06T14:38:13-04:00https://docs.communityhealthtoolkit.org/apps/guides/database/muting_in_dashboards/2021-10-08T08:43:53+03:00https://docs.communityhealthtoolkit.org/apps/examples/contact-tracing/2020-09-23T18:04:11-04:00https://docs.communityhealthtoolkit.org/apps/guides/database/couch2pg-oom-errors/2022-10-31T14:34:56-07:00https://docs.communityhealthtoolkit.org/apps/guides/database/couchdb-authentication/2022-11-22T08:13:16+13:00https://docs.communityhealthtoolkit.org/apps/examples/phc-covid/2020-09-23T18:04:11-04:00https://docs.communityhealthtoolkit.org/apps/examples/covid-education/2021-01-11T16:12:16-05:00https://docs.communityhealthtoolkit.org/apps/examples/covid-rdt-reference-app/2021-09-27T06:46:22-07:00https://docs.communityhealthtoolkit.org/apps/guides/data/csv-to-docs/2022-08-01T12:26:34+03:00https://docs.communityhealthtoolkit.org/apps/guides/database/database-conflicts/2022-11-22T08:13:16+13:00https://docs.communityhealthtoolkit.org/apps/guides/integrations/dhis2-aggregate/2020-07-09T16:39:14-07:00https://docs.communityhealthtoolkit.org/apps/guides/hosting/4.x/_partial_docker_directories/2023-04-06T14:38:13-04:00https://docs.communityhealthtoolkit.org/apps/examples/ebs/2020-09-23T18:04:11-04:00https://docs.communityhealthtoolkit.org/apps/guides/updates/feature-flags/2023-05-04T10:39:42-04:00https://docs.communityhealthtoolkit.org/apps/guides/forms/google-drive/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/guides/forms/form-inputs/2023-05-17T09:14:24-05:00https://docs.communityhealthtoolkit.org/apps/guides/data/invalid-reports/2021-03-24T06:41:04+02:00https://docs.communityhealthtoolkit.org/apps/examples/learning-care/2021-03-03T16:27:50-05:00https://docs.communityhealthtoolkit.org/apps/tutorials/_partial_docker_setup/2023-10-06T16:32:03+02:00https://docs.communityhealthtoolkit.org/apps/examples/interoperability/2023-05-31T18:07:44+03:00https://docs.communityhealthtoolkit.org/apps/guides/privacy/policy/2023-06-29T09:58:29+12:00https://docs.communityhealthtoolkit.org/design/mockups/2023-03-10T03:00:38+03:00https://docs.communityhealthtoolkit.org/apps/guides/updates/moving-contacts/2021-10-22T17:25:03-04:00https://docs.communityhealthtoolkit.org/apps/guides/forms/multimedia/2022-06-17T14:30:45-05:00https://docs.communityhealthtoolkit.org/apps/guides/integrations/openmrs/2023-04-12T17:35:29+00:00https://docs.communityhealthtoolkit.org/apps/guides/integrations/oppia/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/guides/tasks/pass-data-to-form/2023-04-06T14:38:13-04:00https://docs.communityhealthtoolkit.org/apps/examples/pih/2022-11-18T06:41:57+03:00https://docs.communityhealthtoolkit.org/apps/guides/updates/preparing-for-4/2023-04-18T12:42:52+00:00https://docs.communityhealthtoolkit.org/apps/guides/debugging/replicating-production-data-locally/2023-08-21T14:01:53+12:00https://docs.communityhealthtoolkit.org/apps/guides/performance/purging/2023-08-17T01:04:57+03:00https://docs.communityhealthtoolkit.org/apps/guides/tasks/query-task-data/2021-11-29T11:05:14-08:00https://docs.communityhealthtoolkit.org/apps/guides/forms/wealth-quintiles/2020-12-16T14:58:49-05:00https://docs.communityhealthtoolkit.org/apps/guides/integrations/rapidpro/2023-09-08T10:15:34+03:00https://docs.communityhealthtoolkit.org/apps/guides/database/rdbms-from-mac/2021-03-03T16:27:50-05:00https://docs.communityhealthtoolkit.org/apps/guides/database/rdbms-from-windows/2020-08-18T10:29:41-07:00https://docs.communityhealthtoolkit.org/apps/guides/updates/collect-forms-update/2021-07-16T08:15:33-05:00https://docs.communityhealthtoolkit.org/apps/examples/training/2023-03-09T15:46:54+07:00https://docs.communityhealthtoolkit.org/apps/guides/performance/replication/2020-08-19T12:19:51-07:00https://docs.communityhealthtoolkit.org/apps/guides/forms/report-titles/2020-06-05T14:27:01-04:00https://docs.communityhealthtoolkit.org/apps/guides/debugging/secure-sharing-of-developer-instance/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/security/securing-android/2022-12-13T09:17:47+13:00https://docs.communityhealthtoolkit.org/apps/guides/debugging/sharing-4x-logs/2023-05-16T09:10:36-05:00https://docs.communityhealthtoolkit.org/apps/examples/stock-monitoring/2022-08-31T13:55:06-07:00https://docs.communityhealthtoolkit.org/apps/examples/supervisor-reference-app/2023-03-18T15:29:21+03:00https://docs.communityhealthtoolkit.org/apps/guides/tasks/task-schema-parameters/2021-11-29T11:05:14-08:00https://docs.communityhealthtoolkit.org/apps/guides/performance/telemetry/2023-09-07T11:07:58+12:00https://docs.communityhealthtoolkit.org/apps/reference/_partial_utils/2023-04-06T14:38:13-04:00https://docs.communityhealthtoolkit.org/apps/guides/forms/versioning/2022-08-05T10:25:51+12:00 \ No newline at end of file diff --git a/why-the-cht/index.html b/why-the-cht/index.html index 2d2de848ad..ae50f8a633 100644 --- a/why-the-cht/index.html +++ b/why-the-cht/index.html @@ -107,9 +107,10 @@