Rewrite spotter-appmgr (partial squashmerge)
This commit is contained in:
		
							parent
							
								
									19ec74de4d
								
							
						
					
					
						commit
						c5e55e7f2e
					
				| @ -7,12 +7,9 @@ docker image ls | grep -q java || $(realpath $(dirname "${0}"))/java.sh | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t activemq ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/activemq /etc/init.d/activemq | ||||
| rc-update -u | ||||
| 
 | ||||
| # Configure ActiveMQ | ||||
| mkdir -p /srv/activemq/data | ||||
| chown -R 61616:61616 /srv/activemq/data | ||||
| 
 | ||||
| # Configure Solr service | ||||
| cp ${SOURCE_DIR}/etc/init.d/activemq /etc/init.d/activemq | ||||
| rc-update add activemq | ||||
| service activemq start | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="ActiveMQ docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net | ||||
| 	use dns logger netmount | ||||
| 	need docker | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
|  | ||||
							
								
								
									
										17
									
								
								basic.sh
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								basic.sh
									
									
									
									
									
								
							| @ -27,20 +27,23 @@ cp ${SOURCE_DIR}/etc/conf.d/ntpd /etc/conf.d/ntpd | ||||
| 
 | ||||
| # Create a self-signed certificate | ||||
| mkdir /etc/ssl/private | ||||
| openssl req -x509 -new -out /etc/ssl/certs/services.pem -keyout /etc/ssl/private/services.key -nodes -days 3654 -subj "/CN=$(hostname)" | ||||
| openssl req -x509 -new -out /etc/ssl/certs/services.pem -keyout /etc/ssl/private/services.key -nodes -days 7305 -subj "/CN=$(hostname)" | ||||
| chmod 640 /etc/ssl/private/services.key | ||||
| 
 | ||||
| # Configure acme.sh | ||||
| cp ${SOURCE_DIR}/usr/local/bin/update-acme.sh /usr/local/bin/update-acme.sh | ||||
| /usr/local/bin/update-acme.sh | ||||
| 
 | ||||
| # Configure nginx | ||||
| cp ${SOURCE_DIR}/etc/nginx/nginx.conf /etc/nginx/nginx.conf | ||||
| 
 | ||||
| # Download and configure acme.sh | ||||
| mkdir /etc/acme.sh.d | ||||
| wget https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh -O /usr/bin/acme.sh | ||||
| sed -i 's|$HOME/.$PROJECT_NAME|/etc/acme.sh.d|' /usr/bin/acme.sh | ||||
| cp ${SOURCE_DIR}/etc/periodic/daily/acme-sh /etc/periodic/daily/acme-sh | ||||
| chmod +x /usr/bin/acme.sh | ||||
| 
 | ||||
| # Copy Spotter resources | ||||
| mkdir /etc/spotter | ||||
| cp ${SOURCE_DIR}/etc/spotter/apps.json /etc/spotter/apps.json | ||||
| cp ${SOURCE_DIR}/usr/local/bin/spotter-appmgr /usr/local/bin/spotter-appmgr | ||||
| cp ${SOURCE_DIR}/srv/config.json /srv/config.json | ||||
| cp ${SOURCE_DIR}/usr/bin/spotter-appmgr /usr/bin/spotter-appmgr | ||||
| cp -r ${SOURCE_DIR}/srv/portal /srv/portal | ||||
| 
 | ||||
| # Configure services | ||||
|  | ||||
| @ -36,7 +36,5 @@ start_pre() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	until [ -e /var/run/docker.sock ]; do | ||||
| 		usleep 100000 | ||||
| 	done | ||||
| 	ewaitfile 1 /var/run/docker.sock | ||||
| } | ||||
|  | ||||
							
								
								
									
										3
									
								
								basic/etc/periodic/daily/acme-sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								basic/etc/periodic/daily/acme-sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,3 @@ | ||||
| #!/bin/sh | ||||
| 
 | ||||
| [ -x /usr/bin/acme.sh ] && /usr/bin/acme.sh --cron >/dev/null | ||||
| @ -1 +0,0 @@ | ||||
| {"_": {"domain": "spotter.vm", "port": "443"}, "cluster-spotter": {}} | ||||
							
								
								
									
										134
									
								
								basic/srv/config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								basic/srv/config.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,134 @@ | ||||
| { | ||||
|     "apps":{ | ||||
|         "ckan":{ | ||||
|             "host":"ckan", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "crisiscleanup":{ | ||||
|             "host":"cc", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "cts":{ | ||||
|             "host":"cts", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "frontlinesms":{ | ||||
|             "host":"sms", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "gnuhealth":{ | ||||
|             "host":"gh", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":["gnuhealth-clients"], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "kanboard":{ | ||||
|             "host":"kb", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":["kanboard-mobile"], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "mifosx":{ | ||||
|             "host":"mifosx", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":["mifosx-mobile"], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "motech":{ | ||||
|             "host":"motech", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "opendatakit":{ | ||||
|             "host":"odk", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":["opendatakit-clients"], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "opendatakit-build":{ | ||||
|             "host":"odkbuild", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "openmapkit":{ | ||||
|             "host":"omk", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":["geoodk-clients", "openmapkit-clients"], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "pandora":{ | ||||
|             "host":"pandora", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "sahana":{ | ||||
|             "host":"sahana", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "sahana-demo":{ | ||||
|             "host":"sahana-demo", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "sambro":{ | ||||
|             "host":"sambro", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":["sambro-mobile"], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "seeddms":{ | ||||
|             "host":"dms", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "sigmah":{ | ||||
|             "host":"sigmah", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":[], | ||||
|             "tiles-shown":false | ||||
|         }, | ||||
|         "ushahidi":{ | ||||
|             "host":"ush", | ||||
|             "login":"N/A", | ||||
|             "password":"N/A", | ||||
|             "tiles":["ushahidi-mobile"], | ||||
|             "tiles-shown":false | ||||
|         } | ||||
|     }, | ||||
|     "host":{ | ||||
|         "domain":"spotter.vm", | ||||
|         "port": "443" | ||||
|     } | ||||
| } | ||||
| @ -50,7 +50,7 @@ header p { | ||||
|     margin: 0px; | ||||
| } | ||||
| 
 | ||||
| .c, .c2 { | ||||
| .c { | ||||
|     background-color: white; | ||||
|     position: relative; | ||||
|     min-width: 365px; | ||||
| @ -62,9 +62,6 @@ header p { | ||||
|     margin-right: 13px; | ||||
|     border: solid 1px black; | ||||
|     padding: 10px; | ||||
| } | ||||
| 
 | ||||
| .c { | ||||
|     display: none; | ||||
| } | ||||
| 
 | ||||
| @ -73,6 +70,10 @@ header p { | ||||
|     width: 95%; | ||||
| } | ||||
| 
 | ||||
| .visible { | ||||
|     display: initial; | ||||
| } | ||||
| 
 | ||||
| .ico { | ||||
|     margin-right: 5px; | ||||
|     width: 20px; | ||||
|  | ||||
							
								
								
									
										15
									
								
								basic/srv/portal/error.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								basic/srv/portal/error.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="cs"> | ||||
|     <head> | ||||
|         <meta charset="utf-8"> | ||||
|         <meta name="author" content="TS"> | ||||
|         <meta name="copyright" content="page is under CC BY-NC-ND 3.0 CZ"> | ||||
|         <meta name="generator" content="Spotter.ngo"> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
|         <title>Chyba</title> | ||||
|     </head> | ||||
|     <body> | ||||
|         <h1>Chyba spojení</h1> | ||||
|         <p>Aplikace, ke které se pokoušíte připojit, není dostupná. Nejspíše byla vypnuta správcem serveru.</p> | ||||
|     </body> | ||||
| </html> | ||||
| @ -19,7 +19,7 @@ | ||||
|         </header> | ||||
| 
 | ||||
|         <div class="c c2" id="sahana"> | ||||
|             <h2><a href="#"><img src="img/EDEN.png" alt="Sahana EDEN" title="Sahana EDEN">Sahana EDEN</a></h2> | ||||
|             <h2><a href="https://sahana.{host}"><img src="img/EDEN.png" alt="Sahana EDEN" title="Sahana EDEN">Sahana EDEN</a></h2> | ||||
|             <p><strong>Registr kontaktů</strong> asociací, organizací, jednotek zaměstnanců, dobrovolníků, <strong>Registr prostředků</strong>, materiálních zdrojů určených pro činnost v krizových situacích, <strong>logistika</strong> krizového zboží ve skladištích, úkrytech, <strong>organizace lidských zdrojů</strong>, diobrovolníků, <strong>mapová vizualizace</strong> pro lokalizaci a popis krizové události a <strong>mnoho dalších funkcí</strong>.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -28,7 +28,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="sahana-demo"> | ||||
|             <h2><a href="#"><img src="img/EDEN.png" alt="Sahana EDEN DEMO" title="Sahana EDEN DEMO">Sahana EDEN DEMO</a></h2> | ||||
|             <h2><a href="https://sahana-demo.{host}"><img src="img/EDEN.png" alt="Sahana EDEN DEMO" title="Sahana EDEN DEMO">Sahana EDEN DEMO</a></h2> | ||||
|             <p>Přístup určený k bezpečnému vyzkoušení aplikace. Zde můžete přidávat i mazat testovací data.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -37,7 +37,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="sambro"> | ||||
|             <h2><a href="#"><img src="img/EDEN.png" alt="Sahana EDEN SAMBRO" title="Sahana EDEN SAMBRO">Sahana EDEN SAMBRO</a></h2> | ||||
|             <h2><a href="https://sambro.{host}"><img src="img/EDEN.png" alt="Sahana EDEN SAMBRO" title="Sahana EDEN SAMBRO">Sahana EDEN SAMBRO</a></h2> | ||||
|             <p>Samostatná instance Sahana EDEN s šablonou SAMBRO.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -52,12 +52,12 @@ | ||||
|                 <a href="https://play.google.com/store/apps/details?id=io.sahana.sambro.mobile"><img src="img/android.png" class="ico" alt="Android">Android 4.0 a vyšší</a> | ||||
|             </p> | ||||
|             <ul> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl"></span></li> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl">https://sambro.{host}/eden/</span></li> | ||||
|             </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="ccleanup"> | ||||
|             <h2><a href="#"><img src="img/Crisis_Cleanup.png" alt="Crisis Cleanup" title="Crisis Cleanup">Crisis Cleanup</a></h2> | ||||
|         <div class="c" id="crisiscleanup"> | ||||
|             <h2><a href="https://cc.{host}"><img src="img/Crisis_Cleanup.png" alt="Crisis Cleanup" title="Crisis Cleanup">Crisis Cleanup</a></h2> | ||||
|             <p><strong>Mapování krizové pomoci</strong> při odstraňování následků katastrof a koordinaci práce. Jde o majetek, ne o lidi.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -66,7 +66,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="ckan"> | ||||
|             <h2><a href="#"><img src="img/CKAN.png" alt="CKAN" title="CKAN">CKAN</a></h2> | ||||
|             <h2><a href="https://ckan.{host}"><img src="img/CKAN.png" alt="CKAN" title="CKAN">CKAN</a></h2> | ||||
|             <p><strong>Repository</strong> management a datová analýza pro vytváření otevřených dat.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -74,27 +74,27 @@ | ||||
|             </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="odkbuild"> | ||||
|             <h2><a href="#"><img src="img/ODK.png" alt="Open Data Kit" title="Open Data Kit">ODK Build</a></h2> | ||||
|         <div class="c" id="opendatakit-build"> | ||||
|             <h2><a href="https://odkbuild.{host}"><img src="img/ODK.png" alt="Open Data Kit" title="Open Data Kit">ODK Build</a></h2> | ||||
|             <p><strong>Sběr dat s pomocí smartphone</strong>.<br>Aplikace pro návrh formulářů<br> | ||||
|                 <p><a href="http://opendatakit.org/xiframe/">XLSForm</a> - online konverter XLS.<br> | ||||
|                 <a href="https://opendatakit.org/downloads/download-info/odk-formuploader/"><img src="img/java.png" class="ico" alt="ODK Form Uploader">ODK Form Uploader</a><br> | ||||
|                 <a href="https://opendatakit.org/downloads/download-info/odk-validate-2/"><img src="img/java.png" class="ico" alt="ODK Validate">ODK Validate</a></p> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="odk-clients"> | ||||
|         <div class="c" id="opendatakit-clients"> | ||||
|             <h2><a href="#"><img src="img/ODK_Collect.png" alt="Open Data Kit" title="Open Data Kit">ODK Collect</a></h2> | ||||
|             <p>Mobilní aplikace<br> | ||||
|                 <a href="https://play.google.com/store/apps/details?id=org.odk.collect.android"><img src="img/android.png" class="ico" alt="ODK Collect">ODK Collect pro Android</a><br> | ||||
|                 <a href="https://opendatakit.org/downloads/download-info/odk-briefcase/"><img src="img/java.png" class="ico" alt="ODK Briefcase">ODK Briefcase</a><br> | ||||
|             </p> | ||||
|             <ul> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl"></span></li> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl">https://odk.{host}/aggregate</span></li> | ||||
|             </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="odk"> | ||||
|             <h2><a href="#"><img src="img/ODK.png" alt="Open Data Kit" title="Open Data Kit">ODK Aggregate</a></h2> | ||||
|         <div class="c" id="opendatakit"> | ||||
|             <h2><a href="https://odk.{host}"><img src="img/ODK.png" alt="Open Data Kit" title="Open Data Kit">ODK Aggregate</a></h2> | ||||
|             <p><strong>Sběr dat s pomocí smartphone</strong>.<br> | ||||
|                 <a href="http://geoodk.com">GeoODK Collect</a> - náhrada papírových dotazníků smartphonem. | ||||
|             </p> | ||||
| @ -104,8 +104,8 @@ | ||||
|             </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="omk"> | ||||
|             <h2><a href="#"><img src="img/OMK.png" alt="Open Map Kit" title="Open Map Kit">OpenMapKit Server</a></h2> | ||||
|         <div class="c" id="openmapkit"> | ||||
|             <h2><a href="https://omk.{host}"><img src="img/OMK.png" alt="Open Map Kit" title="Open Map Kit">OpenMapKit Server</a></h2> | ||||
|             <p><strong>Sběr dat s pomocí smartphone</strong>.<br> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -119,23 +119,23 @@ | ||||
|                 <a href="https://play.google.com/store/apps/details?id=com.geoodk.collect.android"><img src="img/android.png" class="ico" alt="GeoODK Collect">GeoODK Collect pro Android</a> | ||||
|             </p> | ||||
|             <ul> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl"></span></li> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl">https://omk.{host}</span></li> | ||||
|             </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="omk-clients"> | ||||
|         <div class="c" id="openmapkit-clients"> | ||||
|             <h2><a href="#"><img src="img/OMK.png" alt="Open Map Kit" title="Open Map Kit">OpenMapKit</a></h2> | ||||
|             <p>Mobilní aplikace<br> | ||||
|                 <a href="https://play.google.com/store/apps/details?id=org.odk.collect.android"><img src="img/android.png" class="ico" alt="ODK Collect">ODK Collect pro Android</a><br> | ||||
|                 <a href="https://play.google.com/store/apps/details?id=org.redcross.openmapkit"><img src="img/android.png" class="ico" alt="Android">OpenMapKit pro Android 4.1 a vyšší</a> | ||||
|             </p> | ||||
|             <ul> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl"></span></li> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl">https://omk.{host}</span></li> | ||||
|             </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="flsms"> | ||||
|             <h2><a href="#"><img src="img/FrontlineSMS.png" alt="FrontlineSMS" title="FrontlineSMS">FrontlineSMS</a></h2> | ||||
|         <div class="c" id="frontlinesms"> | ||||
|             <h2><a href="https://sms.{host}"><img src="img/FrontlineSMS.png" alt="FrontlineSMS" title="FrontlineSMS">FrontlineSMS</a></h2> | ||||
|             <p><strong>SMS messaging</strong> přes veřejné datové brány</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -144,7 +144,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="seeddms"> | ||||
|             <h2><a href="#"><img src="img/SeedDMS.png" alt="SeedDMS" title="SeedDMS">SeedDMS</a></h2> | ||||
|             <h2><a href="https://dms.{host}"><img src="img/SeedDMS.png" alt="SeedDMS" title="SeedDMS">SeedDMS</a></h2> | ||||
|             <p><strong>Dokument management</strong> na dokumentaci a projektovou dokumentaci</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -153,7 +153,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="pandora"> | ||||
|             <h2><a href="#"><img src="img/Pandora.png" alt="Pan.do/ra" title="Pan.do/ra">Pan.do/ra</a></h2> | ||||
|             <h2><a href="https://pandora.{host}"><img src="img/Pandora.png" alt="Pan.do/ra" title="Pan.do/ra">Pan.do/ra</a></h2> | ||||
|             <p><strong>Media management</strong> na foto a video z krizové události. Tvorba metadat, komentářů, lokalizace v čase a na mapě.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -162,7 +162,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="ushahidi"> | ||||
|             <h2><a href="#"><img src="img/Ushahidi.png" alt="Ushahidi" title="Ushahidi">Ushahidi</a></h2> | ||||
|             <h2><a href="https://ush.{host}"><img src="img/Ushahidi.png" alt="Ushahidi" title="Ushahidi">Ushahidi</a></h2> | ||||
|             <p>Reakce na krizovou událost. Shromažďujte zprávy od obětí a pracovníků v terénu prostřednictvím SMS, e-mailu, webu, Twitteru.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -177,7 +177,7 @@ | ||||
|                 <a href="https://play.google.com/store/apps/details?id=com.ushahidi.mobile"><img src="img/android.png" class="ico" alt="Android">Android 4.4 a vyšší</a> | ||||
|             </p> | ||||
|             <ul> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl"></span></li> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl">ushahidi.{host}</span></li> | ||||
|             </ul> | ||||
|         </div> | ||||
| 
 | ||||
| @ -189,7 +189,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="kanboard"> | ||||
|             <h2><a href="#"><img src="img/Kanboard.png" alt="Kanboard" title="Kanboard">Kanboard</a></h2> | ||||
|             <h2><a href="https://kb.{host}"><img src="img/Kanboard.png" alt="Kanboard" title="Kanboard">Kanboard</a></h2> | ||||
|             <p>Usnadňuje tvorbu a řízení projektů s pomocí Kanban metodiky.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -204,12 +204,12 @@ | ||||
|                 <a href="https://f-droid.org/packages/in.andres.kandroid/"><img src="img/android.png" class="ico" alt="Android">Kandroid pro Android 4.2 a vyšší</a> | ||||
|             </p> | ||||
|             <ul> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl"></span></li> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl">https://kb.{host}</span></li> | ||||
|             </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="cts"> | ||||
|             <h2><a href="#"><img src="img/CTS.png" alt="CTS" title="CTS">CTS</a></h2> | ||||
|             <h2><a href="https://cts.{host}"><img src="img/CTS.png" alt="CTS" title="CTS">CTS</a></h2> | ||||
|             <p>Logistika hmotné pomoci pro humanitární potřeby.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -218,7 +218,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="gnuhealth"> | ||||
|             <h2><a href="#"><img src="img/GNU_Health.png" alt="GNU Health" title="GNU Health">GNU Health</a></h2> | ||||
|             <h2><a href="https://gh.{host}"><img src="img/GNU_Health.png" alt="GNU Health" title="GNU Health">GNU Health</a></h2> | ||||
|             <p>Zdravotní a nemocniční informační systém.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -235,12 +235,12 @@ | ||||
|                 <a href="https://downloads.tryton.org/4.2/tryton-last.tar.gz"><img src="img/Linux.png" class="ico" alt="Linux">Linux</a> | ||||
|             </p> | ||||
|             <ul> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl"></span></li> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl">gh.{host}</span></li> | ||||
|             </ul> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="sigmah"> | ||||
|             <h2><a href="#"><img src="img/Sigmah.png" alt="Sigmah" title="Sigmah">Sigmah</a></h2> | ||||
|             <h2><a href="https://sigmah.{host}"><img src="img/Sigmah.png" alt="Sigmah" title="Sigmah">Sigmah</a></h2> | ||||
|             <p>Rozpočtování získávání finančních prostředků.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -249,7 +249,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="motech"> | ||||
|             <h2><a href="#"><img src="img/Motech.png" alt="Motech" title="Motech">Motech</a></h2> | ||||
|             <h2><a href="https://motech.{host}"><img src="img/Motech.png" alt="Motech" title="Motech">Motech</a></h2> | ||||
|             <p>Integrace zdravotnických a komunikačních služeb.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -258,7 +258,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="mifosx"> | ||||
|             <h2><a href="#"><img src="img/MifosX.png" alt="Mifos X" title="Mifos X">Mifos X</a></h2> | ||||
|             <h2><a href="https://mifosx.{host}"><img src="img/MifosX.png" alt="Mifos X" title="Mifos X">Mifos X</a></h2> | ||||
|             <p>Nástroj na rozvojovou, humanitární pomoc a mikrofinancování.</p> | ||||
|             <ul> | ||||
|                 <li><strong>Login:</strong> <span class="login"></span></li> | ||||
| @ -272,7 +272,7 @@ | ||||
|                 <a href="https://play.google.com/store/apps/details?id=com.mifos.mifosxdroid"><img src="img/android.png" class="ico" alt="KanBoard">Mifos X client pro Android 3.0 a vyšší</a><br> | ||||
|             </p> | ||||
|             <ul> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl"></span></li> | ||||
|                 <li><strong>URL:</strong> <span class="clienturl">mifosx.{host}</span></li> | ||||
|                 <li><strong>Tenant ID:</strong> <span>default</span></li> | ||||
|             </ul> | ||||
|         </div> | ||||
| @ -296,7 +296,7 @@ | ||||
|             <p><strong>Portable Open Street Map</strong> - softwarový balík na offline používání OpenStreet Map v samostatné virtuální image.</p> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="c" id="cluster-spotter"> | ||||
|         <div class="c visible" id="cluster-spotter"> | ||||
|             <h2><a href="http://spotter.ngo"><img src="img/cluster_spotter.png" alt="Cluster Spotter" title="Cluster Spotter">Cluster Spotter</a></h2> | ||||
|             <p>Info o Misi a Vizi projektu, včetně kontaktu. Zachovejte data bezpečná a neposkytujte je nepovolaným osobám.<br> | ||||
|                 <small>CC 4.0 CZ by <a href="http://trendspotter.cz">TS</a>. Content is based on PD, CC, GNU/GPL. Brand names, trademarks belong to their respective holders.</small> | ||||
|  | ||||
| @ -1,13 +1,21 @@ | ||||
| $(function() { | ||||
|     $.getJSON('apps.json', function(data) { | ||||
|         var host = data._.domain + (data._.port != '443' ? ':'+data._.port : '') | ||||
|         $.each(data, function(id, props) { | ||||
|             var div = $('#'+id).show(); | ||||
|             if (props.hasOwnProperty('url')) | ||||
|                 div.find('h2 a').attr('href', props.url.replace('{host}', host)); | ||||
|             $.each(props, function(key, value) { | ||||
|                 div.find('.'+key).text(value.replace('{host}', host)); | ||||
|             }); | ||||
|     $.getJSON('config.json', function(data) { | ||||
|         $.each(data.apps, function(app, appdata) { | ||||
|             if (!appdata['tiles-shown']) | ||||
|                 return true; | ||||
|             var div = $('#'+app).show(); | ||||
|             div.find('.login').text(appdata.login); | ||||
|             div.find('.password').text(appdata.password); | ||||
|             $.each(appdata.tiles, function(tile) { | ||||
|                 $('#'+tile).show(); | ||||
|             }); | ||||
|         }); | ||||
|         var host = data.host.domain + (data.host.port != '443' ? ':'+data.host.port : '') | ||||
|         $('a').each(function(){ | ||||
|             $(this).attr('href', $(this).attr('href').replace('{host}', host)); | ||||
|         }); | ||||
|         $('span').each(function(){ | ||||
|             $(this).text($(this).text().replace('{host}', host)); | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
|  | ||||
							
								
								
									
										317
									
								
								basic/usr/bin/spotter-appmgr
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										317
									
								
								basic/usr/bin/spotter-appmgr
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,317 @@ | ||||
| #!/usr/bin/python | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| import argparse | ||||
| import json | ||||
| import os | ||||
| import subprocess | ||||
| 
 | ||||
| CONF_FILE = '/srv/config.json' | ||||
| ISSUE_FILE = '/etc/issue' | ||||
| NGINX_DIR = '/etc/nginx/conf.d' | ||||
| 
 | ||||
| NGINX_TEMPLATE = '''server {{ | ||||
|     listen [::]:{port} ssl http2; | ||||
|     server_name {host}.{domain}; | ||||
| 
 | ||||
|     access_log /var/log/nginx/{app}.access.log; | ||||
|     error_log /var/log/nginx/{app}.error.log; | ||||
| 
 | ||||
|     location / {{ | ||||
|         proxy_pass http://{ip}:8080; | ||||
|     }} | ||||
| 
 | ||||
|     error_page 502 /errror.html; | ||||
|     location /error.html {{ | ||||
|         root /srv/portal; | ||||
|     }} | ||||
| }} | ||||
| ''' | ||||
| 
 | ||||
| NGINX_DEFAULT_TEMPLATE = '''server {{ | ||||
|     listen [::]:80 default_server ipv6only=off; | ||||
| 
 | ||||
|     location / {{ | ||||
|         return 301 https://$host:{port}$request_uri; | ||||
|     }} | ||||
|     location /.well-known/acme-challenge/ {{ | ||||
|         root /etc/acme.sh.d; | ||||
|     }} | ||||
| }} | ||||
| 
 | ||||
| server {{ | ||||
|     listen [::]:{port} ssl http2 default_server ipv6only=off; | ||||
|     root /srv/portal; | ||||
|     index index.html; | ||||
| 
 | ||||
|     location / {{ | ||||
|         try_files $uri $uri/ =404; | ||||
|     }} | ||||
|     location /config.json {{ | ||||
|         alias /srv/config.json; | ||||
|     }} | ||||
| 
 | ||||
|     error_page 404 /error.html; | ||||
| }} | ||||
| ''' | ||||
| 
 | ||||
| ISSUE_TEMPLATE = ''' | ||||
| \x1b[1;32m   _____             _   _         __      ____  __  | ||||
|   / ____|           | | | |        \\\\ \\\\    / /  \\\\/  | | ||||
|  | (___  _ __   ___ | |_| |_ ___ _ _\\\\ \\\\  / /| \\\\  / | | ||||
|   \\\\___ \\\\| '_ \\\\ / _ \\\\| __| __/ _ \\\\ '__\\\\ \\\\/ / | |\\\\/| | | ||||
|   ____) | |_) | (_) | |_| ||  __/ |   \\\\  /  | |  | | | ||||
|  |_____/| .__/ \\\\___/ \\\\__|\\\\__\\\\___|_|    \\\\/   |_|  |_| | ||||
|         | |                                          | ||||
|         |_|\x1b[0m | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  \x1b[1;33mUPOZORNĚNÍ:\x1b[0m Neoprávněný přístup k tomuto zařízení je zakázán. | ||||
|  Musíte mít výslovné oprávnění k přístupu nebo konfiguraci tohoto zařízení. | ||||
|  Neoprávněné pokusy a kroky k přístupu nebo používání tohoto systému mohou mít | ||||
|  za následek občanské nebo trestní sankce. | ||||
| 
 | ||||
| 
 | ||||
|  \x1b[1;33mCAUTION:\x1b[0m Unauthozired access to this device is prohibited. | ||||
|  You must have explicit, authorized permission to access or configure this | ||||
|  device. Unauthorized attempts and actions to access or use this system may | ||||
|  result in civil or criminal penalties. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  Pro přístup k aplikacím otevřete URL \x1b[1mhttps://{host}\x1b[0m ve Vašem | ||||
|  internetovém prohlížeči. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| \x1b[0;30m | ||||
| ''' | ||||
| 
 | ||||
| class SpotterManager: | ||||
|     def __init__(self): | ||||
|         # Load JSON configuration | ||||
|         with open(CONF_FILE, 'r') as f: | ||||
|             self.conf = json.load(f) | ||||
|         self.domain = self.conf['host']['domain'] | ||||
|         self.port = self.conf['host']['port'] | ||||
| 
 | ||||
|     def save_conf(self): | ||||
|         # Save a sorted JSON configuration object with indentation | ||||
|         with open(CONF_FILE, 'w') as f: | ||||
|             json.dump(self.conf, f, sort_keys=True, indent=4) | ||||
| 
 | ||||
|     def update_login(self, app, login, password): | ||||
|         # Update login and password for an app in the configuration | ||||
|         if login is not None: | ||||
|             self.conf['apps'][app]['login'] = login | ||||
|         if password is not None: | ||||
|             self.conf['apps'][app]['password'] = password | ||||
|         self.save_conf() | ||||
| 
 | ||||
|     def show_tiles(self, app): | ||||
|         # Update tiles-shown for the app in the configuration | ||||
|         self.conf['apps'][app]['tiles-shown'] = True | ||||
|         self.save_conf() | ||||
| 
 | ||||
|     def hide_tiles(self, app): | ||||
|         # Update tiles-shown for the app in the configuration | ||||
|         self.conf['apps'][app]['tiles-shown'] = False | ||||
|         self.save_conf() | ||||
| 
 | ||||
|     def start_app(self, app): | ||||
|         # Start the actual app service | ||||
|         subprocess.call(['/sbin/service', app, 'start']) | ||||
| 
 | ||||
|     def stop_app(self, app): | ||||
|         # Stop the actual app service | ||||
|         subprocess.call(['/sbin/service', app, 'stop']) | ||||
|         # Stop the app service's dependencies if they are not used by any other running app | ||||
|         deps = self.build_deps_tree() | ||||
|         for dep in self.get_app_deps(app): | ||||
|             if False not in [self.is_app_started(d) for d in deps[dep]]: | ||||
|                 subprocess.call(['/sbin/service', dep, 'stop']) | ||||
| 
 | ||||
|     def build_deps_tree(self): | ||||
|         # Fisrt, build a dictionary of {app: [needs]} | ||||
|         needs = {} | ||||
|         for app in self.conf['apps']: | ||||
|             needs[app] = self.get_app_deps(app) | ||||
|         # Then reverse it to {need: [apps]} | ||||
|         deps = {} | ||||
|         for app, need in needs.iteritems(): | ||||
|             for n in need: | ||||
|                 deps.setdefault(n, []).append(app) | ||||
|         return deps | ||||
| 
 | ||||
|     def get_app_deps(self, app): | ||||
|         # Get "needs" line from init script and split it to list, skipping first two elements (docker, net) | ||||
|         try: | ||||
|             with open(os.path.join('/etc/init.d', app), 'r') as f: | ||||
|                 return [l.split()[2:] for l in f.readlines() if l.startswith('\tneed')][0] | ||||
|         except: | ||||
|             return [] | ||||
| 
 | ||||
|     def is_app_started(self, app): | ||||
|         # Check OpenRC service status without calling any binary | ||||
|         return os.path.exists(os.path.join('/run/openrc/started', app)) | ||||
| 
 | ||||
|     def enable_autostart(self, app): | ||||
|         # Add the app to OpenRC default runlevel | ||||
|         subprocess.call(['/sbin/rc-update', 'add', app]) | ||||
| 
 | ||||
|     def disable_autostart(self, app): | ||||
|         # Remove the app from OpenRC default runlevel | ||||
|         subprocess.call(['/sbin/rc-update', 'del', app]) | ||||
| 
 | ||||
|     def register_proxy(self, app): | ||||
|         # Rebuild nginx configuration using an actual IP of referenced app container | ||||
|         with open(os.path.join(NGINX_DIR, '{}.conf'.format(app)), 'w') as f: | ||||
|             f.write(NGINX_TEMPLATE.format(app=app, host=self.conf['apps'][app]['host'], ip=self.get_container_ip(app), domain=self.domain, port=self.port)) | ||||
|         subprocess.call(['/sbin/service', 'nginx', 'reload']) | ||||
| 
 | ||||
|     def unregister_proxy(self, app): | ||||
|         # Remove nginx configuration to prevent proxy mismatch when the container IP is reassigned to another container | ||||
|         nginx_conf = os.path.join(NGINX_DIR, '{}.conf'.format(app)) | ||||
|         if os.path.exists(nginx_conf): | ||||
|             os.unlink(nginx_conf) | ||||
|             subprocess.call(['/sbin/service', 'nginx', 'reload']) | ||||
| 
 | ||||
|     def get_container_ip(self, app): | ||||
|         # Return an IP address of a container. If the container is not running, return localhost address instead | ||||
|         try: | ||||
|             return subprocess.check_output(['/usr/bin/docker', 'inspect', '-f', '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}', app]).strip() | ||||
|         except: | ||||
|             return '127.0.0.1' | ||||
| 
 | ||||
|     def update_domain(self, domain, port): | ||||
|         self.domain = self.conf['host']['domain'] = domain | ||||
|         self.port = self.conf['host']['port'] = port | ||||
|         self.save_conf() | ||||
|         self.rebuild_nginx() | ||||
|         self.rebuild_issue() | ||||
|         self.restart_apps() | ||||
| 
 | ||||
|     def rebuild_nginx(self): | ||||
|         # Remove all nginx config files to prevent errors during reloads invoked by app restarts | ||||
|         for f in os.listdir(NGINX_DIR): | ||||
|             os.unlink(os.path.join(NGINX_DIR, f)) | ||||
|         # Rebuild nginx config for the portal app and restart nginx to properly bind the new listen port | ||||
|         with open(os.path.join(NGINX_DIR, 'default.conf'), 'w') as f: | ||||
|             f.write(NGINX_DEFAULT_TEMPLATE.format(port=self.port)) | ||||
|         subprocess.call(['/sbin/service', 'nginx', 'restart']) | ||||
| 
 | ||||
|     def rebuild_issue(self): | ||||
|         # Compile the HTTPS host displayed in terminal banner | ||||
|         host = self.domain | ||||
|         # If the dummy host is used, take an IP address of a primary interface instead | ||||
|         if self.domain == 'spotter.vm': | ||||
|             host = subprocess.check_output(['ip', 'route', 'get', '1']).split()[-1] | ||||
|         # Show port number only when using the non-default HTTPS port | ||||
|         if self.port != '443': | ||||
|             host = ':{}'.format(self.port) | ||||
|         # Rebuild the terminal banner | ||||
|         with open(ISSUE_FILE, 'w') as f: | ||||
|             f.write(ISSUE_TEMPLATE.format(host=host)) | ||||
| 
 | ||||
|     def restart_apps(self): | ||||
|         for app in self.conf['apps']: | ||||
|             # Check if a script for internal update of URL in the app exists and is executable and run it | ||||
|             script_path = os.path.join('/srv', app, 'update-url.sh') | ||||
|             if os.path.exists(script_path) and os.access(script_path, os.X_OK): | ||||
|                 subprocess.call([script_path, '{}.{}'.format(self.conf['apps'][app]['host'], self.domain), self.port]) | ||||
|             # If the app is currently running, restart the app service | ||||
|             if self.is_app_started(app): | ||||
|                 subprocess.call(['/sbin/service', app, 'restart']) | ||||
| 
 | ||||
|     def request_cert(self, email): | ||||
|         # Compile an acme.sh command for certificate requisition | ||||
|         cmd = ['/usr/bin/acme.sh', '--issue', '-d', self.domain] | ||||
|         for app in self.conf['apps']: | ||||
|             cmd += ['-d', '{}.{}'.format(self.conf['apps'][app]['host'], self.domain)] | ||||
|         cmd += ['-w', '/etc/acme.sh.d', '--accountemail', email] | ||||
|         # Request the certificate. If the requisition command fails, CalledProcessError will be raised | ||||
|         subprocess.check_output(cmd, stderr=subprocess.STDOUT) | ||||
|         # Install the issued certificate | ||||
|         subprocess.call(['/usr/bin/acme.sh', '--installcert', '-d', self.domain, '--keypath', '/etc/ssl/private/services.key', '--fullchainpath', '/etc/ssl/certs/services.pem', '--reloadcmd', 'service nginx reload']) | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     parser = argparse.ArgumentParser(description='Spotter VM application manager') | ||||
|     subparsers = parser.add_subparsers() | ||||
|      | ||||
|     parser_update_login = subparsers.add_parser('update-login', help='Updates application login') | ||||
|     parser_update_login.set_defaults(action='update-login') | ||||
|     parser_update_login.add_argument('app', help='Application name') | ||||
|     parser_update_login.add_argument('login', help='Administrative login') | ||||
|     parser_update_login.add_argument('password', help='Administrative password') | ||||
| 
 | ||||
|     parser_show_tiles = subparsers.add_parser('show-tiles', help='Shows application tiles in Portal') | ||||
|     parser_show_tiles.set_defaults(action='show-tiles') | ||||
|     parser_show_tiles.add_argument('app', help='Application name') | ||||
| 
 | ||||
|     parser_hide_tiles = subparsers.add_parser('hide-tiles', help='Hides application tiles in Portal') | ||||
|     parser_hide_tiles.set_defaults(action='hide-tiles') | ||||
|     parser_hide_tiles.add_argument('app', help='Application name') | ||||
| 
 | ||||
|     parser_start_app = subparsers.add_parser('start-app', help='Start application including it\'s dependencies') | ||||
|     parser_start_app.set_defaults(action='start-app') | ||||
|     parser_start_app.add_argument('app', help='Application name') | ||||
| 
 | ||||
|     parser_stop_app = subparsers.add_parser('stop-app', help='Stops application including it\'s dependencies if they are not used by another running application') | ||||
|     parser_stop_app.set_defaults(action='stop-app') | ||||
|     parser_stop_app.add_argument('app', help='Application name') | ||||
| 
 | ||||
|     parser_enable_autostart = subparsers.add_parser('enable-autostart', help='Enables application autostart') | ||||
|     parser_enable_autostart.set_defaults(action='enable-autostart') | ||||
|     parser_enable_autostart.add_argument('app', help='Application name') | ||||
| 
 | ||||
|     parser_disable_autostart = subparsers.add_parser('disable-autostart', help='Disables application autostart') | ||||
|     parser_disable_autostart.set_defaults(action='disable-autostart') | ||||
|     parser_disable_autostart.add_argument('app', help='Application name') | ||||
| 
 | ||||
|     parser_register_proxy = subparsers.add_parser('register-proxy', help='Rebuilds nginx proxy target for an application container') | ||||
|     parser_register_proxy.set_defaults(action='register-proxy') | ||||
|     parser_register_proxy.add_argument('app', help='Application name') | ||||
| 
 | ||||
|     parser_unregister_proxy = subparsers.add_parser('unregister-proxy', help='Removes nginx proxy target for an application container') | ||||
|     parser_unregister_proxy.set_defaults(action='unregister-proxy') | ||||
|     parser_unregister_proxy.add_argument('app', help='Application name') | ||||
| 
 | ||||
|     parser_update_domain = subparsers.add_parser('update-domain', help='Rebuilds domain structure of VM with new domain name and new HTTPS port') | ||||
|     parser_update_domain.set_defaults(action='update-domain') | ||||
|     parser_update_domain.add_argument('domain', help='Domain name') | ||||
|     parser_update_domain.add_argument('port', help='HTTPS port') | ||||
| 
 | ||||
|     parser_request_cert = subparsers.add_parser('request-cert', help='Requests and installs Let\'s Encrypt certificate for currently set domain') | ||||
|     parser_request_cert.set_defaults(action='request-cert') | ||||
|     parser_request_cert.add_argument('email', help='Email address to receive certificate notifications') | ||||
| 
 | ||||
|     args = parser.parse_args() | ||||
|     sm = SpotterManager() | ||||
|     if args.action == 'update-login': | ||||
|         sm.update_login(args.app, args.login, args.password) | ||||
|     elif args.action == 'show-tiles': | ||||
|         sm.show_tiles(args.app) | ||||
|     elif args.action == 'hide-tiles': | ||||
|         sm.hide_tiles(args.app) | ||||
|     elif args.action == 'start-app': | ||||
|         sm.start_app(args.app) | ||||
|     elif args.action == 'stop-app': | ||||
|         sm.stop_app(args.app) | ||||
|     elif args.action == 'enable-autostart': | ||||
|         sm.enable_autostart(args.app) | ||||
|     elif args.action == 'disable-autostart': | ||||
|         sm.disable_autostart(args.app) | ||||
|     elif args.action == 'register-proxy': | ||||
|         sm.register_proxy(args.app) | ||||
|     elif args.action == 'unregister-proxy': | ||||
|         sm.unregister_proxy(args.app) | ||||
|     elif args.action == 'update-domain': | ||||
|         sm.update_domain(args.domain, args.port) | ||||
|     elif args.action == 'request-cert': | ||||
|         sm.request_cert(args.email) | ||||
| @ -1,197 +0,0 @@ | ||||
| #!/usr/bin/python | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| import argparse | ||||
| import json | ||||
| import os | ||||
| import subprocess | ||||
| 
 | ||||
| CONF_FILE = '/etc/spotter/apps.json' | ||||
| ISSUE_FILE = '/etc/issue' | ||||
| NGINX_DIR = '/etc/nginx/conf.d' | ||||
| 
 | ||||
| NGINX_TEMPLATE = '''server {{ | ||||
|     listen [::]:{port} ssl http2; | ||||
|     server_name {app}.{domain}; | ||||
| 
 | ||||
|     access_log /var/log/nginx/{app}.access.log; | ||||
|     error_log /var/log/nginx/{app}.error.log; | ||||
| 
 | ||||
|     location / {{ | ||||
|         proxy_pass http://{ip}:8080; | ||||
|     }} | ||||
| }} | ||||
| ''' | ||||
| 
 | ||||
| NGINX_DEFAULT_TEMPLATE = '''server {{ | ||||
|     listen [::]:80 default_server ipv6only=off; | ||||
| 
 | ||||
|     location / {{ | ||||
|         return 301 https://$host:{port}$request_uri; | ||||
|     }} | ||||
|     location /.well-known/acme-challenge/ {{ | ||||
|         root /etc/acme.sh.d; | ||||
|     }} | ||||
| }} | ||||
| 
 | ||||
| server {{ | ||||
|     listen [::]:{port} ssl http2 default_server ipv6only=off; | ||||
|     root /srv/portal; | ||||
|     index index.html; | ||||
| 
 | ||||
|     location / {{ | ||||
|         try_files $uri $uri/ =404; | ||||
|     }} | ||||
|     location /apps.json {{ | ||||
|         alias /etc/spotter/apps.json; | ||||
|     }} | ||||
| }} | ||||
| ''' | ||||
| 
 | ||||
| ISSUE_TEMPLATE = ''' | ||||
| \x1b[1;32m   _____             _   _         __      ____  __  | ||||
|   / ____|           | | | |        \\\\ \\\\    / /  \\\\/  | | ||||
|  | (___  _ __   ___ | |_| |_ ___ _ _\\\\ \\\\  / /| \\\\  / | | ||||
|   \\\\___ \\\\| '_ \\\\ / _ \\\\| __| __/ _ \\\\ '__\\\\ \\\\/ / | |\\\\/| | | ||||
|   ____) | |_) | (_) | |_| ||  __/ |   \\\\  /  | |  | | | ||||
|  |_____/| .__/ \\\\___/ \\\\__|\\\\__\\\\___|_|    \\\\/   |_|  |_| | ||||
|         | |                                          | ||||
|         |_|\x1b[0m | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  \x1b[1;33mUPOZORNĚNÍ:\x1b[0m Neoprávněný přístup k tomuto zařízení je zakázán. | ||||
|  Musíte mít výslovné oprávnění k přístupu nebo konfiguraci tohoto zařízení. | ||||
|  Neoprávněné pokusy a kroky k přístupu nebo používání tohoto systému mohou mít | ||||
|  za následek občanské nebo trestní sankce. | ||||
| 
 | ||||
| 
 | ||||
|  \x1b[1;33mCAUTION:\x1b[0m Unauthozired access to this device is prohibited. | ||||
|  You must have explicit, authorized permission to access or configure this | ||||
|  device. Unauthorized attempts and actions to access or use this system may | ||||
|  result in civil or criminal penalties. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  Pro přístup k aplikacím otevřete URL \x1b[1mhttps://{host}/\x1b[0m ve Vašem | ||||
|  internetovém prohlížeči. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| \x1b[0;30m | ||||
| ''' | ||||
| 
 | ||||
| class SpotterManager: | ||||
|     def __init__(self): | ||||
|         self.conf = {} | ||||
|         with open(CONF_FILE, 'r') as f: | ||||
|             self.conf = json.load(f) | ||||
|         self.domain = self.conf["_"]["domain"] | ||||
|         self.port = self.conf["_"]["port"] | ||||
| 
 | ||||
|     def save_conf(self): | ||||
|         with open(CONF_FILE, 'w') as f: | ||||
|             json.dump(self.conf, f) | ||||
| 
 | ||||
|     def add_app(self, app, args): | ||||
|         self.add_app_to_conf(app, args) | ||||
|         if args.url: | ||||
|             self.update_app_conf(app) | ||||
| 
 | ||||
|     def add_app_to_conf(self, app, args): | ||||
|         self.conf[app] = {} | ||||
|         for key in ('url', 'login', 'password'): | ||||
|             value = getattr(args, key) | ||||
|             if value: | ||||
|                 self.conf[app][key] = value | ||||
|         if args.property: | ||||
|             for key, value in args.property: | ||||
|                 self.conf[app][key] = value | ||||
|         self.save_conf() | ||||
| 
 | ||||
|     def update_app_conf(self, app): | ||||
|         script_path = os.path.join('/srv', app, 'update-url.sh') | ||||
|         if os.path.exists(script_path) and os.access(script_path, os.X_OK): | ||||
|             host = '{}.{}'.format(app, self.domain) | ||||
|             subprocess.call([script_path, host, self.port]) | ||||
|             subprocess.call(['service', app, 'restart']) | ||||
| 
 | ||||
|     def update_proxy(self, app): | ||||
|         self.add_app_to_nginx(app) | ||||
|         subprocess.call(['service', 'nginx', 'reload']) | ||||
| 
 | ||||
|     def add_app_to_nginx(self, app): | ||||
|         ip = get_container_ip(app) | ||||
|         with open(os.path.join(NGINX_DIR, '{}.conf'.format(app)), 'w') as f: | ||||
|             f.write(NGINX_TEMPLATE.format(app=app, ip=ip, domain=self.domain, port=self.port)) | ||||
| 
 | ||||
|     def update_domain(self, domain, port): | ||||
|         self.domain = self.conf["_"]["domain"] = domain | ||||
|         self.port = self.conf["_"]["port"] = port | ||||
|         self.save_conf() | ||||
|         self.update_app_confs() | ||||
|         self.rebuild_nginx() | ||||
|         self.rebuild_issue() | ||||
|         subprocess.call(['service', 'nginx', 'restart']) | ||||
| 
 | ||||
|     def update_app_confs(self): | ||||
|         for app in self.conf.iteritems(): | ||||
|             if 'url' in app[1]: | ||||
|                 self.update_app_conf(app[0]) | ||||
| 
 | ||||
|     def rebuild_nginx(self): | ||||
|         for f in os.listdir(NGINX_DIR): | ||||
|             os.unlink(os.path.join(NGINX_DIR, f)) | ||||
|         with open(os.path.join(NGINX_DIR, 'default.conf'), 'w') as f: | ||||
|             f.write(NGINX_DEFAULT_TEMPLATE.format(port=self.port)) | ||||
|         for app in self.conf.iteritems(): | ||||
|             if 'url' in app[1]: | ||||
|                 self.add_app_to_nginx(app[0]) | ||||
| 
 | ||||
|     def rebuild_issue(self): | ||||
|         host = self.domain | ||||
|         if self.port != '443': | ||||
|             host = '{}:{}'.format(host, self.port) | ||||
|         with open(ISSUE_FILE, 'w') as f: | ||||
|             f.write(ISSUE_TEMPLATE.format(host=host)) | ||||
| 
 | ||||
| def get_container_ip(app): | ||||
|     try: | ||||
|         return subprocess.check_output(['docker', 'inspect', '-f', '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}', app]).strip() | ||||
|     except: | ||||
|         return '127.0.0.1' | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     parser = argparse.ArgumentParser(description='Spotter VM application manager') | ||||
|     subparsers = parser.add_subparsers() | ||||
|      | ||||
|     parser_add_app = subparsers.add_parser('add-app', help='Registers a new application') | ||||
|     parser_add_app.set_defaults(action='add-app') | ||||
|     parser_add_app.add_argument('app', help='Application name') | ||||
|     parser_add_app.add_argument('url', nargs='?', help='URL to the application. Use "{host}" as a host placeholder') | ||||
|     parser_add_app.add_argument('login', nargs='?', help='Administrative login') | ||||
|     parser_add_app.add_argument('password', nargs='?', help='Administrative password') | ||||
|     parser_add_app.add_argument('-p', '--property', nargs=2, action='append', help='Add arbitrary key-value to the application properties') | ||||
| 
 | ||||
|     parser_update_proxy = subparsers.add_parser('update-proxy', help='Updates nginx proxy target for an application container') | ||||
|     parser_update_proxy.set_defaults(action='update-proxy') | ||||
|     parser_update_proxy.add_argument('app', help='Application name') | ||||
| 
 | ||||
|     parser_update_domain = subparsers.add_parser('update-domain', help='Rebuilds domain structure of VM with new domain name and new HTTPS port') | ||||
|     parser_update_domain.set_defaults(action='update-domain') | ||||
|     parser_update_domain.add_argument('domain', help='Domain name') | ||||
|     parser_update_domain.add_argument('port', help='HTTPS port') | ||||
| 
 | ||||
|     args = parser.parse_args() | ||||
|     sm = SpotterManager() | ||||
|     if args.action == 'add-app': | ||||
|         sm.add_app(args.app, args) | ||||
|     elif args.action == 'update-proxy': | ||||
|         sm.update_proxy(args.app) | ||||
|     elif args.action == 'update-domain': | ||||
|         sm.update_domain(args.domain, args.port) | ||||
| @ -1,6 +0,0 @@ | ||||
| #!/bin/sh | ||||
| 
 | ||||
| mkdir -p /etc/acme.sh.d | ||||
| wget https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh -O /usr/local/bin/acme.sh | ||||
| sed -i 's/\$HOME\/.\$PROJECT_NAME/\/etc\/acme.sh.d/' /usr/local/bin/acme.sh | ||||
| chmod +x /usr/local/bin/acme.sh | ||||
							
								
								
									
										12
									
								
								ccleanup.sh
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								ccleanup.sh
									
									
									
									
									
								
							| @ -6,9 +6,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/ccleanup | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| docker image ls | grep -q ruby || $(realpath $(dirname "${0}"))/ruby.sh | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t ccleanup ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/ccleanup /etc/init.d/ccleanup | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create database | ||||
| export CCLEANUP_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -28,17 +31,10 @@ envsubst <${SOURCE_DIR}/srv/ccleanup/conf/database.yml >/srv/ccleanup/conf/datab | ||||
| cp ${SOURCE_DIR}/srv/ccleanup/conf/boot.rb /srv/ccleanup/conf/boot.rb | ||||
| cp ${SOURCE_DIR}/srv/ccleanup/conf/initializers/devise.rb /srv/ccleanup/conf/initializers/devise.rb | ||||
| cp ${SOURCE_DIR}/srv/ccleanup/conf/environments/production.rb /srv/ccleanup/conf/environments/production.rb | ||||
| spotter-appmgr update-login ccleanup "${CCLEANUP_ADMIN_EMAIL}" "${CCLEANUP_ADMIN_PWD}" | ||||
| 
 | ||||
| # Populate database | ||||
| envsubst <${SOURCE_DIR}/srv/ccleanup/db/seeds.rb >/tmp/seeds.rb | ||||
| docker run --rm -h ccleanup --link postgres -v /srv/ccleanup/conf:/srv/ccleanup/config ccleanup rake db:schema:load | ||||
| docker run --rm -h ccleanup --link postgres -v /srv/ccleanup/conf:/srv/ccleanup/config -v /tmp/seeds.rb:/srv/ccleanup/db/seeds.rb ccleanup rake db:seed | ||||
| rm /tmp/seeds.rb | ||||
| 
 | ||||
| # Create CrisisCleanup service | ||||
| cp ${SOURCE_DIR}/etc/init.d/ccleanup /etc/init.d/ccleanup | ||||
| rc-update add ccleanup | ||||
| service ccleanup start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app ccleanup "https://ccleanup.{host}/" "${CCLEANUP_ADMIN_EMAIL}" "${CCLEANUP_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Crisis Cleanup docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker postfix postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -18,7 +17,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy ccleanup | ||||
| 	/usr/bin/spotter-appmgr register-proxy ccleanup | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy ccleanup | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
							
								
								
									
										14
									
								
								ckan.sh
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								ckan.sh
									
									
									
									
									
								
							| @ -8,9 +8,14 @@ docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| docker image ls | grep -q redis || $(realpath $(dirname "${0}"))/redis.sh | ||||
| docker image ls | grep -q solr || $(realpath $(dirname "${0}"))/solr.sh | ||||
| service postgres start | ||||
| service redis start | ||||
| service solr start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t ckan ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/ckan /etc/init.d/ckan | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create database | ||||
| export CKAN_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -51,14 +56,7 @@ export CKAN_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| export CKAN_ADMIN_HASH=$(docker run --rm ckan python -c "from passlib.hash import pbkdf2_sha512;print pbkdf2_sha512.encrypt('${CKAN_ADMIN_PWD}')") | ||||
| export CKAN_ADMIN_EMAIL="admin@example.com" | ||||
| envsubst <${SOURCE_DIR}/adminpwd.sql | docker exec -i postgres psql ckan | ||||
| 
 | ||||
| # Configure CKAN service | ||||
| cp ${SOURCE_DIR}/etc/init.d/ckan /etc/init.d/ckan | ||||
| rc-update add ckan | ||||
| service ckan start | ||||
| spotter-appmgr update-login ckan "${CKAN_ADMIN_USER}" "${CKAN_ADMIN_PWD}" | ||||
| 
 | ||||
| # Install cron job | ||||
| cp ${SOURCE_DIR}/etc/periodic/hourly/ckan /etc/periodic/hourly/ckan | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app ckan "https://ckan.{host}/" "${CKAN_ADMIN_USER}" "${CKAN_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,9 +3,7 @@ | ||||
| description="CKAN docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount postfix | ||||
| 	after ckandp redis solr | ||||
| 	need docker ckandp postfix postgres redis solr | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -23,7 +21,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy ckan | ||||
| 	/usr/bin/spotter-appmgr register-proxy ckan | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy ckan | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
| @ -56,7 +56,7 @@ ckan.datastore.default_fts_index_method = gist | ||||
| 
 | ||||
| ## Site Settings | ||||
| 
 | ||||
| ckan.site_url = http://127.0.0.1 | ||||
| ckan.site_url = https://ckan.spotter.vm | ||||
| #ckan.use_pylons_response_cleanup_middleware = true | ||||
| 
 | ||||
| ## Authorization Settings | ||||
|  | ||||
| @ -4,14 +4,11 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/ckandp | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t ckandp ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/ckandp /etc/init.d/ckandp | ||||
| rc-update -u | ||||
| 
 | ||||
| # Configure CKAN DataPusher | ||||
| mkdir -p /srv/ckandp/conf /srv/ckandp/data | ||||
| cp ${SOURCE_DIR}/srv/ckandp/conf/datapusher.wsgi /srv/ckandp/conf/datapusher.wsgi | ||||
| cp ${SOURCE_DIR}/srv/ckandp/conf/datapusher_settings.py /srv/ckandp/conf/datapusher_settings.py | ||||
| chown -R 8004:8004 /srv/ckandp/data | ||||
| 
 | ||||
| # Configure CKAN DataPusher service | ||||
| cp ${SOURCE_DIR}/etc/init.d/ckandp /etc/init.d/ckandp | ||||
| rc-update add ckandp | ||||
| service ckandp start | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="CKAN DataPusher docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net | ||||
| 	use dns logger netmount | ||||
| 	need docker | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
|  | ||||
							
								
								
									
										12
									
								
								cts.sh
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								cts.sh
									
									
									
									
									
								
							| @ -4,9 +4,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/cts | ||||
| 
 | ||||
| # Check prerequisites | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t cts ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/cts /etc/init.d/cts | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create database | ||||
| export CTS_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -35,11 +38,4 @@ export CTS_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| export CTS_ADMIN_HASH=$(docker run --rm -h cts -v /srv/cts/conf:/srv/cts/cts/settings cts python -c "from django.contrib.auth.hashers import make_password; print make_password('${CTS_ADMIN_PWD}')") | ||||
| export CTS_ADMIN_SECRET=$(head -c 12 /dev/urandom | sha256sum | cut -c1-13) | ||||
| envsubst <${SOURCE_DIR}/adminpwd.sql | docker exec -i postgres psql cts | ||||
| 
 | ||||
| # Create CTS service | ||||
| cp ${SOURCE_DIR}/etc/init.d/cts /etc/init.d/cts | ||||
| rc-update add cts | ||||
| service cts start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app cts "https://cts.{host}/" "${CTS_ADMIN_EMAIL}" "${CTS_ADMIN_PWD}" | ||||
| spotter-appmgr update-login cts "${CTS_ADMIN_EMAIL}" "${CTS_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="CTS docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount | ||||
| 	need docker postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -17,7 +16,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy cts | ||||
| 	/usr/bin/spotter-appmgr register-proxy cts | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy cts | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
							
								
								
									
										13
									
								
								flsms.sh
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								flsms.sh
									
									
									
									
									
								
							| @ -7,20 +7,15 @@ docker image ls | grep -q java || $(realpath $(dirname "${0}"))/java.sh | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t flsms ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/flsms /etc/init.d/flsms | ||||
| rc-update -u | ||||
| 
 | ||||
| # Configure FrontlineSMS | ||||
| mkdir -p /srv/flsms/data | ||||
| export FLSMS_ADMIN_USER=admin | ||||
| export FLSMS_ADMIN_USER="admin" | ||||
| export FLSMS_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| export FLSMS_ADMIN_USER_HASH=$(echo -n "${FLSMS_ADMIN_USER}" | base64) | ||||
| export FLSMS_ADMIN_PWD_HASH=$(echo -n "${FLSMS_ADMIN_PWD}" | base64) | ||||
| envsubst <${SOURCE_DIR}/srv/flsms/data/app-settings.properties >/srv/flsms/data/app-settings.properties | ||||
| chown -R 8018:8018 /srv/flsms/data | ||||
| 
 | ||||
| # Create FrontlineSMS service | ||||
| cp ${SOURCE_DIR}/etc/init.d/flsms /etc/init.d/flsms | ||||
| rc-update add flsms | ||||
| service flsms start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app flsms "https://flsms.{host}/" "${FLSMS_ADMIN_USER}" "${FLSMS_ADMIN_PWD}" | ||||
| spotter-appmgr update-login flsms "${FLSMS_ADMIN_USER}" "${FLSMS_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="FrontlineSMS docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net | ||||
| 	use dns logger netmount | ||||
| 	need docker | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -16,7 +15,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy flsms | ||||
| 	/usr/bin/spotter-appmgr register-proxy flsms | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy flsms | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
							
								
								
									
										14
									
								
								gnuhealth.sh
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								gnuhealth.sh
									
									
									
									
									
								
							| @ -5,9 +5,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/gnuhealth | ||||
| # Check prerequisites | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t gnuhealth ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/gnuhealth /etc/init.d/gnuhealth | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create databases | ||||
| export GNUHEALTH_PWD=$(head -c 18 /dev/urandom | base64 |  tr -d '/+=') | ||||
| @ -18,21 +21,14 @@ mkdir -p /srv/gnuhealth/conf/ | ||||
| envsubst <${SOURCE_DIR}/srv/gnuhealth/conf/trytond.conf >/srv/gnuhealth/conf/trytond.conf | ||||
| 
 | ||||
| # Populate database | ||||
| export GNUHEALTH_ADMIN_USER="admin" | ||||
| export GNUHEALTH_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| echo ${GNUHEALTH_ADMIN_PWD} >/tmp/.adminpwd | ||||
| docker run --rm -h gnuhealth --link postgres -v /srv/gnuhealth/conf:/srv/gnuhealth/gnuhealth/tryton/server/config -v /tmp/.adminpwd:/tmp/.adminpwd -e TRYTONPASSFILE=/tmp/.adminpwd gnuhealth /srv/gnuhealth/gnuhealth/tryton/server/trytond-4.2.10/bin/trytond-admin -d gnuhealth --all -v | ||||
| rm -f /tmp/.adminpwd | ||||
| spotter-appmgr update-login gnuhealth "${GNUHEALTH_ADMIN_USER}" "${GNUHEALTH_ADMIN_PWD}" | ||||
| 
 | ||||
| # Populate demo database | ||||
| wget http://health.gnu.org/downloads/postgres_dumps/gnuhealth-32-demo.sql.gz -O /tmp/gnuhealth_demo.sql.gz | ||||
| zcat /tmp/gnuhealth_demo.sql.gz | docker exec -i -e PGPASSWORD=${GNUHEALTH_PWD} postgres psql gnuhealth_demo gnuhealth | ||||
| rm -f /tmp/gnuhealth_demo.sql.gz | ||||
| 
 | ||||
| # Create GNU Health service | ||||
| cp ${SOURCE_DIR}/etc/init.d/gnuhealth /etc/init.d/gnuhealth | ||||
| rc-update add gnuhealth | ||||
| service gnuhealth start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app gnuhealth "https://gnuhealth.{host}/index.html" admin "${GNUHEALTH_ADMIN_PWD}" | ||||
| spotter-appmgr add-app gnuhealth-clients -p clienturl "gnuhealth.{host}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="GNU Health docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -18,7 +17,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy gnuhealth | ||||
| 	/usr/bin/spotter-appmgr register-proxy gnuhealth | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy gnuhealth | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
							
								
								
									
										13
									
								
								kanboard.sh
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								kanboard.sh
									
									
									
									
									
								
							| @ -5,9 +5,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/kanboard | ||||
| # Check prerequisites | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t kanboard ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/kanboard /etc/init.d/kanboard | ||||
| rc-update -u | ||||
| 
 | ||||
| # Populate database | ||||
| export KANBOARD_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -22,15 +25,7 @@ export KANBOARD_ADMIN_USER=admin | ||||
| export KANBOARD_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| export KANBOARD_ADMIN_HASH=$(docker run --rm kanboard php -r "echo password_hash('${KANBOARD_ADMIN_PWD}', PASSWORD_BCRYPT);") | ||||
| envsubst <${SOURCE_DIR}/adminpwd.sql | docker exec -i postgres psql kanboard | ||||
| 
 | ||||
| # Create KanBoard service | ||||
| cp ${SOURCE_DIR}/etc/init.d/kanboard /etc/init.d/kanboard | ||||
| rc-update add kanboard | ||||
| service kanboard start | ||||
| spotter-appmgr update-login kanboard "${KANBOARD_ADMIN_USER}" "${KANBOARD_ADMIN_PWD}" | ||||
| 
 | ||||
| # Install cron job | ||||
| cp ${SOURCE_DIR}/etc/periodic/daily/kanboard /etc/periodic/daily/kanboard | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app kanboard "https://kanboard.{host}/" "${KANBOARD_ADMIN_USER}" "${KANBOARD_ADMIN_PWD}" | ||||
| spotter-appmgr add-app kanboard-mobile -p clienturl "https://kanboard.{host}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="KanBoard docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker postfix postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -19,7 +18,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy kanboard | ||||
| 	/usr/bin/spotter-appmgr register-proxy kanboard | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy kanboard | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
| @ -4,6 +4,8 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/mariadb | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t mariadb ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/mariadb /etc/init.d/mariadb | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create MariaDB instance | ||||
| mkdir -p /srv/mariadb/conf /srv/mariadb/data | ||||
| @ -18,11 +20,6 @@ if [ ${DEBUG:-0} -eq 1 ]; then | ||||
|     sed -i 's/#general_log/general_log/g' /srv/mariadb/conf/my.cnf | ||||
| fi | ||||
| 
 | ||||
| # Configure MariaDB service | ||||
| cp ${SOURCE_DIR}/etc/init.d/mariadb /etc/init.d/mariadb | ||||
| rc-update add mariadb | ||||
| service mariadb start | ||||
| 
 | ||||
| # Configure MariaDB admin | ||||
| docker exec -i mariadb sh -c 'until [ -x /run/mysqld/mysqld.sock ]; do usleep 100000; done' | ||||
| service mariadb start | ||||
| cat ${SOURCE_DIR}/adminpwd.sql | docker exec -i mariadb mysql | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="MariaDB docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net | ||||
| 	use dns logger netmount | ||||
| 	need docker | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -16,6 +15,10 @@ start() { | ||||
| 	mariadb | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	timeout -t 3 docker exec mariadb sh -c 'until [ -e /run/mysqld/mysqld.sock ]; do usleep 50000; done' | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
| 	/usr/bin/docker stop mariadb | ||||
| } | ||||
|  | ||||
							
								
								
									
										16
									
								
								mifosx.sh
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								mifosx.sh
									
									
									
									
									
								
							| @ -6,9 +6,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/mifosx | ||||
| docker image ls | grep -q mariadb || $(realpath $(dirname "${0}"))/mariadb.sh | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q tomcat || $(realpath $(dirname "${0}"))/tomcat.sh | ||||
| service mariadb start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t mifosx ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/mifosx /etc/init.d/mifosx | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create databases | ||||
| export MIFOSX_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -24,22 +27,17 @@ envsubst <${SOURCE_DIR}/srv/mifosx/conf/context.xml >/srv/mifosx/conf/context.xm | ||||
| cp ${SOURCE_DIR}/srv/mifosx/conf/server.xml /srv/mifosx/conf/server.xml | ||||
| cp ${SOURCE_DIR}/srv/mifosx/update-url.sh /srv/mifosx/update-url.sh | ||||
| 
 | ||||
| # Create Mifos X service | ||||
| cp ${SOURCE_DIR}/etc/init.d/mifosx /etc/init.d/mifosx | ||||
| rc-update add mifosx | ||||
| # Populate database | ||||
| service mifosx start | ||||
| 
 | ||||
| # Update admin account | ||||
| echo `date` '- Waiting for database to be populated. This should take about a minute.' | ||||
| until docker logs mifosx 2>&1 | grep -q 'Migrating schema `mifostenant-default` to version 5000'; do | ||||
|     sleep 1 | ||||
| done | ||||
| 
 | ||||
| # Update admin account | ||||
| export MIFOSX_ADMIN_USER=admin | ||||
| export MIFOSX_ADMIN_EMAIL=admin@example.com | ||||
| export MIFOSX_ADMIN_PWD=$(head -c 12 /dev/urandom | base64 | tr -d "+") | ||||
| export MIFOSX_ADMIN_HASH=$(echo -n "${MIFOSX_ADMIN_PWD}{1}" | sha256sum | awk '{print $1}') | ||||
| envsubst <${SOURCE_DIR}/adminpwd.sql | docker exec -i mariadb mysql mifostenant-default | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app mifosx "https://mifosx.{host}/community-app/" "${MIFOSX_ADMIN_USER}" "${MIFOSX_ADMIN_PWD}" | ||||
| spotter-appmgr add-app mifosx-mobile -p clienturl "mifosx.{host}" | ||||
| spotter-appmgr update-login mifosx "${MIFOSX_ADMIN_USER}" "${MIFOSX_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Mifos X docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net mariadb | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker mariadb postfix | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -19,7 +18,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy mifosx | ||||
| 	/usr/bin/spotter-appmgr register-proxy mifosx | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy mifosx | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
| @ -68,7 +68,7 @@ | ||||
|     --> | ||||
|     <Connector port="8080" protocol="HTTP/1.1" | ||||
|                connectionTimeout="20000" | ||||
|                proxyName="127.0.0.1" | ||||
|                proxyName="mifosx.spotter.vm" | ||||
|                proxyPort="443" | ||||
|                scheme="https" secure="true" | ||||
|                redirectPort="8443" /> | ||||
|  | ||||
							
								
								
									
										13
									
								
								motech.sh
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								motech.sh
									
									
									
									
									
								
							| @ -7,9 +7,12 @@ docker image ls | grep -q activemq || $(realpath $(dirname "${0}"))/activemq.sh | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| docker image ls | grep -q tomcat || $(realpath $(dirname "${0}"))/tomcat.sh | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t motech ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/motech /etc/init.d/motech | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create database | ||||
| export MOTECH_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -24,12 +27,8 @@ cp ${SOURCE_DIR}/srv/motech/conf/config/org.motechproject.motech-platform-email/ | ||||
| chown -R 8013:8013 /srv/motech/conf | ||||
| cp ${SOURCE_DIR}/srv/motech/update-url.sh /srv/motech/update-url.sh | ||||
| 
 | ||||
| # Create Motech service | ||||
| cp ${SOURCE_DIR}/etc/init.d/motech /etc/init.d/motech | ||||
| rc-update add motech | ||||
| # Populate database and create admin account | ||||
| service motech start | ||||
| 
 | ||||
| # Configure Motech admin | ||||
| echo `date` '- Waiting for database to be populated. This should take about a minute.' | ||||
| MOTECH_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' motech) | ||||
| until curl -s "http://${MOTECH_IP}:8080/motech/module/server/startup/" | grep -q adminLogin; do | ||||
| @ -39,6 +38,4 @@ export MOTECH_ADMIN_USER="admin" | ||||
| export MOTECH_ADMIN_EMAIL="admin@example.com" | ||||
| export MOTECH_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| curl -H "Content-Type: application/json" -X POST -d "{\"adminLogin\":\"${MOTECH_ADMIN_USER}\",\"adminEmail\":\"${MOTECH_ADMIN_EMAIL}\",\"adminPassword\":\"${MOTECH_ADMIN_PWD}\",\"adminConfirmPassword\":\"${MOTECH_ADMIN_PWD}\",\"language\":\"cs\",\"providerName\":\"\",\"providerUrl\":\"\",\"schedulerUrl\":\"\"}" http://${MOTECH_IP}:8080/motech/module/server/startup/ | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app motech "https://motech.{host}/motech/" "${MOTECH_ADMIN_USER}" "${MOTECH_ADMIN_PWD}" | ||||
| spotter-appmgr update-login motech "${MOTECH_ADMIN_USER}" "${MOTECH_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Motech docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres activemq | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker activemq postfix postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -19,7 +18,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy motech | ||||
| 	/usr/bin/spotter-appmgr register-proxy motech | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy motech | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
| @ -1,3 +1,3 @@ | ||||
| system.language=en | ||||
| login.mode=repository | ||||
| server.url=http://127.0.0.1 | ||||
| server.url=https://motech.spotter.vm | ||||
|  | ||||
							
								
								
									
										18
									
								
								odk.sh
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								odk.sh
									
									
									
									
									
								
							| @ -6,9 +6,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/odk | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q tomcat || $(realpath $(dirname "${0}"))/tomcat.sh | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t odk ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/odk /etc/init.d/odk | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create databases | ||||
| export ODK_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -24,21 +27,16 @@ cp ${SOURCE_DIR}/srv/odk/conf/server.xml /srv/odk/conf/server.xml | ||||
| cp ${SOURCE_DIR}/srv/odk/update-url.sh /srv/odk/update-url.sh | ||||
| chown -R 8015:8015 /srv/odk/conf | ||||
| 
 | ||||
| # Create OpenDataKit service | ||||
| cp ${SOURCE_DIR}/etc/init.d/odk /etc/init.d/odk | ||||
| rc-update add odk | ||||
| # Populate database | ||||
| service odk start | ||||
| until docker logs odk 2>&1 | grep -q 'org.apache.catalina.startup.Catalina.start'; do | ||||
|     sleep 1 | ||||
| done | ||||
| 
 | ||||
| # Update admin account | ||||
| export ODK_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| export ODK_ADMIN_SALT=$(head -c 4 /dev/urandom | hexdump -e '"%x"') # Must be 8 characters | ||||
| export ODK_ADMIN_BASIC_HASH=$(echo -n "${ODK_ADMIN_PWD}{${ODK_ADMIN_SALT}}" | sha1sum | tr -d " -") | ||||
| export ODK_ADMIN_DIGEST_HASH=$(echo -n "${ODK_ADMIN_USER}:${ODK_ADMIN_REALM}:${ODK_ADMIN_PWD}" | md5sum | tr -d " -") | ||||
| until docker logs odk 2>&1 | grep -q 'org.apache.catalina.startup.Catalina.start'; do | ||||
|     sleep 1 | ||||
| done | ||||
| envsubst <${SOURCE_DIR}/adminpwd.sql | docker exec -i postgres psql odk | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app odk "https://odk.{host}/aggregate/" "${ODK_ADMIN_USER}" "${ODK_ADMIN_PWD}" | ||||
| spotter-appmgr add-app odk-clients -p clienturl "https://odk.{host}/aggregate" | ||||
| spotter-appmgr update-login odk "${ODK_ADMIN_USER}" "${ODK_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="OpenDataKit Aggregate docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker postfix postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -20,7 +19,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy odk | ||||
| 	/usr/bin/spotter-appmgr register-proxy odk | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy odk | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
| @ -68,7 +68,7 @@ | ||||
|     --> | ||||
|     <Connector port="8080" protocol="HTTP/1.1" | ||||
|                connectionTimeout="20000" | ||||
|                proxyName="127.0.0.1" | ||||
|                proxyName="odk.spotter.vm" | ||||
|                proxyPort="443" | ||||
|                scheme="https" secure="true" | ||||
|                redirectPort="8443" /> | ||||
|  | ||||
							
								
								
									
										11
									
								
								odkbuild.sh
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								odkbuild.sh
									
									
									
									
									
								
							| @ -5,9 +5,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/odkbuild | ||||
| # Check prerequisites | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| docker image ls | grep -q ruby || $(realpath $(dirname "${0}"))/ruby.sh | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t odkbuild ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/odkbuild /etc/init.d/odkbuild | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create databases | ||||
| export ODKBUILD_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -18,11 +21,3 @@ export ODKBUILD_COOKIE_SECRET=$(head -c 8 /dev/urandom | hexdump -e '"%x"') | ||||
| mkdir -p /srv/odkbuild/conf | ||||
| envsubst <${SOURCE_DIR}/srv/odkbuild/conf/config.yml >/srv/odkbuild/conf/config.yml | ||||
| docker run --rm -h odkbuild --link postgres -v /srv/odkbuild/conf/config.yml:/srv/odkbuild/config.yml -w /srv/odkbuild odkbuild rake db:migrate | ||||
| 
 | ||||
| # Create OpenDataKit service | ||||
| cp ${SOURCE_DIR}/etc/init.d/odkbuild /etc/init.d/odkbuild | ||||
| rc-update add odkbuild | ||||
| service odkbuild start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app odkbuild "https://odkbuild.{host}/" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="OpenDataKit Build docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount | ||||
| 	need docker postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -17,7 +16,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy odkbuild | ||||
| 	/usr/bin/spotter-appmgr register-proxy odkbuild | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy odkbuild | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
							
								
								
									
										13
									
								
								omk.sh
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								omk.sh
									
									
									
									
									
								
							| @ -7,6 +7,8 @@ docker image ls | grep -q java || $(realpath $(dirname "${0}"))/java.sh | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t omk ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/omk /etc/init.d/omk | ||||
| rc-update -u | ||||
| 
 | ||||
| # Configure OpenMapKit | ||||
| export OMK_ADMIN_USER="admin" | ||||
| @ -15,13 +17,4 @@ mkdir -p /srv/omk/conf /srv/omk/data | ||||
| chown -R 8007:8007 /srv/omk/data | ||||
| docker run --rm -v /srv/omk/data:/mnt/data omk cp -rp /srv/omk/data/. /mnt/data | ||||
| envsubst <${SOURCE_DIR}/srv/omk/conf/settings.js >/srv/omk/conf/settings.js | ||||
| 
 | ||||
| # Configure OpenMapKit service | ||||
| cp ${SOURCE_DIR}/etc/init.d/omk /etc/init.d/omk | ||||
| rc-update add omk | ||||
| service omk start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app omk "https://omk.{host}/" "${OMK_ADMIN_USER}" "${OMK_ADMIN_PWD}" | ||||
| spotter-appmgr add-app omk-clients -p clienturl "https://omk.{host}" | ||||
| spotter-appmgr add-app geoodk-clients -p clienturl "https://omk.{host}" | ||||
| spotter-appmgr update-login omk "${OMK_ADMIN_USER}" "${OMK_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="OpenMapKit docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net | ||||
| 	use dns logger netmount | ||||
| 	need docker | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -17,7 +16,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy omk | ||||
| 	/usr/bin/spotter-appmgr register-proxy omk | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy omk | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
							
								
								
									
										13
									
								
								pandora.sh
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								pandora.sh
									
									
									
									
									
								
							| @ -6,9 +6,13 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/pandora | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| docker image ls | grep -q rabbitmq || $(realpath $(dirname "${0}"))/rabbitmq.sh | ||||
| service postgres start | ||||
| service rabbitmq start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t pandora ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/pandora /etc/init.d/pandora | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create PostgreSQL user and database | ||||
| export PANDORA_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -50,11 +54,4 @@ export PANDORA_ADMIN_EMAIL=admin@example.com | ||||
| export PANDORA_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| export PANDORA_ADMIN_HASH=$(docker run --rm -h pandora -e DJANGO_SETTINGS_MODULE=pandora.settings -v /srv/pandora/conf:/srv/pandora/conf pandora python3 -c "from django.contrib.auth.hashers import make_password; print(make_password('${PANDORA_ADMIN_PWD}'))") | ||||
| envsubst <${SOURCE_DIR}/adminpwd.sql | docker exec -i postgres psql pandora | ||||
| 
 | ||||
| # Configure Pandora service | ||||
| cp ${SOURCE_DIR}/etc/init.d/pandora /etc/init.d/pandora | ||||
| rc-update add pandora | ||||
| service pandora start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app pandora "https://pandora.{host}/" "${PANDORA_ADMIN_USER}" "${PANDORA_ADMIN_PWD}" | ||||
| spotter-appmgr update-login pandora "${PANDORA_ADMIN_USER}" "${PANDORA_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Pan.do/ra docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres rabbitmq | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker postfix postgres rabbitmq | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -20,7 +19,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy pandora | ||||
| 	/usr/bin/spotter-appmgr register-proxy pandora | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy pandora | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
| @ -4,6 +4,8 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/postfix | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t postfix ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/postfix /etc/init.d/postfix | ||||
| rc-update -u | ||||
| 
 | ||||
| # Copy existing config files into persistent storage | ||||
| mkdir -p /srv/postfix/conf /srv/postfix/data | ||||
| @ -11,8 +13,3 @@ docker run --rm -v /srv/postfix/conf:/mnt/conf postfix cp -rp /etc/postfix/. /mn | ||||
| 
 | ||||
| # Configure postfix | ||||
| cp ${SOURCE_DIR}/srv/postfix/conf/main.cf /srv/postfix/conf/main.cf | ||||
| 
 | ||||
| # Configure postfix service | ||||
| cp ${SOURCE_DIR}/etc/init.d/postfix /etc/init.d/postfix | ||||
| rc-update add postfix | ||||
| service postfix start | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Postfix docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net | ||||
| 	use dns logger netmount | ||||
| 	need docker | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
|  | ||||
| @ -4,6 +4,8 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/postgres | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t postgres ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/postgres /etc/init.d/postgres | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create Postgres instance | ||||
| mkdir -p /srv/postgres/data | ||||
| @ -14,14 +16,8 @@ docker run --rm --name postgres -h postgres -v /srv/postgres/data:/var/lib/postg | ||||
| # Configure Postgres | ||||
| cp ${SOURCE_DIR}/srv/postgres/data/postgresql.conf /srv/postgres/data/postgresql.conf | ||||
| cp ${SOURCE_DIR}/srv/postgres/data/pg_hba.conf /srv/postgres/data/pg_hba.conf | ||||
| 
 | ||||
| # Enable query logging. Only if the DEBUG environment variable is set | ||||
| if [ ${DEBUG:-0} -eq 1 ]; then | ||||
|     sed -i 's/^#log_destination/log_destination/' /srv/postgres/data/postgresql.conf | ||||
|     sed -i 's/^#log_statement/log_statement/' /srv/postgres/data/postgresql.conf | ||||
| fi | ||||
| 
 | ||||
| # Configure Postgres service | ||||
| cp ${SOURCE_DIR}/etc/init.d/postgres /etc/init.d/postgres | ||||
| rc-update add postgres | ||||
| service postgres start | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Postgres docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net | ||||
| 	use dns logger netmount | ||||
| 	need docker | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -15,6 +14,10 @@ start() { | ||||
| 	postgres | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	timeout -t 3 docker exec postgres sh -c 'until [ -e /var/run/postgresql/.s.PGSQL.5432 ]; do usleep 50000; done' | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
| 	/usr/bin/docker stop postgres | ||||
| } | ||||
|  | ||||
| @ -4,12 +4,9 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/rabbitmq | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t rabbitmq ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/rabbitmq /etc/init.d/rabbitmq | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create RabbitMQ directory structure | ||||
| mkdir -p /srv/rabbitmq/data | ||||
| chown 5672:5672 /srv/rabbitmq/data | ||||
| 
 | ||||
| # Configure RabbitMQ service | ||||
| cp ${SOURCE_DIR}/etc/init.d/rabbitmq /etc/init.d/rabbitmq | ||||
| rc-update add rabbitmq | ||||
| service rabbitmq start | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="RabbitMQ docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net | ||||
| 	use dns logger netmount | ||||
| 	need docker | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
|  | ||||
							
								
								
									
										7
									
								
								redis.sh
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								redis.sh
									
									
									
									
									
								
							| @ -4,13 +4,10 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/redis | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t redis ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/redis /etc/init.d/redis | ||||
| rc-update -u | ||||
| 
 | ||||
| # Configure Redis | ||||
| mkdir -p /srv/redis/conf /srv/redis/data | ||||
| cp ${SOURCE_DIR}/srv/redis/conf/redis.conf /srv/redis/conf/redis.conf | ||||
| chown -R 6379:6379 /srv/redis/data | ||||
| 
 | ||||
| # Configure Redis service | ||||
| cp ${SOURCE_DIR}/etc/init.d/redis /etc/init.d/redis | ||||
| rc-update add redis | ||||
| service redis start | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Redis docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net | ||||
| 	use dns logger netmount | ||||
| 	need docker | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
|  | ||||
| @ -6,7 +6,12 @@ export TEMPLATE=${TEMPLATE:-"default"} | ||||
| # Check prerequisites | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| docker image ls | grep -q sahana || docker build -t sahana $(realpath $(dirname "${0}"))/sahana | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t sahana ${SOURCE_DIR} | ||||
| envsubst <${SOURCE_DIR}/etc/init.d/sahana-demo >/etc/init.d/sahana-demo | ||||
| chmod +x /etc/init.d/sahana-demo | ||||
| 
 | ||||
| # Create PostgreSQL user and database | ||||
| export SAHANADEMO_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -25,16 +30,8 @@ export SAHANADEMO_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| envsubst <${SOURCE_DIR}/srv/sahana-demo/conf/000_config.py >/srv/sahana-demo/conf/000_config.py | ||||
| envsubst <${SOURCE_DIR}/masterUsers.csv >/tmp/masterUsers.csv | ||||
| cp ${SOURCE_DIR}/srv/sahana-demo/update-url.sh /srv/sahana-demo/update-url.sh | ||||
| spotter-appmgr update-login sahana-demo "${SAHANADEMO_ADMIN_USER}" "${SAHANADEMO_ADMIN_PWD}" | ||||
| 
 | ||||
| # Populate database | ||||
| docker run --rm -h sahana-demo --link postgres -v /srv/sahana-demo/conf:/srv/web2py/applications/eden/models -v /srv/sahana-demo/data/databases:/srv/web2py/applications/eden/databases -v /tmp/masterUsers.csv:/srv/web2py/applications/eden/modules/templates/default/users/masterUsers.csv sahana su - sahana -c "./web2py.py -S eden -M -R applications/eden/static/scripts/tools/noop.py" | ||||
| rm /tmp/masterUsers.csv | ||||
| 
 | ||||
| # Create Sahana service | ||||
| envsubst <${SOURCE_DIR}/etc/init.d/sahana-demo >/etc/init.d/sahana-demo | ||||
| chmod +x /etc/init.d/sahana-demo | ||||
| rc-update add sahana-demo | ||||
| service sahana-demo start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app sahana-demo "https://sahana-demo.{host}/eden/" "${SAHANADEMO_ADMIN_USER}" "${SAHANADEMO_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Sahana Eden Demo docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker postfix postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -21,7 +20,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy sahana-demo | ||||
| 	/usr/bin/spotter-appmgr register-proxy sahana-demo | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy sahana-demo | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
| @ -50,7 +50,7 @@ settings.gis.spatialdb = True | ||||
| #settings.base.system_name = T("Sahana Eden Humanitarian Management Platform") | ||||
| #settings.base.system_name_short = T("Sahana Eden") | ||||
| # Set this to the Public URL of the instance | ||||
| settings.base.public_url = "http://127.0.0.1" | ||||
| settings.base.public_url = "https://sahana-demo.spotter.vm" | ||||
| 
 | ||||
| # Switch to "False" in Production for a Performance gain | ||||
| # (need to set to "True" again when Table definitions are changed) | ||||
|  | ||||
							
								
								
									
										12
									
								
								sahana.sh
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								sahana.sh
									
									
									
									
									
								
							| @ -5,9 +5,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/sahana | ||||
| # Check prerequisites | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t sahana ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/sahana /etc/init.d/sahana | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create PostgreSQL user and database | ||||
| export SAHANA_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -30,6 +33,7 @@ envsubst <${SOURCE_DIR}/srv/sahana/conf/000_config.py >/srv/sahana/conf/000_conf | ||||
| envsubst <${SOURCE_DIR}/srv/sahana/data/Spotter/masterUsers.csv >/srv/sahana/data/Spotter/masterUsers.csv | ||||
| cp ${SOURCE_DIR}/srv/sahana/conf/00_settings.py /srv/sahana/conf/00_settings.py | ||||
| cp ${SOURCE_DIR}/srv/sahana/update-url.sh /srv/sahana/update-url.sh | ||||
| spotter-appmgr update-login sahana "${SAHANA_ADMIN_USER}" "${SAHANA_ADMIN_PWD}" | ||||
| 
 | ||||
| # Populate database | ||||
| docker run --rm -h sahana --link postgres -v /srv/sahana/conf:/srv/web2py/applications/eden/models -v /srv/sahana/data/Spotter:/srv/web2py/applications/eden/modules/templates/Spotter -v /srv/sahana/data/databases:/srv/web2py/applications/eden/databases sahana su - sahana -c "./web2py.py -S eden -M -R applications/eden/static/scripts/tools/noop.py" | ||||
| @ -40,11 +44,3 @@ if [ ${DEBUG:-0} -eq 0 ]; then | ||||
|     sed -i 's/settings.base.debug = True/settings.base.debug = False/' /srv/sahana/conf/000_config.py | ||||
|     sed -i 's/#settings.base.prepopulate = 0/settings.base.prepopulate = 0/' /srv/sahana/conf/000_config.py | ||||
| fi | ||||
| 
 | ||||
| # Create Sahana service | ||||
| cp ${SOURCE_DIR}/etc/init.d/sahana /etc/init.d/sahana | ||||
| rc-update add sahana | ||||
| service sahana start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app sahana "https://sahana.{host}/eden/" "${SAHANA_ADMIN_USER}" "${SAHANA_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Sahana Eden docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker postfix postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -21,7 +20,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy sahana | ||||
| 	/usr/bin/spotter-appmgr register-proxy sahana | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy sahana | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
| @ -50,7 +50,7 @@ settings.gis.spatialdb = True | ||||
| #settings.base.system_name = T("Sahana Eden Humanitarian Management Platform") | ||||
| #settings.base.system_name_short = T("Sahana Eden") | ||||
| # Set this to the Public URL of the instance | ||||
| settings.base.public_url = "http://127.0.0.1" | ||||
| settings.base.public_url = "https://sahana.spotter.vm" | ||||
| 
 | ||||
| # Switch to "False" in Production for a Performance gain | ||||
| # (need to set to "True" again when Table definitions are changed) | ||||
|  | ||||
							
								
								
									
										17
									
								
								sambro.sh
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								sambro.sh
									
									
									
									
									
								
							| @ -5,7 +5,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/sambro | ||||
| # Check prerequisites | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| docker image ls | grep -q sahana || docker build -t sahana $(realpath $(dirname "${0}"))/sahana | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t sahana ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/sambro /etc/init.d/sambro | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create PostgreSQL user and database | ||||
| export SAMBRO_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -26,6 +31,7 @@ envsubst <${SOURCE_DIR}/masterUsers.csv >/tmp/masterUsers.csv | ||||
| cp ${SOURCE_DIR}/srv/sambro/conf/00_settings.py /srv/sambro/conf/00_settings.py | ||||
| cp ${SOURCE_DIR}/srv/sambro/data/SAMBRO/config.py /srv/sambro/data/SAMBRO/config.py | ||||
| cp ${SOURCE_DIR}/srv/sambro/update-url.sh /srv/sambro/update-url.sh | ||||
| spotter-appmgr update-login sambro "${SAMBRO_ADMIN_USER}" "${SAMBRO_ADMIN_PWD}" | ||||
| 
 | ||||
| # Populate database | ||||
| docker run --rm -h sambro --link postgres -v /srv/sambro/conf:/srv/web2py/applications/eden/models -v /srv/sambro/data/SAMBRO:/srv/web2py/applications/eden/modules/templates/SAMBRO -v /tmp/masterUsers.csv:/srv/web2py/applications/eden/modules/templates/default/users/masterUsers.csv -v /srv/sambro/data/databases:/srv/web2py/applications/eden/databases sahana su - sahana -c "./web2py.py -S eden -M -R applications/eden/static/scripts/tools/noop.py" | ||||
| @ -37,12 +43,3 @@ if [ ${DEBUG:-0} -eq 0 ]; then | ||||
|     sed -i 's/settings.base.debug = True/settings.base.debug = False/' /srv/sambro/conf/000_config.py | ||||
|     sed -i 's/#settings.base.prepopulate = 0/settings.base.prepopulate = 0/' /srv/sambro/conf/000_config.py | ||||
| fi | ||||
| 
 | ||||
| # Create SAMBRO service | ||||
| cp ${SOURCE_DIR}/etc/init.d/sambro /etc/init.d/sambro | ||||
| rc-update add sambro | ||||
| service sambro start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app sambro "https://sambro.{host}/eden/" "${SAMBRO_ADMIN_USER}" "${SAMBRO_ADMIN_PWD}" | ||||
| spotter-appmgr add-app sambro-mobile -p clienturl "https://sambro.{host}/eden/" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="SAMBRO docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker postfix postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -21,7 +20,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy sambro | ||||
| 	/usr/bin/spotter-appmgr register-proxy sambro | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy sambro | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
| @ -50,7 +50,7 @@ settings.gis.spatialdb = True | ||||
| #settings.base.system_name = T("Sahana Eden Humanitarian Management Platform") | ||||
| #settings.base.system_name_short = T("Sahana Eden") | ||||
| # Set this to the Public URL of the instance | ||||
| settings.base.public_url = "http://127.0.0.1" | ||||
| settings.base.public_url = "https://sambro.spotter.vm" | ||||
| 
 | ||||
| # Switch to "False" in Production for a Performance gain | ||||
| # (need to set to "True" again when Table definitions are changed) | ||||
|  | ||||
							
								
								
									
										12
									
								
								seeddms.sh
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								seeddms.sh
									
									
									
									
									
								
							| @ -5,9 +5,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/seeddms | ||||
| # Check prerequisites | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t seeddms ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/seeddms /etc/init.d/seeddms | ||||
| rc-update -u | ||||
| 
 | ||||
| # Populate database | ||||
| export SEEDDMS_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -27,14 +30,7 @@ export SEEDDMS_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| export SEEDDMS_ADMIN_EMAIL=admin@example.com | ||||
| envsubst <${SOURCE_DIR}/adminpwd.sql | docker exec -i postgres psql seeddms | ||||
| chown -R 8010:8010 /srv/seeddms/conf | ||||
| 
 | ||||
| # Create SeedDMS service | ||||
| cp ${SOURCE_DIR}/etc/init.d/seeddms /etc/init.d/seeddms | ||||
| rc-update add seeddms | ||||
| service seeddms start | ||||
| spotter-appmgr update-login seeddms "${SEEDDMS_ADMIN_USER}" "${SEEDDMS_ADMIN_PWD}" | ||||
| 
 | ||||
| # Install cron job | ||||
| cp ${SOURCE_DIR}/etc/periodic/hourly/seeddms /etc/periodic/hourly/seeddms | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app seeddms "https://seeddms.{host}/" "${SEEDDMS_ADMIN_USER}" "${SEEDDMS_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="SeedDMS docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker postfix postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -19,7 +18,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy seeddms | ||||
| 	/usr/bin/spotter-appmgr register-proxy seeddms | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy seeddms | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
							
								
								
									
										12
									
								
								sigmah.sh
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								sigmah.sh
									
									
									
									
									
								
							| @ -6,9 +6,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/sigmah | ||||
| docker image ls | grep -q postgres || $(realpath $(dirname "${0}"))/postgres.sh | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| docker image ls | grep -q tomcat || $(realpath $(dirname "${0}"))/tomcat.sh | ||||
| service postgres start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t sigmah ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/sigmah /etc/init.d/sigmah | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create database | ||||
| export SIGMAH_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -41,11 +44,4 @@ sed -i "s|\$2a\$10\$pMcTA1p9fefR8U9NoOPei.H0eq/TbbdSF27M0tn9iDWBrA4JHeCDC|${SIGM | ||||
| cat /tmp/sigmah-MinimumDataKit.sql | docker exec -i -e PGPASSWORD=${SIGMAH_PWD} postgres psql -U sigmah sigmah | ||||
| cat /tmp/sigmah-newOrganizationLaunchScript.sql | docker exec -i -e PGPASSWORD=${SIGMAH_PWD} postgres psql -U sigmah sigmah | ||||
| rm -f /tmp/sigmah-MinimumDataKit.sql /tmp/sigmah-newOrganizationLaunchScript.sql | ||||
| 
 | ||||
| # Create Sigmah service | ||||
| cp ${SOURCE_DIR}/etc/init.d/sigmah /etc/init.d/sigmah | ||||
| rc-update add sigmah | ||||
| service sigmah start | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app sigmah "https://sigmah.{host}/sigmah/" "${SIGMAH_ADMIN_EMAIL}" "${SIGMAH_ADMIN_PWD}" | ||||
| spotter-appmgr update-login sigmah "${SIGMAH_ADMIN_EMAIL}" "${SIGMAH_ADMIN_PWD}" | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Sigmah docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net postgres | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker postfix postgres | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -20,7 +19,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy sigmah | ||||
| 	/usr/bin/spotter-appmgr register-proxy sigmah | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy sigmah | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
							
								
								
									
										7
									
								
								solr.sh
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								solr.sh
									
									
									
									
									
								
							| @ -7,14 +7,11 @@ docker image ls | grep -q java || $(realpath $(dirname "${0}"))/java.sh | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t solr ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/solr /etc/init.d/solr | ||||
| rc-update -u | ||||
| 
 | ||||
| # Configure Solr | ||||
| mkdir -p /srv/solr/data | ||||
| cp ${SOURCE_DIR}/srv/solr/data/solr.xml /srv/solr/data/solr.xml | ||||
| cp ${SOURCE_DIR}/srv/solr/data/.solr.in.sh /srv/solr/data/.solr.in.sh | ||||
| chown -R 8983:8983 /srv/solr/data | ||||
| 
 | ||||
| # Configure Solr service | ||||
| cp ${SOURCE_DIR}/etc/init.d/solr /etc/init.d/solr | ||||
| rc-update add solr | ||||
| service solr start | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Solr docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net | ||||
| 	use dns logger netmount | ||||
| 	need docker | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
|  | ||||
							
								
								
									
										13
									
								
								ushahidi.sh
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								ushahidi.sh
									
									
									
									
									
								
							| @ -5,9 +5,12 @@ SOURCE_DIR=$(realpath $(dirname "${0}"))/ushahidi | ||||
| # Check prerequisites | ||||
| docker image ls | grep -q mariadb || $(realpath $(dirname "${0}"))/mariadb.sh | ||||
| docker image ls | grep -q postfix || $(realpath $(dirname "${0}"))/postfix.sh | ||||
| service mariadb start | ||||
| 
 | ||||
| # Build Docker container | ||||
| docker build -t ushahidi ${SOURCE_DIR} | ||||
| cp ${SOURCE_DIR}/etc/init.d/ushahidi /etc/init.d/ushahidi | ||||
| rc-update -u | ||||
| 
 | ||||
| # Create database | ||||
| export USHAHIDI_PWD=$(head -c 18 /dev/urandom | base64) | ||||
| @ -28,15 +31,7 @@ export USHAHIDI_ADMIN_USER=admin@example.com | ||||
| export USHAHIDI_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) | ||||
| export USHAHIDI_ADMIN_HASH=$(docker run --rm ushahidi php -r "echo password_hash('${USHAHIDI_ADMIN_PWD}', PASSWORD_BCRYPT);") | ||||
| envsubst <${SOURCE_DIR}/adminpwd.sql | docker exec -i mariadb mysql ushahidi | ||||
| 
 | ||||
| # Create Ushahidi service | ||||
| cp ${SOURCE_DIR}/etc/init.d/ushahidi /etc/init.d/ushahidi | ||||
| rc-update add ushahidi | ||||
| service ushahidi start | ||||
| spotter-appmgr update-login ushahidi "${USHAHIDI_ADMIN_USER}" "${USHAHIDI_ADMIN_PWD}" | ||||
| 
 | ||||
| # Install cron job | ||||
| cp ${SOURCE_DIR}/etc/periodic/15min/ushahidi /etc/periodic/15min/ushahidi | ||||
| 
 | ||||
| # Add application definition | ||||
| spotter-appmgr add-app ushahidi "https://ushahidi.{host}/" "${USHAHIDI_ADMIN_USER}" "${USHAHIDI_ADMIN_PWD}" | ||||
| spotter-appmgr add-app ushahidi-mobile -p clienturl "ushahidi.{host}" | ||||
|  | ||||
| @ -2,4 +2,4 @@ UPDATE users SET email = '${USHAHIDI_ADMIN_USER}', password = '${USHAHIDI_ADMIN_ | ||||
| 
 | ||||
| INSERT INTO `config` (`group_name`, `config_key`, `config_value`) VALUES | ||||
| ('data-provider','email','{\"incoming_type\":\"IMAP\",\"incoming_server\":\"localhost\",\"incoming_port\":143,\"incoming_security\":\"None\",\"incoming_username\":\"ushahidi@spotter.ngo\",\"incoming_password\":\"password\",\"outgoing_type\":\"SMTP\",\"outgoing_server\":\"postfix\",\"outgoing_port\":25,\"outgoing_security\":\"None\",\"outgoing_username\":\"ushahidi@spotter.ngo\",\"outgoing_password\":\"password\",\"from\":\"ushahidi@spotter.ngo\",\"from_name\":\"Ushahidi\"}'), | ||||
| ('data-provider','url','\"http:\\/\\/127.0.0.1\\/platform\\/api\\/v3\\/config\\/data-provider\"'); | ||||
| ('data-provider','url','\"https:\\/\\/ush.spotter.vm\\/platform\\/api\\/v3\\/config\\/data-provider\"'); | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| description="Ushahidi docker container" | ||||
| 
 | ||||
| depend() { | ||||
| 	need docker net mariadb | ||||
| 	use dns logger netmount postfix | ||||
| 	need docker mariadb postfix | ||||
| } | ||||
| 
 | ||||
| start() { | ||||
| @ -20,7 +19,11 @@ start() { | ||||
| } | ||||
| 
 | ||||
| start_post() { | ||||
| 	/usr/local/bin/spotter-appmgr update-proxy ushahidi | ||||
| 	/usr/bin/spotter-appmgr register-proxy ushahidi | ||||
| } | ||||
| 
 | ||||
| stop_pre() { | ||||
| 	/usr/bin/spotter-appmgr unregister-proxy ushahidi | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| { | ||||
|     "backend_url": "http://127.0.0.1/platform", | ||||
|     "backend_url": "https://ush.spotter.vm/platform", | ||||
|     "client_id": "ushahidiui", | ||||
|     "client_secret": "35e7f0bca957836d05ca0492211b0ac707671261", | ||||
|     "google_analytics_id": "AIzaSyBvIF3D550tlpL6o1xRrDurGo-81VhHlOw" | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user