Compare commits
757 Commits
last-alpin
...
master
Author | SHA1 | Date | |
---|---|---|---|
440317c552 | |||
fd23d27bba | |||
c9af05aeb0 | |||
5bd1f5e97c | |||
215ffb81ae | |||
7052ea8859 | |||
dd922b7775 | |||
2877cd2748 | |||
1d688ad1ff | |||
723a6a494f | |||
db26467d0b | |||
8d15e2806d | |||
f4700bef17 | |||
abf763683d | |||
0ad56ac087 | |||
81226d3bcc | |||
358281816f | |||
98327336ac | |||
89c4e2e88f | |||
521f3f2ab6 | |||
b17f6a3279 | |||
08313f07db | |||
01d19fe5fb | |||
093f306ec7 | |||
667354a158 | |||
53141556f7 | |||
88893abc50 | |||
082a9fb50d | |||
917c15420c | |||
ef116c12ef | |||
03d56ac0c9 | |||
86c97de908 | |||
967ccc0d44 | |||
6f52ea0f1a | |||
c50e67dbc0 | |||
31876f3776 | |||
4fd2de3935 | |||
b53f8b0a24 | |||
1c2e59e64b | |||
c757630f7a | |||
1c140bb593 | |||
5c1130eafe | |||
b189f3c9a2 | |||
783fd3c094 | |||
8bc038ea02 | |||
8428373178 | |||
ddcca22498 | |||
0f89b0ae4b | |||
9a83b97d33 | |||
a993e2f4ce | |||
fe9928443f | |||
d2082a896b | |||
a763665f32 | |||
2b09ee23c8 | |||
40a46cd675 | |||
9e2075a4af | |||
7355cdb888 | |||
a4c52f9b3b | |||
013f0d110e | |||
4ba0069a8a | |||
99099e03bb | |||
6ec890aa30 | |||
e39aa41c7c | |||
a7202756ab | |||
596955f6b4 | |||
14e07c9b56 | |||
3f9accced2 | |||
1cd9fb1485 | |||
9b517ceebb | |||
97a5c63d48 | |||
f79cddbf44 | |||
c3d5542bee | |||
a28b29f953 | |||
4cc79de59c | |||
af7be5c1be | |||
09b7ce481f | |||
3839eddb60 | |||
ebe3828b5e | |||
d532d087fe | |||
bbc669d2a7 | |||
74df7b6a59 | |||
624693bb22 | |||
5218d4d094 | |||
c9978e21c9 | |||
547c3cf84f | |||
c41a007870 | |||
60c0e25c49 | |||
0d1b4942c3 | |||
cba47bc0b2 | |||
e1e4f706ee | |||
603bd923e1 | |||
c2064220d0 | |||
1fb67a69f9 | |||
e0a071e9e5 | |||
a90cb7679b | |||
d307a559c0 | |||
3659f3d1ed | |||
87429cda34 | |||
b2db2816fa | |||
d5aca4ad52 | |||
57cef0f4cf | |||
ea2ba79f96 | |||
f5416a4501 | |||
553930da0d | |||
40e98ff42a | |||
615b847cf9 | |||
8e4b38ef18 | |||
004f35c186 | |||
a2ffc2ab63 | |||
837466742e | |||
b1ff00e36b | |||
04c9795586 | |||
001faa160e | |||
eb5b8365c3 | |||
29f1b52dee | |||
93f94e16ac | |||
16c9a6c862 | |||
92b61944dd | |||
1620028382 | |||
df2eb81928 | |||
52016223ab | |||
50e6ec1c3a | |||
b3b1daf989 | |||
2163506a8e | |||
21f695d7ba | |||
5107631271 | |||
676a9d24b7 | |||
e8e01417b2 | |||
1885b9e18e | |||
780f44246f | |||
1eea6c8e99 | |||
9417ad24a2 | |||
7331ab6d96 | |||
cc1ea7fa25 | |||
e5574db63c | |||
8771ac9828 | |||
6047cbcd0a | |||
ad437292ab | |||
bd946bf564 | |||
867997b588 | |||
6bab2bda8d | |||
de5e7da26d | |||
c287b1ea6e | |||
a12b0f101e | |||
0028a3ba5b | |||
09a146b54c | |||
5f6a7a2517 | |||
1a0c641df3 | |||
d16fcb8a9d | |||
391859ded4 | |||
e7e255488d | |||
cb4ff53efd | |||
087ad65518 | |||
15be9aad67 | |||
c04cf033a8 | |||
0bae44985c | |||
e788060456 | |||
d93c739d38 | |||
4c0fcc5535 | |||
268dc6447c | |||
6cb0440d4a | |||
bd70f07f8b | |||
ecfafd0c4a | |||
236c15dbac | |||
e0e49ec31a | |||
746713eb9f | |||
102761efac | |||
caf30e9958 | |||
9f8571f622 | |||
b804987254 | |||
2b9d73c847 | |||
cab95d15f3 | |||
b79323b4b7 | |||
3e8032d867 | |||
ef52c066d2 | |||
c32365d671 | |||
7a45daf853 | |||
fea0a7911a | |||
f63e78a800 | |||
0790a9243b | |||
590dde8206 | |||
40e26e4407 | |||
35345dc529 | |||
36181e3593 | |||
dadda1c175 | |||
719b4e04b6 | |||
692571a7f8 | |||
ff3d37517f | |||
d8d9f5431e | |||
8f27ee6afe | |||
797e900268 | |||
74ff517e09 | |||
0455738fa8 | |||
5782083921 | |||
be4042d7e4 | |||
f32b719630 | |||
512895a6f2 | |||
f6328158ed | |||
042a82c463 | |||
853c3852fd | |||
b55a5dfdbd | |||
4e0cbe0dcb | |||
58960e5e01 | |||
84d43f51ff | |||
e02fc0f97d | |||
157a0b8660 | |||
202aa1e8ca | |||
72a4ea9e5c | |||
243c8a4542 | |||
c7b0ea28b2 | |||
0b46076ae7 | |||
3632568e29 | |||
361bb2dc7b | |||
61ab0b0b48 | |||
734a9611e5 | |||
368a060a5e | |||
923b794cc6 | |||
f45e25ea2c | |||
81b9e8d0af | |||
07163889a3 | |||
04804d8883 | |||
bedbbb0c3a | |||
4c47c49eab | |||
29cad671dc | |||
705ac8104a | |||
d73b0c381f | |||
fe0777eaf2 | |||
f16d2cde9b | |||
7a19274211 | |||
36d0b9156c | |||
6aa4eb7778 | |||
76bef22633 | |||
7cb420dc4c | |||
99c39d5ee9 | |||
2ee9b97020 | |||
29d791afe1 | |||
7b1298d7d0 | |||
f948c885bc | |||
473dd4af61 | |||
f5fee5afa1 | |||
5e7846b519 | |||
e5c6203412 | |||
bba8f06422 | |||
076786f482 | |||
28a70e878e | |||
d7d89b9db6 | |||
44209ddfb3 | |||
e355510575 | |||
3713365950 | |||
1801fcdc3d | |||
18698ef5d4 | |||
d08848a4d0 | |||
48510beb28 | |||
751afa6cf2 | |||
64dced3dc8 | |||
b2b2c12cdf | |||
91c413ecbf | |||
2bd45fea0d | |||
c73c5f1eef | |||
7426ff6f9c | |||
0e465b0820 | |||
19b62a4370 | |||
ed997ab417 | |||
376a0f87ef | |||
c2a30bc4c1 | |||
9532bc7405 | |||
0351abcb92 | |||
a2605594d3 | |||
f2176428bc | |||
91a5a24b1b | |||
d94db19410 | |||
515672c170 | |||
8a23276748 | |||
a7a4004f53 | |||
22d10b5a69 | |||
7809cc8a5e | |||
bdf4a01b3b | |||
c71817c2e8 | |||
c22d2c7393 | |||
e794ced82a | |||
e1b7ba1204 | |||
f82ad15689 | |||
f8403c5f42 | |||
4d579ef8c1 | |||
b6c3949d41 | |||
c10b1a7920 | |||
9c3cee22a6 | |||
a41d270743 | |||
ebbbab71fb | |||
a9a930b37b | |||
b5eabcb311 | |||
7ed4628597 | |||
827991d7ac | |||
56af4a0b66 | |||
3d8154d87f | |||
d56afb17c2 | |||
5084dc1579 | |||
d3129d81ab | |||
e8138099cb | |||
fe9fb27679 | |||
692897c9bf | |||
85e8b631a1 | |||
9c50b29d22 | |||
de80024445 | |||
5a43c23b83 | |||
4458be2763 | |||
0f5c1d6433 | |||
4e9c63d8aa | |||
7e3431a4c0 | |||
79efa46226 | |||
f9507ae4b7 | |||
8434f192c9 | |||
d476a36f24 | |||
3a3552f154 | |||
466a83e407 | |||
93cc9f435b | |||
62a6612a79 | |||
f2016d1b71 | |||
715ad22409 | |||
1aaf16e8b7 | |||
3a554e1c84 | |||
cf99826386 | |||
9b18c94ddd | |||
985dd2998a | |||
f46fafa4ed | |||
4ba938d17f | |||
0f093a1087 | |||
4ac414c691 | |||
4391b33fbc | |||
826b244bae | |||
eac6129fb3 | |||
ed3aeb60d8 | |||
6c16aedadd | |||
d1fc5b7796 | |||
4e107840a1 | |||
8c7890fcbc | |||
15e7600ae4 | |||
57cd65115d | |||
990a9dcb71 | |||
a8bca6727b | |||
8b6f09c7d5 | |||
1ec7dfcc95 | |||
0bc2daf4ad | |||
ed0c6c90a7 | |||
2e674aa2d0 | |||
c9ceaff648 | |||
dfdd1de8e8 | |||
77196fdcca | |||
99d31eb0b5 | |||
8171f20309 | |||
8d42eac029 | |||
9d1e3f2d60 | |||
f9cc283477 | |||
89d3dd7d0c | |||
7f0d9572e3 | |||
69f67649f3 | |||
b1d705487a | |||
bbfe11f557 | |||
7116566519 | |||
2ea88cabce | |||
846a85e939 | |||
9f1f247484 | |||
1efc713ae3 | |||
ec7e843024 | |||
afbd4a0f60 | |||
446b855d03 | |||
7186daeb1c | |||
4fbeae6f7e | |||
b96aae6780 | |||
d3d8e3b766 | |||
f1fb7607b5 | |||
048c0053f5 | |||
a7c85af7cc | |||
6822f605d1 | |||
64aced5d8d | |||
bdc0d0a2a6 | |||
8e57996b9c | |||
9d0e30f728 | |||
b556ee3c30 | |||
cd4591501f | |||
1989b886f5 | |||
6e9e0dffe1 | |||
8f07df8c43 | |||
f35efa4a05 | |||
79442aa60e | |||
bc587252b4 | |||
1824e05393 | |||
e0637ce2a2 | |||
7e1e54a63e | |||
42ec6eeb95 | |||
5c48a83547 | |||
e165e9d8f7 | |||
f97d06873e | |||
959da1a423 | |||
081c517e21 | |||
dc41cd5f4a | |||
893c3028a1 | |||
13153d341b | |||
71fb5a7ca3 | |||
387a7072f9 | |||
65adfe8e16 | |||
efff62d21e | |||
4e36b2fb9e | |||
fda64ee225 | |||
b4b03d3505 | |||
ca3fd66ad3 | |||
1bb3a4330e | |||
0c9c54f481 | |||
db81cd38b8 | |||
4f72107c98 | |||
dfd0273a2c | |||
508cb47c1e | |||
f155f0bc22 | |||
8ddbc72644 | |||
91b1cfb08c | |||
cd6ea369d7 | |||
95665357f5 | |||
8cc7553acd | |||
938c47f950 | |||
eb079b9699 | |||
98e87aa772 | |||
d0751b1f2c | |||
4f81baf02f | |||
3e51996286 | |||
bf1c8b3fbf | |||
e051ad1e06 | |||
6977e1e7bd | |||
aaf2611b82 | |||
4129eb85c3 | |||
180997be4a | |||
6af3888fda | |||
cb4b17e1d5 | |||
3a424c5726 | |||
3f6a74b5bd | |||
ce325cf3d0 | |||
b4f5979354 | |||
bbf8219504 | |||
e58fc05a7d | |||
e17da9f060 | |||
b134f3c935 | |||
1ce6abc6e4 | |||
64dda6172e | |||
f623ce13ba | |||
ea289aff48 | |||
2dbefce8db | |||
1dce7601cf | |||
aecf3eede2 | |||
3dfd71eb03 | |||
8d6b2bdee6 | |||
afb121c72e | |||
e09669fb73 | |||
96490c6c3e | |||
2a75965449 | |||
8adf762acc | |||
a13c44d2d6 | |||
718a3b7a3f | |||
5992629869 | |||
43922d8192 | |||
49dffce0d0 | |||
e4d2422974 | |||
0ffbe9bb58 | |||
12869d5dca | |||
5de59917cd | |||
89a430fe5a | |||
e4bf6effe1 | |||
d833b439c7 | |||
af6f90f9cb | |||
6e182a9414 | |||
6822269c84 | |||
1812e27e1e | |||
b7d9cec76a | |||
e225af87fb | |||
58dc418e87 | |||
ab62d9bafc | |||
35a70fd5c1 | |||
072b529c9c | |||
979060da69 | |||
410958a2a7 | |||
76220d811d | |||
5919719f3e | |||
20a6d670ca | |||
b76a350d7b | |||
cdb74d9677 | |||
905f2c62c1 | |||
61fab326c3 | |||
237342254f | |||
a339c8e8ff | |||
f98edaff58 | |||
d5a5962ee2 | |||
5ba5461a80 | |||
0f4c2756ec | |||
6111325402 | |||
b772f92c22 | |||
eb27d92383 | |||
f6c44f3d0c | |||
7bca441acd | |||
25689d6345 | |||
f675996e60 | |||
cb0d0012c9 | |||
1400bab1e1 | |||
cb2a3d65d8 | |||
6bafd28e3e | |||
5e4dbd6adf | |||
0a32d9ed9d | |||
6b38073372 | |||
d2b410efe8 | |||
7c5b482392 | |||
874700ecb4 | |||
1060651116 | |||
afe8df823f | |||
6fb1e12ca6 | |||
38524e70af | |||
94048ba2fe | |||
960e7a2466 | |||
513c0839a5 | |||
848e99b4af | |||
977b9af923 | |||
77965c614a | |||
780e469f82 | |||
65dfff8eb0 | |||
951ae86520 | |||
920f01cf45 | |||
8be2bb2083 | |||
203a70bdbd | |||
b1cb57ab48 | |||
c6954816be | |||
396653c9a6 | |||
7df7428acf | |||
204318ef44 | |||
f9218366fa | |||
3abd3cf835 | |||
a0cf39811c | |||
ac69aebf4e | |||
07a195ab05 | |||
867a5d4d69 | |||
7abe6af068 | |||
efdd1b1c68 | |||
1817da3ebc | |||
76616fcab9 | |||
2a6d271d2d | |||
66c61e581d | |||
de0dcc79f4 | |||
14984b3199 | |||
1c967a0431 | |||
ab78d18491 | |||
30254eb527 | |||
dbce751225 | |||
91ebd4193e | |||
48e31ca0f1 | |||
528e676d4d | |||
b3cde0cdc8 | |||
88ae8848de | |||
31f7c408d4 | |||
a0dc16535d | |||
67caca8171 | |||
48492bf405 | |||
ed2e1193cb | |||
74b7d9478f | |||
00eff6fa85 | |||
96249760fd | |||
011cf4356b | |||
da896c79f2 | |||
33a4c10f7a | |||
0a30deb7e2 | |||
e055eb3542 | |||
00154ef899 | |||
fc99f7f6ab | |||
b0fe54d034 | |||
22fa90d785 | |||
0240e95621 | |||
3a2130eb48 | |||
4543bbc49f | |||
433e23022a | |||
d141fff4c1 | |||
1894893a6f | |||
d957227d40 | |||
725ecc75a6 | |||
30e2232b71 | |||
b8bb87390f | |||
ab82ed3fac | |||
cbaf4d6941 | |||
f74586c94c | |||
d1991ddc7d | |||
8cc184c7e7 | |||
8ac781bd8b | |||
b47df1d71d | |||
f747b89a5d | |||
f2a9529e29 | |||
44546c4816 | |||
57ecc71ebe | |||
365f983c2d | |||
db9458b4ad | |||
b7aedad589 | |||
86f4f940c7 | |||
986c13f4c7 | |||
01fc001990 | |||
7dbfe8533c | |||
4c5568f807 | |||
d3ecfbf4e7 | |||
367deb0897 | |||
0fda481317 | |||
677ac1bc4c | |||
7ebdfc1866 | |||
ea4b883b3f | |||
2b46473cb0 | |||
2c965f7cfb | |||
79f170ff01 | |||
523765188a | |||
384f43748b | |||
629e247570 | |||
2f6ba72cea | |||
41b598936f | |||
cbd65805f8 | |||
05bf6da6ce | |||
89b11a6112 | |||
444cfb58b1 | |||
cecb8d7dba | |||
ce71447928 | |||
ecf1143524 | |||
cd6d3815d6 | |||
88008ad40b | |||
6583acc129 | |||
344b6be624 | |||
c7c949eead | |||
d6447bb437 | |||
a25186b5ea | |||
939d9b0d45 | |||
b02d70df38 | |||
5facbb1b35 | |||
9f02c98d1b | |||
bc4c073b43 | |||
cff204ca46 | |||
fa70f85acb | |||
e8354e59c9 | |||
a9e99a82c5 | |||
0b56beea89 | |||
9b4be311e6 | |||
354c98bbf0 | |||
89126185eb | |||
bed2d7f5f6 | |||
de640bb005 | |||
6ca49d4865 | |||
26bbab959f | |||
b56ac216ce | |||
03050dd389 | |||
5db1ed2baf | |||
9a8c2103d4 | |||
fd07ec7cb8 | |||
d0e3be5ce6 | |||
43c8962b0f | |||
6427a6ec09 | |||
933a75bf57 | |||
eb69ea3cf1 | |||
1b07ef795e | |||
402ac5a469 | |||
8a65b6a0f4 | |||
824af776d9 | |||
dd955c5e59 | |||
260c8159c7 | |||
d21b09d547 | |||
1608b7a93f | |||
26075bad79 | |||
deacaa94be | |||
c3255cb00d | |||
1619380fdc | |||
3a6011aad4 | |||
b6ac14880b | |||
1c40252112 | |||
42523d1aa3 | |||
bf94306e25 | |||
cc20132a1f | |||
afa81c81cd | |||
e7f8b365cd | |||
dfc3dafe37 | |||
d47891b19c | |||
bc1994c31b | |||
ae70b53074 | |||
765f34f3f4 | |||
46f212f1d9 | |||
c564eda438 | |||
9baf26ce56 | |||
c6c50bb3c5 | |||
58622fa5b6 | |||
ed7171e8cc | |||
db514b6f4f | |||
9f6ff9f0ee | |||
db3b04c90b | |||
377d135667 | |||
2eb4a9fa3f | |||
36c5ebbd78 | |||
a6ab5edc02 | |||
43b690c1a2 | |||
05c4fdd99d | |||
97c2c18ca3 | |||
eeb0ddeed5 | |||
83fc9a29a4 | |||
f980dcafd5 | |||
e2bb75a723 | |||
1b232ef8f3 | |||
e2cae77ecd | |||
32ca0a827a | |||
7a756aeaf2 | |||
2e74f8242c | |||
be512ee2b3 | |||
36f8572dfe | |||
e2434abc96 | |||
c77bbdae5e | |||
7784a815a3 | |||
3fb89d89d1 | |||
4d4903e7ec | |||
0926190a70 | |||
4621dbbade | |||
1adc0977e7 | |||
ee07661411 | |||
1d718077f9 | |||
6532ed61e0 | |||
9036751cbe | |||
81519dcca4 | |||
86e411df12 | |||
3f8aee2d84 | |||
06b66fd04c | |||
7c8f101868 | |||
325f818494 | |||
f22d6ed689 | |||
20f8172e44 | |||
65aeb7aac4 | |||
50e4ef0330 | |||
cbed880961 | |||
b42fe67f89 | |||
edcbb2633e | |||
4fa3f59675 | |||
5cc0cdb701 | |||
5a32b94da1 | |||
a8c6339bfc | |||
e3ec786c41 | |||
198b65ab29 | |||
1c2d9c4124 | |||
b4db5a5b78 | |||
fb0a8bc9da | |||
9dc7792b9f | |||
bc524baa19 | |||
6484a99ccb | |||
5c4d526660 | |||
7db69ccf13 | |||
435730095c | |||
b1cb08a815 | |||
1fbc52372c | |||
1e5463db21 | |||
ca9b38e141 | |||
7d62e9e0fa | |||
522f9a7345 | |||
5d0928f2aa | |||
5a0a00f296 | |||
4a6974415f | |||
643ab39fb8 | |||
a9446fa1e4 | |||
e403df0094 |
@ -1,13 +0,0 @@
|
||||
### Steps to reproduce
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### Expected behaviour
|
||||
|
||||
|
||||
### Observed behaviour
|
||||
|
||||
|
||||
### Additional data (ticket URL, log, timestamp, stack trace etc.)
|
||||
|
6
.gitmodules
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
[submodule "app-vmmgr"]
|
||||
path = apk/vmmgr
|
||||
url = ssh://git@git.spotter.cz:2222/Spotter-Cluster/vmmgr.git
|
||||
[submodule "spoc"]
|
||||
path = apk/spoc
|
||||
url = ssh://git@git.spotter.cz:2222/Spotter-Cluster/spoc.git
|
@ -1,34 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# For production builds change to DEBUG=0 or comment the line entirely
|
||||
export DEBUG=1
|
||||
|
||||
SOURCE_DIR=$(realpath $(dirname "${0}"))
|
||||
|
||||
# Install shared packages and perform OS customization
|
||||
${SOURCE_DIR}/basic.sh
|
||||
${SOURCE_DIR}/basic-runtimes.sh
|
||||
|
||||
# Install applications
|
||||
${SOURCE_DIR}/ckan.sh
|
||||
# ${SOURCE_DIR}/crisiscleanup.sh
|
||||
# ${SOURCE_DIR}/cts.sh
|
||||
${SOURCE_DIR}/frontlinesms.sh
|
||||
${SOURCE_DIR}/gnuhealth.sh
|
||||
${SOURCE_DIR}/kanboard.sh
|
||||
${SOURCE_DIR}/mifosx.sh
|
||||
${SOURCE_DIR}/motech.sh
|
||||
${SOURCE_DIR}/opendatakit-build.sh
|
||||
${SOURCE_DIR}/opendatakit.sh
|
||||
${SOURCE_DIR}/openmapkit.sh
|
||||
${SOURCE_DIR}/pandora.sh
|
||||
${SOURCE_DIR}/sahana.sh
|
||||
${SOURCE_DIR}/sambro.sh
|
||||
${SOURCE_DIR}/seeddms.sh
|
||||
${SOURCE_DIR}/sigmah.sh
|
||||
${SOURCE_DIR}/ushahidi.sh
|
||||
|
||||
# Perform cleanup only if DEBUG environment variable is not set
|
||||
if [ ${DEBUG:-0} -eq 0 ]; then
|
||||
${SOURCE_DIR}/zz-cleanup.sh
|
||||
fi
|
88
README.md
@ -1,88 +0,0 @@
|
||||
This is the main repository containing all installation scripts, configuration and customization of operating system all application present in Spotter Cluster virtual machine.
|
||||
|
||||
## Virtual machine specifications
|
||||
- **Memory:** 4 GB
|
||||
- **CPU:** 1 processor, 2 cores
|
||||
- **Hard Disk:** SCSI, 60 GB
|
||||
|
||||
## Operating system installation
|
||||
|
||||
Download **Alpine Virtual 3.7.0 x86_64** from <https://alpinelinux.org/downloads/> and boot from it. At the login prompt, use the root user without password to log in.
|
||||
|
||||
```
|
||||
# Set up interfaces (leave the default choices)
|
||||
setup-interfaces
|
||||
ifup eth0
|
||||
|
||||
# Download and launch the setup script
|
||||
wget dl.dasm.cz/alpine.sh
|
||||
sh alpine.sh
|
||||
```
|
||||
|
||||
The script will perform the bare Alpine linux installation into VM using LUKS-on-LVM. The default disk encryption password is `password`. No root password is set.
|
||||
|
||||
## Application installation
|
||||
|
||||
### First time setup
|
||||
```
|
||||
# Install git
|
||||
apk --no-cache add git
|
||||
|
||||
# Clone the repository
|
||||
git clone https://gitlab.dasm.cz:8443/Spotter-Cluster/Spotter-Cluster.git
|
||||
|
||||
# Enter the repository directory
|
||||
cd Spotter-Cluster
|
||||
|
||||
# Optional: Edit the install sequence script
|
||||
vi 00-install.sh
|
||||
|
||||
# Launch the script
|
||||
./00-install.sh
|
||||
```
|
||||
|
||||
### Resuming from a snapshot
|
||||
Assumes that the repository has already been cloned.
|
||||
```
|
||||
# Enter the repository directory
|
||||
cd Spotter-Cluster
|
||||
|
||||
# Update repository
|
||||
git pull
|
||||
|
||||
# Optional: Edit the install sequence script
|
||||
vi 00-install.sh
|
||||
|
||||
# Launch the script
|
||||
./00-install.sh
|
||||
```
|
||||
|
||||
## Host assignment
|
||||
|
||||
| Application | Container | UID/GID | Internal Port | Host |
|
||||
|-----------------|------------------:|--------:|-----------------:|----------|
|
||||
| ActiveMQ | activemq | 61616 | 61616 (ActiveMQ) | - |
|
||||
| CKAN | ckan | 8003 | 8080 (HTTP) | ckan |
|
||||
| CKAN Datapusher | ckan-datapusher | 8004 | 8080 (HTTP) | - |
|
||||
| Crisis Cleanup | crisiscleanup | 8005 | 8080 (HTTP) | cc |
|
||||
| CTS | cts | 8006 | 8080 (HTTP) | cts |
|
||||
| FrontlineSMS | frontlinesms | 8018 | 8080 (HTTP) | sms |
|
||||
| GNU Health | gnuhealth | 8008 | 8080 (HTTP) | gh |
|
||||
| KanBoard | kanboard | 8009 | 8080 (HTTP) | kb |
|
||||
| MariaDB | mariadb | 3306 | 3306 (MySQL) | - |
|
||||
| Mifos X | mifosx | 8012 | 8080 (HTTP) | mifosx |
|
||||
| Motech | motech | 8013 | 8080 (HTTP) | motech |
|
||||
| ODK Aggregate | opendatakit | 8015 | 8080 (HTTP) | odk |
|
||||
| ODK Build | opendatakit-build | 8017 | 8080 (HTTP) | odkbuild |
|
||||
| OpenMapKit | openmapkit | 8007 | 8080 (HTTP) | omk |
|
||||
| Pan.do/ra | pandora | 8002 | 8080 (HTTP) | pandora |
|
||||
| Postfix | postfix | 587 | 25 (SMTP) | - |
|
||||
| Postgres | postgres | 5432 | 5432 (Postgres) | - |
|
||||
| RabbitMQ | rabbitmq | 5672 | 5672 (AMQP) | - |
|
||||
| Redis | redis | 6379 | 6379 (Redis) | - |
|
||||
| Sahana | sahana | 8001 | 8080 (HTTP) | sahana |
|
||||
| SAMBRO | sambro | 8001 | 8080 (HTTP) | sambro |
|
||||
| SeedDMS | seeddms | 8010 | 8080 (HTTP) | dms |
|
||||
| Sigmah | sigmah | 8011 | 8080 (HTTP) | sigmah |
|
||||
| Solr | solr | 8983 | 8983 (HTTP) | - |
|
||||
| Ushahidi | ushahidi | 8014 | 8080 (HTTP) | ush |
|
12
activemq.sh
@ -1,12 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
SOURCE_DIR=$(realpath $(dirname "${0}"))/activemq
|
||||
|
||||
# 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
|
@ -1,23 +0,0 @@
|
||||
FROM java
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Download and install ActiveMQ
|
||||
wget http://archive.apache.org/dist/activemq/5.15.2/apache-activemq-5.15.2-bin.tar.gz -O /tmp/activemq.tgz \
|
||||
&& tar xf /tmp/activemq.tgz -C /srv \
|
||||
&& mv /srv/apache-activemq-5.15.2 /srv/activemq \
|
||||
&& rm -f /tmp/activemq.tgz \
|
||||
# Create OS user
|
||||
&& addgroup -S -g 61616 activemq \
|
||||
&& adduser -S -u 61616 -h /srv/activemq -s /bin/false -g activemq -G activemq activemq \
|
||||
&& mkdir /srv/activemq/tmp \
|
||||
&& chown activemq:activemq /srv/activemq/tmp \
|
||||
# Configure Java heap size
|
||||
&& sed -i "s/-Xms64M -Xmx1G/-Xms32M -Xmx256M/" /srv/activemq/bin/env
|
||||
|
||||
COPY docker/ /
|
||||
|
||||
VOLUME ["/srv/activemq/data"]
|
||||
EXPOSE 61616
|
||||
|
||||
CMD ["s6-svscan", "/etc/services.d"]
|
@ -1,5 +0,0 @@
|
||||
#!/bin/execlineb -P
|
||||
|
||||
fdmove -c 2 1
|
||||
s6-setuidgid 61616:61616
|
||||
/srv/activemq/bin/activemq console
|
@ -1,19 +0,0 @@
|
||||
#!/sbin/openrc-run
|
||||
|
||||
description="ActiveMQ docker container"
|
||||
|
||||
depend() {
|
||||
need docker
|
||||
}
|
||||
|
||||
start() {
|
||||
/usr/bin/docker run -d --rm \
|
||||
--name activemq \
|
||||
-h activemq \
|
||||
-v /srv/activemq/data:/srv/activemq/data \
|
||||
activemq
|
||||
}
|
||||
|
||||
stop() {
|
||||
/usr/bin/docker stop activemq
|
||||
}
|
100
alpine.sh
@ -1,100 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Prerequisites
|
||||
# setup-interfaces
|
||||
# ifup eth0
|
||||
|
||||
# Set up repositories
|
||||
cat <<EOF >/etc/apk/repositories
|
||||
http://dl-cdn.alpinelinux.org/alpine/v3.7/main
|
||||
http://dl-cdn.alpinelinux.org/alpine/v3.7/community
|
||||
#http://dl-cdn.alpinelinux.org/alpine/edge/main
|
||||
#http://dl-cdn.alpinelinux.org/alpine/edge/community
|
||||
#http://dl-cdn.alpinelinux.org/alpine/edge/testing
|
||||
EOF
|
||||
|
||||
# Install disk management tools
|
||||
apk --no-cache add lvm2 cryptsetup e2fsprogs syslinux
|
||||
|
||||
# Create disk partitions
|
||||
cat <<EOF | fdisk /dev/sda
|
||||
n
|
||||
p
|
||||
1
|
||||
|
||||
+100m
|
||||
a
|
||||
1
|
||||
n
|
||||
p
|
||||
2
|
||||
|
||||
|
||||
t
|
||||
2
|
||||
8e
|
||||
w
|
||||
EOF
|
||||
|
||||
# Set up partition encryption
|
||||
echo -n 'password' | cryptsetup -q luksFormat /dev/sda2
|
||||
echo -n 'password' | cryptsetup open --type luks /dev/sda2 system
|
||||
|
||||
# Set up LVM
|
||||
pvcreate /dev/mapper/system
|
||||
vgcreate vg0 /dev/mapper/system
|
||||
lvcreate -L 4G vg0 -n swap
|
||||
lvcreate -l 100%FREE vg0 -n root
|
||||
|
||||
# Format
|
||||
mkfs.ext4 -m0 /dev/sda1
|
||||
mkfs.ext4 -m1 /dev/vg0/root
|
||||
mkswap /dev/vg0/swap
|
||||
|
||||
# Mount
|
||||
mount -t ext4 /dev/vg0/root /mnt
|
||||
mkdir /mnt/boot
|
||||
mount -t ext4 /dev/sda1 /mnt/boot
|
||||
|
||||
# Install Alpine linux
|
||||
setup-disk -m sys /mnt
|
||||
|
||||
# Update boot-time volume information
|
||||
BOOT_UUID=$(blkid /dev/sda1 | awk '{print $2}' | tr -d '"')
|
||||
cat <<EOF >/mnt/etc/fstab
|
||||
/dev/vg0/root / ext4 rw,noatime,data=ordered 0 1
|
||||
${BOOT_UUID} /boot ext4 rw,noatime,data=ordered 0 2
|
||||
/dev/vg0/swap swap swap defaults 0 0
|
||||
EOF
|
||||
echo "system /dev/sda2 none luks" >/mnt/etc/crypttab
|
||||
|
||||
# Rebuild initfs
|
||||
sed -i 's/lvm/lvm cryptsetup/' /mnt/etc/mkinitfs/mkinitfs.conf
|
||||
mkinitfs -c /mnt/etc/mkinitfs/mkinitfs.conf -b /mnt $(ls /mnt/lib/modules)
|
||||
|
||||
# Update extlinux
|
||||
sed -i 's/rootfstype=ext4/rootfstype=ext4 cryptroot=\/dev\/sda2 cryptdm=system/' /mnt/etc/update-extlinux.conf
|
||||
chroot /mnt update-extlinux
|
||||
|
||||
# Set time zone
|
||||
chroot /mnt setup-timezone -z Europe/Prague
|
||||
|
||||
# Set hostname
|
||||
echo 'spottervm' >/mnt/etc/hostname
|
||||
echo '127.0.0.1 spottervm localhost localhost.localdomain' >/mnt/etc/hosts
|
||||
sed -i '/hostname/d' /mnt/etc/network/interfaces
|
||||
|
||||
# Enable services on boot
|
||||
ln -s /etc/init.d/networking /mnt/etc/runlevels/boot
|
||||
ln -s /etc/init.d/urandom /mnt/etc/runlevels/boot
|
||||
|
||||
# Install bootloader to MBR
|
||||
dd bs=440 count=1 conv=notrunc if=/mnt/usr/share/syslinux/mbr.bin of=/dev/sda
|
||||
|
||||
# Unmount and shut down
|
||||
umount /mnt/boot
|
||||
umount /mnt
|
||||
swapoff -a
|
||||
vgchange -a n
|
||||
cryptsetup luksClose system
|
||||
poweroff
|
28
apk/py3-secure-cookie/APKBUILD
Normal file
@ -0,0 +1,28 @@
|
||||
# Maintainer: Disassembler <disassembler@dasm.cz>
|
||||
pkgname=py3-secure-cookie
|
||||
_pkgname=secure-cookie
|
||||
pkgver=0.1.0
|
||||
pkgrel=0
|
||||
pkgdesc="Secure cookie and session interface for WSGI applications"
|
||||
url="https://secure-cookie.readthedocs.io/"
|
||||
arch="noarch"
|
||||
license="MIT"
|
||||
depends="python3"
|
||||
makedepends="py3-setuptools"
|
||||
checkdepends="py3-pytest py3-werkzeug"
|
||||
source="https://files.pythonhosted.org/packages/source/${_pkgname:0:1}/$_pkgname/$_pkgname-$pkgver.tar.gz"
|
||||
builddir="$srcdir/$_pkgname-$pkgver"
|
||||
|
||||
build() {
|
||||
python3 setup.py build
|
||||
}
|
||||
|
||||
package() {
|
||||
python3 setup.py install --prefix=/usr --root="$pkgdir"
|
||||
}
|
||||
|
||||
check() {
|
||||
PYTHONPATH=$PWD/build/lib pytest
|
||||
}
|
||||
|
||||
sha512sums="2e57dba6f73ceb03eda33c804dbe2277c9fe700dd1be219bb3d8d43a5c9105c2323fb6b28d74d3a1dfc8fbbd938b91ab54d3e1bac1dc74490335b1d27e43b55a secure-cookie-0.1.0.tar.gz"
|
1
apk/spoc
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 8c22df2e71de329a286e75af9bff69e82876db35
|
1
apk/vmmgr
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 1c810db9472f50bd9dbe1e0f38df72590b120124
|
@ -1,11 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
SOURCE_DIR=$(realpath $(dirname "${0}"))/basic-runtimes
|
||||
|
||||
# Build Docker images
|
||||
docker build -t java ${SOURCE_DIR}/java
|
||||
docker build -t php ${SOURCE_DIR}/php
|
||||
docker build -t python2 ${SOURCE_DIR}/python2
|
||||
docker build -t python3 ${SOURCE_DIR}/python3
|
||||
docker build -t ruby ${SOURCE_DIR}/ruby
|
||||
docker build -t tomcat ${SOURCE_DIR}/tomcat
|
@ -1,13 +0,0 @@
|
||||
FROM alpine
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Install Java 1.8 JRE
|
||||
apk --no-cache add openjdk8-jre-base paxctl \
|
||||
# Fix grsec attributes to loosen memory protection restrictions
|
||||
&& paxctl -cm /usr/lib/jvm/java-1.8-openjdk/bin/java \
|
||||
&& paxctl -cm /usr/lib/jvm/java-1.8-openjdk/bin/keytool \
|
||||
&& paxctl -cm /usr/lib/jvm/java-1.8-openjdk/jre/bin/java \
|
||||
&& paxctl -cm /usr/lib/jvm/java-1.8-openjdk/jre/bin/keytool \
|
||||
# Cleanup
|
||||
&& apk --no-cache del paxctl
|
@ -1,6 +0,0 @@
|
||||
FROM alpine
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Install PHP runtime
|
||||
apk --no-cache add nginx php7 php7-ctype php7-fpm php7-gd php7-json php7-mbstring php7-mcrypt php7-opcache php7-session
|
@ -1,10 +0,0 @@
|
||||
FROM alpine
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Install XML libs
|
||||
apk --no-cache add libxml2 libxslt
|
||||
|
||||
RUN \
|
||||
# Install Python2 runtime
|
||||
apk --no-cache add python2
|
@ -1,11 +0,0 @@
|
||||
FROM alpine
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Install XML libs
|
||||
apk --no-cache add libxml2 libxslt
|
||||
|
||||
RUN \
|
||||
# Install Python3 runtime
|
||||
apk --no-cache add python3 \
|
||||
&& ln -s /usr/bin/python3 /usr/bin/python
|
@ -1,33 +0,0 @@
|
||||
FROM alpine
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Install Ruby runtime dependencies
|
||||
apk --no-cache add gdbm libressl readline zlib
|
||||
|
||||
RUN \
|
||||
# Install Ruby build dependencies
|
||||
apk --no-cache add --virtual .deps build-base autoconf gdbm-dev libressl-dev linux-headers readline-dev zlib-dev \
|
||||
# Download and unpack Ruby
|
||||
&& wget http://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.6.tar.xz -O ruby.tar.xz \
|
||||
&& mkdir -p /usr/src/ruby \
|
||||
&& tar -xJf ruby.tar.xz -C /usr/src/ruby --strip-components=1 \
|
||||
&& rm ruby.tar.xz \
|
||||
&& cd /usr/src/ruby \
|
||||
# Hackfix to suppress "Insecure world writable dir" warning
|
||||
&& sed -ni 'p;13a #define ENABLE_PATH_CHECK 0' file.c \
|
||||
# Configure compilation + hackfix to detect isnan/isinf macros
|
||||
&& autoconf \
|
||||
&& ac_cv_func_isnan=yes ac_cv_func_isinf=yes ./configure --build=x86_64-linux-musl --disable-install-doc --enable-shared \
|
||||
# Compile and install Ruby
|
||||
&& make -j $(nproc) \
|
||||
&& make install \
|
||||
# Install RubyGems and Bundler
|
||||
&& mkdir -p /usr/local/etc \
|
||||
&& echo -e 'install: --no-document\nupdate: --no-document' >/usr/local/etc/gemrc \
|
||||
&& gem update --system \
|
||||
# Cleanup
|
||||
&& cd /tmp \
|
||||
&& rm -r /usr/src/ruby \
|
||||
&& apk --no-cache del .deps \
|
||||
&& rm -rf /root/.gem
|
@ -1,15 +0,0 @@
|
||||
FROM java
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Install Tomcat 8
|
||||
wget http://mirror.hosting90.cz/apache/tomcat/tomcat-8/v8.0.51/bin/apache-tomcat-8.0.51.tar.gz -O /tmp/apache-tomcat-8.tgz \
|
||||
&& tar xf /tmp/apache-tomcat-8.tgz -C /srv \
|
||||
&& mv /srv/apache-tomcat-8.0.51 /srv/tomcat \
|
||||
# Make catalina.sh available globally
|
||||
&& ln -s /srv/tomcat/bin/catalina.sh /usr/bin/catalina.sh \
|
||||
# Cleanup
|
||||
&& rm -rf /srv/tomcat/webapps/ROOT /srv/tomcat/webapps/docs /srv/tomcat/webapps/examples /srv/tomcat/webapps/host-manager /srv/tomcat/webapps/manager \
|
||||
&& rm -f /tmp/apache-tomcat-8.tgz
|
||||
|
||||
COPY docker/ /
|
64
basic.sh
@ -1,64 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
SOURCE_DIR=$(realpath $(dirname "${0}"))/basic
|
||||
|
||||
# Install packages
|
||||
apk --no-cache add --virtual .useful curl git file htop libressl openssh-server openssh-sftp-server
|
||||
apk --no-cache add docker gettext kbd-misc python2 nginx
|
||||
|
||||
# Copy profile files and settings
|
||||
mkdir -p /root/.config/htop /root/.ssh
|
||||
cp ${SOURCE_DIR}/root/.profile /root/.profile
|
||||
cp ${SOURCE_DIR}/root/.ssh/authorized_keys /root/.ssh/authorized_keys
|
||||
cp ${SOURCE_DIR}/root/.config/htop/htoprc /root/.config/htop/htoprc
|
||||
|
||||
# Copy boot configuration
|
||||
cp ${SOURCE_DIR}/boot/extlinux.conf /boot/extlinux.conf
|
||||
cp ${SOURCE_DIR}/boot/spotter.txt /boot/spotter.txt
|
||||
cp ${SOURCE_DIR}/etc/inittab /etc/inittab
|
||||
>/etc/motd
|
||||
|
||||
# Enable support for Czech characters
|
||||
cp ${SOURCE_DIR}/etc/rc.conf /etc/rc.conf
|
||||
cp ${SOURCE_DIR}/etc/conf.d/consolefont /etc/conf.d/consolefont
|
||||
|
||||
# Configure NTP client
|
||||
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 7305 -subj "/CN=$(hostname)"
|
||||
chmod 640 /etc/ssl/private/services.key
|
||||
|
||||
# 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}/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
|
||||
for SERVICE in consolefont crond nginx ntpd sshd; do
|
||||
rc-update add ${SERVICE} boot
|
||||
service ${SERVICE} start
|
||||
done
|
||||
|
||||
# Configure Docker service
|
||||
cp ${SOURCE_DIR}/etc/init.d/docker /etc/init.d/docker
|
||||
rc-update add docker
|
||||
service docker start
|
||||
|
||||
# Create basic images
|
||||
docker build -t alpine ${SOURCE_DIR}
|
||||
|
||||
# Set dummy domain and generate related files
|
||||
spotter-appmgr update-domain spotter.vm 443
|
@ -1,6 +0,0 @@
|
||||
FROM alpine:3.7
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Install S6 supervisor
|
||||
apk --no-cache add s6
|
@ -1,9 +0,0 @@
|
||||
DEFAULT vm
|
||||
PROMPT 0
|
||||
ALLOWOPTIONS 0
|
||||
NOESCAPE 1
|
||||
DISPLAY spotter.txt
|
||||
LABEL vm
|
||||
LINUX vmlinuz-virthardened
|
||||
INITRD initramfs-virthardened
|
||||
APPEND root=/dev/vg0/root modules=sd-mod,usb-storage,ext4 pax_nouderef quiet rootfstype=ext4 cryptroot=/dev/sda2 cryptdm=system
|
@ -1,4 +0,0 @@
|
||||
|
||||
|
||||
Startuji SpotterVM...
|
||||
|
@ -1 +0,0 @@
|
||||
NTPD_OPTS="-N -p tik.cesnet.cz -p tak.cesnet.cz"
|
@ -1,40 +0,0 @@
|
||||
#!/sbin/openrc-run
|
||||
# Copyright 1999-2013 Gentoo Foundation
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
command="${DOCKERD_BINARY:-/usr/bin/dockerd}"
|
||||
pidfile="${DOCKER_PIDFILE:-/run/${RC_SVCNAME}.pid}"
|
||||
command_args="-p \"${pidfile}\" ${DOCKER_OPTS}"
|
||||
DOCKER_LOGFILE="${DOCKER_LOGFILE:-/var/log/${RC_SVCNAME}.log}"
|
||||
DOCKER_ERRFILE="${DOCKER_ERRFILE:-${DOCKER_LOGFILE}}"
|
||||
DOCKER_OUTFILE="${DOCKER_OUTFILE:-${DOCKER_LOGFILE}}"
|
||||
start_stop_daemon_args="--background \
|
||||
--stderr \"${DOCKER_ERRFILE}\" --stdout \"${DOCKER_OUTFILE}\""
|
||||
|
||||
grsecdir=/proc/sys/kernel/grsecurity
|
||||
|
||||
depend() {
|
||||
need sysfs
|
||||
}
|
||||
|
||||
start_pre() {
|
||||
checkpath -f -m 0644 -o root:docker "$DOCKER_LOGFILE"
|
||||
|
||||
for i in $disable_grsec; do
|
||||
if [ -e "$grsecdir/$i" ]; then
|
||||
einfo " Disabling $i"
|
||||
echo 0 > "$grsecdir/$i"
|
||||
fi
|
||||
done
|
||||
ulimit -n 1048576
|
||||
|
||||
# Having non-zero limits causes performance problems due to accounting overhead
|
||||
# in the kernel. We recommend using cgroups to do container-local accounting.
|
||||
ulimit -p unlimited
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
start_post() {
|
||||
ewaitfile 1 /var/run/docker.sock
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ -x /usr/bin/acme.sh ] && /usr/bin/acme.sh --cron >/dev/null
|
@ -1,2 +0,0 @@
|
||||
alias ll="ls -la"
|
||||
alias view="vi"
|
@ -1,2 +0,0 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILc3Mu7OlKrV7VqDQZ31vT3I3JJxtNNBiemUTRQVOZ3I Disassembler
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDMLx88cP67gOmmwDj2vjnPZnZp4KT/aqAkIEVBasss073wtU+tHAia5qKB+PJau3WnUSid/ZVcwHNXgrXE69DS2ZlBQFFBCJdWKP1Pd528Ot66mw9FaZvxRLaeA60yxC9dTFD0WCyVJw3HSdkJf17NYTtKcPQcn5DGfrdPHX16C3KUxOJXveTBOiieWbkQ1uUCTYyfeR9Qj+RR0gPogK217dNxGd4F3PJ3hXPKWDVpSH9JBnpG64mab3krhb6/eMUnLPUUAtgF6b0vXWNahFlA3NsriQiJy5mroLQCL2feqfkGVKlbxpRwgkGOPph4UK6RgNehF7oPwni/zMQ2rjxbpIWredlOPNvU7F8BebiuU8K4/16tz6xRiSgYzpm9nTHvJaz3W12b8Co145zPcmIdRg5KCQDEf+xB7gfpK/uo3qmc7ddMtA4oqUztbAlpfW6qR+i4X5ed9LnWdMKoWeB5Xn52cbKuTvD1qmVWGm0IPF/r+hw7Gn97nyq1Oatn9LKTJaLZeaJ9b1nBGL56U5i+4hdZPema7tVgWEYfYKTq4hrKWdWwJjlpJjqZ2qLltJmkJMNji9Ve+xBe+nRjW9wNk7c7fDxPvJe45EbrqDQNFxXjw4CKOIIt/k6e/imrVf9S7Or4Vxi+OJCQLZYT8EPb/VUuPn0JhtpIlBvD3xCDjw== vampola.karel@gmail.com
|
@ -1,134 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
@ -1,86 +0,0 @@
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Calibri', 'Verdana', 'Tahoma', sans-serif;
|
||||
background-color: silver;
|
||||
color: black;
|
||||
line-height: 150%;
|
||||
margin: 25px 30px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
h1, h2 {
|
||||
font-size: 150%;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
h2 a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
h2 img {
|
||||
float: right;
|
||||
margin-left: 10px;
|
||||
margin-bottom:10px;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
ul {
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
header {
|
||||
color: white;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
header p {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.c {
|
||||
background-color: white;
|
||||
position: relative;
|
||||
min-width: 365px;
|
||||
max-width: 365px;
|
||||
width: 90%;
|
||||
float: left;
|
||||
min-height: 175px;
|
||||
margin-top: 13px;
|
||||
margin-right: 13px;
|
||||
border: solid 1px black;
|
||||
padding: 10px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.c2 {
|
||||
max-width: 765px;
|
||||
width: 95%;
|
||||
}
|
||||
|
||||
.visible {
|
||||
display: initial;
|
||||
}
|
||||
|
||||
.ico {
|
||||
margin-right: 5px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.cleaner {
|
||||
clear: both;
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
<!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>
|
Before ![]() (image error) Size: 5.4 KiB |
Before ![]() (image error) Size: 69 KiB |
Before ![]() (image error) Size: 17 KiB |
Before ![]() (image error) Size: 70 KiB |
Before ![]() (image error) Size: 12 KiB |
Before ![]() (image error) Size: 15 KiB |
Before ![]() (image error) Size: 6.4 KiB |
Before ![]() (image error) Size: 119 KiB |
Before ![]() (image error) Size: 42 KiB |
Before ![]() (image error) Size: 12 KiB |
Before ![]() (image error) Size: 48 KiB |
Before ![]() (image error) Size: 21 KiB |
Before ![]() (image error) Size: 36 KiB |
Before ![]() (image error) Size: 83 KiB |
Before ![]() (image error) Size: 101 KiB |
Before ![]() (image error) Size: 16 KiB |
Before ![]() (image error) Size: 7.9 KiB |
Before ![]() (image error) Size: 47 KiB |
Before ![]() (image error) Size: 6.1 KiB |
Before ![]() (image error) Size: 22 KiB |
Before ![]() (image error) Size: 21 KiB |
Before ![]() (image error) Size: 16 KiB |
Before ![]() (image error) Size: 13 KiB |
Before ![]() (image error) Size: 12 KiB |
Before ![]() (image error) Size: 32 KiB |
Before ![]() (image error) Size: 23 KiB |
Before ![]() (image error) Size: 53 KiB |
Before ![]() (image error) Size: 9.2 KiB |
Before ![]() (image error) Size: 17 KiB |
Before ![]() (image error) Size: 33 KiB |
Before ![]() (image error) Size: 4.3 KiB |
Before ![]() (image error) Size: 16 KiB |
@ -1,308 +0,0 @@
|
||||
<!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>Cluster NGO</title>
|
||||
<link rel="icon" href="img/cluster_spotter.png" type="image/png">
|
||||
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen">
|
||||
<script src="js/jquery-3.3.1.min.js" type="text/javascript"></script>
|
||||
<script src="js/script.js" type="text/javascript"></script>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>CLUSTER NGO</h1>
|
||||
<p>Sada softwarových nástrojů určená pro krizový management.</p>
|
||||
</header>
|
||||
|
||||
<div class="c c2" id="sahana">
|
||||
<h2><a href="https://sahana.{host}/eden/"><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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="sahana-demo">
|
||||
<h2><a href="https://sahana-demo.{host}/eden/"><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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="sambro">
|
||||
<h2><a href="https://sambro.{host}/eden/"><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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="sambro-mobile">
|
||||
<h2><a href="#"><img src="img/EDEN.png" alt="SAMBRO Mobile" title="SAMBRO Mobile">SAMBRO Mobile</a></h2>
|
||||
<p>Mobilní klient k aplikaci Sahana EDEN.<br>
|
||||
<a href="https://itunes.apple.com/us/app/sambro-mobile/id1127251669"><img src="img/ios.png" class="ico" alt="IOS">IOS 6.0 a vyšší</a><br>
|
||||
<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">https://sambro.{host}/eden/</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="ckan">
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<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="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">https://odk.{host}</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
<ul>
|
||||
<li><strong>Login:</strong> <span class="login"></span></li>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="geoodk-clients">
|
||||
<h2><a href="#"><img src="img/GeoODK_Collect.png" alt="GeoODK Collect" title="GeoODK Collect">GeoODK Collect</a></h2>
|
||||
<p>Mobilní aplikace<br>
|
||||
<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">https://omk.{host}</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<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">https://omk.{host}</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="seeddms">
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="pandora">
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="ushahidi">
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="ushahidi-mobile">
|
||||
<h2><a href="#"><img src="img/Ushahidi_mobile.png" alt="Ushahidi" title="Ushahidi">Ushahidi Mobile</a></h2>
|
||||
<p>Mobilní aplikace Ushahidi pro<br>
|
||||
<a href="https://itunes.apple.com/us/app/ushahidi-mobile/id1205994516?mt=8"><img src="img/ios.png" class="ico" alt="IOS">IOS 9.0 a vyšší</a><br>
|
||||
<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">ushahidi.{host}</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="sms-sync-gateway">
|
||||
<h2><a href="#"><img src="img/SMS_Sync.png" alt="SMS Sync Gateway" title="SMS Sync Gateway">SMS Sync Gateway</a></h2>
|
||||
<p>Mobilní aplikace pro<br>
|
||||
<a href="https://play.google.com/store/apps/details?id=org.addhen.smssync"><img src="img/android.png" class="ico" alt="Android">Android 2.3 a vyšší</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="c" id="kanboard">
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="kanboard-mobile">
|
||||
<h2><a href="#"><img src="img/Kanboard.png" alt="Kanboard" title="Kanboard">Kanboard Mobile</a></h2>
|
||||
<p>Mobilní aplikace<br>
|
||||
<a href="https://play.google.com/store/apps/details?id=eu.it_quality.kanboard"><img src="img/android.png" class="ico" alt="KanBoard">KanBoard client pro Android 4.1 a vyšší</a><br>
|
||||
<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">https://kb.{host}</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="cts">
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="gnuhealth">
|
||||
<h2><a href="https://gh.{host}/index.html"><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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
<li><strong>Heslo k demu:</strong> <span class="demopassword">gnusolidario</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="gnuhealth-clients">
|
||||
<h2><a href="#"><img src="img/GNU_Health.png" alt="GNU Health" title="GNU Health">GNU Health klienti</a></h2>
|
||||
<p>Klientské aplikace platformy Tryton GNU Health pro<br>
|
||||
<a href="https://downloads.tryton.org/4.2/tryton-last.exe"><img src="img/Windows.png" class="ico" alt="Windows">Windows</a><br>
|
||||
<a href="https://downloads.tryton.org/4.2/tryton-last.dmg"><img src="img/MacOS.png" class="ico" alt="MacOS">MacOS</a><br>
|
||||
<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">gh.{host}</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="sigmah">
|
||||
<h2><a href="https://sigmah.{host}/sigmah/"><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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="motech">
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="mifosx">
|
||||
<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>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="mifosx-mobile">
|
||||
<h2><a href="#"><img src="img/MifosX_Mobile.png" alt="Mifos X" title="Mifos X">Mifos X</a></h2>
|
||||
<p>Mobilní aplikace<br>
|
||||
<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">mifosx.{host}</span></li>
|
||||
<li><strong>Tenant ID:</strong> <span>default</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="diaspora">
|
||||
<h2><a href="#"><img src="img/Diaspora.png" alt="diaspora*" title="diaspora*">diaspora*</a></h2>
|
||||
<p>Autonomní sociání síť s možností propojení do cizích sociálních sítí.</p>
|
||||
<ul>
|
||||
<li><strong>Login:</strong> <span class="login"></span></li>
|
||||
<li><strong>Heslo:</strong> <span class="password"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="c" id="openid">
|
||||
<h2><a href="http://openid.net"><img src="img/OpenID.png" alt="OpenID" title="OpenID">OpenID</a></h2>
|
||||
<p>Pro ověření identity budete potřebovat účet OpenID. Zaregistrujte se. Registraci využijete v software Sahana EDEN.</p>
|
||||
</div>
|
||||
|
||||
<div class="c" id="posm">
|
||||
<h2><a href="#"><img src="img/POSM.png" alt="POSM" title="POSM">POSM</a></h2>
|
||||
<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 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>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="cleaner"></div>
|
||||
</body>
|
||||
</html>
|
2
basic/srv/portal/js/jquery-3.3.1.min.js
vendored
@ -1,21 +0,0 @@
|
||||
$(function() {
|
||||
$.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(idx, 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));
|
||||
});
|
||||
});
|
||||
});
|
@ -1,318 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
CONF_FILE = '/srv/config.json'
|
||||
DISCARD_IP = '[100::1]'
|
||||
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 /error.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;
|
||||
}}
|
||||
}}
|
||||
'''
|
||||
|
||||
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 another running app
|
||||
deps = self.build_deps_tree()
|
||||
for dep in self.get_app_deps(app):
|
||||
if not any([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 IP of referenced app container and reload nginx
|
||||
self.update_proxy_conf(app, self.get_container_ip(app))
|
||||
subprocess.call(['/sbin/service', 'nginx', 'reload'])
|
||||
|
||||
def update_proxy_conf(self, app, ip):
|
||||
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=ip, domain=self.domain, port=self.port))
|
||||
|
||||
def unregister_proxy(self, app):
|
||||
# Remove nginx configuration to prevent proxy mismatch when the container IP is reassigned to another container
|
||||
self.update_proxy_conf(app, DISCARD_IP)
|
||||
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 address from IPv6 discard prefix instead
|
||||
try:
|
||||
return subprocess.check_output(['/usr/bin/docker', 'inspect', '-f', '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}', app]).strip()
|
||||
except:
|
||||
return DISCARD_IP
|
||||
|
||||
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):
|
||||
# Rebuild nginx config for the portal app
|
||||
with open(os.path.join(NGINX_DIR, 'default.conf'), 'w') as f:
|
||||
f.write(NGINX_DEFAULT_TEMPLATE.format(port=self.port))
|
||||
# Unregister nginx proxy for apps (will be repopulated on app restart)
|
||||
for app in self.conf['apps']:
|
||||
self.update_proxy_conf(app, DISCARD_IP)
|
||||
# Restart nginx to properly bind the new listen 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(['/sbin/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)
|
117
build/build-all.sh
Executable file
@ -0,0 +1,117 @@
|
||||
#!/bin/sh
|
||||
set -ev
|
||||
|
||||
ROOT=$(dirname $(dirname $(realpath "${0}")))
|
||||
|
||||
# Build documentation
|
||||
cd ${ROOT}/doc
|
||||
make html
|
||||
|
||||
# Build basic tar
|
||||
cd ${ROOT}/vm
|
||||
tar czpf /srv/build/vm.tar.gz *
|
||||
|
||||
# Build native apps
|
||||
cd ${ROOT}/apk/py3-secure-cookie
|
||||
apk add -U py3-setuptools py3-pytest py3-werkzeug
|
||||
abuild -F
|
||||
|
||||
cd ${ROOT}/apk/spoc
|
||||
abuild -F
|
||||
|
||||
cd ${ROOT}/apk/vmmgr
|
||||
abuild -F
|
||||
|
||||
# Build runtimes
|
||||
cd ${ROOT}/lxc-shared
|
||||
spoc-image build -p alpine3.8/image
|
||||
spoc-image build -p alpine3.8-java8/image
|
||||
spoc-image build -p alpine3.8-ruby2.4/image
|
||||
spoc-image build -p alpine3.10/image
|
||||
spoc-image build -p alpine3.10-nodejs10/image
|
||||
spoc-image build -p alpine3.11/image
|
||||
spoc-image build -p alpine3.11-python2.7/image
|
||||
spoc-image build -p alpine3.12/image
|
||||
spoc-image build -p alpine3.12-java8/image
|
||||
spoc-image build -p alpine3.12-php7.3/image
|
||||
spoc-image build -p alpine3.12-python3.8/image
|
||||
spoc-image build -p alpine3.12-ruby2.4/image
|
||||
spoc-image build -p alpine3.12-ruby2.7/image
|
||||
spoc-image build -p alpine3.12-tomcat7/image
|
||||
spoc-image build -p alpine3.12-tomcat8.5/image
|
||||
spoc-image build -p debian10/image
|
||||
|
||||
# Build services
|
||||
cd ${ROOT}/lxc-services
|
||||
spoc-image build -p activemq/image
|
||||
spoc-image build -p mariadb/image
|
||||
spoc-image build -p mongodb/image
|
||||
spoc-image build -p postgres/image
|
||||
spoc-image build -p postgis/image
|
||||
spoc-image build -p rabbitmq/image
|
||||
spoc-image build -p redis/image
|
||||
spoc-image build -p solr6/image
|
||||
|
||||
# Build applications
|
||||
cd ${ROOT}/lxc-apps
|
||||
|
||||
spoc-image build -p ckan/ckan.image
|
||||
spoc-image build -p ckan/ckan-datapusher.image
|
||||
spoc-app publish ckan/app
|
||||
|
||||
spoc-image build -p crisiscleanup/image
|
||||
spoc-app publish crisiscleanup/app
|
||||
|
||||
spoc-image build -p cts/image
|
||||
spoc-app publish cts/app
|
||||
|
||||
spoc-image build -p decidim/decidim-nginx.image
|
||||
spoc-image build -p decidim/decidim.image
|
||||
spoc-app publish decidim/app
|
||||
|
||||
spoc-image build -p dhis2/image
|
||||
spoc-app publish dhis2/app
|
||||
|
||||
spoc-image build -p frontlinesms/image
|
||||
spoc-app publish frontlinesms/app
|
||||
|
||||
spoc-image build -p gnuhealth/image
|
||||
spoc-app publish gnuhealth/app
|
||||
|
||||
spoc-image build -p kanboard/image
|
||||
spoc-app publish kanboard/app
|
||||
|
||||
spoc-image build -p mifosx/image
|
||||
spoc-app publish mifosx/app
|
||||
|
||||
spoc-image build -p motech/image
|
||||
spoc-app publish motech/app
|
||||
|
||||
spoc-image build -p odoo/image
|
||||
spoc-app publish odoo/app
|
||||
|
||||
spoc-image build -p opendatakit/opendatakit.image
|
||||
spoc-image build -p opendatakit/opendatakit-build.image
|
||||
spoc-app publish opendatakit/app
|
||||
|
||||
spoc-image build -p openmapkit/image
|
||||
spoc-app publish openmapkit/app
|
||||
|
||||
spoc-image build -p pandora/image
|
||||
spoc-app publish pandora/app
|
||||
|
||||
spoc-image build -p sahana/image
|
||||
spoc-app publish sahana/app
|
||||
spoc-app publish sahana-demo/app
|
||||
spoc-app publish sambro/app
|
||||
spoc-app publish safire/app
|
||||
spoc-app publish share/app
|
||||
|
||||
spoc-image build -p seeddms/image
|
||||
spoc-app publish seeddms/app
|
||||
|
||||
spoc-image build -p taarifa/image
|
||||
spoc-app publish taarifa/app
|
||||
|
||||
spoc-image build -p ushahidi/image
|
||||
spoc-app publish ushahidi/app
|
29
build/clean-all.sh
Executable file
@ -0,0 +1,29 @@
|
||||
#!/bin/sh
|
||||
set -ev
|
||||
|
||||
# Clean documentation
|
||||
rm -rf /srv/build/doc/*
|
||||
|
||||
# Clean basic tar
|
||||
rm -f /srv/build/vm.tar.gz
|
||||
|
||||
# Clean native apps
|
||||
rm -rf /srv/build/alpine/*
|
||||
|
||||
# Clean built LXC packages
|
||||
rm -rf /srv/build/spoc
|
||||
|
||||
# Remove nginx configs
|
||||
for CONF in $(find /etc/nginx/conf.d -name '*.conf' -a ! -name repo.conf -a ! -name default.conf); do
|
||||
rm -f ${CONF}
|
||||
done
|
||||
service nginx reload
|
||||
|
||||
# Stop running containers
|
||||
for APP in $(spoc-container list); do
|
||||
spoc-container stop ${APP}
|
||||
done
|
||||
|
||||
# Remove data
|
||||
rm -rf /var/lib/spoc
|
||||
rm -rf /var/log/spoc
|
32
build/etc/abuild.conf
Normal file
@ -0,0 +1,32 @@
|
||||
export CFLAGS="-Os -fomit-frame-pointer"
|
||||
export CXXFLAGS="$CFLAGS"
|
||||
export CPPFLAGS="$CFLAGS"
|
||||
export LDFLAGS="-Wl,--as-needed"
|
||||
|
||||
export JOBS=2
|
||||
export MAKEFLAGS=-j$JOBS
|
||||
|
||||
# remove line below to disable colors
|
||||
USE_COLORS=1
|
||||
|
||||
# uncomment line below to enable ccache support.
|
||||
#USE_CCACHE=1
|
||||
|
||||
SRCDEST=/var/cache/distfiles
|
||||
|
||||
# uncomment line below to store built packages in other location
|
||||
# The package will be stored as $REPODEST/$repo/$pkgname-$pkgver-r$pkgrel.apk
|
||||
# where $repo is the name of the parent directory of $startdir.
|
||||
REPODEST=/srv/build/alpine/v3.12
|
||||
|
||||
# PACKAGER and MAINTAINER are used by newapkbuild when creating new aports for
|
||||
# the APKBUILD's "Contributor:" and "Maintainer:" comments, respectively.
|
||||
#PACKAGER="Your Name <your@email.address>"
|
||||
#MAINTAINER="$PACKAGER"
|
||||
PACKAGER_PRIVKEY="/root/repo.spotter.cz.rsa"
|
||||
|
||||
# what to clean up after a successful build
|
||||
CLEANUP="srcdir bldroot pkgdir deps"
|
||||
|
||||
# what to cleanup after a failed build
|
||||
ERROR_CLEANUP="bldroot deps"
|
8
build/etc/nginx/conf.d/repo.conf
Normal file
@ -0,0 +1,8 @@
|
||||
server {
|
||||
listen [::]:80;
|
||||
server_name repo.build.vm;
|
||||
|
||||
location / {
|
||||
root /srv/build;
|
||||
}
|
||||
}
|
36
build/install-toolchain.sh
Executable file
@ -0,0 +1,36 @@
|
||||
#!/bin/sh
|
||||
set -ev
|
||||
|
||||
cd $(realpath $(dirname "${0}"))
|
||||
|
||||
# Install basic build tools
|
||||
apk update
|
||||
apk add git file htop less openssh-client tree
|
||||
# Install Alpine SDK (for APK builds)
|
||||
apk add alpine-sdk
|
||||
# Install Sphinx support (for documentation builds)
|
||||
apk add py3-sphinx py3-sphinx_rtd_theme
|
||||
|
||||
# Copy root profile files and settings
|
||||
mkdir -p /root/.config/htop
|
||||
cp root/.profile /root/.profile
|
||||
cp root/.config/htop/htoprc /root/.config/htop/htoprc
|
||||
|
||||
# Prepare abuild toolchain
|
||||
adduser root abuild
|
||||
cp etc/abuild.conf /etc/abuild.conf
|
||||
|
||||
# Prepare local APK repository
|
||||
cp etc/nginx/conf.d/repo.conf /etc/nginx/conf.d/repo.conf
|
||||
echo "172.17.0.1 repo.build.vm" >>/etc/hosts
|
||||
service nginx reload
|
||||
|
||||
# Change SPOC repository
|
||||
sed -i 's/https:\/\/repo\.spotter\.cz/http:\/\/repo.build.vm/' /etc/spoc/spoc.conf
|
||||
|
||||
# Supply abuild key
|
||||
# echo '/root/repo.spotter.cz.rsa' | abuild-keygen
|
||||
|
||||
# Supply SPOC key
|
||||
# openssl ecparam -genkey -name secp384r1 -out /etc/spoc/publish.key
|
||||
# openssl ec -in /etc/spoc/publish.key -pubout -out /tmp/repository.pub
|
2
build/root/.profile
Normal file
@ -0,0 +1,2 @@
|
||||
alias ll="ls -la"
|
||||
alias view="vi -R"
|
@ -1,14 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
SOURCE_DIR=$(realpath $(dirname "${0}"))/ckan-datapusher
|
||||
|
||||
# Build Docker container
|
||||
docker build -t ckan-datapusher ${SOURCE_DIR}
|
||||
cp ${SOURCE_DIR}/etc/init.d/ckan-datapusher /etc/init.d/ckan-datapusher
|
||||
rc-update -u
|
||||
|
||||
# Configure CKAN DataPusher
|
||||
mkdir -p /srv/ckan-datapusher/conf /srv/ckan-datapusher/data
|
||||
cp ${SOURCE_DIR}/srv/ckan-datapusher/conf/datapusher.wsgi /srv/ckan-datapusher/conf/datapusher.wsgi
|
||||
cp ${SOURCE_DIR}/srv/ckan-datapusher/conf/datapusher_settings.py /srv/ckan-datapusher/conf/datapusher_settings.py
|
||||
chown -R 8004:8004 /srv/ckan-datapusher/data
|
@ -1,32 +0,0 @@
|
||||
FROM python2
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Install runtime dependencies
|
||||
apk --no-cache add libffi libressl uwsgi-python
|
||||
|
||||
RUN \
|
||||
# Install build dependencies
|
||||
apk --no-cache add --virtual .deps build-base git libffi-dev libressl-dev libxml2-dev libxslt-dev py2-pip python2-dev \
|
||||
# Install CKAN DataPusher
|
||||
&& mkdir -p /srv/ckan-datapusher \
|
||||
&& cd /srv/ckan-datapusher \
|
||||
&& pip install -U setuptools \
|
||||
&& pip install -e 'git+https://github.com/ckan/datapusher.git#egg=datapusher' \
|
||||
# Hackfix the X509_STORE_CTX wrapper
|
||||
&& sed -i 's/\[security\]//' /srv/ckan-datapusher/src/datapusher/requirements.txt \
|
||||
&& pip install -r /srv/ckan-datapusher/src/datapusher/requirements.txt \
|
||||
# Create OS user
|
||||
&& addgroup -S -g 8004 ckandp \
|
||||
&& adduser -S -u 8004 -h /srv/ckan-datapusher -s /bin/false -g ckandp -G ckandp ckandp \
|
||||
&& chown -R ckandp:ckandp /srv/ckan-datapusher \
|
||||
# Cleanup
|
||||
&& apk --no-cache del .deps \
|
||||
&& find /srv/ckan-datapusher/src -name '.git*' -exec rm -rf {} + \
|
||||
&& rm -rf /root/.cache
|
||||
|
||||
VOLUME ["/etc/ckan-datapusher", "/srv/ckan-datapusher/data"]
|
||||
EXPOSE 8080
|
||||
|
||||
USER ckandp
|
||||
CMD ["uwsgi", "--plugin", "python", "--http-socket", "0.0.0.0:8080", "--wsgi-file", "/etc/ckan-datapusher/datapusher.wsgi", "--enable-threads"]
|
@ -1,20 +0,0 @@
|
||||
#!/sbin/openrc-run
|
||||
|
||||
description="CKAN DataPusher docker container"
|
||||
|
||||
depend() {
|
||||
need docker
|
||||
}
|
||||
|
||||
start() {
|
||||
/usr/bin/docker run -d --rm \
|
||||
--name ckan-datapusher \
|
||||
-h ckan-datapusher \
|
||||
-v /srv/ckan-datapusher/conf:/etc/ckan-datapusher \
|
||||
-v /srv/ckan-datapusher/data:/srv/ckan-datapusher/data \
|
||||
ckan-datapusher
|
||||
}
|
||||
|
||||
stop() {
|
||||
/usr/bin/docker stop ckan-datapusher
|
||||
}
|
62
ckan.sh
@ -1,62 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
SOURCE_DIR=$(realpath $(dirname "${0}"))/ckan
|
||||
|
||||
# Check prerequisites
|
||||
docker image ls | grep -q ckan-datapusher || $(realpath $(dirname "${0}"))/ckan-datapusher.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 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)
|
||||
export CKAN_DS_PWD=$(head -c 18 /dev/urandom | base64)
|
||||
envsubst <${SOURCE_DIR}/createdb.sql | docker exec -i postgres psql
|
||||
|
||||
# Configure CKAN Solr core
|
||||
docker exec solr solr create -p 8983 -c ckan
|
||||
cp ${SOURCE_DIR}/srv/solr/data/ckan/conf/schema.xml /srv/solr/data/ckan/conf/schema.xml
|
||||
cp ${SOURCE_DIR}/srv/solr/data/ckan/conf/solrconfig.xml /srv/solr/data/ckan/conf/solrconfig.xml
|
||||
chown 8983:8983 /srv/solr/data/ckan/conf/schema.xml
|
||||
service solr restart
|
||||
|
||||
# Configure CKAN
|
||||
mkdir -p /srv/ckan/conf /srv/ckan/data
|
||||
chown -R 8003:8003 /srv/ckan/data
|
||||
export CKAN_SECRET=$(head -c 18 /dev/urandom | base64)
|
||||
export CKAN_UUID=$(cat /proc/sys/kernel/random/uuid)
|
||||
envsubst <${SOURCE_DIR}/srv/ckan/conf/ckan.ini >/srv/ckan/conf/ckan.ini
|
||||
cp ${SOURCE_DIR}/srv/ckan/conf/who.ini /srv/ckan/conf/who.ini
|
||||
cp ${SOURCE_DIR}/srv/ckan/update-url.sh /srv/ckan/update-url.sh
|
||||
|
||||
# Set "production values" (increases performance) only if the DEBUG environment variable is not set
|
||||
if [ ${DEBUG:-0} -eq 0 ]; then
|
||||
sed -i 's/debug = true/debug = false/' /srv/ckan/conf/ckan.ini
|
||||
fi
|
||||
|
||||
# Populate database
|
||||
docker run --rm -h ckan --link postgres --link redis --link solr -v /srv/ckan/conf:/etc/ckan -v /srv/ckan/data:/srv/ckan/storage ckan paster --plugin=ckan db init -c /etc/ckan/ckan.ini
|
||||
docker run --rm -h ckan --link postgres --link redis --link solr -v /srv/ckan/conf:/etc/ckan -v /srv/ckan/data:/srv/ckan/storage ckan paster --plugin=ckanext-spatial spatial initdb -c /etc/ckan/ckan.ini
|
||||
docker run --rm -h ckan --link postgres --link redis --link solr -v /srv/ckan/conf:/etc/ckan -v /srv/ckan/data:/srv/ckan/storage ckan paster --plugin=ckan datastore set-permissions -c /etc/ckan/ckan.ini | docker exec -i postgres psql
|
||||
|
||||
# Create admin account
|
||||
export CKAN_ADMIN_USER="admin"
|
||||
export CKAN_ADMIN_UUID=$(cat /proc/sys/kernel/random/uuid)
|
||||
export CKAN_ADMIN_APIKEY=$(cat /proc/sys/kernel/random/uuid)
|
||||
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
|
||||
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
|
@ -1,47 +0,0 @@
|
||||
FROM python2
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Add edge/testing repository
|
||||
echo '@edge http://dl-cdn.alpinelinux.org/alpine/edge/testing' >>/etc/apk/repositories \
|
||||
# Install runtime dependencies
|
||||
&& apk --no-cache add geos@edge libjpeg-turbo libmagic libpq mailcap py2-pip zlib
|
||||
|
||||
RUN \
|
||||
# Install build dependencies
|
||||
apk --no-cache add --virtual .deps build-base git libjpeg-turbo-dev libxml2-dev libxslt-dev postgresql-dev python2-dev zlib-dev \
|
||||
# Hackfix for python find_library('c') call
|
||||
&& ln -s /lib/ld-musl-x86_64.so.1 /lib/libc.so.1 \
|
||||
# Install CKAN
|
||||
&& mkdir -p /srv/ckan \
|
||||
&& cd /srv/ckan \
|
||||
&& pip install -U setuptools \
|
||||
&& pip install -e 'git+https://github.com/ckan/ckan.git#egg=ckan' \
|
||||
# Force psycopg2 version update for compatibility with PostgreSQL 10
|
||||
&& sed -i 's/psycopg2==2.4.5/psycopg2==2.7.1/' /srv/ckan/src/ckan/requirements.txt \
|
||||
&& pip install -r /srv/ckan/src/ckan/requirements.txt \
|
||||
# Install CKAN extensions
|
||||
&& pip install -e 'git+https://github.com/ckan/ckanext-basiccharts#egg=ckanext_basiccharts' \
|
||||
&& pip install -e 'git+https://github.com/ckan/ckanext-spatial#egg=ckanext_spatial' \
|
||||
&& pip install -e 'git+https://github.com/ckan/ckanext-geoview#egg=ckanext_geoview' \
|
||||
&& pip install -e 'git+https://github.com/ckan/ckanext-mapviews#egg=ckanext_mapviews' \
|
||||
&& pip install -e 'git+https://github.com/XVTSolutions/ckanext-spatialUI#egg=ckanext_spatialui' \
|
||||
&& pip install -e 'git+https://github.com/aptivate/ckanext-datasetthumbnail#egg=ckanext_datasetthumbnail' \
|
||||
&& pip install -e 'git+https://github.com/datagvat/ckanext-dgvat_xls#egg=ckanext_dgvat_xls' \
|
||||
&& pip install -r /srv/ckan/src/ckanext-spatial/pip-requirements.txt \
|
||||
&& pip install -r /srv/ckan/src/ckanext-dgvat-xls/requirements.txt \
|
||||
# Create OS user
|
||||
&& addgroup -S -g 8003 ckan \
|
||||
&& adduser -S -u 8003 -h /srv/ckan -s /bin/false -g ckan -G ckan ckan \
|
||||
&& chown -R ckan:ckan /srv/ckan \
|
||||
# Cleanup
|
||||
&& apk --no-cache del .deps \
|
||||
&& find /srv/ckan/src -name '.git*' -exec rm -rf {} + \
|
||||
&& rm -rf /root/.cache
|
||||
|
||||
COPY docker/ /
|
||||
|
||||
VOLUME ["/etc/ckan", "/srv/ckan/storage"]
|
||||
EXPOSE 8080
|
||||
|
||||
CMD ["s6-svscan", "/etc/services.d"]
|
@ -1,3 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
/bin/true
|
@ -1,5 +0,0 @@
|
||||
#!/bin/execlineb -P
|
||||
|
||||
fdmove -c 2 1
|
||||
s6-setuidgid 8003:8003
|
||||
/usr/bin/paster serve /etc/ckan/ckan.ini
|
@ -1,33 +0,0 @@
|
||||
#!/sbin/openrc-run
|
||||
|
||||
description="CKAN docker container"
|
||||
|
||||
depend() {
|
||||
need docker ckan-datapusher postfix postgres redis solr
|
||||
}
|
||||
|
||||
start() {
|
||||
/usr/bin/docker run -d --rm \
|
||||
--name ckan \
|
||||
-h ckan \
|
||||
--link ckan-datapusher \
|
||||
--link postfix \
|
||||
--link postgres \
|
||||
--link redis \
|
||||
--link solr \
|
||||
-v /srv/ckan/conf:/etc/ckan \
|
||||
-v /srv/ckan/data:/srv/ckan/storage \
|
||||
ckan
|
||||
}
|
||||
|
||||
start_post() {
|
||||
/usr/bin/spotter-appmgr register-proxy ckan
|
||||
}
|
||||
|
||||
stop_pre() {
|
||||
/usr/bin/spotter-appmgr unregister-proxy ckan
|
||||
}
|
||||
|
||||
stop() {
|
||||
/usr/bin/docker stop ckan
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
if docker ps | grep -q 'ckan$'; then
|
||||
docker exec ckan paster --plugin=ckan tracking update -c /etc/ckan/ckan.ini >/dev/null
|
||||
docker exec ckan paster --plugin=ckan search-index rebuild -r -c /etc/ckan/ckan.ini >/dev/null
|
||||
fi
|
@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
HOST="${1}"
|
||||
[ "${2}" != "443" ] && HOST="${1}:${2}"
|
||||
|
||||
sed -i "s|^ckan\.site_url.*|ckan.site_url = https://${HOST}|" /srv/ckan/conf/ckan.ini
|
@ -1,39 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
SOURCE_DIR=$(realpath $(dirname "${0}"))/crisiscleanup
|
||||
|
||||
# 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 crisiscleanup ${SOURCE_DIR}
|
||||
cp ${SOURCE_DIR}/etc/init.d/crisiscleanup /etc/init.d/crisiscleanup
|
||||
rc-update -u
|
||||
|
||||
# Create database
|
||||
export CRISISCLEANUP_PWD=$(head -c 18 /dev/urandom | base64)
|
||||
envsubst <${SOURCE_DIR}/createdb.sql | docker exec -i postgres psql
|
||||
|
||||
# Copy existing config files into persistent storage
|
||||
mkdir -p /srv/crisiscleanup/conf
|
||||
chown 8005:8005 /srv/crisiscleanup/conf
|
||||
docker run --rm -v /srv/crisiscleanup/conf:/mnt/conf crisiscleanup cp -rp /srv/crisiscleanup/config/. /mnt/conf
|
||||
chown root:root /srv/crisiscleanup/conf
|
||||
|
||||
# Configure CrisisCleanup
|
||||
export CRISISCLEANUP_ADMIN_USER="Admin"
|
||||
export CRISISCLEANUP_ADMIN_EMAIL="admin@example.com"
|
||||
export CRISISCLEANUP_ADMIN_PWD=$(head -c 12 /dev/urandom | base64)
|
||||
envsubst <${SOURCE_DIR}/srv/crisiscleanup/conf/database.yml >/srv/crisiscleanup/conf/database.yml
|
||||
cp ${SOURCE_DIR}/srv/crisiscleanup/conf/boot.rb /srv/crisiscleanup/conf/boot.rb
|
||||
cp ${SOURCE_DIR}/srv/crisiscleanup/conf/initializers/devise.rb /srv/crisiscleanup/conf/initializers/devise.rb
|
||||
cp ${SOURCE_DIR}/srv/crisiscleanup/conf/environments/production.rb /srv/crisiscleanup/conf/environments/production.rb
|
||||
spotter-appmgr update-login crisiscleanup "${CRISISCLEANUP_ADMIN_EMAIL}" "${CRISISCLEANUP_ADMIN_PWD}"
|
||||
|
||||
# Populate database
|
||||
envsubst <${SOURCE_DIR}/srv/crisiscleanup/db/seeds.rb >/tmp/seeds.rb
|
||||
docker run --rm -h crisiscleanup --link postgres -v /srv/crisiscleanup/conf:/srv/crisiscleanup/config crisiscleanup rake db:schema:load
|
||||
docker run --rm -h crisiscleanup --link postgres -v /srv/crisiscleanup/conf:/srv/crisiscleanup/config -v /tmp/seeds.rb:/srv/crisiscleanup/db/seeds.rb crisiscleanup rake db:seed
|
||||
rm /tmp/seeds.rb
|
@ -1,51 +0,0 @@
|
||||
FROM ruby
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Install NodeJS runtime
|
||||
apk --no-cache add nodejs paxctl \
|
||||
# Fix grsec attributes to loosen memory protection restrictions
|
||||
&& paxctl -cm /usr/bin/node \
|
||||
# Cleanup
|
||||
&& apk --no-cache del paxctl
|
||||
|
||||
RUN \
|
||||
# Install runtime dependencies
|
||||
apk --no-cache add libpq libxml2 libxslt tzdata
|
||||
|
||||
ENV RAILS_ENV production
|
||||
|
||||
RUN \
|
||||
# Install build dependencies
|
||||
apk --no-cache add --virtual .deps build-base git libxml2-dev libxslt-dev linux-headers postgresql-dev yarn zlib-dev \
|
||||
# Clone CrisisCleanup
|
||||
&& git clone --depth 1 https://github.com/CrisisCleanup/crisiscleanup /srv/crisiscleanup \
|
||||
# Hackfix ruby dependency versions
|
||||
&& sed -i 's/2\.2\.5/2.3.6/' /srv/crisiscleanup/Gemfile \
|
||||
&& sed -i 's/rdoc (4\.2\.0)/rdoc (4.3.0)/' /srv/crisiscleanup/Gemfile.lock \
|
||||
# Install Ruby and NodeJS dependencies
|
||||
&& cd /srv/crisiscleanup \
|
||||
&& bundle config build.nokogiri --use-system-libraries \
|
||||
&& bundle install \
|
||||
&& npm install \
|
||||
&& yarn \
|
||||
# Create CrisisCleanup secret
|
||||
&& echo -e "production:\n secret_key_base: $(rake secret)" >/srv/crisiscleanup/config/secrets.yml \
|
||||
# Generate static resources
|
||||
&& rake assets:precompile \
|
||||
# Create OS user
|
||||
&& addgroup -S -g 8005 cc \
|
||||
&& adduser -S -u 8005 -h /srv/crisiscleanup -s /bin/false -g cc -G cc cc \
|
||||
&& chown -R cc:cc /srv/crisiscleanup \
|
||||
# Cleanup
|
||||
&& apk --no-cache del .deps \
|
||||
&& find /srv/crisiscleanup -name '.git*' -exec rm -rf {} + \
|
||||
&& rm -rf /usr/local/share/.cache \
|
||||
&& rm -rf /root/.bundle /root/.config /root/.npm
|
||||
|
||||
VOLUME ["/srv/crisiscleanup/config"]
|
||||
EXPOSE 8080
|
||||
|
||||
USER cc
|
||||
WORKDIR /srv/crisiscleanup
|
||||
CMD ["rails", "server"]
|
41
cts.sh
@ -1,41 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
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)
|
||||
envsubst <${SOURCE_DIR}/createdb.sql | docker exec -i postgres psql
|
||||
|
||||
# Copy existing config files into persistent storage
|
||||
mkdir -p /srv/cts/conf
|
||||
docker run --rm -v /srv/cts/conf:/mnt/conf cts cp /srv/cts/cts/settings/base.py /mnt/conf/
|
||||
|
||||
# Configure CTS
|
||||
export CTS_SECRET=$(head -c 26 /dev/urandom | base64)
|
||||
envsubst <${SOURCE_DIR}/srv/cts/conf/spotter.py >/srv/cts/conf/spotter.py
|
||||
touch /srv/cts/conf/__init__.py
|
||||
|
||||
# Set "production values" (increases performance) only if the DEBUG environment variable is not set
|
||||
if [ ${DEBUG:-0} -eq 0 ]; then
|
||||
sed -i 's/DEBUG = True/DEBUG = False/' /srv/cts/conf/spotter.py
|
||||
fi
|
||||
|
||||
# Populate database
|
||||
docker run --rm -h cts --link postgres -v /srv/cts/conf:/srv/cts/cts/settings cts manage.py migrate
|
||||
|
||||
# Create admin account
|
||||
export CTS_ADMIN_EMAIL=admin@example.com
|
||||
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
|
||||
spotter-appmgr update-login cts "${CTS_ADMIN_EMAIL}" "${CTS_ADMIN_PWD}"
|
@ -1,40 +0,0 @@
|
||||
FROM python2
|
||||
MAINTAINER Disassembler <disassembler@dasm.cz>
|
||||
|
||||
RUN \
|
||||
# Add edge/testing repository
|
||||
echo '@edge http://dl-cdn.alpinelinux.org/alpine/edge/testing' >>/etc/apk/repositories \
|
||||
# Install runtime dependencies
|
||||
&& apk --no-cache add geos@edge libpq nginx zlib
|
||||
|
||||
RUN \
|
||||
# Install build dependencies
|
||||
apk --no-cache add --virtual .deps build-base git postgresql-dev python2-dev py2-pip zlib-dev \
|
||||
# Install CTS
|
||||
&& git clone --depth 1 https://github.com/theirc/CTS /srv/cts \
|
||||
&& pip install -r /srv/cts/requirements/production.txt \
|
||||
# Hackfix geos version detection
|
||||
&& sed -i 's/\$//' /usr/lib/python2.7/site-packages/django/contrib/gis/geos/libgeos.py \
|
||||
# Make manage.py globally executable
|
||||
&& chmod +x /srv/cts/manage.py \
|
||||
&& ln -s /srv/cts/manage.py /usr/local/bin/manage.py \
|
||||
# Compile static files
|
||||
&& sed -i '/debug_toolbar/d' /srv/cts/cts/settings/dev.py \
|
||||
&& DJANGO_SETTINGS_MODULE=cts.settings.dev manage.py collectstatic -l --noinput \
|
||||
# Create OS user
|
||||
&& addgroup -S -g 8006 cts \
|
||||
&& adduser -S -u 8006 -h /srv/cts -s /bin/false -g cts -G cts cts \
|
||||
&& chown -R cts:cts /srv/cts \
|
||||
# Cleanup
|
||||
&& apk --no-cache del .deps \
|
||||
&& find /srv/cts -name '.git*' -exec rm -rf {} + \
|
||||
&& rm -rf /root/.cache
|
||||
|
||||
COPY docker/ /
|
||||
|
||||
VOLUME ["/srv/cts/cts/settings"]
|
||||
EXPOSE 8080
|
||||
|
||||
ENV DJANGO_SETTINGS_MODULE cts.settings.spotter
|
||||
WORKDIR /srv/cts
|
||||
CMD ["s6-svscan", "/etc/services.d"]
|
@ -1,3 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
/bin/true
|
@ -1,28 +0,0 @@
|
||||
#!/sbin/openrc-run
|
||||
|
||||
description="CTS docker container"
|
||||
|
||||
depend() {
|
||||
need docker postgres
|
||||
}
|
||||
|
||||
start() {
|
||||
/usr/bin/docker run -d --rm \
|
||||
--name cts \
|
||||
-h cts \
|
||||
--link postgres \
|
||||
-v /srv/cts/conf:/srv/cts/cts/settings \
|
||||
cts
|
||||
}
|
||||
|
||||
start_post() {
|
||||
/usr/bin/spotter-appmgr register-proxy cts
|
||||
}
|
||||
|
||||
stop_pre() {
|
||||
/usr/bin/spotter-appmgr unregister-proxy cts
|
||||
}
|
||||
|
||||
stop() {
|
||||
/usr/bin/docker stop cts
|
||||
}
|
19
doc/Makefile
Normal file
@ -0,0 +1,19 @@
|
||||
# Minimal makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build-3
|
||||
SOURCEDIR = .
|
||||
BUILDDIR = /srv/build/doc
|
||||
|
||||
# Put it first so that "make" without argument is like "make help".
|
||||
help:
|
||||
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
|
||||
.PHONY: help Makefile
|
||||
|
||||
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||
%: Makefile
|
||||
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
21
doc/applications/attachments/images-list-apps.csv
Normal file
@ -0,0 +1,21 @@
|
||||
Application,Container,Host
|
||||
CKAN,ckan,ckan
|
||||
Crisis Cleanup,crisiscleanup,cc
|
||||
CTS,cts,cts
|
||||
EcoGIS,ecogis,ecogis
|
||||
FrontlineSMS,frontlinesms,sms
|
||||
GNU Health,gnuhealth,gh
|
||||
Kanboard,kanboard,kb
|
||||
Mifos X,mifosx,mifosx
|
||||
Motech,motech,motech
|
||||
ODK Aggregate,opendatakit,odk
|
||||
ODK Build,opendatakit-build,odkbuild
|
||||
Odoo,odoo,odoo
|
||||
OpenMapKit,openmapkit,omk
|
||||
Pan.do/ra,pandora,pandora
|
||||
Sahana,sahana,sahana
|
||||
Sahana - Demo,sahana-demo,sahana-demo
|
||||
SAMBRO,sambro,sambro
|
||||
SeedDMS,seeddms,dms
|
||||
Sigmah,sigmah,sigmah
|
||||
Ushahidi,ushahidi,ush
|
|
13
doc/applications/attachments/images-list-basic.csv
Normal file
@ -0,0 +1,13 @@
|
||||
Product,Layer
|
||||
Alpine 3.8,alpine3.8
|
||||
Alpine 3.8 - PHP 5.6,alpine3.8-php5.6
|
||||
Alpine 3.9 - Ruby 2.4,alpine3.8-ruby2.4
|
||||
Alpine 3.9,alpine3.9
|
||||
Alpine 3.9 - Java 8,alpine3.9-java8
|
||||
Alpine 3.9 - PHP 7.2,alpine3.9-php7.2
|
||||
Alpine 3.9 - Python 2.7,alpine3.9-python2.7
|
||||
Alpine 3.9 - Python 3.6,alpine3.9-python3.6
|
||||
Alpine 3.9 - Ruby 2.4,alpine3.9-ruby2.4
|
||||
Alpine 3.9 - Ruby 2.6,alpine3.9-ruby2.6
|
||||
Alpine 3.9 - Tomcat 7,alpine3.9-tomcat7
|
||||
Alpine 3.9 - Tomcat 8.5,alpine3.9-tomcat8.5
|
|
8
doc/applications/attachments/images-list-services.csv
Normal file
@ -0,0 +1,8 @@
|
||||
Product,Layer,UID/GID,Internal Port
|
||||
ActiveMQ,activemq,61616,61616 (ActiveMQ)
|
||||
MariaDB,mariadb,3306,3306 (MySQL)
|
||||
Postgres,postgres,5432,5432 (Postgres)
|
||||
PostGIS,postgis,5432,5432 (Postgres)
|
||||
RabbitMQ,rabbitmq,5672,5672 (AMQP)
|
||||
Redis,redis,6379,6379 (Redis)
|
||||
Solr 6,solr6,8983,8983 (HTTP)
|
|
12
doc/applications/attachments/map-services.csv
Normal file
@ -0,0 +1,12 @@
|
||||
Application,Data sources,Map viewer,Configurable,Notes
|
||||
CKAN,OSM (`Stamen <http://maps.stamen.com>`_),Leaflet,No,[1]
|
||||
CrisisCleanup v2,Google Maps,Google Maps,No,
|
||||
CrisisCleanup v3,OSM,Leaflet,No,
|
||||
Crismapp,OSM,Leaflet,,
|
||||
CTS,"OSM, `ArcGIS <http://server.arcgisonline.com/arcgis/rest/services>`_",Leaflet,No,
|
||||
EcoGIS,,FreeGIS + OpenLayers 2,Probably,[2]
|
||||
Odoo,Google Maps,Google Maps,No,[3]
|
||||
OpenMapKit,OSM,N/A,Yes,[4]
|
||||
Pan.do/ra,Google Maps,Google Maps + OxMap,No,
|
||||
Sahana Eden,OSM (`HOT <https://www.hotosm.org/>`_),OpenLayers 2,"Yes, very",[5]
|
||||
Ushahidi,"OSM (`Mapbox <https://www.mapbox.com/about/maps/>`_, `HOT`_)",Leaflet,No,
|
|
78
doc/applications/ckan.rst
Normal file
@ -0,0 +1,78 @@
|
||||
CKAN
|
||||
====
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
CKAN is an open-source DMS (data management system) for powering data hubs and data portals. CKAN makes it easy to publish, share and use data. It is written in python, has Flask-based web interface and uses Postgres database with PostGIS extension. CKAN exposes API which allows third parties to create extensions.
|
||||
|
||||
The project is split to several components. The most important ones are:
|
||||
|
||||
- **ckan** - https://github.com/ckan/ckan - The main DMS component with Flask frontend.
|
||||
- **datapusher** - https://github.com/ckan/datapusher - A standalone web service that pushes data files from a CKAN site's resources into its DataStore.
|
||||
- **ckan-service-provider** - https://github.com/ckan/ckan-service-provider - A library for making web services that make functions available as synchronous or asynchronous jobs.
|
||||
|
||||
Apart from that, CKAN requires a *Redis* in-memory data store and *Solr* search platform instance. Note that CKAN is shipped with Solr schemas which don't work well with up-to-date versions of Solr, therefore we use older Solr 6.5.1.
|
||||
|
||||
DataPusher
|
||||
----------
|
||||
|
||||
DataPusher is running as a separate service. Its development is a bit out of sync with the core ckan component. SKAN has already moved to python 3, however datapusher is still working only with python 2.7. Due to that, DataPusher has its own image and is running as a separate container.
|
||||
|
||||
Alpine, being a progressive linux distribution, stopped supporting uwsgi connector for python 2.7 in Alpine 3.11, therefore the container needs to be based on older Alpine 3.10 which still ships with *uwsgi-python2*.
|
||||
|
||||
The connection between CKAN and DataPusher is done via HTTPS endpoints. There is a possibility to disable TLS certificate verification, but a better solution seems to be import any self-signed certificate into the DataPusher's trust store. There is a script which automatically handles the import whenever the DataPusher container starts.
|
||||
|
||||
Extensions
|
||||
----------
|
||||
|
||||
CKAN container comes with several preinstalled and preconfigured extensions. Historically, there were more extensions, but over the time CKAN's API evolved and the development has moved to python 3, so majority of the historical extensions are no longer operational.
|
||||
|
||||
ckan/ckanext-basiccharts
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- URL: https://github.com/ckan/ckanext-basiccharts
|
||||
|
||||
Adds Line, Bar and Pie charts. It uses Flot Charts, which is compatible with all major browsers (including IE6+).
|
||||
|
||||
ckan/ckanext-spatial
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- URL: https://github.com/ckan/ckanext-spatial
|
||||
|
||||
Contains plugins that add geospatial capabilities to CKAN. E.g. a spatial field on the default CKAN dataset schema which allows to perform spatial queries and to display the dataset extent on the frontend.
|
||||
|
||||
ckan/ckanext-geoview
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- URL: https://github.com/ckan/ckanext-geoview
|
||||
|
||||
Contains view plugins to display geospatial files and services in CKAN. It contains an OpenLayers based viewer and other view plugins that used to be part of ckanext-spatial.
|
||||
|
||||
ckan/ckanext-mapviews
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- URL: https://github.com/ckan/ckanext-mapviews
|
||||
|
||||
Adds regular and choropleth maps to CKAN, using the new CKAN Resource View. It uses LeafletJS, which is compatible with all major browsers (including IE7+).
|
||||
|
||||
XVTSolutions/ckanext-spatialUI
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- URL: https://github.com/XVTSolutions/ckanext-spatialUI
|
||||
|
||||
Provides the UI elements for spatial search. Spatial search widget and dataset extent map.
|
||||
|
||||
aptivate/ckanext-datasetthumbnail
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- URL: https://github.com/aptivate/ckanext-datasetthumbnail
|
||||
|
||||
Adds support for generation and display of thumbnail images.
|
||||
|
||||
datagvat/ckanext-dgvat_xls
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- URL: https://github.com/datagvat/ckanext-dgvat_xls
|
||||
|
||||
Allows group admin to export datasets from their organizations to export all datasets to a .xls worksheet. Sysadmins may choose to export datasets from any organization they want or to export all datasets of all groups.
|
21
doc/applications/crisiscleanup.rst
Normal file
@ -0,0 +1,21 @@
|
||||
CrisisCleanup
|
||||
=============
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
Crisis Cleanup is a collaboration platform that connects disaster recovery organization volunteers with people who need help after a disaster. It is a Ruby on Rails application written for Ruby 2.6 with NodeJS-dependent web frontend.
|
||||
|
||||
Upstream URL: https://github.com/CrisisCleanup/crisiscleanup-2
|
||||
|
||||
Version 2 maintenance
|
||||
---------------------
|
||||
|
||||
As of 2020-03-27, CrisisCleanup v2 is no longer maintained. The maintenance has been discontinued in favor of CrisisCleanup v3, which splits the backend and frontend into two separate projects. Unfortunately the source of the backend part hasn't been opened and the creator has no plants to do so, so currently only the frontend application as available on https://github.com/CrisisCleanup/crisiscleanup-3-web.
|
||||
|
||||
Version 3 uses OpenStreetMap and Leaflet, whereas version 2 used Google Maps.
|
||||
|
||||
NodeJS compatibility
|
||||
--------------------
|
||||
|
||||
The application uses NodeJS to generate and pack assets, however due to its age, yarn dependencies installation fails on NodeJS versions newer than 8, therefore the NodeJS version has been frozen on 8.14.0 provided by Alpine 3.8.
|
26
doc/applications/decidim.rst
Normal file
@ -0,0 +1,26 @@
|
||||
Decidim
|
||||
=======
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
Decidim is a participatory democracy platform for cities and organizations. Decidim is written and runs on Ruby 2.6, where it is installed as Ruby Gem. Incoming HTTP requests are handled via passenger nginx plugin.
|
||||
|
||||
Upstream URL: https://github.com/decidim/decidim
|
||||
|
||||
Passenger nginx plugin
|
||||
----------------------
|
||||
|
||||
The passenger plugin work as application proxy between HTTP server and Ruby on Rails applications. Nginix doesn't have modules API like Apache does, so all nginx module must be present at compile time and only then they can be loaded and unloaded at runtime. Passenger plugin is not present in the standard Alpine nginx packages, therefore for passenger to work, a custom version of nginx including the passenger plugin needs to be compiled. Passenger sources contain ``passenger-install-nginx-module`` script which eases and semi-automates the compilation.
|
||||
|
||||
Database upgrades
|
||||
-----------------
|
||||
|
||||
Decidim creates a series of database migration scripts under ``db/migrate`` directory. Unfortunately, these script are not created deterministically as their file names are always created with current build's timestamp. The same script using the same Decidim version therefore always ends up with different database migration scripts. Newly added scripts in a new version of Decidim are not sorted at the end, so it's impossible to determine which scripts need to applied from the filenames alone.
|
||||
|
||||
During manual upgrade, the workaround is to compare the directories between the old and the new image, stripping the timestamp and running only the scripts which don't exist in the old directory, however this is impossible to be done during automatic upgrade, as the old image is removed before the upgrade script is executed.
|
||||
|
||||
Additional site creation
|
||||
------------------------
|
||||
|
||||
Decidim allows to create managed sites using the superadmin interface on ``https://<Decidim URL>/system/``. The sites require their own (sub)domains, therefore some additional considerations must be taken when setting up HTTP reverse proxies and TLS certificates.
|
97
doc/applications/frontlinesms.rst
Normal file
@ -0,0 +1,97 @@
|
||||
FrontlineSMS
|
||||
============
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
FrontlineSMS is a system for both manual and automatic processing of SMS, supporting creation of various SMS workflows. The application is written in Java (resp. Groovy) and uses Grails layout engine. It has its own installer which deploys single-tenant Jetty lightweight applicaiton server. To work efficiently, FrontlineSMS requires a device with SMS capabilities or a connection to third-party service such as Twilio.
|
||||
|
||||
The version of FrontlineSMS is no longer maintained by the original developers and no new updates are expected to appear. The manufacturer currently offers and supports only a cloud version of FrontlineSMS.
|
||||
|
||||
Upstream URL: https://github.com/frontlinesms/frontlinesms2
|
||||
|
||||
Fork URL: https://github.com/trendspotter/frontlinesms2 - the fork contains the last known working version of installer as a release.
|
||||
|
||||
Modem capabilities
|
||||
------------------
|
||||
|
||||
There are special considerations to be taken whenever an application witch direct access to hardware is run in a container. Currently FrontlineSMS has not been tested with such device and it is expected that some extra work or container configuration not present in any other application needs to be done in order to make the hardware device available and usable by the container.
|
||||
|
||||
Localization
|
||||
------------
|
||||
|
||||
FrontlineSMS is localized to Czech only locally on SpoterVM. Upstream doesn't contain the localization as the application is not developed anymore. The localization is supplied as a Java property file ``WEB-INF/grails-app/i18n/messages_cs.properties`` and then once again as the same file packed and minifies as ``assets/i18n/frontlinesms-core_messages_cs.js``. The minified file can be created using ``frontlinesms-lang-js.py`` helper script in SpotterVM repository.
|
||||
|
||||
Java support
|
||||
------------
|
||||
|
||||
Due to the age of the application (latest release somewhere in 2014), FrontlineSMS doesn't work well with current versions of Java runtime. The last know working version is Java 8.222.10 supplied by Alpine 3.8. More recent version, e.g. Java 8.242 cause HTTP connection accept failures.
|
||||
|
||||
X server
|
||||
--------
|
||||
|
||||
Although FrontlineSMS is a web application, it requires X server as it attempts to install a systray icon. On a headless server, this requirement can be worked around using ``xf86-video-dummy`` package which works as a *blackhole* display driver.
|
||||
|
||||
The X server is then started as
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
Xorg -noreset +extension GLX +extension RANDR +extension RENDER -config dummy.conf :10
|
||||
|
||||
Where the ``dummy.conf`` looks as follows
|
||||
|
||||
.. code-block:: xorg.conf
|
||||
|
||||
Section "ServerFlags"
|
||||
Option "DontVTSwitch" "true"
|
||||
Option "AllowMouseOpenFail" "true"
|
||||
Option "PciForceNone" "true"
|
||||
Option "AutoEnableDevices" "false"
|
||||
Option "AutoAddDevices" "false"
|
||||
EndSection
|
||||
|
||||
Section "InputDevice"
|
||||
Identifier "dummy_mouse"
|
||||
Option "CorePointer" "true"
|
||||
Driver "void"
|
||||
EndSection
|
||||
|
||||
Section "InputDevice"
|
||||
Identifier "dummy_keyboard"
|
||||
Option "CoreKeyboard" "true"
|
||||
Driver "void"
|
||||
EndSection
|
||||
|
||||
Section "Device"
|
||||
Identifier "dummy_videocard"
|
||||
Driver "dummy"
|
||||
Option "ConstantDPI" "true"
|
||||
VideoRam 192000
|
||||
EndSection
|
||||
|
||||
Section "Monitor"
|
||||
Identifier "dummy_monitor"
|
||||
HorizSync 5.0 - 1000.0
|
||||
VertRefresh 5.0 - 200.0
|
||||
Modeline "1280x720" 27.41 1280 1312 1416 1448 720 737 740 757
|
||||
EndSection
|
||||
|
||||
Section "Screen"
|
||||
Identifier "dummy_screen"
|
||||
Device "dummy_videocard"
|
||||
Monitor "dummy_monitor"
|
||||
DefaultDepth 24
|
||||
SubSection "Display"
|
||||
Viewport 0 0
|
||||
Depth 24
|
||||
Modes "1280x720"
|
||||
Virtual 8192 4096
|
||||
EndSubSection
|
||||
EndSection
|
||||
|
||||
Section "ServerLayout"
|
||||
Identifier "dummy_layout"
|
||||
Screen "dummy_screen"
|
||||
InputDevice "dummy_mouse"
|
||||
InputDevice "dummy_keyboard"
|
||||
EndSection
|