From ef6080d34d2de1c6517b62929cea80e0076a6e62 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 15:14:51 +0200 Subject: [PATCH 01/22] add autobuild docs --- docs/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/README.md b/docs/README.md index 727157b2d..1b133412e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -25,6 +25,20 @@ cd _builds/html python -m http.server ``` +You can also automatically build the docs with `sphinx-autobuild`: + +Install it: + +``` +pip install sphinx-autobuild +``` + +Then run: + +``` +sphinx-autobuild . _build/html/ --port 8001 +``` + ## Hosting the docs Docs are hosted on readthedocs and managed by Dimagi. From b1d9f4ec4222f7bb8381b910d5ba8edde590026b Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 15:23:16 +0200 Subject: [PATCH 02/22] tweak admin docs --- docs/administration.rst | 3 +++ docs/administration/admin-site.md | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/administration.rst b/docs/administration.rst index 25a7aac0d..6bc4065ca 100644 --- a/docs/administration.rst +++ b/docs/administration.rst @@ -3,6 +3,9 @@ cStock Administration This section outlines common tasks performed by a cStock administrator. +Administrators are users that have special permissions on the cStock site, +and can manage users, access the system data models, and perform other administrative operations. + .. toctree:: administration/admin-site.md diff --git a/docs/administration/admin-site.md b/docs/administration/admin-site.md index 66b9f4bf1..c6364a164 100644 --- a/docs/administration/admin-site.md +++ b/docs/administration/admin-site.md @@ -1,6 +1,7 @@ Admin site access ================= -To access the admin site, go to [http://cstock.jsi.com/admin/](http://cstock.jsi.com/admin). -If you are prompted to login, then you may not have access. +To access the admin site, first [login to cStock](https://cstock.health.gov.mw/accounts/login/), then +go to [https://cstock.health.gov.mw/admin/](https://cstock.health.gov.mw/admin/). +If you are prompted to login again, then you may not have access. You should contact another administrator to grant you access. From 9bfaca9339ea8132b7f82236c12a7f73c86859be Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 15:44:20 +0200 Subject: [PATCH 03/22] add markdown table support --- docs/conf.py | 3 ++- docs/requirements.in | 1 + docs/requirements.txt | 12 +++++++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 1eb4f246a..77399ace3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -28,7 +28,8 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'recommonmark' + 'recommonmark', + 'sphinx_markdown_tables', ] # Add any paths that contain templates here, relative to this directory. diff --git a/docs/requirements.in b/docs/requirements.in index 085b3a792..d28745162 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,2 +1,3 @@ sphinx recommonmark +sphinx-markdown-tables diff --git a/docs/requirements.txt b/docs/requirements.txt index f2fbaa85a..ac717b505 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: # # pip-compile requirements.in # @@ -23,9 +23,13 @@ idna==3.3 imagesize==1.3.0 # via sphinx importlib-metadata==4.11.3 - # via sphinx + # via + # markdown + # sphinx jinja2==3.1.1 # via sphinx +markdown==3.5.1 + # via sphinx-markdown-tables markupsafe==2.1.1 # via jinja2 packaging==21.3 @@ -46,6 +50,8 @@ sphinx==4.5.0 # via # -r requirements.in # recommonmark +sphinx-markdown-tables==0.0.17 + # via -r requirements.in sphinxcontrib-applehelp==1.0.2 # via sphinx sphinxcontrib-devhelp==1.0.2 From cbcd5b42de575e6d2d2cb52daa45d40076fde0a9 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 15:54:03 +0200 Subject: [PATCH 04/22] add a sysadmin overview page --- docs/systems-administration.rst | 1 + docs/systems-administration/overview.md | 32 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 docs/systems-administration/overview.md diff --git a/docs/systems-administration.rst b/docs/systems-administration.rst index 07d2c5844..26b63b06b 100644 --- a/docs/systems-administration.rst +++ b/docs/systems-administration.rst @@ -5,6 +5,7 @@ This section outlines common tasks performed by a cStock *system* administrator. .. toctree:: + systems-administration/overview.md systems-administration/common-tasks.md systems-administration/troubleshooting.md systems-administration/server-setup.md diff --git a/docs/systems-administration/overview.md b/docs/systems-administration/overview.md new file mode 100644 index 000000000..1a990d34f --- /dev/null +++ b/docs/systems-administration/overview.md @@ -0,0 +1,32 @@ +cStock System Overview +====================== + +[cStock](https://cstock.health.gov.mw/) is a website built and maintained by the Malawi Ministry of Health. +There is a web component as well as an SMS component. + +## Hosting + +cStock is hosted by the Ministry of Health. + +## Code + +The cStock application code is hosted [on Github](https://github.com/dimagi/logistics/). +It is a Python / Django application, based on RapidSMS. + +In general system administrators should not need to modify cStock code, +but it would be necessary to add new features or fix bugs. + +## Key Services + +cStock consists of the following key services: + +| Service | Description | Technology | +|-------------------------|----------------------------------------------------------------------------------------------------------------------------------|-------------------| +| Web Application Process | The web application is the business logic that powers the cStock web application. | Django | +| SMS Application Process | A process that runs alongside the web application to manage SMS workflows | Django + RapidSMS | +| Background Task Process | A process that runs alongside the web application to manage background tasks and scheduled SMS messages | Django + Celery | +| Database | The database houses all persistent data. | MySQL | +| Web Server | The web server sits in front of the web application, providing outside internet access. It also hosts static files like images. | Nginx | +| SMS Gateway | The SMS Gateway connects to third-party SMS providers (TNM and Airtel) and routes the messages to the SMS application process. | Kannel | + + From 7fb5b3876bf4b94f20512d563f67d6214b441790 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 15:54:10 +0200 Subject: [PATCH 05/22] add an intro paragraph --- docs/index.rst | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 1c07b28bf..0e78fdf43 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,8 +3,16 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to cStock's documentation! -================================== +cStock Project Documentation +============================ + +cStock is a website that provides real-time, actionable HSA logistics data for managers and stakeholders to coordinate, +plan, and identify solutions to better meet customer needs in a timely manner. + +cStock is hosted at `https://cstock.health.gov.mw/ `_. + +This documentation is intended for cStock administrators, system administrators, and developers. + .. toctree:: :maxdepth: 3 From ed449715de9bc40a501d9aa39ab3e15008748925 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 15:59:41 +0200 Subject: [PATCH 06/22] tweak server access --- docs/systems-administration.rst | 3 ++- .../{vpn.md => server-access.md} | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) rename docs/systems-administration/{vpn.md => server-access.md} (54%) diff --git a/docs/systems-administration.rst b/docs/systems-administration.rst index 26b63b06b..90fce1772 100644 --- a/docs/systems-administration.rst +++ b/docs/systems-administration.rst @@ -6,7 +6,8 @@ This section outlines common tasks performed by a cStock *system* administrator. .. toctree:: systems-administration/overview.md + systems-administration/server-access.md systems-administration/common-tasks.md systems-administration/troubleshooting.md systems-administration/server-setup.md - systems-administration/vpn.md + diff --git a/docs/systems-administration/vpn.md b/docs/systems-administration/server-access.md similarity index 54% rename from docs/systems-administration/vpn.md rename to docs/systems-administration/server-access.md index 328366494..6670f948d 100644 --- a/docs/systems-administration/vpn.md +++ b/docs/systems-administration/server-access.md @@ -1,15 +1,25 @@ Connecting to the Server ======================== -Access to the cstock server requires connecting to the VPN. +Access to the cstock server requires connecting to a VPN. Follow the steps below to connect to the VPN and access the server. +## Prerequisites + +Before you will be able to login to the cStock server you will need two accounts: + +1. A VPN account (or access to shared VPN credentials). +2. An account on the cStock server (or access to shared server credentials) + +If you don't have these, ask a system administrator to provide you access. + + ## VPN set up -To get set up initially ask a system administrator to set you up with a new VPN account, and two-factor application. +To access the VPN you will need to set up your VPN account and two-factor application. You may need to install an older version of Sophos Authenticator to get the two-factor codes to work. -Once you've gotten set up, download the OpenVPN config file and save it locally. +Once you've gotten set up, download the provided OpenVPN config file and save it locally. ## Logging in to the VPN @@ -23,6 +33,8 @@ Enter your credentials, which are you username, followed by your password + 2FA So if your password is `hunter2` and the 2-factor code is `123456`, you would enter `hunter2123456` for the password field. +For different operating systems, refer to the VPN documentation provided by the system administrator. + ## Logging in to cstock Once on the VPN, you can access cstock by running: From 7594406961572db76189bd31dcf14f8e70ee851c Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 16:10:55 +0200 Subject: [PATCH 07/22] expand common tasks --- docs/systems-administration/common-tasks.md | 52 +++++++++++++++++++-- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/docs/systems-administration/common-tasks.md b/docs/systems-administration/common-tasks.md index 57a17eac2..d20677dc8 100644 --- a/docs/systems-administration/common-tasks.md +++ b/docs/systems-administration/common-tasks.md @@ -1,19 +1,37 @@ Common System Administration Tasks ================================== -## Deploying Code +These are some common tasks required of system administrators. -Deploying code requires installing fabric3 (`pip install -r requrements/deploy/dev-requirements.txt`). +All of these tasks require [server access](./server-access.md). -Then, to deploy you must first connect to the VPN. Then run: +## Deploying Updated Code + +Deploying code requires installing fabric3: + +``` +pip install -r requrements/deploy/dev-requirements.txt +``` + +And then cloning [the code repository](https://github.com/dimagi/logistics/): + +``` +git clone https://github.com/dimagi/logistics.git +``` + +Then, to deploy you must first connect to the VPN. Then run the following command in the repository root: ``` fab malawi deploy ``` -## Restarting processes +This command should be run on *your own machine*. +For the remaining sections, you must run the commands *on the server*. + +## Restarting application processes -We use supervisor (`/etc/supervisor.conf`) to manage the running processes. +We use supervisor (`/etc/supervisor.conf`) to manage the running cStock processes, +including the web application, SMS application, and background task application. To see the list of running processes run: @@ -26,3 +44,27 @@ You can restart individual processes with: ``` sudo supervisorctl restart ``` + +## Restarting the web server + +To restart the web server you can run: + +``` +sudo service nginx restart +``` + +## Restarting the database + +To restart the database you can run: + +``` +sudo service mysql restart +``` + +## Restart the SMS gateway + +To restart the SMS gateway you can run: + +``` +sudo service kannel restart +``` From 561efe9533adb901d7813ad26a1edcee775696bb Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 16:10:59 +0200 Subject: [PATCH 08/22] tweak server access --- docs/systems-administration/server-access.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/systems-administration/server-access.md b/docs/systems-administration/server-access.md index 6670f948d..e78667204 100644 --- a/docs/systems-administration/server-access.md +++ b/docs/systems-administration/server-access.md @@ -40,7 +40,7 @@ For different operating systems, refer to the VPN documentation provided by the Once on the VPN, you can access cstock by running: ```bash -ssh user@10.10.100.77 +ssh cstock@10.10.100.77 ``` -Replace `user` with your username, or use the `cstock` user for shared access. +If you have an individual user account, replace `cstock` with your username. From b7d7f33fcb12bc651c909e64137dcfd8dd4e78a8 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 16:33:43 +0200 Subject: [PATCH 09/22] whitespace --- docs/systems-administration/overview.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/systems-administration/overview.md b/docs/systems-administration/overview.md index 1a990d34f..e648b9f41 100644 --- a/docs/systems-administration/overview.md +++ b/docs/systems-administration/overview.md @@ -29,4 +29,3 @@ cStock consists of the following key services: | Web Server | The web server sits in front of the web application, providing outside internet access. It also hosts static files like images. | Nginx | | SMS Gateway | The SMS Gateway connects to third-party SMS providers (TNM and Airtel) and routes the messages to the SMS application process. | Kannel | - From 14de859fdb495b47bbf7836f4f9429643d5ae404 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 16:33:50 +0200 Subject: [PATCH 10/22] expand troubleshooting --- .../systems-administration/troubleshooting.md | 76 ++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/docs/systems-administration/troubleshooting.md b/docs/systems-administration/troubleshooting.md index b49fd61db..83411aa11 100644 --- a/docs/systems-administration/troubleshooting.md +++ b/docs/systems-administration/troubleshooting.md @@ -3,7 +3,16 @@ Troubleshooting Some common issues, and how to resolve them. -# "Too many connections" error +## Monitoring + +The project uses [Sentry](https://sentry.io/) for error monitoring. +Whenever there is an error in the application it will be logged to Sentry, and an alert will be sent to all Sentry users. + +## Common errors + +Some common error messages from Sentry are documented here. + +### "Too many connections" error If you see errors in Sentry saying "too many connections", it is an issue with too many open connections to the MySQL database. @@ -14,3 +23,68 @@ Restarting the router process usually resolves this: ``` sudo supervisorctl restart rapidsms-router ``` + +### "Warehouse already running, will do nothing..." + +This error indicates that a background job that builds the cStock reports every 12 hours failed because +the previous one has not completed. + +1. If it is the first time you have seen the error in a while, check if it is the first of the month. If it is, you can likely ignore it. The warehouse job takes longer than usual on the first and this is expected. +2. If it is not the first, or you see the error multiple times in a row you should check the warehouse runner status (see the deploy section above). +3. By looking in the logs, if the job is still running you can ignore it. +4. If the job has died, you should manually go to the admin page and set the status of the most recent job to "complete". Unintuitively you should also set "has_error" to False, despite the fact that the job likely errored. This is due to a legacy issue with how that field is used. + +## SMS issues + +The first place to check for troubleshooting SMS issues is the [SMS status page](https://cstock.health.gov.mw/malawi/status/) on the site. + +The following is an example output from that page: + +``` + Kannel bearerbox version `1.4.5'. +Compiler `11.2.0'. +System Linux, release 5.15.0-88-generic, version #98-Ubuntu SMP Mon Oct 2 15:18:56 UTC 2023, machine x86_64. +Hostname cstock, IP 127.0.1.1. +Libxml version 2.9.12. +Using OpenSSL 3.0.0 7 sep 2021. +Compiled with MySQL 8.0.27, using MySQL 8.0.35. +Compiled with PostgreSQL 14.1 (Ubuntu 14.1-1ubuntu1). +Using SQLite 3.36.0. +Using hiredis API 0.14.1 +Using native malloc. + + +Status: running, uptime 32d 22h 13m 28s + +WDP: received 0 (0 queued), sent 0 (0 queued) + +SMS: received 4461 (0 queued), sent 9185 (1178 queued), store size -1 +SMS: inbound (0.02,0.00,0.00) msg/sec, outbound (0.12,0.03,0.00) msg/sec + +DLR: received 0, sent 0 +DLR: inbound (0.00,0.00,0.00) msg/sec, outbound (0.00,0.00,0.00) msg/sec +DLR: 0 queued, using internal storage + +Box connections: + smsbox:(none), IP 127.0.0.1 (0 queued), (on-line 32d 22h 13m 27s) + + +SMSC connections: + airtel-smpp[airtel-smpp] SMPP:messaging.airtel.mw:9001/9001:mnofhlth:VMA (online 178261s, rcvd: sms 2579 (0.02,0.00,0.00) / dlr 0 (0.00,0.00,0.00), sent: sms 5573 (0.12,0.03,0.00) / dlr 0 (0.00,0.00,0.00), failed 0, queued 0 msgs) + tnm-smpp-send[tnm-smpp-send] SMPP:41.78.250.95:5016/5016:CStock:SMPP (re-connecting, rcvd: sms 0 (0.00,0.00,0.00) / dlr 0 (0.00,0.00,0.00), sent: sms 3612 (0.00,0.00,0.00) / dlr 0 (0.00,0.00,0.00), failed 8, queued 0 msgs) + tnm-smpp-receive-1[tnm-smpp-receive-1] SMPP:41.78.250.40:5019/5019:CStock:SMPP (online 178174s, rcvd: sms 1882 (0.03,0.01,0.00) / dlr 0 (0.00,0.00,0.00), sent: sms 0 (0.00,0.00,0.00) / dlr 0 (0.00,0.00,0.00), failed 0, queued 0 msgs) + tnm-smpp-receive-2[tnm-smpp-receive-2] SMPP:41.78.250.42:5019/5019:CStock:SMPP (re-connecting, rcvd: sms 0 (0.00,0.00,0.00) / dlr 0 (0.00,0.00,0.00), sent: sms 0 (0.00,0.00,0.00) / dlr 0 (0.00,0.00,0.00), failed 0, queued 0 msgs) + + + + +Last Celery Heartbeat:2023-12-13 16:17:00.029043 +``` + +The most important part is the bottom section, labeled `SMSC connections`. +This will show the status of the four connections to SMS gateways (one for airtel, and 3 for TNM). +If the connection reports `online` then it is working as expected. +If it says `re-connecting` or anything else, it is not working. + +The most common reason that SMS fails is due to VPN issues between cStock and TNM. +These need to be resolved by the cStock hosting team and TNM networking team. From 32e9c60697990fcc3f5c45cb98ee433eca48d207 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 16:54:50 +0200 Subject: [PATCH 11/22] expand services section --- docs/systems-administration/overview.md | 103 ++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 8 deletions(-) diff --git a/docs/systems-administration/overview.md b/docs/systems-administration/overview.md index e648b9f41..1ae864340 100644 --- a/docs/systems-administration/overview.md +++ b/docs/systems-administration/overview.md @@ -20,12 +20,99 @@ but it would be necessary to add new features or fix bugs. cStock consists of the following key services: -| Service | Description | Technology | -|-------------------------|----------------------------------------------------------------------------------------------------------------------------------|-------------------| -| Web Application Process | The web application is the business logic that powers the cStock web application. | Django | -| SMS Application Process | A process that runs alongside the web application to manage SMS workflows | Django + RapidSMS | -| Background Task Process | A process that runs alongside the web application to manage background tasks and scheduled SMS messages | Django + Celery | -| Database | The database houses all persistent data. | MySQL | -| Web Server | The web server sits in front of the web application, providing outside internet access. It also hosts static files like images. | Nginx | -| SMS Gateway | The SMS Gateway connects to third-party SMS providers (TNM and Airtel) and routes the messages to the SMS application process. | Kannel | +| Service | Description | Technology | +|-------------------------|---------------------------------------------------------------------------------------------------------------------------------|-------------------| +| Web Application Process | The web application is the business logic that powers the cStock web application. | Django | +| SMS Application Process | A process that runs alongside the web application to manage SMS workflows | Django + RapidSMS | +| Background Task Process | A process that runs alongside the web application to manage background tasks and scheduled SMS messages | Django + Celery | +| Database | The database houses all persistent data. | MySQL | +| Cache / Message Broker | The cache is used to improve the performance of the site and pass messages between other processes. | Redis | +| Web Server | The web server sits in front of the web application, providing outside internet access. It also hosts static files like images. | Nginx | +| SMS Gateway | The SMS Gateway connects to third-party SMS providers (TNM and Airtel) and routes the messages to the SMS application process. | Kannel | +In general, all of these need to be running and functioning properly for cStock to work. + +### Web Application Process + +The web application is the business logic that powers the cStock web application. +Here is the key information for it: + +| Item | Value | +|------------------------|-------------------------------------------------------------------------------| +| Process | Django (Gunicorn) | +| Log files | `www/cstock/log/gunicorn.command.log` and `www/cstock/log/gunicorn.error.log` | +| View status | `sudo supervisorctl status` (gunicorn process) | +| Stop / Start / Restart | `sudo supervisorctl stop gunicorn` (or `start`, or `restart`) | + +### SMS Application Process + +The SMS web application runs alongside the web application to manage SMS workflows. +Here is the key information for it: + +| Item | Value | +|------------------------|---------------------------------------------------------------| +| Process | Django (RapidSMS) | +| Log files | `www/cstock/log/rapidsms.log` | +| View status | `sudo supervisorctl status` (rapidsms-router process) | +| Stop / Start / Restart | `sudo supervisorctl stop rapidsms-router` (or `start`, or `restart`) | + +### Background Task Process + +The background task process runs alongside the web application to manage background tasks and scheduled SMS messages. +Here is the key information for it: + +| Item | Value | +|------------------------|-------------------------------------------------------------| +| Process | Django (Celery) | +| Log files | `www/cstock/log/celery.error.log` | +| View status | `sudo supervisorctl status` (celery process) | +| Stop / Start / Restart | `sudo supervisorctl stop celery` (or `start`, or `restart`) | + +### Database + +The database houses all persistent data for the application. +Here is the key information for it: + +| Item | Value | +|------------------------|------------------------------------------------------| +| Process | MySQL | +| View status | `sudo service mysql status` | +| Stop / Start / Restart | `sudo service mysql stop` (or `start`, or `restart`) | + +### Cache / Message Broker + +The cache is used to improve the performance of the site and pass messages between other processes. +Here is the key information for it: + +| Item | Value | +|------------------------|------------------------------------------------------| +| Process | Redis | +| View status | `sudo service redis status` | +| Stop / Start / Restart | `sudo service redis stop` (or `start`, or `restart`) | + +### Web Server + +The web server sits in front of the web application, providing outside internet access. It also hosts static files like images. +Here is the key information for it: + +| Item | Value | +|------------------------|------------------------------------------------------| +| Process | Nginx | +| Log files | `/var/log/nginx/` | +| Configuration file | `/etc/nginx/sites-available/cstock` | +| View status | `sudo service nginx status` | +| Stop / Start / Restart | `sudo service nginx stop` (or `start`, or `restart`) | + + +### SMS Gateway + +The SMS Gateway connects to third-party SMS providers (TNM and Airtel) and routes the messages to the SMS application process. +Here is the key information for it: + +| Item | Value | +|------------------------|-------------------------------------------------------| +| Process | Kannel | +| Log files | `/var/log/kannel/` | +| Configuration file | `/etc/kannel/kannel.conf` | +| View status | `sudo service kannel status` | +| Stop / Start / Restart | `sudo service kannel stop` (or `start`, or `restart`) | From ec8df6142749cbc7f92f1c2b7d76b27de6489888 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 16:56:45 +0200 Subject: [PATCH 12/22] add note about changing config --- docs/systems-administration/troubleshooting.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/systems-administration/troubleshooting.md b/docs/systems-administration/troubleshooting.md index 83411aa11..8046db392 100644 --- a/docs/systems-administration/troubleshooting.md +++ b/docs/systems-administration/troubleshooting.md @@ -88,3 +88,5 @@ If it says `re-connecting` or anything else, it is not working. The most common reason that SMS fails is due to VPN issues between cStock and TNM. These need to be resolved by the cStock hosting team and TNM networking team. + +If you need to make changes to the SMS gateway configrations, you can edit the Kannel configuration file. From 05f1e74ca63b086b3184f99d28691ffa0f237037 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 16:59:43 +0200 Subject: [PATCH 13/22] reduce headings --- docs/systems-administration/server-setup.md | 40 ++++++++++----------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/systems-administration/server-setup.md b/docs/systems-administration/server-setup.md index c417f535c..6c4dbaa73 100644 --- a/docs/systems-administration/server-setup.md +++ b/docs/systems-administration/server-setup.md @@ -3,7 +3,7 @@ Server Installation These steps are from a production installation. -# Create a system user +## Create a system user Fill in the prompts after running the command: @@ -13,7 +13,7 @@ adduser cstock This user will be the one to run cstock and other related processes. -## Make the cstock user a sudoer +### Make the cstock user a sudoer This will allow them to run necessary commands as root. @@ -21,7 +21,7 @@ This will allow them to run necessary commands as root. sudo usermod -aG sudo cstock ``` -# Install and configure MySQL +## Install and configure MySQL Follow [this guide](https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04) to install MySQL. @@ -30,7 +30,7 @@ sudo apt install mysql-server sudo systemctl start mysql.service ``` -## Set a root login/password +### Set a root login/password Replace the password with the one you want to set. @@ -40,13 +40,13 @@ mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '* mysql> \q ``` -## Secure installation +### Secure installation ``` sudo mysql_secure_installation ``` -## Restore user-based access +### Restore user-based access ``` $ mysql -u root -p @@ -54,7 +54,7 @@ mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket; mysql> \q ``` -## Create cstock database user +### Create cstock database user Don't forget to change the password! @@ -65,7 +65,7 @@ mysql> GRANT CREATE, ALTER, DROP, INSERT, UPDATE, INDEX, DELETE, SELECT, REFEREN mysql> \q ``` -## Create cstock database +### Create cstock database ``` $ mysql -u cstock -p @@ -73,7 +73,7 @@ mysql> CREATE DATABASE cstock; mysql> \q ``` -# Restore cstock database +## Restore cstock database If you haven't already, take a backup of the database from whatever server it is running on: @@ -100,7 +100,7 @@ sudo mysql cstock < cstock_database.sql Note: the above restore usually has to be run as root due to permissions issues. -# Install Python 3.9, pip, virtualenv, virtualenvwrapper, mysql dependencies +## Install Python, pip, virtualenv, virtualenvwrapper, mysql dependencies **For these steps, be sure you are logged in as the *cstock* user.** @@ -111,7 +111,7 @@ sudo apt install python3-pip python3 -m pip install --user virtualenv virtualenvwrapper ``` -# Set up virtualenvewrapper +### Set up virtualenvewrapper ``` source /home/cstock/.local/bin/virtualenvwrapper.sh @@ -120,7 +120,7 @@ source /home/cstock/.local/bin/virtualenvwrapper.sh If you run into errors, check your environment variables and update your `.profile` as described [here](https://askubuntu.com/a/995130) and [here](https://virtualenvwrapper.readthedocs.io/en/latest/). -# Install Redis +## Install Redis Following [this guide](https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-20-04). @@ -144,7 +144,7 @@ sudo systemctl restart redis.service None of the other steps are required. -# Create project directories +## Create project directories As the *cstock* user, set up your project directories: @@ -153,7 +153,7 @@ mkdir -p ~/www/cstock/ mkdir -p ~/www/cstock/log/ ``` -# Set up cstock +## Set up cstock Set up cstock code according to the [Dev Setup Instructions](../dev-setup.md). @@ -168,14 +168,14 @@ setvirtualenvproject pip install -r requirements.txt ``` -## Configure localsettings +### Configure localsettings Copy your localsettings across from the previous production project and edit anything relevant (e.g. database credentials) **If you are able to run `./manage.py runserver` with no issues, things are likely working as expected.** -# Install and configure nginx +## Install and configure nginx By following [this guide](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-20-04). @@ -244,7 +244,7 @@ And restart nginx: sudo service nginx reload ``` -## Set up static files +### Set up static files In the cstock code home directory run: @@ -256,7 +256,7 @@ If static files are returning a 403 error, [check the permissions on the path](h If static files are returning a 404 error, check the paths in the nginx configuration above. -## Set up SSL +### Set up SSL Install certbot @@ -273,7 +273,7 @@ sudo certbot --nginx -d cstock.dimagi.com Follow the steps, and you're done. -# Install and configure supervisord +## Install and configure supervisord Follow [these instructions](https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps) to set up supervisord. @@ -329,7 +329,7 @@ Once the file is set up correctly, you can add it to supervisor and start all th sudo supervisorctl reload ``` -# Set up and configure Kannel (SMS gateway) +## Set up and configure Kannel (SMS gateway) ``` sudo apt install kannel From b1b513f829e1d31b2b55818be1daa174a4f2d1b4 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 17:10:30 +0200 Subject: [PATCH 14/22] add shell info --- docs/systems-administration/common-tasks.md | 53 +++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/systems-administration/common-tasks.md b/docs/systems-administration/common-tasks.md index d20677dc8..d4103921f 100644 --- a/docs/systems-administration/common-tasks.md +++ b/docs/systems-administration/common-tasks.md @@ -68,3 +68,56 @@ To restart the SMS gateway you can run: ``` sudo service kannel restart ``` + +## Getting an application shell + +Sometimes it can be useful to get an application shell, to run the cStock Python code manually, +for example, to inspect data models or make once-off changes. + +To get an application shell you can enter the virtual environment like this (as the `cstock` user): + +``` +workon cstock +``` + +This should enter the virtual environment and load you in the right directory. +From there you can run: + +``` +python manage.py shell +``` + +To get a Python shell. You can then run code to work with the Django application. +For example, to see how many registered web users there are, you can run: + +``` +>>> from django.contrib.auth.models import User +>>> User.objects.count() +551 +``` + +## Getting a database shell + +The easiest way to get a database shell is to first enter the virtual environment as per above: + +``` +workon cstock +``` + +Then run: + +``` +python manage.py dbshell +``` + +Then to run the equivalent command in MySQL you could run: + +``` +mysql> SELECT count(*) FROM auth_user; ++----------+ +| count(*) | ++----------+ +| 551 | ++----------+ +1 row in set (0.00 sec) +``` From f14ef98912c16607a288e20f265ddcaf207b6a2e Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 17:33:10 +0200 Subject: [PATCH 15/22] tweaks --- docs/systems-administration/overview.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/systems-administration/overview.md b/docs/systems-administration/overview.md index 1ae864340..82478f9f8 100644 --- a/docs/systems-administration/overview.md +++ b/docs/systems-administration/overview.md @@ -6,7 +6,7 @@ There is a web component as well as an SMS component. ## Hosting -cStock is hosted by the Ministry of Health. +cStock is hosted by the Ministry of Health in a local data center. ## Code @@ -20,6 +20,13 @@ but it would be necessary to add new features or fix bugs. cStock consists of the following key services: +![cStock Architecture](/images/cstock-architecture.png) + +In the above, green boxes run custom cStock code, blue boxes are 3rd-party applications running +on the cStock server, and grey boxes are external services. + +Here is a high-level description of each cStock service: + | Service | Description | Technology | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------|-------------------| | Web Application Process | The web application is the business logic that powers the cStock web application. | Django | From 15f9b306d038fab21a55ccdbf57395ced7fc36af Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 17:33:25 +0200 Subject: [PATCH 16/22] add architecture diagram --- docs/images/cstock-architecture.png | Bin 0 -> 107917 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/cstock-architecture.png diff --git a/docs/images/cstock-architecture.png b/docs/images/cstock-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..e54858e212e6f1b9f968d944a7e7a15d8e21e093 GIT binary patch literal 107917 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 literal 0 HcmV?d00001 From b101375ef228a1f0ff5ddf9fc6d60a038ed4d70d Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 17:56:35 +0200 Subject: [PATCH 17/22] paths --- docs/systems-administration/overview.md | 26 ++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/systems-administration/overview.md b/docs/systems-administration/overview.md index 82478f9f8..aa372c387 100644 --- a/docs/systems-administration/overview.md +++ b/docs/systems-administration/overview.md @@ -44,24 +44,24 @@ In general, all of these need to be running and functioning properly for cStock The web application is the business logic that powers the cStock web application. Here is the key information for it: -| Item | Value | -|------------------------|-------------------------------------------------------------------------------| -| Process | Django (Gunicorn) | -| Log files | `www/cstock/log/gunicorn.command.log` and `www/cstock/log/gunicorn.error.log` | -| View status | `sudo supervisorctl status` (gunicorn process) | -| Stop / Start / Restart | `sudo supervisorctl stop gunicorn` (or `start`, or `restart`) | +| Item | Value | +|------------------------|---------------------------------------------------------------------------------------------------------| +| Process | Django (Gunicorn) | +| Log files | `/home/cstock/www/cstock/log/gunicorn.command.log` and `/home/cstock/www/cstock/log/gunicorn.error.log` | +| View status | `sudo supervisorctl status` (gunicorn process) | +| Stop / Start / Restart | `sudo supervisorctl stop gunicorn` (or `start`, or `restart`) | ### SMS Application Process The SMS web application runs alongside the web application to manage SMS workflows. Here is the key information for it: -| Item | Value | -|------------------------|---------------------------------------------------------------| -| Process | Django (RapidSMS) | -| Log files | `www/cstock/log/rapidsms.log` | -| View status | `sudo supervisorctl status` (rapidsms-router process) | -| Stop / Start / Restart | `sudo supervisorctl stop rapidsms-router` (or `start`, or `restart`) | +| Item | Value | +|------------------------|----------------------------------------------------------------------| +| Process | Django (RapidSMS) | +| Log files | `/home/cstock/www/cstock/log/rapidsms.log` | +| View status | `sudo supervisorctl status` (rapidsms-router process) | +| Stop / Start / Restart | `sudo supervisorctl stop rapidsms-router` (or `start`, or `restart`) | ### Background Task Process @@ -71,7 +71,7 @@ Here is the key information for it: | Item | Value | |------------------------|-------------------------------------------------------------| | Process | Django (Celery) | -| Log files | `www/cstock/log/celery.error.log` | +| Log files | `/home/cstock/www/cstock/log/celery.error.log` | | View status | `sudo supervisorctl status` (celery process) | | Stop / Start / Restart | `sudo supervisorctl stop celery` (or `start`, or `restart`) | From 02d53e585789a90617950dd4537073410d0a3984 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Wed, 13 Dec 2023 18:00:12 +0200 Subject: [PATCH 18/22] reports section --- .../systems-administration/troubleshooting.md | 47 +++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/docs/systems-administration/troubleshooting.md b/docs/systems-administration/troubleshooting.md index 8046db392..94d4fcf47 100644 --- a/docs/systems-administration/troubleshooting.md +++ b/docs/systems-administration/troubleshooting.md @@ -30,9 +30,7 @@ This error indicates that a background job that builds the cStock reports every the previous one has not completed. 1. If it is the first time you have seen the error in a while, check if it is the first of the month. If it is, you can likely ignore it. The warehouse job takes longer than usual on the first and this is expected. -2. If it is not the first, or you see the error multiple times in a row you should check the warehouse runner status (see the deploy section above). -3. By looking in the logs, if the job is still running you can ignore it. -4. If the job has died, you should manually go to the admin page and set the status of the most recent job to "complete". Unintuitively you should also set "has_error" to False, despite the fact that the job likely errored. This is due to a legacy issue with how that field is used. +2. If it is not the first, or you see the error multiple times in a row you should check and update the report jobs (see the reporting section below). ## SMS issues @@ -90,3 +88,46 @@ The most common reason that SMS fails is due to VPN issues between cStock and TN These need to be resolved by the cStock hosting team and TNM networking team. If you need to make changes to the SMS gateway configrations, you can edit the Kannel configuration file. + +## Report Issues + +cStock reports are updated by a background task that runs every 12 hours. +If reports are failing to update, the problem is usually related to this task. + +### Viewing report task status + +The easiest way to see the status of the report task is in the Django admin area. + +After logging into cStock, visit this page: [https://cstock.health.gov.mw/admin/warehouse/reportrun/](https://cstock.health.gov.mw/admin/warehouse/reportrun/) +to see the recent report update jobs. + +When things are working well, you will see a green check under the "complete" column of every report update, +and a red "x" under the "has error" column. +If you see any recent reports with errors, there is likely a problem with the job. + +### Checking the logs for a job + +To see the output from a job you can check the celery logs by running: + +``` +tail -f -n 200 /home/cstock/www/cstock/log/celery.error.log +``` + +If the job is still running you'll see something like this: + +``` +[2023-09-25 09:20:55,702: WARNING/PoolWorker-2] processing health facility Ng'onga (6538) (493/641) +[2023-09-25 09:21:48,137: WARNING/PoolWorker-2] processing health facility Chang'ambika (6673) (494/641) +[2023-09-25 09:22:34,373: WARNING/PoolWorker-2] processing health facility Chapananga (6674) (495/641) +[2023-09-25 09:23:20,702: WARNING/PoolWorker-2] processing health facility Chkwawa DHO (6675) (496/641) +[2023-09-25 09:24:06,826: WARNING/PoolWorker-2] processing health facility Chipwaila (6676) (497/641) +[2023-09-25 09:24:53,339: WARNING/PoolWorker-2] processing health facility Dolo (6677) (498/641) +``` + +If the numbers at the end are still counting up then the job has not finished. +You should continue to let it run, and the reports should eventually be updated. + +If the numbers are no longer counting up, or you don't see anything like that in the logs, +you should manually go to the admin page and set the status of the most recent job to "complete". +Unintuitively, you should also set "has_error" to `False`, despite the fact that the job likely errored. +This is due to a legacy issue with how that field is used. From 8af6d0882e4eac4b83b57223bc40eac8020eb140 Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Thu, 14 Dec 2023 10:47:45 +0200 Subject: [PATCH 19/22] add config files --- docs/systems-administration/overview.md | 41 ++++++++++++++----------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/docs/systems-administration/overview.md b/docs/systems-administration/overview.md index aa372c387..a080d0349 100644 --- a/docs/systems-administration/overview.md +++ b/docs/systems-administration/overview.md @@ -16,6 +16,8 @@ It is a Python / Django application, based on RapidSMS. In general system administrators should not need to modify cStock code, but it would be necessary to add new features or fix bugs. +To get up and running with the cStock code, see [the development setup documentation](/dev-setup/). + ## Key Services cStock consists of the following key services: @@ -44,36 +46,39 @@ In general, all of these need to be running and functioning properly for cStock The web application is the business logic that powers the cStock web application. Here is the key information for it: -| Item | Value | -|------------------------|---------------------------------------------------------------------------------------------------------| -| Process | Django (Gunicorn) | -| Log files | `/home/cstock/www/cstock/log/gunicorn.command.log` and `/home/cstock/www/cstock/log/gunicorn.error.log` | -| View status | `sudo supervisorctl status` (gunicorn process) | -| Stop / Start / Restart | `sudo supervisorctl stop gunicorn` (or `start`, or `restart`) | +| Item | Value | +|-------------------------|---------------------------------------------------------------------------------------------------------| +| Process | Django (Gunicorn) | +| Log files | `/home/cstock/www/cstock/log/gunicorn.command.log` and `/home/cstock/www/cstock/log/gunicorn.error.log` | +| Configuration file | `/home/cstock/www/cstock/code_root/logistics_project/localsettings.py` | +| View status | `sudo supervisorctl status` (gunicorn process) | +| Stop / Start / Restart | `sudo supervisorctl stop gunicorn` (or `start`, or `restart`) | ### SMS Application Process The SMS web application runs alongside the web application to manage SMS workflows. Here is the key information for it: -| Item | Value | -|------------------------|----------------------------------------------------------------------| -| Process | Django (RapidSMS) | -| Log files | `/home/cstock/www/cstock/log/rapidsms.log` | -| View status | `sudo supervisorctl status` (rapidsms-router process) | -| Stop / Start / Restart | `sudo supervisorctl stop rapidsms-router` (or `start`, or `restart`) | +| Item | Value | +|------------------------|--------------------------------------------------------------------------| +| Process | Django (RapidSMS) | +| Log files | `/home/cstock/www/cstock/log/rapidsms.log` | +| Configuration file | `/home/cstock/www/cstock/code_root/logistics_project/localsettings.py` | +| View status | `sudo supervisorctl status` (rapidsms-router process) | +| Stop / Start / Restart | `sudo supervisorctl stop rapidsms-router` (or `start`, or `restart`) | ### Background Task Process The background task process runs alongside the web application to manage background tasks and scheduled SMS messages. Here is the key information for it: -| Item | Value | -|------------------------|-------------------------------------------------------------| -| Process | Django (Celery) | -| Log files | `/home/cstock/www/cstock/log/celery.error.log` | -| View status | `sudo supervisorctl status` (celery process) | -| Stop / Start / Restart | `sudo supervisorctl stop celery` (or `start`, or `restart`) | +| Item | Value | +|------------------------|-------------------------------------------------------------------------| +| Process | Django (Celery) | +| Log files | `/home/cstock/www/cstock/log/celery.error.log` | +| Configuration file | `/home/cstock/www/cstock/code_root/logistics_project/localsettings.py` | +| View status | `sudo supervisorctl status` (celery process) | +| Stop / Start / Restart | `sudo supervisorctl stop celery` (or `start`, or `restart`) | ### Database From c51a7fc6b695399a237baa2260e640e2b90d56ea Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Thu, 14 Dec 2023 10:52:32 +0200 Subject: [PATCH 20/22] expanding server access --- docs/systems-administration/common-tasks.md | 28 ++++++++------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/docs/systems-administration/common-tasks.md b/docs/systems-administration/common-tasks.md index d4103921f..0a33cf035 100644 --- a/docs/systems-administration/common-tasks.md +++ b/docs/systems-administration/common-tasks.md @@ -45,29 +45,23 @@ You can restart individual processes with: sudo supervisorctl restart ``` -## Restarting the web server +## Restarting processes -To restart the web server you can run: +Sometimes other processes (te web server, database, etc.) need to be restarted. +To manage those you can find the information in the [overview page](./overview). -``` -sudo service nginx restart -``` - -## Restarting the database - -To restart the database you can run: +## Making configuration changes -``` -sudo service mysql restart -``` +If you need to make any configuration changes, for example, updating passwords or IP addresses, +those happen in the relevant configuration files for whichever service you need to update. -## Restart the SMS gateway +To find the service's configuration file, look it up on the [overview page](./overview). -To restart the SMS gateway you can run: +For example, to update the credentials for the TNM or Airtel SMS gateway, you would modify +the SMS gateway (Kannel) configuration file at `/etc/kannel/kannel.conf`. -``` -sudo service kannel restart -``` +Typically, whenever you make changes to a service, you also need to restart the service, +as per the instructions above. ## Getting an application shell From 7865a6b133de01ae5ebe65e34b0c98132e05935f Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Thu, 14 Dec 2023 11:25:33 +0200 Subject: [PATCH 21/22] add ssh docs --- docs/systems-administration/server-access.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/systems-administration/server-access.md b/docs/systems-administration/server-access.md index e78667204..270820af5 100644 --- a/docs/systems-administration/server-access.md +++ b/docs/systems-administration/server-access.md @@ -37,10 +37,12 @@ For different operating systems, refer to the VPN documentation provided by the ## Logging in to cstock -Once on the VPN, you can access cstock by running: +Once on the VPN, you can access cstock using the SSH command by running: ```bash ssh cstock@10.10.100.77 ``` If you have an individual user account, replace `cstock` with your username. + +For more information on using SSH, see [this page](https://www.ucl.ac.uk/isd/what-ssh-and-how-do-i-use-it). From b4c89b2cecd247ee3362b82e4882043ba61fa55c Mon Sep 17 00:00:00 2001 From: Cory Zue Date: Thu, 14 Dec 2023 11:31:11 +0200 Subject: [PATCH 22/22] [ci skip] fix typos --- docs/systems-administration/common-tasks.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/systems-administration/common-tasks.md b/docs/systems-administration/common-tasks.md index 0a33cf035..45e051ee1 100644 --- a/docs/systems-administration/common-tasks.md +++ b/docs/systems-administration/common-tasks.md @@ -45,9 +45,9 @@ You can restart individual processes with: sudo supervisorctl restart ``` -## Restarting processes +## Restarting other processes -Sometimes other processes (te web server, database, etc.) need to be restarted. +Sometimes other processes (the web server, database, etc.) need to be restarted. To manage those you can find the information in the [overview page](./overview). ## Making configuration changes