├── README.md
├── articles
├── eng
│ ├── SSH-config-and-fs-from-zone-api.md
│ └── sniffex-PHP-compatibility-check.md
└── est
│ ├── Ghost.md
│ ├── Go-Gitea.md
│ ├── Java-Jenkins.md
│ ├── LetsEncrypt-Acme.sh.md
│ ├── LetsEncrypt-Lego.md
│ ├── MongoDB.md
│ ├── PHP-Laravel-6.md
│ ├── Python-Django-2.md
│ └── Python-Django-3.md
└── scripts
├── generate_ssh_configs.php
├── mongo-magic
├── .mongo-magic.sh
└── README.md
├── php-shims.inc
├── phpcs_nosymlinks.phar
├── sniffex
├── sniffex-phpcs56minimal.xml
├── sniffex_nosymlinks
└── spectx
├── !_detail.sx
├── !_ip-count.sx
├── !_summary.sx
├── !_tor.sx
└── patterns
└── zone_accesslog_server.sxp
/README.md:
--------------------------------------------------------------------------------
1 | # Zone.EU technical documentation and script examples
2 |
3 | All articles are writte "as is" by zone hackers community. Everything is *semi-official* and not officially supported by helpdesk.
4 |
5 | ## Contribution
6 | | Path | Description |
7 | | --- | --- |
8 | | **/articles/{lang}/{name}.md** | Translatable articles in markdown format |
9 | | **/articles/images/image.png**| Images for articles |
10 | | **/scripts/{script}.(php\|sh\|...)** | Example scripts and utilities |
11 |
12 | Feel free to contribute.
13 |
14 | ## Table of Contents
15 | | Article | Tech | Descrition | ENG | EST |
16 | | --- | --- | --- | --- | --- |
17 | | Laravel 6 | `php` | Laravel framework | - | [EST](./articles/est/PHP-Laravel-6.md) |
18 | | Gitea | `git`, `go` | Self-hosted Git service | - | [EST](./articles/est/Go-Gitea.md) |
19 | | Django 3 | `python` | Django web framework | - | [EST](./articles/est/Python-Django-3.md) |
20 | | Ghost 3.* | `nodejs` | Ghost blog framework | - | [EST](./articles/est/Ghost.md) |
21 | | Acme.sh | `lets encrypt`, `shell` | An ACME protocol client written purely in Shell (Unix shell) language | - | [EST](./articles/est/LetsEncrypt-Acme.sh.md) |
22 | | LeGo | `lets encrypt`, `go` | Let's Encrypt client and ACME library written in Go | - | [EST](./articles/est/LetsEncrypt-Lego.md) |
23 | | MongoDB | `NoSQL` | Document-oriented NoSQL databse | - | [EST](./articles/est/MongoDB.md) |
24 | | Jenkins | `Java`, `CI`, `CD` | Open source automation server | - | [EST](./articles/est/Java-Jenkins.md) |
25 | | SSH config | `shell`, `php`, `api`| Generating SSH config and SSHFS mount aliases using Zone API | [ENG](./articles/eng/SSH-config-and-fs-from-zone-api.md) | - |
26 | | sniffex | `shell`, `php`| Check for code compatibility with PHP 5.6 | [ENG](./articles/eng/sniffex-PHP-compatibility-check.md) | - |
--------------------------------------------------------------------------------
/articles/eng/SSH-config-and-fs-from-zone-api.md:
--------------------------------------------------------------------------------
1 | # Generating SSH config and SSHFS mount aliases using Zone API
2 |
3 | Author: [Peeter Marvet](https://github.com/petskratt), original idea / script from [Ingmar Aasoja](https://github.com/ybr-nx)
4 |
5 | Managing SSH accounts on multiple servers is made easier with `~/.ssh/config`, where
6 | you can specify username and other options for each hostname:
7 |
8 | ```sshconfig
9 | Host example.com
10 | HostName example.com
11 | ForwardAgent yes
12 | User virt11111
13 | ```
14 |
15 | ... so instead of `ssh virt11111@example.com` you can do just `ssh example.com`.
16 |
17 | Connecting to these accounts using SSHFS can be made easier using alias:
18 |
19 | ```shell
20 | alias mount_example.com="mkdir -p ~/sshfs/example.com && sshfs -o follow_symlinks -o volname=example.com virt11111@example.com: ~/sshfs/example.com"
21 | ```
22 |
23 | But when you have A LOT of servers even managing and updating these config entries and aliases becomes a burden.
24 |
25 | ### Generating config files and aliases
26 |
27 | With [Zone API](https://api.zone.eu/v2) you can generate config entries for all servers you have access to,
28 | e.g these are on your account or delegated to you (with full rights). API key can be generated in [my.zone.eu](https://my.zone.eu) self-service panel.
29 |
30 | Download [generate_ssh_configs.php](/scripts/generate_ssh_configs.php) and add your
31 | API credentials to array:
32 |
33 | ```php
34 | $zoneApiKeys = [
35 | 'zoneidusername' => 'apikeyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
36 | ];
37 | ```
38 |
39 | And run it:
40 |
41 | ````shell script
42 | php generate_ssh_configs.php
43 | ````
44 |
45 | Script will generate config files `~/.ssh/[zoneidusername].config` and as an additional
46 | feature also aliases for mounting these accounts using SSHFS in `~/[zoneidusername].alias`.
47 |
48 | ### Including in main config
49 |
50 | To use these add to your `~/.ssh/config`:
51 |
52 | ```sshconfig
53 | Include *.config
54 | ```
55 |
56 | As `ssh` uses first match from `~/.ssh/config` you can override generated host entries by placing
57 | an entry before the `Include`, in which case you also need to add `Host *`:
58 |
59 | ```sshconfig
60 | Host *
61 | Include *.config
62 | ```
63 |
64 | ### Creating aliases
65 |
66 | Add to your `~/.bash_profile` if you'd like to use SSHFS:
67 |
68 | ```shell
69 | # aliases generated from Zone API
70 | for f in ~/*.alias; do source "$f"; done
71 | alias umount_sshfs='for f in ~/sshfs/*; do umount "$f"; done'
72 |
73 | # *.config files generated from Zone API
74 | complete -W "$(echo `cat ~/.ssh/config ~/.ssh/*.config | grep -E '^Host' | cut -d" " -f2- | tr " " "\n" | grep -v "*" | sort | uniq`;)" ssh
75 | ```
76 |
77 | Undocumented features:
78 | * you can unmount all SSHFS shares with `umount_sshfs`
79 | * all hosts in config will appear as `ssh` autocomplete suggestions
80 |
81 | ### ToDo
82 |
83 | * we need physical server hostname or IP in API so configs can work also when actual hostname directs elsewhere (or uses dedicated IP)
84 | * add support for command-line arguments (what to create? for which ZoneID?)
85 | * add support for checking / adding SSH keys and whitelisted IPs to accounts
86 |
--------------------------------------------------------------------------------
/articles/eng/sniffex-PHP-compatibility-check.md:
--------------------------------------------------------------------------------
1 | # Checking for PHP version compatibility with PHP_CodeSniffer and PHPCompatibility
2 |
3 | Author: [Peeter Marvet](https://github.com/petskratt)
4 |
5 | Script that can be used to check code for compatibility with PHP version 5.6 - including easily installing
6 | and removing dependencies in ~/bin (and our current preferences for minimal noise in reports).
7 |
8 | ## Usage
9 |
10 | Download [`sniffex`](/scripts/generate_ssh_configs.php) script:
11 |
12 | ```shell script
13 | mkdir -p ~/bin && wget https://raw.githubusercontent.com/zone-eu/zone-docs/master/scripts/sniffex -O ~/bin/sniffex && chmod +x ~/bin/sniffex && sniffex init
14 | ```
15 |
16 | ```shell script
17 | sniffex command [./path]
18 |
19 | init install PHP_CodeSniffer and PHPCompatibility to ~/bin
20 | cleanup remove installed components from ~/bin
21 | snuff check the provided path
22 | ```
23 |
24 | ## Ruleset
25 |
26 | Ruleset used for checking is [`sniffex-phpcs56minimal.xml`](/scripts/sniffex-phpcs56minimal.xml).
27 |
28 | This ruleset is made for testing large number of servers automatically, so some non-essential folders have been
29 | excluded: logs, caches, old/new, adminer.php, some unit tests / examples and specific libraries that are most
30 | probably unused.
31 |
32 | If you find a single file that crashes `phpcs` then it is most probably a recursion loop in something incorrectly
33 | detected as PHP code - for example ` `Veebiserver` -> `PM2 protsessid (Node.js)`
86 |
87 | Seal tuleb vajutada nuppu `Lisa uus Node.js rakendus`
88 |
89 | Täita tuleb väljad
90 |
91 | | väli | väärtus |
92 | | --- | --- |
93 | | Rakenduse nimi | Ghost |
94 | | Skript või Pm2 .JSON | Ghost/pm2.config.json |
95 | | Maksimaalne mälukasutus | võib jätta seadistamata, kuna on juba seadistatud pm2 failis serveris. |
96 |
97 | Ning vajuta nuppu `Salvesta muudatused`
98 |
99 | Rakendus võiks hakata tööle paari minu jooksul. Kui rakendus tööle ei hakka, siis saab haldusliidesest kopeerida käsurea, millega rakendus käivitati ning parandada vead vastavalt väljundile.
100 |
101 |
--------------------------------------------------------------------------------
/articles/est/Go-Gitea.md:
--------------------------------------------------------------------------------
1 | # Gitea – Alternatiiv GitHubile, mis töötab Zone Virtuaalserveris
2 |
3 | ## Mis on Gitea?
4 |
5 | Autor: [Ingmar Aasoja](https://github.com/ybr-nx)
6 |
7 | Gitea on GO’s kirjutatud avatud lähtekoodiga alternatiiv populaarsetele versioonihaldusteenustele Github ja Gitlab. Täpsemat infot Gitea kohta leiad aadressilt [https://gitea.io/](https://gitea.io/) ning põhjaliku dokumentatsiooniga saab tutvuda siin: [https://docs.gitea.io/en-US/](https://docs.gitea.io/en-US/)
8 |
9 | 
10 |
11 | ## Nõuded Zone teenusele
12 |
13 | Kasutusel peab olema Zone tarkvaraplatvormi kasutav server (kõlbab nii Virtuaalserver, Nutikas Pilveserver kui ka Nutikas Privaatserver). Käesolevas õpetuses on virtuaalserveri nimeks **git.miljonivaade.eu**
14 |
15 | **Virtuaalserveril peab olema eraldatud IP aadress portide suunamise tarvis. Pakett III sisaldab ühte tasuta eraldatud IP aadressi. Kui see aktiveeritud pole, tuleb ühendust võtta Zone klienditoega, kes selle tasuta aktiveerib.**
16 |
17 | ## 1. Seadistame Zone virtuaalserveri
18 |
19 | ### 1.1 SSH
20 |
21 | Kui teil on juba SSH ligipääs virtuaalserverile seadistatud võib jätkata punktist **1.2**
22 |
23 | **Virtuaalserveri Haldus -> SSH -> Ligipääs**
24 |
25 | * Lisame oma avaliku SSH võtme
26 | * Lubame ligipääsu oma IP aadressilt (või kõikjalt)
27 |
28 | ### 1.2 MySQL
29 |
30 | **Virtuaalserveri Haldus -> Andmebaasid -> MySQL**
31 |
32 | * Lisame uue andmebaasi nimega **d73643_gitea**. Collation väljale valime **utf8mb4_general_ci**
33 | * Lisame uue kasutaja nimega **d73643_gitea**
34 | * Anname kasutajale **d73643_gitea** kõik õigused andmebaasis **d73643_gitea**
35 |
36 | ### 1.3 HTTP ligipääsu seadistamine (http proxy)
37 |
38 | **Virtuaalserveri Haldus -> Veebiserver -> Seaded** HTTPS seadete all vajutame nuppu **muuda**
39 |
40 | * SSL/VHosti IP: **XXX.XXX.XXX.XXX**, mille väätuseks on virtuaalserverile eraldatud IP aadress.
41 | * Määrame mod_proxy sihtpordiks **3000**
42 | * Ning vajutame **Salvesta muudatused** nuppu
43 |
44 | 
45 |
46 | ### 1.4 Gitea SSH ligipääsu seadistamine GITile (portide suunamine)
47 |
48 | Gitea kasutab oma sisest SSH serverit, mis annab võimaluse git repositooriumite ning kasutajate ligipääse Giteas endas hallata.
49 |
50 | **Virtuaalserveri Haldus -> Veebiserver -> Portide Suunamine**
51 |
52 | * Lisa uus portide suunamine all tuleb täita väljad
53 | * IP: Valime Zone poolt eraldatud IP aadressi
54 | * Port: **2222**
55 | * Kommentaar: **gitea-ssh** (vabalt valitud näidis)
56 | * Ning vajutan nuppu **Lisa**
57 |
58 | _**HTTP proxy ja portide suunamise muudatused jõuavad serverisse umbes 10 minuti jooksul, aga DNS A kirje levimine eraldatud IP aadressile võib võtta ka üle tunni. Kui on soov rakendus enne kirjete levimist seadistada, siis võib IP enda tööjaama hosts faili lisada.**_
59 |
60 | ## 2. Paigaldame Gitea
61 |
62 | ### 2.1 Laadime alla ning paigaldame Gitea binaarfaili
63 |
64 | Siseneme virtuaalserverisse SSH abil ning käivitame järgmised read:
65 | ```sh
66 | mkdir domeenid/www.git.miljonivaade.eu/gitea
67 | cd domeenid/www.git.miljonivaade.eu/gitea
68 | wget -O gitea https://dl.gitea.io/gitea/1.9.6/gitea-1.9.6-linux-amd64
69 | chmod +x gitea
70 | ```
71 | Et Gitea esialgse konfiguratsioonifaili genereeriks, tuleb gitea korraks käivitada. Antud juhul see ebaõnnestub, aga tekitatakse **custom/conf/app.ini** fail.
72 |
73 | Käivitame käsu:
74 | ```sh
75 | ./gitea web
76 | ```
77 | Tulemus peaks olema järgmine:
78 |
79 | 
80 |
81 | ### 2.2 Seadistame rakenduse konfiguratsioonid
82 |
83 | Avame konfiguratsioonifaili
84 | ```sh
85 | nano custom/conf/app.ini
86 | ```
87 | Kogu sisu tuleb üle kirjutada järgnevaga:
88 | ```ini
89 | RUN_USER = virt73403
90 | RUN_MODE = prod
91 |
92 | [database]
93 | DB_TYPE = mysql
94 | HOST = d73643.mysql.zonevs.eu:3306
95 | USER = d73643_gitea
96 | NAME = d73643_gitea
97 |
98 | [repository]
99 | ROOT = /data03/virt73403/domeenid/www.git.miljonivaade.eu/gitea/repositories
100 |
101 | [server]
102 | PROTOCOL = http
103 | DOMAIN = git.miljonivaade.eu
104 | HTTP_ADDR = 127.1.69.203
105 | HTTP_PORT = 3000
106 | DISABLE_SSH = false
107 | START_SSH_SERVER = true
108 | SSH_PORT = 2222
109 | SSH_LISTEN_HOST = 127.1.69.203
110 |
111 | [log]
112 | MODE = file
113 | LEVEL = Info
114 | ROOT_PATH = /data03/virt73403/domeenid/www.git.miljonivaade.eu/gitea/log
115 | ```
116 | Virtuaalserveri põhised muutujad konfiguratsioonis:
117 |
118 | * **RUN_USER** – kasutaja, kelle õigustes rakendus käivitatakse. Selleks on virtuaalserveri SSH kasutajanimi.
119 | * **database.HOST** – andmebaasi hosti nimi, mille leiab Virtuaalserver Haldus -> Andmebaasid -> MySQL alampunktist. Lisaks tuleb määrata port, milleks on 3306.
120 | * **database.USER** – loodud MySQL kasutaja kasutajanimi.
121 | * **database.NAME** – loodud andmebaasi nimi.
122 | * **repository.ROOT** – asukoht, kuhu pannakse loodud repositooriumite andmed. Selle peaks määrama kujul: /dataXX/{ssh-kasutaja}/domeenid/[www.{domeen}/vabalt/valitud/asukoht](http://www.%7Bdomeen%7D/vabalt/valitud/asukoht)
123 | * **server.PROTOCOL** – konfiguratsioonis määrame protokoliks “http”, kuna HTTPS eest hoolitseb Zone seadistatud proxy.
124 | * **server.DOMAIN** – virtuaalserveri nimi ehk domeen.
125 | * **server.HTTP_ADDR** – virtuaalserveri loopback IP, mille saab teada kui käivitada virtuaalserveris SSH konsoolis käsk **vs-loopback-ip -4**.
126 | * **server.HTTP_PORT** – port, mille määrasime mod_proxy pordiks serveri seadetes.
127 | * **server.SSH_PORT** – port, mille määrasime portide suunamisel.
128 | * **server.SSH_LISTEN_HOST** – sama mis **server.HTTP_ADDR**.
129 | * **log.ROOT_PATH** – logifailide kataloog, mille võib määrata järgmiselt: /dataXX/{ssh-kasutaja}/domeenid/[www.{domeen}/vabalt/valitud/asukoht](http://www.%7Bdomeen%7D/vabalt/valitud/asukoht)
130 |
131 | ### 2.3 Paigaldame ning käivitame rakenduse
132 |
133 | Pärast seda käivitame rakenduse uuesti
134 | ```sh
135 | ./gitea web
136 | ```
137 | Ning kui kõik õnnestub, peaks pilt välja selline:
138 |
139 | 
140 |
141 | Veebiliides peaks tööle hakkama minnes aadressile: [https://git.miljonivaade.eu](https://git.miljonivaade.eu/) ning avanema peaks järgmine pilt:
142 |
143 | 
144 |
145 | Põhikonfiguratsioon on sellega paigas. Antud lehel tuleb siis lisaks
146 |
147 | * sisestada MySQL kasutaja parool
148 | * kustutada pordi number **Application URL** väärtusest ning scheme määrata HTTPS. Antud juhul on lõppväärtus [https://git.miljonivaade.eu/](https://git.miljonivaade.eu/)
149 |
150 | Lõplikuks paigaldamiseks vajutame nuppu **Install Gitea**.
151 |
152 | Õnnestunud paigalduse korral peaks avanema järgmine pilt:
153 |
154 | 
155 |
156 | Selles vaates tuleb teha endale konto. Esimesena registreeritud kontole antakse ka administraatori õigused.
157 |
158 | _**Selle alampunkti lõpuks on meil olemas täisväärtuslik töötav Gitea rakendus. Nüüd on vaja lisada seaded, et Zone oskaks seda vajadusel automaatselt käivitada ja/või restartida**_
159 |
160 | ## 3. Seadistame Zone virtuaalserveri töötamaks Giteaga
161 |
162 | ### 3.1 Seadistame Gitea teenuse PM2’s
163 |
164 | Kui Gitea töötab, peatame rakenduse klahvikombinatsiooniga **ctrl + c**.
165 |
166 | Järgmiseks tuleb seadistada PM2, et Gitea jätkaks tööd ka pärast SSH’st välja logimist ning pärast Zone poolset serveri taaskäivitust. Selleks lisame PM2 teenuse. Samuti aitab PM2 rakendust automaatselt taaskäivitada, kui mingi probleemi tõttu peaks see “maha surema”.
167 |
168 | Tekitame PM2 konfiguratisoonifaili:
169 | ```sh
170 | nano /data03/virt73403/domeenid/www.git.miljonivaade.eu/gitea/gitea-pm2.json
171 | ```
172 | Faili sisu peab olema selline:
173 | ```json
174 | {
175 | "apps" : [{
176 | "name" : "gitea-service",
177 | "script" : "gitea",
178 | "cwd" : "/data03/virt73403/domeenid/www.git.miljonivaade.eu/gitea",
179 | "args" : "web"
180 | }]
181 | }
182 | ```
183 | Salvestame faili ning Virtuaalserveri haldusliideses lisame rakenduse:
184 |
185 | **Virtuaalserveri Haldus -> Veebiserver -> Node.js ja PM2**
186 |
187 | * Vajutame nuppu “Lisa uus Node.js rakendus”
188 | * Täidame väljad
189 | * Rakenduse nimi: **gitea-service** (vabalt valitud näids)
190 | * Skript või pm2.json: **domeenid/[www.git.miljonivaade.eu/gitea/gitea-pm2.json](http://www.git.miljonivaade.eu/gitea/gitea-pm2.json)**
191 | * Maksimaalne mälukasutus: kuna .json faili puhul see seade mõju ei avalda, võib see jääda 1MB peale.
192 | * Vajutame **Lisa** nuppu
193 |
194 | Rakenduse käivitamiseks läbi PM2 peame ootama paar minutit. Veendumaks, et rakendus toimib, proovime selle aja möödudes minna brauseris rakenduse vaatesse – [https://git.miljonivaade.eu/](https://git.miljonivaade.eu/).
195 |
196 | Kui antud aadressil avaneb Gitea rakendus, võib kontrollida, et rakendus sai ikka PM2 poolt käivitatud. Seda saab teha SSH konsoolis käsuga
197 | ```sh
198 | pm2 status
199 | ```
200 | Avaneda võiks järgmine pilt:
201 |
202 | 
203 |
204 | ## 4. Hakkame rakendust kasutama ja/või testima
205 |
206 | Järgnev tekst on juba töötava rakenduse näide, kui esimene kasutajakonto on loodud. Gitea on Zone virtuaalserveris paigaldatud, seadistatud õigesti käivituma ning järgnev on pigem väga lühike sissejuhatus rakendusse esimese repositooriumi loomiseks ning giti SSH ligipääsu seadistamiseks.
207 |
208 | ### 4.1 Sisestame SSH avaliku võtme git ligipääsuks
209 |
210 | * Klikime paremal üleval ikoonil ning avame menüüpunkti **Your Settings**
211 | * Avanenud lehel avame kaardi **SSH / GPG Keys**
212 | * SSH võtme all vajutame nuppu **Add key**
213 |
214 | ### 4.2 Loome uue respositooriumi
215 |
216 | Siseneme **Dashboard** vaatesse. Visuaalne pilt on sarnane Githubi ja Gitlabiga ning neid kasutanud ei tohiks ka siin repositooriumi seadistamisega hätta jääda.
217 |
218 |  
219 |
220 | ### 4.3 Hakkame kasutama
221 |
222 | Repositooriumi vaates **Clone this repository** alt tuleb valida **SSH** ning kopeerida vastav URL.
223 |
224 | Näiteks
225 | ```sh
226 | git clone ssh://virt73403@git.miljonivaade.eu:2222/ingmar/zone-test.git
227 | touch README.md
228 | git add .
229 | git commit -m "added readme"
230 | git push
231 | ```
232 | Ning giti kasutanud inimesel ei tohiks olla raske veenduda, et kõik töötab.
233 |
234 | 
235 |
236 | Edasi tuleb vaid Giteaga lähemat tutvust sobitada ning see enda vajaduste järgi ära seadistada.
--------------------------------------------------------------------------------
/articles/est/Java-Jenkins.md:
--------------------------------------------------------------------------------
1 | # Jenkins Zone hallatud platvormil
2 |
3 | Autor: [Ingmar Aasoja](https://github.com/ybr-nx)
4 |
5 | Antud õpetus on semi-official. Ehk annab suuna kätte, aga ametlike klienditoe kanalite kaudu tuge ei pakuta.
6 |
7 | Õpetus eeldab, et on seadistatud SSH ligipääs. [SSH ühenduse loomine](https://help.zone.eu/kb/ssh-uhenduse-loomine/)
8 |
9 | # 1. Loo Jenkinsi tarvis alamdomeen ning seadista proxy.
10 |
11 | Kõige lihtsam on Jenkins paigaldada alamdomeenile nii, et selle veebiliides kuvatakse kasutajale Java serverist läbi veebiserveri proxy. Näiteks võid luua alamdomeeni nimega jeknins.sinudomeen.ee
12 |
13 | Alamdomeeni lisamisel määra sellele mod_proxy sihtport 8080.
14 |
15 | # 2. Paigalda java
16 |
17 | Aadressilt https://java.com/en/download/manual.jsp kliki Linux x64 nimel parem klikk ja “Copy link address”, kasuta seda aadressi Java paki allalaadimiseks wget-i abil.
18 |
19 | Käsureal käivitamiseks: (PS! See on näide ja paigaldab vana versiooni!)
20 |
21 | ```
22 | cd ~/.zse/opt/oracle/java/
23 | wget -O java.tar.gz https://javadl.oracle.com/webapps/download/AutoDL?BundleId=244058_89d678f2be164786b292527658ca1605
24 | tar -zxf java.tar.gz
25 | ln -sf jre1.8.0_281/bin bin
26 | ln -sf jre1.8.0_281/lib lib
27 | rm -f java.tar.gz
28 | ```
29 |
30 | # 3. Paigalda Jenkins
31 |
32 | Jenkinsi saab alla laadida aadressilt https://www.jenkins.io/download/. Valikus on LTS ning kõõige uuem stabiilne versioon. Vali endale sobib ning kopeera parekla hiireklõpsuga url. Zone platvormile tuleb valida **Generic jva package (.war)**, mis on nimekirjas kõige ülemine. Õpetuses kasutame kõige uuemat (mitte LTS) versiooni seisuga 20. veebruar 2021: https://get.jenkins.io/war/2.280/jenkins.war
33 |
34 | ```
35 | mkdir -p ~/jenkins/home
36 | cd ~/jenkins
37 | wget https://get.jenkins.io/war/2.280/jenkins.war
38 | ```
39 |
40 | Esmasel käviitamisel luuakse admin kasutaja, selleks teeme seda manuaalselt. **127.X.XX.XX** asemel tuleb kasutada käsu `vs-loopback-ip -4` väljundit
41 |
42 | ```
43 | JENKINS_HOME=~/jenkins/home _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true -Djava.io.tmpdir=~/tmp" java -jar jenkins.war --httpListenAddress=127.X.XX.XX
44 | ```
45 |
46 | Väljundis peaks olema ka kuvatud esmaseks seadistamiseks salasõna
47 |
48 | ```
49 | *************************************************************
50 | *************************************************************
51 | *************************************************************
52 |
53 | Jenkins initial setup is required. An admin user has been created and a password generated.
54 | Please use the following password to proceed to installation:
55 |
56 | -XXXXXXXXXXXX-salasõna-XXXXXXXXXXXXXXX-
57 |
58 | This may also be found at: /dataXX/virtXXX/jenkins/home/secrets/initialAdminPassword
59 |
60 |
61 | *************************************************************
62 | *************************************************************
63 | *************************************************************
64 | ```
65 |
66 | Nüüd navigeerime brauseris oma valitud (alam)domeenile. "https://jenkins.sinudomeen.ee" ning sisestame vormi eelnevalt kuvatud salasõna.
67 |
68 | Kui on soov, siis järgmises vaates võib valida variandi valimaks ise vajalikke *pluginaid*. Õpetuse raames valime **Install suggested plugins**.
69 |
70 | Kui pluginad on paigaldatud, siis tuleb luua admin kasutaja. Täidame väljad ning vajutame nuppu **Save and Continue**. Järgmises vaates kuvab õnnestumise korral URL'i, millele Jenkins on paigaldatud. Seal tuleb vajutada **Save and Finish**
71 |
72 | # 4. Seadistame Pm2
73 |
74 | Kuna on tarvis, et Jenkins toimiks ka pärast serveri taaskäivitamist või taaskäivitaks ennast juhul, kui tekib süsteemne viga, siis tuleb seadistada Pm2 protsessihaldur. Killime jenkinsi protsessi vajutades consoolis `ctrl + c` ning loome uue faili `~/jenkins/jenkins.config.js` sisuga:
75 |
76 | **NB!** asenda **127.X.XX.XX** käsu `vs-loopback-ip -4` väljundiga
77 |
78 | ```
79 | module.exports = {
80 | apps : [{
81 | name : "jenkins",
82 | script : process.env.HOME + "/.zse/opt/oracle/java/bin/java",
83 | cwd : process.env.HOME + "/jenkins/",
84 | args: "-jar jenkins.war --httpListenAddress=127.X.XX.X",
85 | max_memory_restart : "4G",
86 | env: {
87 | "JENKINS_HOME": process.env.HOME + "/jenkins/home",
88 | "_JAVA_OPTIONS": "-Djava.net.preferIPv4Stack=true -Djava.io.tmpdir=" + process.env.HOME + "/tmp -Xms64M -Xmx2G"
89 | }
90 | }]
91 | }
92 | ```
93 |
94 | Mine MinuZone haldusliidesesse punkti alla `Veebiserver` -> `PM2 protsessid (Node.js)` ning vajuta nuppu **Lisa uus rakendus**
95 | Rakenduse nimi pane **Jenkins.**
96 | Skript või PM2 .JSON lahtrisse sisesta **jenkins/jenkins.config.js**
97 | Maksimaalne mälukasutus **1MiB**
98 |
99 | Vajuta nuppu **Salvesta muudatused**
100 |
101 | Nüüd peaks mõne minut pärast Jenkis käivituma. Käsk `pm2 monit` monitoorib aktiivseid rakenduse ning annab teada, kui Jenkins on käivitatud
102 |
--------------------------------------------------------------------------------
/articles/est/LetsEncrypt-Acme.sh.md:
--------------------------------------------------------------------------------
1 | # Let's Encrypt genereerimine Acme.sh kliendiga Node.JS rakenduse näitel
2 |
3 | Autor: [Ingmar Aasoja](https://github.com/ybr-nx)
4 |
5 | Kuna Let's Encyrpt EULA ei luba jagada privaatseid võtmeid, siis Zone veebiserveri välises kontekstis peab sertifikaadi ise taotlema. /.well-know/acme-challenge URL on juba reserveeritud Zone enda tarvis ning ainuke variant on kasutada DNS autentimist. Selleks sobib väga hästi Acme.sh lihtne bash'i rakendus, millele on Zone.EU toe lisanud oma tänuväärse tööga [tambetliiv](https://github.com/tambetliiv).
6 |
7 | Antud olukorras eeldan, et Node.JS rakenduseks on Virtuaalserveri kaudu lisatud rakendus, mille nimi on "laravel-echo server". Kui soovime kindlad olla, et läbi Minu Zone UI lisatud rakenduse nimi ikka vastab sellele, siis näeb hetkel töötavaid rakendusi käsuga:
8 |
9 | ```sh
10 | pm2 list
11 | ```
12 |
13 | Let's Encrypti sertifikaadi genereerimiseks DNS autoriseerimisega loo endale API ligipääs lisades Minu Zones API võtme: https://help.zone.eu/kb/zoneid-api-v2/
14 |
15 | Seadista serveris api ligipääsu parameetrid:
16 | ```sh
17 | cd ~
18 | echo "export ZONE_Username={zone username}" >> ~/.bash_profile
19 | echo "export ZONE_Key={zone api key}" >> ~/.bash_profile
20 | source .bash_profile
21 | ```
22 |
23 | Paigalda Acme.sh klient:
24 | ```sh
25 | curl https://get.acme.sh | sh
26 | mkdir -p bin
27 | ln -s ~/.acme.sh/acme.sh ~/bin/acme.sh
28 | ```
29 |
30 | Loo tühi kataloog `/data01/virt75146/certs` sertifikaatide hoidmiseks. (Node.JS) Rakendus tuleb panna kasutama sertifikaate samast kaustast.
31 | ```sh
32 | mkdir /data01/virt75146/certs
33 | ```
34 |
35 | Loo sertifikaat. Aega võib võtta see **kuni** 5 minutit:
36 | ```sh
37 | acme.sh --issue -d laravel.miljonivaade.eu --dns dns_zone \
38 | --cert-file /data01/virt75146/certs/laravel.miljonivaade.eu.cert.pem \
39 | --key-file /data01/virt75146/certs/laravel.miljonivaade.eu.key.pem \
40 | --fullchain-file /data01/virt75146/certs/laravel.miljonivaade.eu.fullchain.pem \
41 | --reloadcmd "pm2 restart laravel-echo-server"
42 | ```
43 |
44 | Skript ootab 5 minutit DNS kirje leviku taga. Kui skript töö lõpetab, on vajalikud sertifikaadifailid loodud ning taaskäivitatud ka vajalik Node.JS rakendus.
45 |
46 | Selleks, et sertifikaat ka automaatselt uueneks, lisa antud rida Virtuaalserveri halduses `Veebiserver` -> `Crontab`. Intervalliks määra iga kuu vabalt valitud kuupäev, käivitusviis "süsteemselt" ning käsk järgmine:
47 | ```sh
48 | source ~/.bash_profile && acme.sh --issue -d laravel.miljonivaade.eu --dns dns_zone --reloadcmd "pm2 restart laravel-echo-server"
49 | ```
50 |
51 |
--------------------------------------------------------------------------------
/articles/est/LetsEncrypt-Lego.md:
--------------------------------------------------------------------------------
1 | # Let's Encrypt genereerimine Lego kliendiga
2 |
3 | Autor: [Ingmar Aasoja](https://github.com/ybr-nx)
4 |
5 | https://go-acme.github.io/lego/dns/zoneee/
6 |
7 | Paigalda lego
8 | ```sh
9 | wget https://github.com/go-acme/lego/releases/download/v3.1.0/lego_v3.1.0_linux_amd64.tar.gz
10 | tar -xvf lego_v3.1.0_linux_amd64.tar.gz
11 | mv lego bin/lego
12 | ```
13 |
14 | Seadista API klient
15 | ```sh
16 | export ZONEEE_API_USER={zone username}
17 | export ZONEEE_API_KEY={zone api key}
18 | echo "export ZONEEE_API_USER={zone username}" >> ~/.bash_profile
19 | echo "export ZONEEE_API_KEY={zone api key}" >> ~/.bash_profile
20 | ```
21 |
22 | Loo kasutaja ja sertifikaat. Esimesel käivitusel pead kinnitama, et oled tutvunud kasutajatingimustega.
23 |
24 | ```sh
25 | lego --email example@example.org --dns zoneee --domains laravel.miljonivaade.eu run
26 | ```
27 |
28 | Väljund on umbes selline:
29 | ```
30 | 2019/10/30 19:34:33 No key found for account example@example.org. Generating a P384 key.
31 | 2019/10/30 19:34:33 Saved key to /data01/virtXXXXX/.lego/accounts/acme-v02.api.letsencrypt.org/example@example.org/keys/example@example.org.key
32 | 2019/10/30 19:34:33 zoneee: some credentials information are missing: ZONEEE_API_USER,ZONEEE_API_KEY
33 | 2019/10/30 19:34:33 Please review the TOS at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
34 | Do you accept the TOS? Y/n
35 | Y
36 | 2019/10/30 19:34:38 [INFO] acme: Registering account for example@example.org
37 | !!!! HEADS UP !!!!
38 |
39 | Your account credentials have been saved in your Let's Encrypt
40 | configuration directory at "/data01/virtXXXXX/.lego/accounts".
41 | You should make a secure backup of this folder now. This
42 | configuration directory will also contain certificates and
43 | private keys obtained from Let's Encrypt so making regular
44 | backups of this folder is ideal.2019/10/30 19:34:38
45 | 2019/10/30 19:35:10 [INFO] [laravel.miljonivaade.eu] acme: Obtaining bundled SAN certificate
46 | 2019/10/30 19:35:10 [INFO] [laravel.miljonivaade.eu] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/1010758337
47 | 2019/10/30 19:35:10 [INFO] [laravel.miljonivaade.eu] acme: Could not find solver for: tls-alpn-01
48 | 2019/10/30 19:35:10 [INFO] [laravel.miljonivaade.eu] acme: Could not find solver for: http-01
49 | 2019/10/30 19:35:10 [INFO] [laravel.miljonivaade.eu] acme: use dns-01 solver
50 | 2019/10/30 19:35:10 [INFO] [laravel.miljonivaade.eu] acme: Preparing to solve DNS-01
51 | 2019/10/30 19:35:11 [INFO] [laravel.miljonivaade.eu] acme: Trying to solve DNS-01
52 | 2019/10/30 19:35:11 [INFO] [laravel.miljonivaade.eu] acme: Checking DNS record propagation using [217.146.66.66:53 217.146.66.65:53 194.204.49.1:53 90.191.225.242:53]
53 | 2019/10/30 19:35:11 [INFO] Wait for propagation [timeout: 5m0s, interval: 5s]
54 | 2019/10/30 19:35:11 [INFO] [laravel.miljonivaade.eu] acme: Waiting for DNS record propagation.
55 | 2019/10/30 19:35:16 [INFO] [laravel.miljonivaade.eu] acme: Waiting for DNS record propagation.
56 | .....
57 | 2019/10/30 19:36:31 [INFO] [laravel.miljonivaade.eu] acme: Waiting for DNS record propagation.
58 | 2019/10/30 19:36:42 [INFO] [laravel.miljonivaade.eu] The server validated our request
59 | 2019/10/30 19:36:42 [INFO] [laravel.miljonivaade.eu] acme: Cleaning DNS-01 challenge
60 | 2019/10/30 19:36:43 [INFO] [laravel.miljonivaade.eu] acme: Validations succeeded; requesting certificates
61 | 2019/10/30 19:36:43 [INFO] [laravel.miljonivaade.eu] Server responded with a certificate.
62 | ```
63 |
64 | Sertifikaadid asuvad kaustas `~./lego/certificates/`
65 |
66 | Uuendamiseks lisa süsteemne cron:
67 |
68 | ```sh
69 | source ~/.bash_profile && lego --email example@example.org --dns zoneee --domains laravel.miljonivaade.eu renew --renew-hook "pm2 restart laravel-echo-server"
70 | ```
--------------------------------------------------------------------------------
/articles/est/MongoDB.md:
--------------------------------------------------------------------------------
1 | # MongoDB zone virtuaalserveris
2 |
3 | Autor: [Ingmar Aasoja](https://github.com/ybr-nx)
4 |
5 | Antud õpetus on semi-official. Ehk annab suuna kätte, aga ametlike klienditoe kanalite kaudu tuge ei pakuta.
6 |
7 | Õpetus eeldab, et on seadistatud SSH ligipääs. [SSH ühenduse loomine](https://help.zone.eu/kb/ssh-uhenduse-loomine/)
8 |
9 |
10 | ## 1. Laadime alla MonoDB binaari ning seadistame _symlink_'i
11 |
12 | ```sh
13 | mkdir mongodb
14 | cd mongodb
15 | wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-6.0.0.tgz -O download.tgz
16 | tar -zxvf download.tgz
17 |
18 | # symlink annab võimaluse muuta lihtsamalt mongodb versiooni ilma konfe muutmata
19 | ln -s mongodb-linux-x86_64-rhel80-6.0.0 mongodb-binary
20 | ```
21 |
22 | Mongodb'ga ühendamiseks käsurealt, paigaldame ka `mongosh` tööriista
23 |
24 | ```
25 | wget https://downloads.mongodb.com/compass/mongosh-1.5.2-linux-x64.tgz -O mongosh.tgz
26 | tar -zxvf mongosh.tgz
27 | echo 'export PATH=$PATH:$HOME/mongodb/mongosh-1.5.2-linux-x64/bin' >> $HOME/.bash_profile
28 | source $HOME/.bash_profile
29 | ```
30 |
31 | Samuti on vaja mongodb halduse käsurea tööriistu, millega teha andmetest _dump'e_ ning neid taastada.
32 |
33 | ```sh
34 |
35 | wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel80-x86_64-100.5.4.tgz -O tools.tgz
36 | tar -zxvf tools.tgz
37 | echo 'export PATH=$PATH:$HOME/mongodb/mongodb-database-tools-rhel80-x86_64-100.5.4/bin' >> $HOME/.bash_profile
38 | source $HOME/.bash_profile
39 | ```
40 |
41 | ## 2. Loome vajaliku keskkonna ning seadistused
42 |
43 | Allpool loodavates failides tuleb teha vajalikud asendused:
44 | + `/dataXX/virtXXXX` tuleb asendada enda ssh kasutaja kodukaustaga kaustaga.
45 | + `127.XX.XX.XX` tuleb asendada enda loopback IP'ga, mille näeb käivitades käsku `vs-loopback-ip -4`
46 | + `virtXXXX` tuleb asendada enda ssh kasutajanimega.
47 |
48 | MongoDB eeldab, et vajalikud kaustad on juba loodud
49 |
50 | ```
51 | mkdir log run db
52 | ```
53 |
54 |
55 | Loome MongoDB konfiguratsioonifaili
56 |
57 | ```sh
58 | nano $HOME/mongodb/mongo.cfg
59 | ```
60 |
61 | ```yml
62 | processManagement:
63 | fork: false
64 | pidFilePath: /dataXX/virtXXXX/mongodb/run/mongodb-5679.pid
65 | net:
66 | bindIp: 127.XX.XX.XX
67 | port: 5679
68 | unixDomainSocket:
69 | enabled: false
70 | systemLog:
71 | verbosity: 0
72 | quiet: true
73 | destination: file
74 | path: /dataXX/virtXXXX/mongodb/log/mongodb.log
75 | logRotate: reopen
76 | logAppend: true
77 | storage:
78 | dbPath: /dataXX/virtXXXX/mongodb/db/
79 | journal:
80 | enabled: true
81 | directoryPerDB: true
82 | engine: wiredTiger
83 | wiredTiger:
84 | engineConfig:
85 | journalCompressor: snappy
86 | cacheSizeGB: 1
87 | collectionConfig:
88 | blockCompressor: snappy
89 |
90 | ```
91 |
92 | Loome PM2 konfiguratsioonifaili
93 |
94 | ```sh
95 | nano $HOME/mongodb/mongodb.pm2.json
96 | ```
97 |
98 | ```json
99 | {
100 | "apps": [{
101 | "name": "mongodb",
102 | "script": "./mongodb-binary/bin/mongod",
103 | "args": "--config /dataXX/virtXXXX/mongodb/mongo.cfg --auth --wiredTigerEngineConfigString=cache_size=200M",
104 | "cwd":"./mongodb",
105 | "max_memory_restart" : "128M",
106 | }]
107 | }
108 | ```
109 |
110 | ## 3. MongoDB esmane käivitamine
111 |
112 | Kindlaks tegemaks, et seadistused said tehtud õigesti, käivitame esialgu MongoDB manuaalselt käskudega.
113 |
114 | ```
115 | cd ~
116 | pm2 start mongodb/mongodb.pm2.json
117 | ```
118 |
119 | Pm2 väjundis peaks olema aru saada, et MongoDB töötab. Kontrollida saab seda käsuga `pm2 show mongodb` Kuna meil on see hetkel käivitatud nii, et autentimine on aktiveeritud, siis peame me korraks selle kinni panema ning seadistama kasutajad.
120 |
121 | Peatame rakenduse
122 |
123 | ```
124 | pm2 stop mongodb
125 | ```
126 |
127 | ## 4. Loome andmebaasi kasutaja
128 |
129 | **NB!** mongodb ei tohi sel hetkel töötada
130 |
131 | Kõigepeal tuleb välja mõelda endale kasutajanime/salasõna paar. Näidises kasutame:
132 |
133 | **u: kasutaja**
134 | **p: salasona**
135 |
136 | Antud õpetuses seadistame ainult ühe kasutaja. Soovitatav on kasutajate ja andmebaaside halduseks luua eraldi kasutajad. Selle kohta saab täpsemalt lugeda MongoDB dokumentatsioonist:
137 | https://docs.mongodb.com/manual/reference/method/db.createUser/
138 |
139 |
140 | Liigume oma MongoDB kodukataloogi
141 |
142 | ```
143 | cd mongodb
144 | ```
145 |
146 |
147 | Käivitame MongoDB autentimisseadeteta
148 |
149 | ```
150 | ./mongodb-binary/bin/mongod -f /dataXX/virtXXXX/mongodb/mongo.cfg --fork
151 | ```
152 |
153 | Edukas väljund peaks olema
154 |
155 | ```
156 | about to fork child process, waiting until server is ready for connections.
157 | forked process: 2790
158 | child process started successfully, parent exiting
159 | ```
160 |
161 | Loome kasutaja koos vajalike õigustega
162 |
163 | ```
164 | mongosh virtXXXX.loopback.zonevs.eu:5679/admin --eval "db.createUser({
165 | user:\"kasutaja\",
166 | pwd:\"salasona\",
167 | roles:[{role:\"userAdminAnyDatabase\",db:\"admin\"},{role:\"readWriteAnyDatabase\",db:\"admin\"}]
168 | })"
169 | ```
170 |
171 | Väljundi lõpp võiks olla umbes selline
172 |
173 | ```json
174 | { ok: 1 }
175 |
176 | ```
177 |
178 | Nüüd, kus on meil kasutaja loodud, loome ka andmebaasi andmete jaoks. Paneme sellele nimeks `my-database`. Seda saab teha lihtsa käsuga
179 |
180 | ```
181 | mongosh virtXXXX.loopback.zonevs.eu:5679/my-database --eval="db"
182 | ```
183 |
184 | Väljundi viimane rida peaks kuvama loodud andmebaasi nime
185 |
186 | ```
187 | my-database
188 | ```
189 |
190 | Nüüd, kus on meil seadistatud asutaja, peame me mongo ka nii käivitama, et autentimist nõutaks. Selleks paneme käimas oleva mongo kinni ning käivitame selle uuesti läbi pm2 (kirjeldatud punktis nr. 5)
191 |
192 | ```
193 | ./mongodb-binary/bin/mongod -f /dataXX/virtXXXX/mongodb/mongo.cfg --shutdown
194 | ```
195 |
196 | ## 5. Seadistame rakenduse virtuaalserveri halduses
197 |
198 | `Virtuaalserverid` -> `Veebiserver` -> `PM2 protsessid (Node.js)`
199 |
200 | Seal tuleb vajutada nuppu `Lisa uus Node.js rakendus`
201 |
202 | Täita tuleb väljad
203 |
204 | | väli | väärtus |
205 | | --- | --- |
206 | | Rakenduse nimi | MongoDB |
207 | | Skript või Pm2 .JSON | mongodb/mongodb.pm2.json |
208 | | Maksimaalne mälukasutus | võib jätta seadistamata, kuna on juba seadistatud pm2 failis serveris. |
209 |
210 | Ning vajuta nuppu `Salvesta muudatused`
211 |
212 | Paari minuti pärast peaks pm2 näitama, et rakendus on aktiivne. Seda saab kontrollida käsuga
213 |
214 | ```
215 | pm2 show mongodb
216 | ```
217 |
218 | ## 6. Testimine
219 |
220 | Testimaks, kas kõik töötab, võib kasutada alljärgnevaid käske
221 |
222 | ```sh
223 |
224 | # Käivitame MongoDB kliendi
225 | mongosh virtXXXX.loopback.zonevs.eu:5679 -u kasutaja -p salasona --authenticationDatabase admin
226 |
227 | # Järgnevad käsud võiksid kõik toimida
228 | use my-database
229 | db.asjad.insert({sissekanne:'Esimene sissekanne'});
230 | db.asjad.find();
231 | db.asjad.drop();
232 | ```
233 |
234 | ## 7. Andmebaasi _dump_ & _restore_
235 |
236 | Kuna varukoopiaid tehakse virtuaalserveris failisüsteemi tasandil ning selle tegemise hetkel võib failisüsteemis olla andmebaasi seis poolik, siis on soovitatav teha ise nö. dump varukoopiaid.
237 |
238 | ### 7.1 Andmete dumpimine failisüsteemi
239 |
240 | ```
241 | mongodump --host virtXXXX.loopback.zonevs.eu --port 5679 --db my-database --username kasutaja --password salasona --authenticationDatabase admin --out $HOME/mongodb/dump
242 | ```
243 |
244 | ### 7.2 Taastame andmebaasi
245 |
246 | ```
247 | mongorestore --host virtXXXX.loopback.zonevs.eu --port 5679 --db my-database --username kasutaja --password salasona --authenticationDatabase admin $HOME/mongodb/dump/[andmebaasi nimi, näiteks `my-database`]
248 | ```
249 |
--------------------------------------------------------------------------------
/articles/est/PHP-Laravel-6.md:
--------------------------------------------------------------------------------
1 | # Laravel 6.0 paigaldamine ning seadistamine Zone virtuaalserveris
2 |
3 | Autor: [Ingmar Aasoja](https://github.com/ybr-nx)
4 |
5 | Laraveli paigaldamine jagatud majutuses pole raketiteadus. Käesolevas juhendis näitan milliste Zone poolt pakutavate abivahenditega on võimalik Laravelist paremini aru saada ja seda oma eesmärkide saavutamiseks ära kasutada. Postituse lõpuosas kirjeldan ka mõningaid keerukamaid nüansse, mis võivad jagatud keskondades arendades kõvemaks pähkliks olla ka kogunenumal programmeerijal.
6 |
7 | Eeldan, et lugeja on tutvunud Laraveli põhitõdedega, kuid soovitan juhendist paremaks arusaamiseks vajadusel kiigata dokumentatsiooni poole: [Installation - Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/6.0)
8 |
9 | ## Nõuded teenuspaketile
10 | Laravelil ei ole erilisi nõudmiseid teenuspaketile, Zones töötab see väga sujuvalt ka Virtuaalserveri veebimajutusteenuse soodsaima paketiga. Enamate võimalustega paketti läheb reeglina vaja ainult edasjõudnutele mõeldud võimaluste kasutamiseks, nagu näiteks:
11 |
12 | * Redis (Cache, sessioonid, Queue)
13 | * MongoDB (Moloquent, Queue)
14 | * Websockets (Laravel Echo, Hot Module Replacement)
15 |
16 | ## Infot juhendi kohta
17 | Minu näidis-skriptides on kasutatud reaalselt loodud virtuaalserverit ning selle katalooge. Selleks, et antud õpetust oma Virtuaalserveris järgida, võib oma analoogsed kataloogid (asukohad failipuus) tuletada järgmiselt:
18 |
19 | * Õpetuses kasutatava kasutajakonto kodukataloog: `/data01/virt75146`
20 | Selle kataloogi oma analoogi leiad käivitades oma virtuaalserveris käsureal käsu `echo $HOME`
21 |
22 | * Õpetuses kasutatava virtuaalserveri juurkataloog: `/data01/virt75146/domeenid/www.laravel.miljonivaade.eu`
23 | See kataloog on tuletatud `echo $HOME` väljundile lisatud virtuaalserveri kataloogist `/domeenid/www.{virtuaalserveri.domeen}`
24 |
25 | Kõik juhendis edaspidi viidatud käsud, millele ei eelne juhist vahetada kataloogi `cd /mingi/asukoht` käsuga, tuleb käivitada rakenduse juurkataloogis, milleks käesoleva juhendi kontekstis on `/data01/virt75146/domeenid/www.laravel.miljonivaade.eu/rakendus`
26 |
27 | ## 1. Zone virtuaalserveri seadistamine
28 |
29 | ### 1.1 SSH
30 |
31 | Kordamine on tarkuse ema, kuid blogipost kisub pikaks ilma SSH kasutusjuhendit ümber kirjutamatagi, mistõttu siinkohal suunan teid abikeskonda: https://help.zone.eu/kb/ssh-uhenduse-loomine/
32 |
33 | ### 1.2 MariaDB & MySQL
34 |
35 | Jällegi viilin täpsemate juhiste kirjutamisest ja viitan siikohal uuesti blogipostile, kus seda teemat on juba käsitletud, täpsemalt punktile **1.2**: https://blog.zone.ee/2018/06/05/gitea-alternatiiv-githubile-mis-tootab-zone-virtuaalserveris/
36 |
37 | ### 1.3 Redis
38 |
39 | Redise kasutusele võtmine on meie juures tänu Minu Zone keskkonnale äärmiselt lihtne.
40 |
41 | Ava leht `Virtuaalserveri Haldus` -> `Andmebaasid` -> `Redis` ja vajuta lehel ON/OFF nuppu (ainuke nupp lehel).
42 |
43 | Minuti jooksul Redis käivitatakse ning vajalikud ligipääsuandmed ilmuvad samale lehele.
44 |
45 | ### 1.4 HTTP(S) ligipääs
46 |
47 | Soovitan muuta veebiserveri poolt kasutatavat juurkataloogi nii, et see ühtiks Laraveli rakenduse ülesehitusega.
48 |
49 | Olenevalt sellest, kas rakendus paigaldatakse peadomeenile või alamdomeenile, tuleb minna vastavalt Apache seadistustesse:
50 |
51 | `Virtuaalserveri Haldus` ->
52 | -> `Seaded` -> `HTTPS` -> `Muuda`
53 | -> `Alamdomeenid` -> `HTTPS` -> `Muuda`
54 |
55 | **Apache veebiserver -> Kataloog** – vali kataloog, kuhu plaanid rakenduse paigaldada ning lisa lõppu **public**. Näiteks **rakendus/public**
56 |
57 | **PHP -> Režiim** – vali vähemalt **7.3 FastCGI**.
58 |
59 | Juhul, kui on plaan kasutada ka *websocket*'eid, pead **HTTPS IP-address** väljale sisestama su serverile eraldatud IP-aadressi (mille saad küsida meie klienditeenindusest). Hiljem *websocket*'eid seadistades tuleb sellele IP-aadressile teha portide suunamine.
60 |
61 | Salvesta muudatused.
62 |
63 | ### 1.4.1 PHP ja laiendused
64 |
65 | Pärast veebiserveri muudatuste salvestamist vaata veel üle PHP laiendused.
66 |
67 | Vajuta nuppu **PHP laiendused** ja deaktiveeri **Redis**. Redise laienduse klassi nimi läheb konflikti Laraveli sisese Fascade'iga ning Redisega suhtlemiseks kasutab Laravel **predis** nimelist pakki, mis seda laiendust ei kasuta.
68 |
69 | Kui on soov kasutada PhpRedis moodulit, siis peab muutma Laravelis aliase **Redis** endale sobivaks, kuid siin me sellel detailsemalt ei peatu.
70 |
71 | Kui on soov kasutada MongoDB'd, aktiveeri **MongoDB** laiendus.
72 |
73 | ### 1.5 MongoDB
74 |
75 | MongoDB kasutamise õpetus on käesoleva blogipostituses kontekstis rohkem äärmemärkus ning selle alampunkti läbimiseks pole otsest vajadust.
76 |
77 | `Virtuaalserveri Haldus` -> `Andmebaasid` -> `MongoDB`
78 |
79 | Sarnaselt Redise seadistamisele on vaja vajutada vaid ON/OFF nuppu ning kogu ligipääsuks vajalik info kuvatakse samal lehel.
80 |
81 | ## 2. Laraveli rakenduse paigaldus
82 |
83 | ## 2.1 Laravel raamistiku paigaldus
84 | Logi SSH'ga virtuaalserverisse sisse ja liigu kausta, kus peaks tulevikus asuma kaust **rakendus** ning milles olevast **public** kaustast seadistasime Apache serveri rakendust serveerima.
85 |
86 | Meie näite puhul:
87 | ```
88 | cd ~/domeenid/www.laravel.miljonivaade.eu
89 | ```
90 |
91 | Käivita käsk, mis paigaldab Laravel raamistiku:
92 | ```
93 | composer create-project --prefer-dist laravel/laravel="6.0" rakendus
94 | ```
95 |
96 | Selle käsuga tekitatakse kaust `rakendus`, mis on edaspidi rakenduse juurkataloogiks ning milles enamus siinses juhendis kirjeldatud käske käivitada tuleb.
97 |
98 | Sellega on Laravel paigaldatud ning külastades brauseriga aadressi https://laravel.miljonivaade.eu kuvatakse sulle Laraveli standardne esileht. Edasi on tuleb sul oma äranägemise järgi seadistada Laraveli konfiguratsioon.
99 |
100 | ## 2.2 Kasutajaliides ja autentimise initsialiseerimine
101 | Kui soovid kasutada Laraveli poolt eelpaigaldatud UI arendusmeetodeid, seadista vajalikud **Node.js** pakid ning näiteks **Vue.js** eelseadistatud skriptid. Alates versioonist 6.0 on UI lahku löödud eraldi pakiks.
102 |
103 | Seadista **Vue.js UI**:
104 | ```sh
105 | // paigalda laravel/ui
106 | composer require laravel/ui --dev
107 |
108 | // seadista vue
109 | php artisan ui vue
110 |
111 | // genereeri sisselogimine ja registreerimine
112 | php artisan ui vue --auth
113 |
114 | // Paigalda UI arenduseks vajalikud **Node.js** moodulid:
115 | npm install
116 | ```
117 |
118 | Veendumaks, et kõik toimis, käivita käsk:
119 | ```sh
120 | npm run dev
121 | ```
122 |
123 | Kui kõik toimis, peaks väljund olema järgmine:
124 |
125 | ```
126 | DONE Compiled successfully in 7207ms 11:14:20 AM
127 |
128 | Asset Size Chunks Chunk Names
129 | /css/app.css 173 KiB /js/app [emitted] /js/app
130 | /js/app.js 1.38 MiB /js/app [emitted] /js/app
131 |
132 | ```
133 |
134 | Asendame näidiseks faili `resources/views/welcome.blade.php` sisuga:
135 | ```php
136 | @extends('layouts.app')
137 |
138 | @section('content')
139 |
140 | @endsection
141 | ```
142 |
143 | Minnes nüüd aadressile `https://laravel.miljonivaade.eu/`, peaks kuvatama teksti **I'm an example component.**
144 |
145 | Eelnevast võib täpsemalt lugeda ka dokumentatsioonist:
146 | [JavaScript & CSS Scaffolding - Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/6.0/frontend)
147 |
148 |
149 | ## 3. MariaDB (MySQL)
150 |
151 | ### 3.1 Ligipääsu seadistamine
152 |
153 | Laravel kasutab keskkonnamuutujate halduseks dotenv pakki. Seadistame `.env` failis andmebaasi ligipääsu ja määrame väärtused järgmistele ridadele:
154 |
155 | ```
156 | DB_HOST={mysql aadress}
157 | DB_DATABASE={andmebaasi nimi}
158 | DB_USERNAME={andmebaasi kasutajanimi}
159 | DB_PASSWORD={andmebaasi parool}
160 | ```
161 |
162 | Vajaliku info (nt MariaDB serveri aadressi) leiad Virtuaaserveri haldusest MySQL/MariaDB alampunktist.
163 |
164 | MariaDB ühenduse toimivust saab katsetada käivitades paigaldusskripti automaatselt paigaldatud migratsioonid:
165 |
166 | ```sh
167 | php artisan migrate
168 | ```
169 |
170 | Väljund peaks olema järgmine:
171 | ```
172 | Migration table created successfully.
173 | Migrating: 2014_10_12_000000_create_users_table
174 | Migrated: 2014_10_12_000000_create_users_table (0.01 seconds)
175 | Migrating: 2014_10_12_100000_create_password_resets_table
176 | Migrated: 2014_10_12_100000_create_password_resets_table (0.01 seconds)
177 | Migrating: 2019_08_19_000000_create_failed_jobs_table
178 | Migrated: 2019_08_19_000000_create_failed_jobs_table (0 seconds)
179 |
180 | ```
181 |
182 | ### 3.2 JSON & MariaDB
183 |
184 | Kuna Zones on kasutusel MariaDB ning Laraveli enda sisene MariaDB draiver ei oska kõikide JSON funktsioonidega ringi käia (kasutatakse MySQL omast json path aliast), siis tuleb paigaldada MariaDB toe pakk.
185 |
186 | Alates Laraveli versioonist 5.8 (mis ilmus 2019 alguses), pole seda enam vaja. Siiski võib seda vaja minna varasematel versioonidel ning seetõttu jätan selle info ka siia õpetusse. Kasutada saab seda ka 6.0 versiooniga ning kuna MariaDB's on teatud erinevusi, siis võib see tulla tulevikus kasuks:
187 | https://github.com/laravel/framework/pull/25517
188 |
189 | Paigaldame paki:
190 |
191 | ```sh
192 | composer require ybr-nx/laravel-mariadb
193 | ```
194 |
195 | Paki seadistamiseks muudame faili `config/database.php`. Otsime üles **mysql** ühenduse seaded ning asendame **driver** väärtuse **mariadb**'ga.
196 |
197 | Tulemus peaks olema järgmine:
198 | ```
199 | // ...
200 | 'mysql' => [
201 | 'driver' => 'mariadb',
202 | 'host' => env('DB_HOST', '127.0.0.1'),
203 | 'port' => env('DB_PORT', '3306'),
204 | 'database' => env('DB_DATABASE', 'forge'),
205 | 'username' => env('DB_USERNAME', 'forge'),
206 | // ...
207 | ```
208 |
209 |
210 | Testiks loome näiteks tabeli nimega **tasks**. Loome migratsiooni käivitades käsu:
211 | ```sh
212 | php artisan make:migration create_tasks_table --create=tasks
213 | ```
214 |
215 | Sellega loodi migratsioon ning faili näeb kaustas `database/migrations`. Migratsioonifaili nimes olev kuupäev on küll erinev, aga kolme faili seast peaks lihtne olema õiget valida. Juhendis loodud migratsiooni näite puhul muudame faili `database/migrations/2019_09_11_082935_create_tasks_table.php`
216 |
217 | Muudame `up()` meetodit nii, et tulemus oleks järgmine
218 | ```php
219 | //...
220 | public function up()
221 | {
222 | Schema::create('tasks', function (Blueprint $table) {
223 | $table->bigIncrements('id');
224 | $table->string('name');
225 | $table->json('information');
226 | $table->timestamps();
227 | });
228 | }
229 | //...
230 |
231 | ```
232 |
233 | Käivitame migratsiooni käsuga:
234 | ```sh
235 | php artisan migrate
236 | ```
237 |
238 | Tulemus peaks olema järgmine:
239 | ```
240 | Migrating: 2019_09_11_082935_create_tasks_table
241 | Migrated: 2019_09_11_082935_create_tasks_table (0.02 seconds)
242 | ```
243 |
244 | Testime JSON väljade toimivust. Lisame `routes/web.php` faili sisu ruutingu, mis sisestab andmebaasi kirje ning kuvab selle kinnituseks ka kohe välja.
245 |
246 | ```php
247 | //...
248 | Route::get('/json', function () {
249 | DB::table('tasks')->insert([
250 | 'name' => 'First task for me',
251 | 'information' => json_encode([
252 | 'location' => [
253 | 'city' => 'Tallinn',
254 | 'state' => 'Harjumaa',
255 | 'todo' => 'Nothing'
256 | ]
257 | ])
258 | ]);
259 | dd(DB::table('tasks')->get());
260 | });
261 | //...
262 | ```
263 |
264 | **NB!** Antud õpetuse skoobist väljudes tasub mainimist, et Eloquentis *array cast*'i kasutades pole Eloquent mudelitel *json_encode()* funktsiooni JSON väljadel tarvis kasutada.
265 |
266 | Loodud kirje JSON kaudu pärimise testimiseks loome järgmise ruutingu faili `routes/web.php`:
267 | ```php
268 | //...
269 | Route::get('/jsonshow', function () {
270 | dd(DB::table('tasks')->where('information->location->city', '=', 'Tallinn')->get());
271 | });
272 | //...
273 | ```
274 |
275 | Nüüd peaks URL ´https://laravel.miljonivaade.eu/jsonshow´ kuvama eelnevalt sisestatud kirjet.
276 |
277 | Sellega on MariaDB seadistatud Laravel raamistikuga täisväärtuslikult töötama.
278 |
279 | ## 4. Redis (nõuab Virutaalserveri paketti II)
280 |
281 | ### 4.1 Redise seadistamine
282 | Paigaldame **predis** paki käivitades rakenduse kaustas käsu:
283 | ```sh
284 | composer require predis/predis
285 | ```
286 |
287 | Muudame `.env` failis väärtused vastavalt `Virtuaalserveri Haldus` -> `Andmebaasid` -> `Redis` näidatavale:
288 | ```
289 | REDIS_CLIENT=predis
290 | REDIS_HOST=virtXXX.loopback.zonevs.eu
291 | REDIS_PASSWORD=XXXXXXXX
292 | REDIS_DB=0
293 | REDIS_PREFIX=
294 | ```
295 |
296 | Loome failis `routes/web.php` Redise testimiseks näidisruutingu:
297 | ```php
298 | //...
299 | Route::get('/redis', function () {
300 | dd(Redis::info());
301 | });
302 | //...
303 | ```
304 | Kui nüüd aadressilt 'https://laravel.miljonivaade.eu/redis' vaatab vastu Redise info, peaks kõik toimima.
305 |
306 | ### 4.2 Redis ja sessioonid
307 | Määrame rakenduse sessioone Redises hoidma. Selleks muudame `.env` failis `SESSION_DRIVER` väärtust.
308 | ```
309 | SESSION_DRIVER=redis
310 | ```
311 |
312 | ### 4.3 Redis ja cache
313 | Määrame rakenduse sessioone Redises hoidma. Selleks muudame `.env` failis `SESSION_DRIVER` väärtust.
314 | ```
315 | SESSION_DRIVER=redis
316 | ```
317 |
318 | Kui sessioone ja cache' hoida Redises, peab arvestama, et andmed ei säili pärast serveri ja redise taaskäivitamist. Enamasti see probleemiks ei ole. Kui on soov sessiooni TTL'i (*time to live*) pikendada ning et sessioonid säiliks, on mõtekam kasutada sessiooni `mysql` *driver*'it, mille seadistamine on kirjeldatud Laraveli dokumentatsioonis.
319 |
320 | ## 5. MongoDB (nõuab Virutaalserveri paketti II)
321 |
322 | ### 5.1 Seadistame MongoDB
323 |
324 | **NB!** MongoDB ja Laravel 6.0 kooslus nõuab uut ZoneOS serveri platvormi. Oma serveri liigutamiseks uuele tuleb kirjutada info@zone.ee
325 |
326 | https://help.zone.eu/kb/uleviimisel-uuele-zoneos-platvormile/
327 |
328 | MongoDB ja Laraveli suhtluseks soovitame kasutada pakki **laravel-mongodb**
329 | https://jenssegers.com/projects/laravel-mongodb
330 |
331 | Kuna käsureal oleval PHP'l pole MongoDB PHP moodulit aktiveeritud, seadistame PHP CLI'le oma php.ini, kus laadime sisse mongodb mooduli. Selleks käivitame käsud:
332 |
333 | ```sh
334 | cd ~
335 | mkdir phpini-cli
336 | echo "extension=php_mongodb.so" > phpini-cli/php.ini
337 | echo "export PHP_INI_SCAN_DIR=/data01/virt75146/phpini-cli" >> ~/.bash_profile
338 | export PHP_INI_SCAN_DIR=/data01/virt75146/phpini-cli
339 | ```
340 |
341 | Paigaldame mongodb paki käivitades käsu **(NB! seda tuleb teha rakenduse juurkataloogis):**
342 | ```sh
343 | composer require jenssegers/mongodb
344 | ```
345 |
346 | Määrame vajalikud seaded, mis leiame lehelt `Virtuaalserveri Haldus` -> `Andmebaasid` -> `MongoDB`. Muudame `.env` failis väärtused:
347 | ```
348 | MONGO_PORT=5678
349 | MONGO_HOST=virtXXX.loopback.zonevs.eu
350 | MONGO_DATABASE=mongodb_XXX
351 | MONGO_USERNAME=mongodb_XXX
352 | MONGO_PASSWORD=XXX
353 | ```
354 |
355 | Kirjeldame MongoDB andmebaasi ühenduse raamistiku konfiguratsioonis, muutes faili `config/database.php`.
356 |
357 | Lisame **connections** massiivi teiste elementide kõrvale järgneva:
358 | ```php
359 | //..
360 | 'mongodb' => [
361 | 'driver' => 'mongodb',
362 | 'host' => env('MONGO_HOST', 'localhost'),
363 | 'port' => env('MONGO_PORT', 5678),
364 | 'database' => env('MONGO_DATABASE'),
365 | 'username' => env('MONGO_USERNAME'),
366 | 'password' => env('MONGO_PASSWORD'),
367 | 'options' => [
368 | 'database' => env('MONGO_DATABASE')
369 | ]
370 | ],
371 | //..
372 | ```
373 |
374 | Kindlasti tuleb tähelepanu pöörata 'options' sisule, kuna see määrab ära autentimise andmebaasi.
375 |
376 | MongoDB testimiseks tekitame failis `routes/web.php` ruutingu:
377 | ```php
378 | //...
379 | Route::get('/mongodb', function () {
380 | dd(DB::connection('mongodb')->collection('users')->get());
381 | });
382 | //...
383 | ```
384 | Külastame lehte 'https://laravel.miljonivaade.eu/mongodb'. Kui antud lehel kuvatakse tühja *collection'i* on see õigesti seadistatud
385 |
386 | **Lisaks:**
387 | Kui on soovi kasutada autentimise ja/või queue tarvis Moloquenti, leiab selle info Moloquenti dokumentatsioonist:
388 | Autentimine: https://moloquent.github.io/master/#auth
389 | Queue: https://moloquent.github.io/master/#queues
390 |
391 | ## 6. Queue
392 | Queue käivitamiseks pole tingimata tarvis kõrgemat teenuspaketti kui I, kuid see on soovitatav, sest siis saab kasutada Queue käitamiseks Redist või MongoDB'd. MariaDB'i pidev koormamine ei mõju rakendusele hästi ning kui see jagatud keskonnas teisi segama hakkab, ei pruugi antud *worker* enam tööle jääda.
393 |
394 | Antud näites paneme Queue tööle siiski MariaDB andmebaasi peal. Redise ja MongoDB kasutamiseks tuleb lihtsalt määrata vastav draiver **config/queue.php** konfiguratsioonifailis.
395 |
396 | Täpsema info leiab dokumentatsioonist:
397 | MySQL/MariaDB ja Redis: https://laravel.com/docs/6.0/queues
398 | MongoDB: https://moloquent.github.io/master/#queues
399 |
400 | Loome vajalikud andmebaasi tabelid:
401 | ```
402 | php artisan queue:table
403 | php artisan migrate
404 | ```
405 |
406 | Määrame draiveriks andmebebaasi muutes failis `.env` väärtust:
407 | ```
408 | QUEUE_CONNECTION=database
409 | ```
410 |
411 | Draiverite seadistamine dokumentatsiooni järgi ei tohiks raskusi tekitada. Pigem tekib küsimus, et kuidas olla kindel, et queue töötaks, kui SSH'st välja logida ja kui serverile restart tehakse? Selleks tuleb Zones appi PM2.
412 |
413 | Loome kõigepealt konfiguratsioonifaili `pm2.laravel.queue.json` sisuga:
414 | ```json
415 | {
416 | "apps" : [{
417 | "name" : "laravel-queue",
418 | "cwd" : "/data01/virt75146/domeenid/www.laravel.miljonivaade.eu/rakendus",
419 | "script" : "artisan",
420 | "interpreter" : "php",
421 | "args" : " queue:work",
422 | "max_memory_restart" : "128M"
423 | }]
424 | }
425 | ```
426 |
427 | Vajalikud seadistuste kirjeldused, mis tuleb seadistada vastavalt oma rakendusele:
428 |
429 | | Väli | Kirjeldus |
430 | | --- | --- |
431 | | `apps.name` | Vabalt valitud nimi, mida kuvatakse PM2 halduses |
432 | | `apps.cwd` | Täispikk rakenduse juurkataloogi asukoht |
433 | | `apps.max_memory_restart` | Määrab kui suure mälu kasutuse korral rakendus taaskäivitatakse. Tuleb seadistada oma äranägemise järgi, aga kindlasti ei tohi see ületada paketis lubatut: https://www.zone.ee/et/virtuaalserver/vordlus. Kui on plaanis kasutada websocketeid, peab arvestama, et kõikide rakenduste kogumaht ei ületaks lubatut. |
434 |
435 | Nüüd tuleb antud failist ka Zone platvormile teada anda:
436 | `Virtuaalserver haldus` -> `Node.js ja PM2`, vajutada nuppu `Lisa uus Node.js rakendus`
437 |
438 | Täida väljad:
439 | **rakenduse nimi** : `laravel-queue` (võib olla vabalt valitud)
440 | **skript või pm2 .json** : `domeenid/www.laravel.miljonivaade.eu/rakendus/pm2.laravel.queue.json` (.json faili asukoht alates `$HOME` kataloogist)
441 |
442 | Mälukasutuse võib jätta 1MB peale, kuna see kirjutatakse .json failis üle.
443 |
444 | Vajuta **Lisa** nuppu ning oota umbes 2 minutit. Queue toimivust saab kontrollida käsurealt käsuga:
445 |
446 | ```
447 | pm2 list
448 | ```
449 | või
450 | ```
451 | pm2 show laravel-queue
452 | ```
453 |
454 | Kui on soovi *queue*'t taaskäivitada, saab seda teha zone virutaalserveri halduses "ON/OFF" nupu kõrval oleva nupuga või käivita käsurealt vastav käsk:
455 |
456 | ```
457 | php artisan queue:restart
458 | ```
459 |
460 | ## 7. Websockets (nõuab Virutaalserveri paketti III ning staatilist IP aadressi)
461 | Websocketi ja PHP kooslus pole levinud nähtus ning selle seadistamine on olnud näidiste puudumise tõttu vaevaline. Õnneks on Laravel teinud suure töö ära **Laravel Echo** näol.
462 |
463 | Kuna vaikimis on meil kõik pordid tulemüürist kinni või suunatud Apache peale, siis läheb sul pordi suunamiseks vaja staatilist IP-aadressi. Kui sul seda veel pole, saad selle tellida kirjutades klienditoele aadressil info@zone.ee.
464 |
465 | Kui staatiline IP-aadress on olemas, veendume, et see on seadistatud vastavalt õpetusele punktis **1.4**.
466 |
467 | Siinses õpetuses seadistame websocketite kasutamise **Redise** ning **Socket.IO** serveri abil. Redise paigaldamisest on meil juttu punktis number 4. Paigaldame peame veel Socket.IO serveri.
468 |
469 | ## 7.1 Laravel Echo Server
470 | [GitHub - tlaverdure/laravel-echo-server: Socket.io server for Laravel Echo](https://github.com/tlaverdure/laravel-echo-server)
471 |
472 | Meil on paigaldatud Let's Encrypt sertifikaat, kuid see paigaldatakse automaatselt ainult Apache veebiserverile ning selle proxy'le. Kuna EULA sertifikaatide privaatseid võitmeid jagada ei luba, tuleb siinkohal kasutada oma sertifikaate. Selleks on kolm võimalust:
473 | * Tellida tasuline sertifikaat: [SSL sertifikaat - Zone.ee](https://www.zone.ee/et/turvalisus/ssl-sertifikaat/)
474 | * Genereerida `self signed` sertifikaat
475 | * Luua oma vahenditega Let's Encrypt sertifikaat kasutades DNS autoriseeringut ning Zone API't: [Let's Encrypt genereerimine Acme.sh kliendiga](./LetsEncrypt-Acme.sh.md) või [Let's Encrypt genereerimine Lego kliendiga](./LetsEncrypt-Lego.md)
476 |
477 | Siinses juhendis eeldame, et üks neist on juba tehtud ning sertifikaat koos võtmega asub kataloogis `/data01/virt75146/certs`
478 |
479 | Socket IO serveri paigaldame süsteemsele kasutajale globaalselt. Selleks liigume enne paigaldamist kodukataloogi.
480 | ```sh
481 | cd ~
482 | npm install laravel-echo-server
483 | ```
484 |
485 | Liigume tagasi rakenduse juurkataloogi ning loome JSON konfiguratsioonifaili `laravel-echo-server.json`.
486 |
487 | ```
488 | {
489 | "authHost": "https://laravel.miljonivaade.eu",
490 | "authEndpoint": "/broadcasting/auth",
491 | "database": "redis",
492 | "databaseConfig": {
493 | "redis": {
494 | "database": 0,
495 | "host": "virt75146.loopback.zonevs.eu",
496 | "port": 6379,
497 | "password": "XXX"
498 | }
499 | },
500 | "devMode": true,
501 | "host": null,
502 | "port": "6001",
503 | "protocol": "https",
504 | "socketio": {},
505 | "sslCertPath": "/data01/virt75146/certs/laravel.miljonivaade.eu.cert.pem",
506 | "sslKeyPath": "/data01/virt75146/certs/laravel.miljonivaade.eu.key.pem,
507 | "sslCertChainPath": "/data01/virt75146/certs/laravel.miljonivaade.eu.fullchain.pem",
508 | "sslPassphrase": "",
509 | "subscribers": {
510 | "http": true,
511 | "redis": true
512 | },
513 | "apiOriginAllow": {
514 | "allowCors": true,
515 | "allowOrigin": "https://laravel.miljonivaade.eu",
516 | "allowMethods": "GET, POST",
517 | "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
518 | }
519 | }
520 | ```
521 |
522 | Seadete kirjeldused, mis tuleb seadistada vastavalt oma rakendusele:
523 |
524 | | Väli | Kirjeldus |
525 | | --- | --- |
526 | | `authHost` | Laraveli rakenduse avalik URL |
527 | | `databseConfig.redis.database` | Redise andmebaasi number. Sama väärtus, mis `.env` failis muutujal `REDIS_DB` |
528 | | `databseConfig.redis.host` | Virtuaalserveri *loopback* host |
529 | | `databseConfig.redis.port` | Redise port, vaikeväärtuseks on meil **6379** |
530 | | `databseConfig.redis.password` | Varem lisatud redise andmebaasi |
531 | | `devMode` | Määrab ära, et echo serverist kasutatakse arendus keskonnas. **NB!** produktsioonis peab olemas selle väärtus **false** |
532 | | `sslCertPath` | SSL sertifikaati path. Väärtus on erinev, kui see paigaldati teise asukohta, kui siinses õpetuses kirjeldatud |
533 | | `sslCertPath` | SSL sertifikaati privaatse võtme. Väärtus on erinev, kui see paigaldati teise asukohta, kui siinses õpetuses kirjeldatud |
534 | | `apiOriginAllow.allowOrigin` | Laraveli rakenduse avalik URL |
535 |
536 | Ning käivitame testiks **laravel-echo-server** rakenduse
537 | ```
538 | laravel-echo-server start
539 | ```
540 |
541 | Ning töötav väljund peaks kuvama järgmist:
542 | ```
543 | L A R A V E L E C H O S E R V E R
544 |
545 | version 1.5.8
546 |
547 | ⚠ Starting server in DEV mode...
548 |
549 | ✔ Running at localhost on port 6001
550 | ✔ Channels are ready.
551 | ✔ Listening for http events...
552 | ✔ Listening for redis events...
553 |
554 | Server ready!
555 |
556 | ```
557 |
558 | Sulgeme rakenduse klahvikombinatsiooniga `ctrl + C` ning seadistame PM2 protsessihalduri seda jooksutama. Loome konfiguratsioon faili `pm2.laravel.echo.json` sisuga:
559 |
560 | ```json
561 | {
562 | "apps" : [{
563 | "name" : "laravel-echo-server",
564 | "cwd" : "/data01/virt75146/domeenid/www.laravel.miljonivaade.eu/rakendus",
565 | "script" : "laravel-echo-server",
566 | "args" : " start",
567 | "max_memory_restart" : "128M"
568 | }]
569 | }
570 | ```
571 |
572 | Tuletatavad väärtused võib asendada sarnaselt punktis **6** olevale PM2 konfiguratsioonifailile järgnevale tabelile.
573 |
574 | Seadistame Virtuaalserveri halduses PM2 konfiguratsiooni, kus kõik toimub samuti sarnaselt punktile **6**, erinevad vaid väljade väärtused. `Virtuaalserver haldus` -> `Node.js ja PM2`, vajutada nuppu `Lisa uus Node.js rakendus`
575 |
576 | **rakenduse nimi** : `laravel-echo-server` (võib olla vabalt valitud)
577 | **skript või pm2 .json** : `domeenid/www.laravel.miljonivaade.eu/rakendus/laravel.echo.json`
578 |
579 | Pärast rakendus lisandumist tuleb oodata umbes minut ning rakendust peaks nägema, kui käivitada käsk
580 | ```
581 | pm2 show laravel-echo-server
582 | ```
583 |
584 | Lisame info ka Laraveli rakenduse konfuguratsiooni. Muudame `.env` faili rea väärtust:
585 | ```
586 | BROADCAST_DRIVER=redis
587 | ```
588 |
589 | Failis `config/app.php` faili eemaldame kommentaari realt
590 | ```
591 | App\Providers\BroadcastServiceProvider::class,
592 | ```
593 |
594 | Seadistame portide suunamise, et websocket'iga laravel echo serverile ka ligi pääseks:
595 | `Virtuaalserveri Haldus` -> `Veebiserver` -> `Portide Suunamine`
596 |
597 | Lisame järneva:
598 | * IP: varem hostile määratud staatiline IP
599 | * Port: `6001`
600 | * Kommentar: `laravel-echo-server` (vabalt valitud näidis)
601 |
602 | Vajutame nuppu **Lisa** ning muudatused jõuavad serverini 10 minuti jooksul. Seni võib tegeleda järgmiste punktidega ning portide suunamist läheb vaja alles **7.1.3** juures vaja
603 |
604 | ## 7.1 Laravel Echo kliendi seadistamine ning testimine
605 | Kuna näide põhineb privaatsel kanalil, tuleb enda rakenduses registreerida kasutaja ning sellega **sisse logida**. Kui kõik on tehtud nii, nagu õpetuses kirjas, saab seda kõike teha aadressil `https://laravel.miljonivaade.eu/register`
606 |
607 | ## 7.1.1 Loome kanali, kuhu me sõnumeid saatma hakkame
608 | Kanali autentimiseks piisab sellest, kui muuta `routes/channels.php` faili sisu järgnevaks:
609 |
610 | ```php
611 | description = $description;
655 | $this->task = $task;
656 | }
657 |
658 | /**
659 | * Get the channels the event should broadcast on.
660 | *
661 | * @return \Illuminate\Broadcasting\Channel|array
662 | */
663 | public function broadcastOn()
664 | {
665 | return new PrivateChannel('task.' . $this->task);
666 | }
667 | }
668 | ```
669 |
670 | Proovime event'i välja kutsuda ning loome näidisruutingu faili `routes/web.php`, mille sisuks on:
671 |
672 | ```php
673 | Route::get('/sendtask', function () {
674 | event(new App\Events\TaskAdded(2, 'My second task todo.'));
675 | return 'Sent!';
676 | });
677 | ```
678 |
679 | Külastame aadressi `https://laravel.miljonivaade.eu/sendtask`. Kui kõik on õigesti seadistatud, peaks event jõudma `laravel-echo-server` rakenduse väljundisse, mida näeme pm2 logist:
680 |
681 | ```sh
682 | tail -f /data01/virt75146/.pm2/logs/laravel-echo-server-out.log
683 | ```
684 |
685 | ## 7.1.3 Laravel Echo & Socket.IO JS kliendi seadistamine
686 | Paigaldame vajalikud javascript teegid:
687 | ```sh
688 | npm install --save laravel-echo socket.io-client
689 | ```
690 |
691 | Lisame **Echo** frontend rakendusse. Avame faili `resources/js/bootstrap.js` ning lisame lõppu sinna järgnevad read:
692 |
693 | ```js
694 | import Echo from "laravel-echo"
695 |
696 | window.io = require('socket.io-client');
697 |
698 | window.Echo = new Echo({
699 | broadcaster: 'socket.io',
700 | host: window.location.hostname + ':6001'
701 | });
702 | ```
703 |
704 | Muudame näidis Vue komponendis olevat `mountend()` meetodit järgnevalt:
705 | ```js
706 | mounted() {
707 | console.log('Component mounted.')
708 |
709 | Echo.channel('private-task.2')
710 | .listen('TaskAdded', (e) => {
711 | alert(e.description);
712 | });
713 | }
714 | ```
715 |
716 | Kompileerime javascripti javascripti käsuga
717 | ```sh
718 | npm run dev
719 | ```
720 |
721 | Kui nüüd külastada lehte `https://laravel.miljonivaade.eu` ning brauseri teises kaardis avada URL `https://laravel.miljonivaade.eu/sendtask`, peaks esimesele kaardile tulema vastav javascripti alert.
722 |
723 | ## 8. Vue.JS & Hot Module Replacement (nõuab Virtuaalserveri paketti III ning staatilist IP aadressi)
724 | Hot Module Replacement (HMR) on abimees arendajakogemuse parandamiseks. Iga arendaja on avastanud ennast olukorrast, kus iga javascriptis ja css'is tehtud muutuse pärast peab tulemuse nägemiseks brauseris lehe uuesti laadima. Hullemaks kipub olekord minema *one page application* puhul, kus tihtilugu peab soovitud seisundi saavutamiseks iga korda rakenduses edasi liikuma. Arendades Laravel'i rakenduses UI'd Vue.JS'is, on võimalik vastav UI komponent automaatselt pärast muutmist laadida.
725 |
726 | Eelduseks on SSL sertifikaadi olemasoleks vastavalt punktis **7.1** kirjeldatule
727 |
728 | Seadistame portide suunamise, mille kaudu frontend rakendusega suhtleb:
729 | `Virtuaalserveri Haldus` -> `Veebiserver` -> `Portide Suunamine`
730 |
731 | Lisame järgneva:
732 | * IP: varem hostile määratud staatiline IP
733 | * Port: `6002`
734 | * Kommentar: `laravel-hot-module-replace` (vabalt valitud näidis)
735 |
736 | Muudame laraveli layouti kasutamaks mix'i. leiame failist `resources/views/layout.blade.php` rea
737 | ```html
738 |
739 | ```
740 | ning muudame selle järgnevaks:
741 | ```html
742 |
743 | ```
744 |
745 | Lisame faili `webpack.mix.js` algusesse pärast rida `const mix = require('laravel-mix');` järgmise:
746 | ```js
747 | mix.options({
748 | hmrOptions: {
749 | host: 'laravel.miljonivaade.eu', //rakenduse domeen
750 | port: 6002 // portide suunamisel määratud port
751 | }
752 | });
753 | ```
754 |
755 | Seadistame **HMR** käima üle HTTPS'i. Selleks kasutame samu sertifikaate, mille punktis **7** echo serverile seadistasime. Seda teeme lisades faili `package.json` task'i `hot` lõppu *option*'id: `https`, `cert` ja `key`. Tulemuseks peaks olema järgmisele sarnanev rida:
756 | ```json
757 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js --https --cert=/data01/virt75146/certs/laravel.miljonivaade.eu.cert.pem --key=/data01/virt75146/certs/laravel.miljonivaade.eu.key.pem",
758 | ```
759 |
760 | Käivitame arendustsüksli watch'i. Kasutades HMR'i, tuleb `watch` taski asemel lihtsalt käivitada `hot`
761 | ```sh
762 | npm run hot
763 | ```
764 |
765 | Avame URL'i `https://laravel.miljonivaade.eu`
766 |
767 | Kui nüüd muuta näidiskomponendi `resources/js/components/ExampleComponent.vue` template'i, näeb muutust brauseris kohe.
--------------------------------------------------------------------------------
/articles/est/Python-Django-2.md:
--------------------------------------------------------------------------------
1 | # Django 2 (Python) Zone.eu virtuaalserveris
2 |
3 | Autor: [Ingmar Aasoja](https://github.com/ybr-nx)
4 |
5 | [Antud õpetus on aegunud! Django 3 leiad siit](./Python-Django-3.md)
6 |
7 | Antud õpetus on semi-official. Ehk annab suuna kätte, aga ametlike klienditoe kanalite kaudu tuge ei pakuta.
8 |
9 | Õpetus töötab ainult alates uuest ZoneOS platvormi versioonist 19.10.00. Seda saad kontrollida nii:
10 | ```
11 | cat /etc/os-release | grep PRETTY_NAME
12 | ```
13 |
14 | ## 1. Virtualenv'i seadistamine
15 |
16 | ```
17 | virtualenv ~/.venv/django-dev --python=python3.6
18 | source ~/.venv/django-dev/bin/activate
19 | ```
20 |
21 | ## 2. Django paigaldamine ja seadistamine
22 |
23 | Valitud on verioon 2.1 kuna 2.2 ei toeta PyMySQL moodulit. (Vaata antud õpetuse punkti **6**)
24 |
25 | ```sh
26 | pip install django==2.1
27 | ```
28 |
29 | Loo projekt
30 | ```sh
31 | cd domeenid/www.django.miljonivaade.eu
32 | django-admin startproject miljonivaade
33 | ```
34 |
35 | ## 3. Andmebaasid
36 |
37 | Kuna vaikimisi seadistatud sqllite3 pole Zone virtuaalsereris oleval pythonil toetatud (ja veebirakenduses ei ole ka kõige õigem valik), peab seadistama muu andmebaasi. Valikuks on **MariaDB** ja **MongoDB**.
38 |
39 | ### 3.1.1 MariaDB
40 |
41 | Kuna tavaline MariaDB/MySQL moodul vajab kompileerijat, siis kasuta sellleks **PyMysql** moodulit, mis vajab veidi erinevat seadistamist.
42 |
43 | ```
44 | pip install pymysql
45 | ```
46 |
47 | Seadista `miljonivaade/miljonivaade/settings.py` failis andmebaass järgnevalt:
48 |
49 | ```py
50 | DATABASES = {
51 | 'default': {
52 | 'ENGINE': 'django.db.backends.mysql',
53 | 'HOST': 'dXXX.mysql.zonevs.eu', # andmebaasi serveri host
54 | 'NAME': 'XXX', # andmebaasi nimi
55 | 'PASSWORD': 'XXX', # andmebaasi salasõna
56 | 'USER': 'XXX', # andmebaasi kasutajakonto
57 | 'STRICT': True
58 | }
59 | }
60 | ```
61 |
62 | Ning selleks, et PyMySQL moodul töötaks pead muutma mõnda. Lisada tuleb `miljonivaade/manage.py` faili read:
63 |
64 | ```py
65 | import pymysql
66 |
67 | pymysql.install_as_MySQLdb()
68 | ```
69 |
70 | Faili algus võiks näha välja umbes selline
71 |
72 | ```py
73 | #!/usr/bin/env python
74 | """Django's command-line utility for administrative tasks."""
75 | import os
76 | import sys
77 | import pymysql
78 |
79 | pymysql.install_as_MySQLdb()
80 |
81 | def main():
82 | #....
83 | ```
84 |
85 | Sama pead lisama ka `miljonivaade/miljonivaade/wsgi.py` faili algusesse, mis võiks näha välja umbes selline:
86 |
87 | ```py
88 | """
89 | WSGI config for miljonivaade project.
90 |
91 | It exposes the WSGI callable as a module-level variable named ``application``.
92 |
93 | For more information on this file, see
94 | https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/
95 | """
96 |
97 | import os
98 | import pymysql
99 |
100 | from django.core.wsgi import get_wsgi_application
101 |
102 | pymysql.install_as_MySQLdb()
103 |
104 |
105 | ```
106 |
107 | ### 3.1.2 MongoDB
108 |
109 | Paigalda **djongo** (MonoDB django moodul)
110 |
111 | ```
112 | pip install djongo
113 | ```
114 |
115 | Seadista `miljonivaade/miljonivaade/settings.py ` failis andmebaas järgnevalt:
116 |
117 | ```py
118 | DATABASES = {
119 | 'default' : {
120 | 'ENGINE': 'djongo',
121 | 'ENFORCE_SCHEMA': True,
122 | 'NAME': 'mongodb_XXX', # MongoDB andmebaas
123 | 'USER': 'mongodb_XXX', # MongoDB kasutajanimi
124 | 'PORT': 5678,
125 | 'PASSWORD': '{XXX}', # MongoDB parool
126 | 'HOST': 'virtXXX.loopback.zonevs.eu', # MongoDB host
127 | 'AUTH_SOURCE': 'admin'
128 |
129 | }
130 | }
131 | ```
132 |
133 | ### 3.2 Käivita migratsioonid
134 |
135 | ```
136 | python miljonivaade/manage.py migrate
137 | ```
138 |
139 | ## 4. Seadistame serveri serveerimaks Django rakendust
140 |
141 | ### 4.1 Gunicorn ja Mod Proxy
142 | Kuna Zone's mod_wsgi Apache moodulit ei ole, siis jääb ainukeseks võimaluseks kasutada **gunicorn** python moodulit ning serveerida seda läbi mod_proxy. Seadistame virtuaalserveri halduses soovitud domeeni/alamdomeeni mod_proxy port'i omale sobivaks. Antud juhul kasutame port'i **8000** - see on default, teisel juhul tuleb port määrata gunicorn'i käivitades optioniga `gunicorn --bind 0.0.0.0:8000`
143 |
144 | Paigalda gunicorn
145 |
146 | ```
147 | pip install gunicorn
148 | ```
149 |
150 | **NB!** gunicorn tuleb paigaldada samaaegselt aktiveeritud virtenvis, siis see hoolitseb viimase aktiveerimise eest ise, kui seadistame **Pm2** teenust.
151 |
152 | Ning käivita see
153 | ```sh
154 | cd miljonivaade
155 | gunicorn miljonivaade.wsgi:application
156 | ```
157 |
158 | Kui nüüd brauseris külastada `https://django.miljonivaade.eu`, siis peaks seal kuvama veateaded, et antud host ei ole ALLOWED_HOSTS listis. See tähendab, et gunicorn töötab, aga vaja veel veidike seadistada Django rakendust
159 |
160 | Lisa domeen ALLOWED_HOSTS list'i, ehk muuda fail `miljonivaade/miljonivaade/settings.py` umbes rea 28 ümber järgmiseks:
161 |
162 | ```py
163 | ALLOWED_HOSTS = [
164 | 'django.miljonivaade.eu'
165 | ]
166 | ```
167 |
168 | Kui nüüd käivitada gunicorn uuesti, siis peaks brauser juba kuvama kenamat lehte teatega **The install worked successfully! Congratulations!**
169 |
170 | Selleks, et server töötaks täisväärtuslikult, seadista gunicorn serveerima ka staatilisi faile. Muuda `miljonivaade/miljonivaade/urls.py` faili nii, et see näeks välja umbes järgmine:
171 |
172 | ```py
173 | from django.contrib import admin
174 | from django.urls import path
175 | from django.contrib.staticfiles.urls import staticfiles_urlpatterns
176 | ö
177 | urlpatterns = [
178 | path('admin/', admin.site.urls),
179 | ]
180 |
181 | urlpatterns += staticfiles_urlpatterns()
182 | ```
183 |
184 | Kui nüüd rakendust käivitada, siis brauser annab esilehel küll veateate, aga path'ile **/admin** minnes on pilt ilusam.
185 |
186 | ### 4.2 Pm2 teenus
187 |
188 | Et kindel olla rakenduse toimivuses pärast serveri taaskäivitamist ja/või mõne muu probleemi tekkimist, pead seadistama Pm2 teenuse.
189 |
190 | Loo fail `miljonivaade/django.config.js` (faili nimi peab olema config.js laiendiga)
191 |
192 | ```js
193 | module.exports = {
194 | apps : [{
195 | name : "django",
196 | cwd : process.env.HOME + "/domeenid/www.django.miljonivaade.eu/miljonivaade",
197 | script : process.env.HOME + "/.venv/django-dev/bin/gunicorn",
198 | args: "miljonivaade.wsgi:application",
199 | interpreter: process.env.HOME + "/.venv/django-dev/bin/python3.6",
200 | max_memory_restart : "128M"
201 | }]
202 | }
203 | ```
204 |
205 | Järgmiseks tuleb see seadistada Minu Zone's
206 |
207 | `virtuaalserveri haldus` -> `Veebiserver` -> `PM2 protsessid (Node.js)`
208 | Vajuta nuppu **Lisa uus Node.js rakendus**
209 |
210 | | Väli | Kirjeldus |
211 | | --- | --- |
212 | | **nimi** | django |
213 | | **skript või PM2 .JSON** | miljonivaade/django.config.js |
214 |
215 | Maksimaalse mälukasutuse võib jätta määramata. Vajuta nuppu **Lisa** ning mõne minuti jooksul peaks rakendus tööle hakkama. Kontrollida saad seda serveris käsuga `pm2 list`
216 |
217 | ## 5. Rakenduse arendamine
218 |
219 | Django rakendust arendades on kood laetud mällu ning muutused ei kajastu kohe, selleks peab käsurealt taaslaadima rakenduse `--watch` parameetriga. Sel juhul jälgib Pm2 muudetavaid faile ning laeb vajadusel rakenduse uuesti.
220 |
221 | ```sh
222 | pm2 start django --watch
223 | ```
224 |
225 | Ning kui muudatused tehtud, siis lülita see välja
226 | ```sh
227 | pm2 start django
228 | ```
229 |
230 | ## 6. Django 2.2 ja PyMysql
231 |
232 | Kuna PyMySQL'il on veel kompatiilsusprobleeme Djangoga 2.2 versiooniga, siis peab muutma mõnda faili. Neid tuleb teha iga kord, kui paigaldatakse antud pakk pip'iga. Kui antud *issue* lahendatakse, siis täiendan õpetust.
233 | https://github.com/PyMySQL/PyMySQL/issues/790
234 |
235 | Parandatud **PyMySQL** tugi peaks jõudma Django 3.0 versiooni
236 | https://code.djangoproject.com/wiki/Version3.0Roadmap
237 |
238 | Kui on soov paigaldada uuem django, siis [Django 3 õpetuse leiad siit.](./Python-Django-3.md)
239 |
240 | Django 2.2 puhul pead tegema järgmised muutused
241 |
242 | `~/.venv/django-dev/lib64/python3.6/site-packages/django/db/backends/mysql/base.py`
243 | Rida 35 muuda
244 | ```py
245 | if version < (1, 3, 12):
246 | ```
247 |
248 | `~/.venv/django-dev/lib64/python3.6/site-packages/django/db/backends/mysql/operations.py`
249 | Rida 146 muuda
250 |
251 | ```py
252 | query = query.encode(errors='replace')
253 |
254 | ```
--------------------------------------------------------------------------------
/articles/est/Python-Django-3.md:
--------------------------------------------------------------------------------
1 | # Django 3 (Python) Zone.eu virtuaalserveris
2 |
3 | Autor: [Ingmar Aasoja](https://github.com/ybr-nx)
4 |
5 | Antud õpetus on semi-official. Ehk annab suuna kätte, aga ametlike klienditoe kanalite kaudu tuge ei pakuta.
6 |
7 | Õpetus eeldab, et on seadistatud SSH ligipääs. [SSH ühenduse loomine](https://help.zone.eu/kb/ssh-uhenduse-loomine/)
8 |
9 | ## 1. Virtualenv'i seadistamine
10 |
11 | ```
12 | virtualenv ~/.venv/django-dev --python=python3.8
13 | source ~/.venv/django-dev/bin/activate
14 | ```
15 |
16 | ## 2. Django paigaldamine ja seadistamine
17 |
18 | ```sh
19 | pip install django==3.1
20 | ```
21 |
22 | Loo projekt
23 | ```sh
24 | cd domeenid/www.django.miljonivaade.eu
25 | django-admin startproject miljonivaade
26 | ```
27 |
28 | ## 3. Andmebaasid
29 |
30 | Kuna vaikimisi seadistatud sqllite3 pole Zone virtuaalsereris oleval pythonil toetatud (ja veebirakenduses ei ole ka kõige õigem valik), seadistame **MariaDB**
31 |
32 | ### 3.1.1 MariaDB
33 |
34 | Kuna tavaline MariaDB/MySQL moodul vajab kompileerijat, siis peab Zone veebimajutuses kasutama selle asemel **PyMysql** moodulit, mis vajab veidi erinevat seadistamist.
35 |
36 | ```
37 | pip install pymysql
38 | ```
39 |
40 | Seadista `miljonivaade/miljonivaade/settings.py` failis andmebaass järgnevalt:
41 |
42 | ```py
43 | DATABASES = {
44 | 'default': {
45 | 'ENGINE': 'django.db.backends.mysql',
46 | 'HOST': 'dXXX.mysql.zonevs.eu', # andmebaasi serveri host
47 | 'NAME': 'XXX', # andmebaasi nimi
48 | 'PASSWORD': 'XXX', # andmebaasi salasõna
49 | 'USER': 'XXX', # andmebaasi kasutajakonto
50 | 'STRICT': True
51 | }
52 | }
53 | ```
54 |
55 | Ning selleks, et PyMySQL moodul töötaks pead muutma mõnda. Lisada tuleb `miljonivaade/manage.py` faili read:
56 |
57 | ```py
58 | import pymysql
59 |
60 | pymysql.install_as_MySQLdb()
61 | ```
62 |
63 | Faili algus võiks näha välja umbes selline
64 |
65 | ```py
66 | #!/usr/bin/env python
67 | """Django's command-line utility for administrative tasks."""
68 | import os
69 | import sys
70 | import pymysql # lisatud rida
71 |
72 | pymysql.install_as_MySQLdb() # lisatud rida
73 |
74 | def main():
75 | #....
76 | ```
77 |
78 | Sama pead lisama ka `miljonivaade/miljonivaade/wsgi.py` faili algusesse, mis võiks näha välja umbes selline:
79 |
80 | ```py
81 | """
82 | WSGI config for miljonivaade project.
83 |
84 | It exposes the WSGI callable as a module-level variable named ``application``.
85 |
86 | For more information on this file, see
87 | https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/
88 | """
89 |
90 | import os
91 | import pymysql # lisatud rida
92 |
93 | from django.core.wsgi import get_wsgi_application
94 |
95 | pymysql.install_as_MySQLdb() # lisatud rida
96 |
97 |
98 | ```
99 |
100 | ### 3.2 Käivita migratsioonid
101 |
102 | ```
103 | python miljonivaade/manage.py migrate
104 | ```
105 |
106 | ## 4. Seadistame serveri serveerimaks Django rakendust
107 |
108 | ### 4.1 Gunicorn ja Mod Proxy
109 | Kuna Zone's mod_wsgi Apache moodulit ei ole, siis jääb ainukeseks võimaluseks kasutada **gunicorn** python moodulit ning serveerida seda läbi mod_proxy. Seadistame virtuaalserveri halduses soovitud domeeni/alamdomeeni mod_proxy port'i omale sobivaks. Antud juhul kasutame port'i **8000** - see on default, teisel juhul tuleb port määrata gunicorn'i käivitades optioniga `gunicorn --bind 0.0.0.0:8000`
110 |
111 | Paigalda gunicorn
112 |
113 | ```
114 | pip install gunicorn
115 | ```
116 |
117 | **NB!** gunicorn tuleb paigaldada samaaegselt aktiveeritud virtenvis, siis see hoolitseb viimase aktiveerimise eest ise, kui seadistame **Pm2** teenust.
118 |
119 | Ning käivita see
120 | ```sh
121 | cd miljonivaade
122 | gunicorn miljonivaade.wsgi:application
123 | ```
124 |
125 | Kui nüüd brauseris külastada `https://django.miljonivaade.eu`, siis peaks seal kuvama veateaded, et antud host ei ole ALLOWED_HOSTS listis. See tähendab, et gunicorn töötab, aga vaja veel veidike seadistada Django rakendust
126 |
127 | Lisa domeen ALLOWED_HOSTS list'i, ehk muuda fail `miljonivaade/miljonivaade/settings.py` umbes rea 28 ümber järgmiseks:
128 |
129 | ```py
130 | ALLOWED_HOSTS = [
131 | 'django.miljonivaade.eu'
132 | ]
133 | ```
134 |
135 | Kui nüüd käivitada gunicorn uuesti, siis peaks brauser juba kuvama kenamat lehte teatega **The install worked successfully! Congratulations!**
136 |
137 | Selleks, et server töötaks täisväärtuslikult, seadista gunicorn serveerima ka staatilisi faile. Muuda `miljonivaade/miljonivaade/urls.py` faili nii, et see näeks välja umbes järgmine:
138 |
139 | ```py
140 | from django.contrib import admin
141 | from django.urls import path
142 |
143 | from django.contrib.staticfiles.urls import staticfiles_urlpatterns # lisatud rida
144 |
145 | urlpatterns = [
146 | path('admin/', admin.site.urls),
147 | ]
148 |
149 | urlpatterns += staticfiles_urlpatterns() # lisatud rida
150 | ```
151 |
152 | Kui nüüd rakendust käivitada, siis brauser annab esilehel küll veateate, aga path'ile **/admin** minnes on pilt ilusam.
153 |
154 | ### 4.2 Pm2 teenus
155 |
156 | Et kindel olla rakenduse toimivuses pärast serveri taaskäivitamist ja/või mõne muu probleemi tekkimist, pead seadistama Pm2 teenuse.
157 |
158 | Loo fail `miljonivaade/django.config.js` (faili nimi peab olema config.js laiendiga)
159 |
160 | ```js
161 | module.exports = {
162 | apps : [{
163 | name : "django",
164 | cwd : process.env.HOME + "/domeenid/www.django.miljonivaade.eu/miljonivaade",
165 | script : process.env.HOME + "/.venv/django-dev/bin/gunicorn",
166 | args: "miljonivaade.wsgi:application",
167 | interpreter: process.env.HOME + "/.venv/django-dev/bin/python3.8",
168 | max_memory_restart : "128M"
169 | }]
170 | }
171 | ```
172 |
173 | Järgmiseks tuleb see seadistada Minu Zone's
174 |
175 | `virtuaalserveri haldus` -> `Veebiserver` -> `PM2 protsessid (Node.js)`
176 | Vajuta nuppu **Lisa uus Node.js rakendus**
177 |
178 | | Väli | Kirjeldus |
179 | | --- | --- |
180 | | **nimi** | django |
181 | | **skript või PM2 .JSON** | /domeenid/www.django.miljonivaade.eu/miljonivaade/django.config.js |
182 |
183 | Maksimaalse mälukasutuse võib jätta määramata. Vajuta nuppu **Lisa** ning mõne minuti jooksul peaks rakendus tööle hakkama. Kontrollida saad seda serveris käsuga `pm2 list`
184 |
185 | ## 5. Rakenduse arendamine
186 |
187 | Django rakendust arendades on kood laetud mällu ning muutused ei kajastu kohe, selleks peab käsurealt taaslaadima rakenduse `--watch` parameetriga. Sel juhul jälgib Pm2 muudetavaid faile ning laeb vajadusel rakenduse uuesti.
188 |
189 | ```sh
190 | pm2 start django --watch
191 | ```
192 |
193 | Ning kui muudatused tehtud, siis lülita see välja
194 | ```sh
195 | pm2 start django
196 | ```
--------------------------------------------------------------------------------
/scripts/generate_ssh_configs.php:
--------------------------------------------------------------------------------
1 | 'apikeyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
5 | ];
6 |
7 | // directories used as SSH FS mountpoints are created here
8 | $sshFsMount = getenv( 'HOME' ) . '/sshfs';
9 |
10 | // template for .ssh/config entries
11 | $sshConfigTemplate = '
12 | Host {{HOST}}
13 | HostName {{HOST}}
14 | ForwardAgent yes
15 | User {{USER}}
16 | ';
17 |
18 | $sshFsAliasTemplate = '
19 | alias mount_{{HOST}}="mkdir -p {{MOUNT}}/{{HOST}} && sshfs -o follow_symlinks -o volname={{HOST}} {{USER}}@{{HOST}}: {{MOUNT}}/{{HOST}}"
20 | ';
21 |
22 | $sshFsFunctionTemplate = '
23 | mount_{{HOST_SAFE}} () {
24 | mkdir -p {{MOUNT}}/{{HOST}}
25 | sshfs -o follow_symlinks {{USER}}@{{HOST}}: {{MOUNT}}/{{HOST}}
26 | }
27 | ';
28 |
29 | foreach ( $zoneApiKeys as $userName => $apiKey ) {
30 |
31 | $ch = curl_init();
32 | curl_setopt( $ch, CURLOPT_URL, 'https://api.zone.eu/v2/vserver' );
33 | curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
34 | curl_setopt( $ch, CURLOPT_USERPWD, $userName . ":" . $apiKey );
35 | $headers = [];
36 | $headers[] = "Content-Type: application/json";
37 | curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
38 | $result = curl_exec( $ch );
39 | curl_close( $ch );
40 |
41 | $vservers = json_decode( $result, true );
42 |
43 | $sshConfig = '';
44 | $sshFsFunctions = '';
45 | $sshFsAliases = '';
46 |
47 | foreach ( $vservers as $vserver ) {
48 | $sshConfig .= template_replace( $sshConfigTemplate, $vserver );
49 | $sshFsFunctions .= template_replace( $sshFsFunctionTemplate, $vserver );
50 | $sshFsAliases .= template_replace( $sshFsAliasTemplate, $vserver );
51 | }
52 |
53 | // generate ssh config - can be included into main .ssh/config:
54 | //
55 | file_put_contents( getenv( 'HOME' ) . '/.ssh/' . $userName . '.config', $sshConfig );
56 |
57 | // generate sshfs aliases - can be sourced into .bash_profile:
58 | // for f in ~/*.alias; do source "$f"; done
59 | // alias umount_sshfs="for f in ~/sshfs/*; do umount \"$f\"; done"
60 | file_put_contents( getenv( 'HOME' ) . '/' . $userName . '.alias', $sshFsAliases );
61 |
62 | // generate sshfs mount functions (good for cron and other cases where aliases don't work)
63 | // $sshMountsFile = getenv( 'HOME' ) . '/' . $userName . '_mounts.sh';
64 | // file_put_contents( $sshMountsFile, $sshFsFunctions );
65 | // chmod( $sshMountsFile, 0744 );
66 |
67 | }
68 |
69 | echo 'All done!
70 | Include generated configs by adding to your ~/.ssh/config:
71 |
72 | Include *.config
73 |
74 | To include generated aliases and allow autocomplete for ssh add to your .bash_profile:
75 |
76 | # aliases generated from Zone API
77 | for f in ~/*.alias; do source "$f"; done
78 | alias umount_sshfs=\'for f in ~/sshfs/*; do umount "$f"; done\'
79 |
80 | # *.config files generated from Zone API
81 | complete -W "$(echo `cat ~/.ssh/config ~/.ssh/*.config | grep -E \'^Host\' | cut -d" " -f2- | tr " " "\n" | grep -v "*" | sort | uniq`;)" ssh
82 |
83 | ';
84 |
85 |
86 |
87 | function template_replace( $template, $vserver ) {
88 |
89 | global $sshFsMount;
90 |
91 | $tags = [
92 | '{{HOST}}' => $vserver['name'],
93 | '{{HOST_SAFE}}' => str_replace( '.', '_', $vserver['name'] ),
94 | '{{USER}}' => $vserver['group'],
95 | '{{MOUNT}}' => $sshFsMount,
96 | ];
97 |
98 | foreach ( $tags as $tag => $value ) {
99 | $template = str_replace( $tag, $value, $template );
100 | }
101 |
102 | return $template;
103 | }
--------------------------------------------------------------------------------
/scripts/mongo-magic/.mongo-magic.sh:
--------------------------------------------------------------------------------
1 | #! /usr/bin/bash
2 |
3 | # Install MongoDB on Zone.eu servers automatically.
4 | #
5 | # Usage:
6 | # 1. Copy the script (.mongo-magic.sh) into your HOME directory (e.g., /data01/virt12345/).
7 | # 2. Run the script from the terminal using: "bash .mongo-magic.sh".
8 | #
9 | # Download Instructions:
10 | # You can download this script directly from GitHub using:
11 | # - wget: wget https://raw.githubusercontent.com/raidokulla/mongo-magic/master/.mongo-magic.sh
12 | # - curl: curl -O https://raw.githubusercontent.com/raidokulla/mongo-magic/master/.mongo-magic.sh
13 | #
14 | # Features:
15 | # - Checks for an existing MongoDB instance and prevents conflicts.
16 | # - Offers to back up the current database before installation.
17 | # - Allows the user to choose between MongoDB versions 6.0 and 7.0.
18 | # - Lets the user select the memory allocation for MongoDB from predefined options (256M, 512M, 1G, 2G, 3G).
19 | # - Enables the user to specify a custom PM2 app name.
20 | # - Automatically checks for compatible MongoDB tools and installs them.
21 | # - Prompts for the creation of a new user with root access and an optional additional user with read/write permissions.
22 | # - Prompts the user to name the new database with limited access.
23 | # - Provides instructions for setting up MongoDB as a new PM2 app on Zone.eu servers.
24 | # - Adds the mongosh binary to the PATH for easy access.
25 | #
26 | # Author: Raido K @ Vellex Digital
27 | # GitHub: https://github.com/raidokulla
28 |
29 | # DEFINE COLORS
30 | RED="\033[0;31m"
31 | GREEN="\033[0;32m"
32 | YELLOW="\033[0;33m"
33 | RESET="\033[0m" # Reset to default color
34 |
35 | # START SCRIPT
36 | echo -e "${GREEN}Welcome to the MongoDB installation script!${RESET}"
37 | echo "This script will help you install MongoDB on your Zone.eu server."
38 | echo "Sit back and relax while we take care of everything for you."
39 | sleep 1
40 |
41 | # GET LOOPBACK IP
42 | LOOPBACK=$(vs-loopback-ip -4)
43 | MONGODB_DIR="$HOME/mongodb"
44 |
45 | # Check if MongoDB is running
46 | if pgrep -x "mongod" > /dev/null; then
47 | echo -e "${RED}MongoDB is already running!${RESET}"
48 | echo "Please stop the MongoDB service before running this script."
49 | exit 1
50 | fi
51 |
52 | # Check if a MongoDB directory exists
53 | if [ -d "$MONGODB_DIR/db" ]; then
54 | echo -e "${YELLOW}Existing MongoDB directory found.${RESET}"
55 | read -p "Do you want to back it up before overwriting? (y/n): " backup_choice
56 |
57 | if [[ "$backup_choice" == "y" ]]; then
58 | echo "Backing up existing MongoDB database..."
59 | tar -czvf "$HOME/mongodb_backup_$(date +%Y%m%d_%H%M%S).tar.gz" "$MONGODB_DIR/db"
60 | echo -e "${GREEN}Backup completed successfully.${RESET}"
61 | fi
62 |
63 | echo "Overwriting existing MongoDB database..."
64 | rm -rf "$MONGODB_DIR/db/*" # Clear existing database files
65 | fi
66 |
67 | # Ask user which MongoDB version to install
68 | echo -e "${GREEN}Select MongoDB version to install:${RESET}"
69 | echo "1) 6.0"
70 | echo "2) 7.0"
71 | read -p "Enter choice (1 or 2): " version_choice
72 |
73 | case $version_choice in
74 | 1) MONGO_VERSION="mongodb-linux-x86_64-rhel80-6.0.0.tgz";;
75 | 2) MONGO_VERSION="mongodb-linux-x86_64-rhel80-7.0.0.tgz";;
76 | *) echo -e "${RED}Invalid choice. Exiting.${RESET}"; exit 1;;
77 | esac
78 |
79 | # CREATE REQUIRED DIRS
80 | mkdir -p "$MONGODB_DIR/log" "$MONGODB_DIR/run" "$MONGODB_DIR/db"
81 |
82 | # Change to MongoDB directory
83 | cd "$MONGODB_DIR" || { echo -e "${RED}Failed to change directory!${RESET}"; exit 1; }
84 |
85 | # GET MONGODB
86 | wget "https://fastdl.mongodb.org/linux/$MONGO_VERSION" || { echo "Download failed!"; exit 1; }
87 | tar -zxvf "$MONGO_VERSION" -C "$MONGODB_DIR" # Extract directly to the MongoDB directory
88 |
89 | # Correctly identify the extracted folder
90 | if [[ $version_choice == 1 ]]; then
91 | EXTRACTED_DIR="mongodb-linux-x86_64-rhel80-6.0.0"
92 | elif [[ $version_choice == 2 ]]; then
93 | EXTRACTED_DIR="mongodb-linux-x86_64-rhel80-7.0.0"
94 | fi
95 |
96 | # Create the symlink to the extracted directory
97 | ln -s "$MONGODB_DIR/$EXTRACTED_DIR" "$MONGODB_DIR/mongodb-binary"
98 |
99 | # CREATE DIRECTORIES FOR MONGOSH AND TOOLS
100 | mkdir -p "$MONGODB_DIR/mongosh" "$MONGODB_DIR/tools"
101 |
102 | # GET MONGOSH
103 | wget https://downloads.mongodb.com/compass/mongosh-1.5.2-linux-x64.tgz -O "$MONGODB_DIR/mongosh/mongosh.tgz" || { echo "Download failed!"; exit 1; }
104 | tar -zxvf "$MONGODB_DIR/mongosh/mongosh.tgz" -C "$MONGODB_DIR/mongosh" --strip-components=1
105 | echo 'export PATH=$PATH:$MONGODB_DIR/mongosh/bin' >> "$HOME/.bash_profile"
106 | echo "Updating PATH to include mongosh..."
107 | source $HOME/.bash_profile
108 | echo -e "${GREEN}Mongosh installed successfully.${RESET}"
109 | sleep 1
110 |
111 | # CREATE MONGO.CFG
112 | echo "Creating MongoDB configuration file..."
113 | sleep 1
114 | cat > "$MONGODB_DIR/mongo.cfg" << ENDOFFILE
115 | processManagement:
116 | fork: false
117 | pidFilePath: "$MONGODB_DIR/run/mongodb-5679.pid"
118 | net:
119 | bindIp: $LOOPBACK
120 | port: 5679
121 | unixDomainSocket:
122 | enabled: false
123 | systemLog:
124 | verbosity: 0
125 | quiet: true
126 | destination: file
127 | path: "$MONGODB_DIR/log/mongodb.log"
128 | logRotate: reopen
129 | logAppend: true
130 | storage:
131 | dbPath: "$MONGODB_DIR/db/"
132 | journal:
133 | enabled: true
134 | directoryPerDB: true
135 | engine: wiredTiger
136 | wiredTiger:
137 | engineConfig:
138 | journalCompressor: snappy
139 | cacheSizeGB: 1
140 | collectionConfig:
141 | blockCompressor: snappy
142 | ENDOFFILE
143 |
144 | echo -e "${GREEN}Mongo CFG created.${RESET}"
145 | sleep 1
146 |
147 | # Ask user for memory limit
148 | echo -e "${GREEN}Select memory limit for MongoDB:${RESET}"
149 | echo "1) 256M"
150 | echo "2) 512M"
151 | echo "3) 1G"
152 | echo "4) 2G"
153 | echo "5) 3G"
154 | read -p "Enter choice (1-5): " memory_choice
155 |
156 | case $memory_choice in
157 | 1) MEMORY="256M";;
158 | 2) MEMORY="512M";;
159 | 3) MEMORY="1G";;
160 | 4) MEMORY="2G";;
161 | 5) MEMORY="3G";;
162 | *) echo -e "${RED}Invalid choice. Exiting.${RESET}"; exit 1;;
163 | esac
164 |
165 | # Ask user for PM2 app name
166 | read -p "Enter a name for the PM2 app:" pm2_app_name
167 |
168 | # CREATE JSON FOR PM2
169 | echo "Creating MongoDB PM2 JSON..."
170 | sleep 1
171 | cat > "$MONGODB_DIR/${pm2_app_name}.pm2.json" << ENDOFFILE
172 | {
173 | "apps": [{
174 | "name": "$pm2_app_name",
175 | "script": "$MONGODB_DIR/mongodb-binary/bin/mongod",
176 | "args": "--config $MONGODB_DIR/mongo.cfg --auth",
177 | "cwd": "$MONGODB_DIR",
178 | "max_memory_restart": "$MEMORY"
179 | }]
180 | }
181 | ENDOFFILE
182 |
183 | echo -e "${GREEN}MongoDB PM2 JSON created.${RESET}"
184 | sleep 1
185 |
186 | # START MONGODB FIRST TIME
187 | echo "Starting MongoDB..."
188 | sleep 1
189 | pm2 start "$MONGODB_DIR/${pm2_app_name}.pm2.json" || { echo -e "${RED}Failed to start MongoDB!${RESET}"; exit 1; }
190 |
191 | # WAIT FOR MONGODB TO START
192 | echo "Checking if MongoDB is running..."
193 | max_attempts=30 # Maximum number of attempts
194 | attempt=0
195 |
196 | while ! pgrep -x mongod > /dev/null; do
197 | if [ "$attempt" -ge "$max_attempts" ]; then
198 | echo -e "${RED}MongoDB did not start in time. Exiting.${RESET}"
199 | exit 1
200 | fi
201 | sleep 1 # Wait for 1 second before checking again
202 | attempt=$((attempt + 1))
203 | done
204 |
205 | echo -e "${GREEN}MongoDB is up and running.${RESET}"
206 | sleep 1
207 |
208 | echo "Checking if mongosh is installed..."
209 |
210 | # CHECK IF MONGOSH IS INSTALLED
211 | if ! command -v mongosh &> /dev/null; then
212 | echo -e "${RED}Mongosh is not installed or path not added. Please install it manually.${RESET}"
213 | exit 1
214 | fi
215 |
216 | # CREATE ADMIN DB USER
217 | echo -e "${GREEN}Creating new root user in ADMIN database.${RESET}"
218 | read -p "Enter new ROOT username: " username
219 | read -sp "Enter new ROOT password: " password
220 | echo
221 |
222 | # Create the root user using mongosh
223 | mongosh $USER.loopback.zonevs.eu:5679/admin --eval "db.createUser({
224 | user: \"$username\",
225 | pwd: \"$password\",
226 | roles: [{ role: \"root\", db: \"admin\" }]
227 | })"
228 |
229 | # WARNING ABOUT CREATING A NEW USER
230 | echo -e "${YELLOW}WARNING: It is recommended to create a new user with read/write permissions.${RESET}"
231 | read -p "Do you want to create a new user with limited permissions? (y/n): " create_user
232 |
233 | if [[ "$create_user" == "y" ]]; then
234 | read -p "Enter new USERNAME for LIMITED access: " new_username
235 | read -sp "Enter new PASSWORD for LIMITED access: " new_password
236 | echo
237 | read -p "Enter the name of the DATABASE for the LIMITED user: " db_name
238 | echo
239 |
240 | # Create the new user with limited access using the root user's credentials
241 | mongosh --username "$username" --password "$password" $USER.loopback.zonevs.eu:5679/admin --eval "db.createUser({
242 | user: \"$new_username\",
243 | pwd: \"$new_password\",
244 | roles: [{ role: \"readWrite\", db: \"$db_name\" }]
245 | })"
246 | echo -e "${GREEN}New user created in $db_name with read/write permissions.${RESET}"
247 | sleep 1
248 | fi
249 |
250 | # DO NEXT COMMENTS
251 | echo -e "${GREEN}MongoDB installation completed successfully.${RESET}"
252 | sleep 1
253 | echo -e "${YELLOW}IMPORTANT: Setup MongoDB as new PM2 app at Zone.eu${RESET}"
254 | echo "Webhosting -> PM2 and Node.js -> Add new application"
255 | echo "Path for the app: $MONGODB_DIR/${pm2_app_name}.pm2.json"
256 | echo "App name: $pm2_app_name"
257 | echo "Memory limit: $MEMORY"
258 | echo "Start the app and check the logs for any errors."
259 |
260 | # CLOSE MONGO USING PM2
261 | echo "Shutting down MongoDB using PM2..."
262 | pm2 stop "$pm2_app_name" || { echo "Failed to stop MongoDB!"; exit 1; }
263 | echo "Deleting MongoDB PM2 app..."
264 | pm2 delete "$pm2_app_name" || { echo "Failed to delete MongoDB!"; exit 1; }
265 | echo -e "${GREEN}All done. Exiting script.${RESET}"
266 |
--------------------------------------------------------------------------------
/scripts/mongo-magic/README.md:
--------------------------------------------------------------------------------
1 | # Mongo Magic
2 |
3 | ## Overview
4 | Mongo Magic is a bash script designed to automate the installation and setup of MongoDB on Zone.eu servers. The script provides various options for configuration, ensuring a smooth installation process tailored to your needs.
5 |
6 | ## Features
7 | - Checks for existing MongoDB instances to prevent conflicts.
8 | - Offers to back up the current database before installation.
9 | - Allows selection between MongoDB versions 6.0 and 7.0.
10 | - Lets you choose the memory allocation for MongoDB from predefined options (256M, 512M, 1G, 2G, 3G).
11 | - Enables specification of a custom PM2 app name.
12 | - Automatically checks for and installs compatible MongoDB tools.
13 | - Prompts for the creation of a new user with root access and an optional additional user with read/write permissions.
14 | - Prompts the user to name the new database with limited access.
15 | - Provides instructions for setting up MongoDB as a new PM2 app on Zone.eu servers.
16 | - Adds the mongosh binary to the PATH for easy access.
17 |
18 | ## Installation
19 |
20 | ### Download the Script
21 | You can download the script directly from GitHub using:
22 |
23 | - Using `wget`:
24 | ```bash
25 | wget https://raw.githubusercontent.com/raidokulla/mongo-magic/master/.mongo-magic.sh
26 | ```
27 |
28 | - Using `curl`:
29 | ```bash
30 | curl -O https://raw.githubusercontent.com/raidokulla/mongo-magic/master/.mongo-magic.sh
31 | ```
32 |
33 | ### Run the Script
34 | 1. Copy the script to your HOME directory (e.g., `/data01/virt12345/`).
35 | 2. Run the script from the terminal:
36 | ```bash
37 | bash .mongo-magic.sh
38 | ```
39 |
40 | ## Author
41 | Raido K @ Vellex Digital
42 | [GitHub Repository](https://github.com/raidokulla/mongo-magic)
43 |
44 | ## License
45 | This project is open-source and available under the [MIT License](LICENSE).
--------------------------------------------------------------------------------
/scripts/php-shims.inc:
--------------------------------------------------------------------------------
1 | = 50600 ) {
18 |
19 | // re-introduce deprecated variables
20 |
21 | $HTTP_POST_VARS = &$_POST;
22 | $HTTP_GET_VARS = &$_GET;
23 | $HTTP_COOKIE_VARS = &$_COOKIE;
24 |
25 | $HTTP_SERVER_VARS = &$_SERVER;
26 | $HTTP_POST_FILES = &$_FILES;
27 | $HTTP_SESSION_VARS = &$_SESSION;
28 | $HTTP_ENV_VARS = &$_ENV;
29 |
30 | // register globals - Matt Kukowski http://docs.php.net/manual/da/security.globals.php#113106
31 | // if you need to implement register_globals() function see http://docs.php.net/manual/da/security.globals.php#82213
32 |
33 | if ( ! isset( $PXM_REG_GLOB ) ) {
34 |
35 | $PXM_REG_GLOB = 1;
36 |
37 | if ( ! ini_get( 'register_globals' ) ) {
38 | foreach ( array_merge( $_GET, $_POST ) as $key => $val ) {
39 | global $$key;
40 | $$key = ( get_magic_quotes_gpc() ) ? $val : addslashes( $val );
41 | }
42 | }
43 | if ( ! get_magic_quotes_gpc() ) {
44 | foreach ( $_POST as $key => $val ) {
45 | $_POST[ $key ] = addslashes( $val );
46 | }
47 | foreach ( $_GET as $key => $val ) {
48 | $_GET[ $key ] = addslashes( $val );
49 | }
50 | }
51 | }
52 |
53 | // replace removed session functions - partially from https://stackoverflow.com/questions/3682615/how-to-fix-the-session-register-deprecated-issue/59504007#59504007
54 | // (there's more magic there, but it requires runkit.so)
55 |
56 | if ( ! function_exists( 'session_register' ) ) {
57 | function session_register() {
58 | $register_vars = func_get_args();
59 | foreach ( $register_vars as $var_name ) {
60 | $_SESSION[ $var_name ] = $GLOBALS[ $var_name ];
61 | if ( ! ini_get( 'register_globals' ) ) {
62 | $GLOBALS[ $var_name ] = &$_SESSION[ $var_name ];
63 | }
64 | }
65 | }
66 |
67 | function session_is_registered( $var_name ) {
68 | return isset( $_SESSION[ $var_name ] );
69 | }
70 |
71 | function session_unregister( $var_name ) {
72 | unset( $_SESSION[ $var_name ] );
73 | }
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/scripts/phpcs_nosymlinks.phar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zone-eu/zone-docs/13d9149f66dc5e293bb8e5c9ceace220e2e1d480/scripts/phpcs_nosymlinks.phar
--------------------------------------------------------------------------------
/scripts/sniffex:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # for debug output, uncomment:
3 | #set -x
4 |
5 | function help() {
6 |
7 | # yes, sniffex is named after the famous Sniffex scam https://sniffexquestions.blogspot.com/ (a bit like Xenu's Link Sleuth)
8 | echo "PHP code check for PHP 5.6 compatibility using PHP_CodeSniffer and PHPCompatibility -v 0.2 2020-04-29 / peeter@zone.ee
9 |
10 | Usage:
11 |
12 | sniffex command [./path]
13 |
14 | init install PHP_CodeSniffer and PHPCompatibility to ~/bin
15 | cleanup remove installed components from ~/bin
16 | snuff check the provided path
17 | "
18 | }
19 |
20 | function init() {
21 | mkdir -p ~/bin
22 |
23 | wget https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar
24 | mv -f phpcs.phar ~/bin/phpcs
25 | chmod +x ~/bin/phpcs
26 | chmod +x ~/bin/phpcs
27 |
28 | # wget https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar
29 | # mv -f phpcbf.phar ~/bin/phpcbf
30 | # chmod +x ~/bin/phpcbf
31 |
32 | git clone https://github.com/PHPCompatibility/PHPCompatibility.git ~/bin/PHPCompatibility
33 | git clone https://github.com/PHPCSStandards/PHPCSUtils.git ~/bin/PHPCSUtils
34 |
35 | wget https://raw.githubusercontent.com/zone-eu/zone-docs/master/scripts/sniffex-phpcs56minimal.xml -O ~/bin/sniffex-phpcs56minimal.xml
36 |
37 | phpcs --config-set installed_paths "$HOME/bin/PHPCompatibility,$HOME/bin/PHPCSUtils"
38 | phpcs --config-set default_standard "$HOME/bin/sniffex-phpcs56minimal.xml"
39 | phpcs --config-set colors 1
40 | }
41 |
42 | function cleanup() {
43 | rm -f ~/bin/phpcs
44 | # rm -f ~/bin/phpcbf
45 | rm -f ~/bin/CodeSniffer.conf
46 |
47 | rm -rf ~/bin/PHPCompatibility
48 | rm -rf ~/bin/PHPCSUtils
49 | rm -f ~/bin/sniffex
50 | rm -f ~/bin/sniffex-phpcs56minimal.xml
51 | }
52 |
53 | function snuff() {
54 |
55 | if [ -z "$1" ]; then
56 | echo "Please provide path"
57 | exit 1
58 | fi
59 |
60 | echo "Starting scan of $1"
61 | # phpcs -pn --extensions=php,inc --ignore=*/cache/*,*/uploads/*,*/zoneplus_backups/*,*/sniff-examples/*,*/old*,*/new* --exclude=PHPCompatibility.FunctionUse.NewFunctions,PHPCompatibility.Classes.NewClasses,PHPCompatibility.IniDirectives.RemovedIniDirectives,PHPCompatibility.Constants.NewConstants --runtime-set testVersion 5.6 --report-full=sniffex_full.txt --report-json=sniffex_full.json --report-source=sniffex_source.txt --report-code=sniffex_code.txt "$1"
62 | # moved settings to ruleset (that has been configured as default)
63 | phpcs --report-full=sniffex_full.txt --report-json=sniffex_full.json --report-source=sniffex_summary.txt --report-code=sniffex_code.txt "$1"
64 | }
65 |
66 | if [ $# -eq 0 ]; then
67 | help
68 | exit 1
69 | fi
70 |
71 | $1 "$2"
72 |
--------------------------------------------------------------------------------
/scripts/sniffex-phpcs56minimal.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Subset of PHPCompatibility for PHP 5.6 or greater compatibility checks
4 |
5 |
6 |
7 |
8 |
9 |
10 | */cache/*
11 | */log/*
12 | */logs/*
13 | */tmp/*
14 | */uploads/*
15 | */zoneplus_backups/*
16 | */sniff-examples/*
17 | */old/*
18 | */new/*
19 | */vana/*
20 | */uus/*
21 | */backup/*
22 | */dev/*
23 | */src/test/*
24 |
25 |
26 | */adminer*
27 | */_samples/*
28 | */var-dumper/Tests/*
29 | */model/aws/lib/*
30 | */connectors/lasso/*
31 | */phpmailer/test/*
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 | */fckeditor*\.php
71 | */phpcompat\.php
72 | */*phpmailer\.php
73 |
74 |
75 |
--------------------------------------------------------------------------------
/scripts/sniffex_nosymlinks:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # for debug output, uncomment:
3 | #set -x
4 |
5 | function help() {
6 |
7 | # yes, sniffex is named after the famous Sniffex scam https://sniffexquestions.blogspot.com/ (a bit like Xenu's Link Sleuth)
8 | echo "PHP code check for PHP 5.6 compatibility using PHP_CodeSniffer and PHPCompatibility -v 0.2 2020-04-29 / peeter@zone.ee
9 |
10 | Usage:
11 |
12 | sniffex command [./path]
13 |
14 | init install PHP_CodeSniffer and PHPCompatibility to ~/bin
15 | cleanup remove installed components from ~/bin
16 | snuff check the provided path
17 | "
18 | }
19 |
20 | function init() {
21 | mkdir -p ~/bin
22 |
23 | #wget https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar
24 | wget https://raw.githubusercontent.com/petskratt/zone-docs/master/scripts/phpcs_nosymlinks.phar -O phpcs.phar
25 |
26 | mv -f phpcs.phar ~/bin/phpcs
27 | chmod +x ~/bin/phpcs
28 | chmod +x ~/bin/phpcs
29 |
30 | # wget https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar
31 | # mv -f phpcbf.phar ~/bin/phpcbf
32 | # chmod +x ~/bin/phpcbf
33 |
34 | git clone https://github.com/PHPCompatibility/PHPCompatibility.git ~/bin/PHPCompatibility
35 | git clone https://github.com/PHPCSStandards/PHPCSUtils.git ~/bin/PHPCSUtils
36 |
37 | wget https://raw.githubusercontent.com/petskratt/zone-docs/master/scripts/sniffex-phpcs56minimal.xml -O ~/bin/sniffex-phpcs56minimal.xml
38 |
39 | phpcs --config-set installed_paths "$HOME/bin/PHPCompatibility,$HOME/bin/PHPCSUtils"
40 | phpcs --config-set default_standard "$HOME/bin/sniffex-phpcs56minimal.xml"
41 | phpcs --config-set colors 1
42 | }
43 |
44 | function cleanup() {
45 | rm -f ~/bin/phpcs
46 | # rm -f ~/bin/phpcbf
47 | rm -f ~/bin/CodeSniffer.conf
48 |
49 | rm -rf ~/bin/PHPCompatibility
50 | rm -rf ~/bin/PHPCSUtils
51 | rm -f ~/bin/sniffex
52 | rm -f ~/bin/sniffex-phpcs56minimal.xml
53 | }
54 |
55 | function snuff() {
56 |
57 | if [ -z "$1" ]; then
58 | echo "Please provide path"
59 | exit 1
60 | fi
61 |
62 | echo "Starting scan of $1"
63 | # phpcs -pn --extensions=php,inc --ignore=*/cache/*,*/uploads/*,*/zoneplus_backups/*,*/sniff-examples/*,*/old*,*/new* --exclude=PHPCompatibility.FunctionUse.NewFunctions,PHPCompatibility.Classes.NewClasses,PHPCompatibility.IniDirectives.RemovedIniDirectives,PHPCompatibility.Constants.NewConstants --runtime-set testVersion 5.6 --report-full=sniffex_full.txt --report-json=sniffex_full.json --report-source=sniffex_source.txt --report-code=sniffex_code.txt "$1"
64 | # moved settings to ruleset (that has been configured as default)
65 | phpcs --report-full=sniffex_full.txt --report-json=sniffex_full.json --report-source=sniffex_summary.txt --report-code=sniffex_code.txt "$1"
66 | }
67 |
68 | if [ $# -eq 0 ]; then
69 | help
70 | exit 1
71 | fi
72 |
73 | $1 "$2"
74 |
--------------------------------------------------------------------------------
/scripts/spectx/!_detail.sx:
--------------------------------------------------------------------------------
1 | // Template for just a nice log view with some filters
2 | // peeter@zone.ee 2020-05-14
3 |
4 | @src = PARSE(pattern:$[/user/patterns/zone_accesslog_server.sxp],
5 | src:'file://spectx/example/*');
6 |
7 | $start = T('2020-05-04 00:00:00');
8 | $end = $start[+24 hour];
9 |
10 | @src
11 | // .filter( timestamp > $start AND timestamp < $end )
12 | |filter(
13 | reqid IS NOT null
14 | // AND time > 1
15 | // AND uri contains('cron')
16 | // AND response = 500
17 | // AND (agent contains('yandex') OR agent contains('semrush') OR agent contains('ahrefs') OR cc(IPADDR(host)) = 'CN' OR ASN(IPADDR(host)) = 136907)
18 | // OR true
19 | )
20 | |select(
21 | timestamp, TIME_TO_STR(timestamp + time * 1000, 'HH:mm:ss.SSS') as endtime, time, verb, vhost, uri, ip, cc(ip), asname(ip), response, bytes, agent, referrer
22 | )
23 | |sort(timestamp)
24 | ;
--------------------------------------------------------------------------------
/scripts/spectx/!_ip-count.sx:
--------------------------------------------------------------------------------
1 | // Template for IP counting in Apache access logs
2 | // peeter@zone.ee 2020-05-14
3 |
4 | @src = PARSE(pattern:$[/user/patterns/zone_accesslog_server.sxp],
5 | src:'file://spectx/example/*');
6 |
7 | $start = T('2020-05-04 00:00:00');
8 | $end = $start[+24 hour];
9 |
10 | @src
11 | // .filter( timestamp > $start AND timestamp < $end )
12 | .select(
13 | timestamp[1 min] as period,
14 | ip
15 | )
16 | .group(period, ip)
17 | .select(period, count(*) as cnt)
18 | .group(period)
19 | ;
--------------------------------------------------------------------------------
/scripts/spectx/!_summary.sx:
--------------------------------------------------------------------------------
1 | // Template for summarizing PHP performance in Apache access logs
2 | // peeter@zone.ee 2020-05-14
3 |
4 | @src = PARSE(pattern:$[/user/patterns/zone_accesslog_server.sxp],
5 | src:'file://spectx/example/*');
6 |
7 | $start = T('2020-05-04 00:00:00');
8 | $end = $start[+24 hour];
9 |
10 | @src
11 | //|filter( timestamp > $start AND timestamp < $end )
12 | |select(
13 | timestamp[1 min] as period,
14 | round(avg(time)*100)/100 as avg,
15 | count(time >= 1) as long,
16 | count(time < 1) as short,
17 | count(reqid is NOT null) as PHP,
18 | round(sum(time)) as total_time,
19 | // sum(bytes)/10000 as total_transfer,
20 | count(reqid is null) as static,
21 |
22 | // misc bots
23 | count(reqid is NOT null AND (agent contains('yandex') OR agent contains('semrush') OR agent contains('ahrefs') OR cc(ip) = 'CN' or ASN(ip) = 136907)) as bots,
24 |
25 | // misc response codes
26 | // count(response != 200 AND response <500) as not200
27 | // count(response = 200) as success,
28 | // count(response >= 300 AND response < 400) as redirect,
29 | // count(response >= 400 AND response < 500) as err40x,
30 | count( response >= 500 ) as err50x
31 |
32 | // uri-based
33 | // count(uri = '/assets/styles/calendar_multiday.css') as assets,
34 |
35 | // single vhost from logfile
36 | // sum( if( vhost not contains('example.com'), bytes, long(0)) )/10000 as other_transfer,
37 | // sum( if( vhost not contains('example.com'), time, float(0)) ) as other_time,
38 | // count( vhost contains('example.com') AND reqid is NOT null) as vhost_requests,
39 | // sum( if( vhost contains('example.com'), bytes, long(0)) )/10000 as vhost_transfer,
40 | // sum( if( vhost contains('example.com'), time, float(0)) ) as vhost_time,
41 | )
42 | |group(period)
43 | ;
--------------------------------------------------------------------------------
/scripts/spectx/!_tor.sx:
--------------------------------------------------------------------------------
1 | // Template to find usage from TOR exit nodes
2 | // peeter@zone.ee 2020-05-14
3 |
4 | @stream = PARSE(pattern:$[/user/zone_accesslog_universal.sxp],
5 | src:'file://spectx/example/*');
6 |
7 | $torpattern = <<>(' [' HTTPDATE)))
5 | ' ' '[' HTTPDATE:timestamp ']'
6 | ' ' (('\"' [A-Z-_]+:verb ' ' LD{0,8192}:uri (' HTTP/' FLOAT:httpversion '\"')?) | DQS{0,8192}:invalidRequest)
7 | ' ' (INTEGER:response | '-')
8 | ' ' (LONG:bytes | '-')
9 | (' ' DQS{0,8192}:referrer (' ' DQS{0,8192}:agent)?)?
10 | ' ('
11 | ('-' | LD:reqid)
12 | (',' LD)?
13 | '-'
14 | ('-' | FLOAT:time)
15 | (',' FLOAT)?
16 | ')'
17 | EOL
--------------------------------------------------------------------------------