├── 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 | ![Gitea logo](https://blog.zone.ee/static/sites/2/2018/06/gitea.001.png) 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 | ![](https://blog.zone.ee/static/sites/2/2018/06/gitea-2-1024x862.png) 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 | ![](https://blog.zone.ee/static/sites/2/2018/06/gitea-9-1024x181.png) 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 | ![](https://blog.zone.ee/static/sites/2/2018/06/gitea-1.png) 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 | ![](https://blog.zone.ee/static/sites/2/2018/06/gitea-3-1024x748.png) 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 | ![](https://blog.zone.ee/static/sites/2/2018/06/gitea-4-1024x447.png) 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 | ![](https://blog.zone.ee/static/sites/2/2018/06/gitea-5.png) 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 | ![](https://blog.zone.ee/static/sites/2/2018/06/gitea-6.png) ![](https://blog.zone.ee/static/sites/2/2018/06/gitea-7.png) 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 | ![](https://blog.zone.ee/static/sites/2/2018/06/gitea-8-1024x354.png) 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 --------------------------------------------------------------------------------