Hledám Webhosting pro Nette projekty

Jakub Bouček
Člen | 54
+
+3
-

Hledám webhosting (nejen) pro Nette projekty, budu rád za vaše zkušenosti a postřehy.

Občas pomáhám malým neziskovkám a jednotlivcům s nekomerčním projektem. Nechci ho spravovat, tedy nechci ho mít na svém VPS, ale někde jej zprovoznit a čau. Takhle jsem rozjel několik projektů na Wedosu, ale jsou to propálené hodiny s velmi špatnou zkušeností, zejména v cílové rovince, kdy se ladí detaily.

Pokusím se shrnout svoje potřeby:

  • Cena hostingu je citlivé téma – klient nechce platit několikanásobek ze něco, co nevyužije (zpravidla nerozumí popisovaným výhodám).
  • Wedos hosting v Čechách kurví trh. Nabízí velmi velmi levnou službu, která už je dost známá a rozšířená – prosadit klientovi webhosting za > 60 Kč/měs. je téměř nemožné. Za dobrou službu ale rád přesvědčím klienta k 1000 Kč/rok.
  • Webhosting by měl být v ČR a provozovaný českou společností – jednak je cílovka zpravidla výhradně česká a je jednodušší vyjednat zpracovatelskou smlouvu (GDPR) v českém jazyce.
  • Úhrada fakturou a bankovním převodem – pro některé klienty je nemyslitelné někam dávat číslo karty.
  • Platba předem a paušálně – zaplatit na rok a mít klid.
  • Nenáročné projekty – projekty mají malou návštěvnost. Není problémem výkon, ale spíš dostupnost kvalitných mechanismů.
  • 1 webohosting na 1 web – nehledám multihostingy nebo VPS. Cílím dotaz na projekty, které pomáhám rozjet, ale pak je předám klientovi se vším všudy. Tak aby jakýkoliv v budoucnu vzniklý problém nešel za mnou.

Technicky:

  • Aktuální PHP, MySQL,
  • HTTPS přes Let's Encrypt,
  • nastavitelná DocumentRoot pro každý VirtualHost – MUST HAVE viz níže,
  • Dostupnost moderní výbavy výhodou (HTTP/2 např.),
  • Bezpečnost obecně – aby hosting prosazoval zabezpečené metody by-design (např. Active 24 ani neumožňuje používání nezabezpečených SMTP, POP3)
  • .htaccess,
  • Rewrite modul,
  • přiměřeně rozumná administrace,
  • FTP (nebo SFTP) – ano, SSH nestačí, potřebuji, aby si klient mohl aplikaci řešit beze mě, tady se CI neužije.
  • Přístupné logy

Proč chci nastavitelná DocumentRoot?
To je asi moje největší nespokojenost na většině malých webhostingů, kteří mají DocumentRoot pevně umístěný a vývojář pak aplikaci ohýbá pomocí RewriteRule.
To je ale udržitelné jen v malém rozsahu. Stačí, aby se pak na jednom projektu namíchalo několik aplikací najednou (Nette aplikace, Blog ve Wordpressu, do toho třeba nějaké subdomény), do toho je potřeba mít určitá pravidla (kvůli canonicalizaci URL, přesměrování na HTTPS, směrování provozu do /www/ při současném vyloučení zdvojení /www/ v URL) a pravidla .htaccess se navzájem začnou ovlivňovat a dochází k podivným chybám. RewriteRule se navíc nedají téměř debugovat.
Přitom ale mnoho pravidel existuje úplně zbytečně, stačí, aby se v administraci pro VirtualHost nastavil DocumentRoot a kód se rapidně pročistí.

Bezpečnostní faktor nastavitelného DocumentRoot
Důvod, proč moderní frameworky požadují posunutí public adresáře do nějaké množené složky je bezpečnost. Tím, že se browser nemůže by design dostat do interních adresářů aplikace jsou tyto velmi účinně chráněny před nežádoucím přístupem. Za(s)lepování takového přístupu jen a pouze pomocí .htaccess vnímám jako určité riziko – když totiž soubor zmizí, nebo se poškodí, stane se aplikace zranitelná. Obecně z principu nemám důvěru v takto relizované bezpečnostní mechanismy, kdy se sníží bezpečnost soustavy pouhým odebráním některého souboru.

Řešil jste toto někdo stejně jako já a máte doporučení na WebHosting?

Editoval Jakub Bouček (2. 3. 2019 1:44)

Václav Pávek
Backer | 96
+
0
-

Doporučuji https://www.coolhosting.cz/ – jsem u nich 10 let a nechystám se přecházet jinam. SSH nemají, subdomény jsou oddělené adresáři (každá subdoména má svůj, dynamický vhost). Obrovskou výhodou je možnost provozovat v každém adresáři jinou verzi PHP 5.1 – 7.3 (nastavení pomocí .htaccess). Pokud se míchá na jedné doméně více aplikací (každý má vlastní .htaccess ⇒ nutno nastavit RewriteBase).

David Grudl
Nette Core | 8082
+
0
-

Používám WebSupport. Loni mi sice přestaly jednoho dne fungovat všechny weby kvůli jejich chybě, kterou sami neuznali, ale jinak tam frčím bez problémů už pár lety a splňují vše co píšeš. Navíc velmi rychle mají nové verze PHP, teď už je tam PHP 7.3.

Platím cca 900 Kč ročně za neomezeně domén a 3GB sdíleného prostoru. Tak tahle nabídka platila před pěti lety.

hrach
Člen | 1834
+
0
-

@VáclavPávek jak je to s DB? na webu mají MySQL 5.5 a Postgre 8.4, coz jsou naprosto archaické verze :O

@DavidGrudl prosim te, jaky mas tarif, nejak se nemuzu doklikat? Nejlepvnesji The Hosting je i pri 5 domenach za 1600 bez DPH. To mas asi nejaky stary tarif, ktery uz nenabizeji, ze?

Hurass
Člen | 114
+
0
-

Vyzkoušel jsem jich hodně a nejvíce jsem spokojenej se Stable.cz. Nicméně většinu projektů jsem přesunul do AWS.

Václav Pávek
Backer | 96
+
0
-

@hrach s DB je to bídné, už jsem psal na podporu. MySQL je tam 5.6.43, PostgreSQL pro jistotu už nelze z administrace založit. Zatím jsem neměl potřebu toto řešit, díky za podmětný dotaz.

Jinak p. Martinovský je velmi ochotný a věřím, že s DB se něco udělá nebo bude možná migrace na nový server.

David Grudl
Nette Core | 8082
+
0
-

@hrach hmmm, asi přišli na to, že ta nabídka je až příliš výhodná :-)

Jakub Bouček
Člen | 54
+
+2
-

Tak jsem za posledních 48 hodin prošel velmi zajímavou cestu poznání.

CoolHosting mě vůbec neoslovil, jsou tam několik let zastaralé věci a především je to stejné jako na Wedosu, ze kterého utíkám – vše se nastavuje přes .htaccess.
Naopak Savana, kterou jsem kolem roku 2010 opustil, vypadá zajímavě. Alespoň podle slibů. Nezkoušel jsem.
Dále Active 24, její lidi jsou poměrně aktivní na konferencích, zejména těch zaměřených na bezpečnost. DocumentRoot mi umožní nastavit na požádání, přímo v adminu to neumí. Zatím asi můj favorit.

Nicméně jsem se kousnul a začal jsem analyzovat, proč jsou na Wedosu ty pravidla pro Rewrite tak zabugované. Nakonec se mi povedlo vytvořit stabilní kombinaci, která je funkční, stabilní, spolehlivá a vypadá, že i bezpečná (testoval jsem to na všechny scénáře, které v předchozí verzi byly problematické).

Došel jsem k několika poznatkům:

  • Dynamická pravidla postavená na složitých regulárech a předávání hodnot přes RewriteCond backreferences se chovají jinak, než když stejný zápis zadám přímo (místo %1 rovnou napíšu doménu domena.cz). Může to být sice pořád chyba v tom zapsaném reguláru, možná nějaké traling slashes. Nevím, ale vyhozením dynamiky zmizely největší fuckupy.

Kromě lepší funkčnosti se statická pravidla stala více transparentní. Je přesně vidět, jaké dotazy se matchnou není třeba zkoumat, jestli se „to“ do reguláru ještě vejde, nebo chybu způsobuje jiné pravidlo.

Asi největší shitstorm jsem zažíval s posunutím public adresáře do podadresáře (pro pojekt typu Nette). Návod od Wedosu několika obrovskými nedostatky:

  • Posunutím publicu do podsložky (např. /www/), došlo k tomu, že web se pak zobrazoval na několika nekanonických URL (domena.cz/ a domena.cz/www/) a nešlo s tím nic moc udělat. Navíc se na tuto chybovou adresu přesměrovávaly chybové requesty.
  • Sice se dalo napsat další pravidlo, které detekovalo tento problém a pokusilo se jej přesměrovat na správnou variantu, ale to nefungovalo, jakmile v /www/ vytvořil .htaccess s jakýmkoliv pravidlem.
  • V dynamické variantě nebylo možné dělat správné SEO canonizace. Místo jednoho přesměrování na správnou adresu, se zřetězilo několik přesměrování za sebou:

A tedy konkrétně
.htaccess umístěný v DocumentRoot webu:

RewriteEngine On

# HTTP -> HTTPS
RewriteCond %{HTTP_HOST} plzenskybarcamp\.cz$
RewriteCond %{HTTPS} !on
RewriteRule .? https://www.plzenskybarcamp.cz%{REQUEST_URI} [R=301,L]

# domain.tld -> www.domain.tld
RewriteCond %{HTTP_HOST} plzenskybarcamp\.cz$
RewriteCond %{HTTP_HOST} !^www\.plzenskybarcamp\.cz$
RewriteRule .? https://www.plzenskybarcamp.cz%{REQUEST_URI} [R=301,L]

# Rewrite to project directory
RewriteCond %{HTTP_HOST} ^www\.plzenskybarcamp\.cz$
RewriteCond %{REQUEST_URI} !^plzenskybarcamp.cz/www/
RewriteCond %{REQUEST_URI} !^/plzenskybarcamp.cz/www/
RewriteRule (.*) plzenskybarcamp.cz/www/$1 [DPI]

a pak .htaccess přímo v aplikaci (tedy v /plzenskybarcamp.cz/www/):

RewriteEngine On

# WEDOS FUCKING SUCK
# https://www.plzenskybarcamp.cz/plzenskybarcamp.cz/www/... -> https://www.plzenskybarcamp.cz/...
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} ^/plzenskybarcamp.cz/www(.*)
RewriteRule .* %1 [R=301,L,QSA,NE]

# Prevents files starting with dot to be viewed by browser
RewriteRule /\.|^\.(?!well-known/) - [F]

# Front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz|map)$ index.php [L]

Hodně mi pomohl článek od @DavidGrudl, který se sice jen lehce otře o interní procesy rewrite_modu, ale to byla přesně ta tečka, kterou jsem potřeboval, abych se pohnul z místa.

Snad to někomu pomůže. A kdybyste tam viděli nějakou úplně očividnou chybu, tak mi prosím napište.

Václav Pávek
Backer | 96
+
+1
-

@JakubBouček Wedos směruje všechny požadavky (doména, subdoména, request_uri) do jednoho adresáře kde si je musíš rozhodit tam kam potřebuješ (obdobné je to na Active24 – tedy pokud se něco nezměnilo). U Coolhosting má každá subdoména svůj adresář takže s .htaccessem pracuješ na úrovni daného adresáře.

To co jsi vytvořil se taky hodí pokud máš k jednomu hostingu aliasy a potřebuješ je rozhodit.

martv
Člen | 1
+
0
-

@hrach Dovolím si odpovědět za coolhosting, který tady doporučoval @VáclavPávek (čehož si velmi vážím, děkuji!). Web máme dost archaický, nicméně technologicky nabízíme nové hostingy na vlastní cloudové platformě (100 % SSD, 3 repliky dat, vše v ČR). Je k dispozici dynamická volba PHP od 5.1 do 7.3, MariaDB 10.2 a když tak koukám na požadavky od @JakubBouček, tak umíme vlastně všechno (Lets Encrypt, HTTP/2, …). Cena je nicméně na horní hranici 90 Kč / měsíc + DPH.

Pro více webů lze pak domluvit multihosting (což se vyplatí cca od 3 hostingů), případně plně managované cloudové servery (pro 6–7 domén a více). Vše v řádu stokorun měsíčně.

Neumíme slevové kupóny, promo akce nebo domény za nákupní ceny :-)

Václav Martinovský
coolhosting.cz

Jakub Bouček
Člen | 54
+
0
-

Václav Pávek napsal(a):

@JakubBouček Wedos směruje všechny požadavky (doména, subdoména, request_uri) do jednoho adresáře kde si je musíš rozhodit tam kam potřebuješ (obdobné je to na Active24 – tedy pokud se něco nezměnilo). U Coolhosting má každá subdoména svůj adresář takže s .htaccessem pracuješ na úrovni daného adresáře.

To není přesné. Active 24 mi umožní určit, který adresář má být DocumentRoot. To není to samé, že „každá subdoména svůj adresář“, protože u některých projektů potřebuji DocumentRoot zanořit hlouběji do podsložky – zpravidla /www/ u Nette. A na to potřebuješ minimálně pravidlo: RewriteRule (.*) /www/$1.

Třeba Nette si s tím poradí. Ale vzniknou tím vedlejší efekty, jako zdvojení aplikace na http://domena.cz/www/ a pak chybná přesměrování, když třeba Apache chce zobrazit 404 u statického obrázku.

Proto bych se opravdu moc rád vyhnul tomu, aby se přes Rewrite opravoval každý request, ale abych tím řešil už jen konkrétní požadavky aplikace, nikoliv „nežádoucí nastavení serveru“.

To co jsi vytvořil se taky hodí pokud máš k jednomu hostingu aliasy a potřebuješ je rozhodit.

Ano, příklad je ukázán na situaci, kdy může být na jednom hostingu více (sub)domén. Jak ale píšu, prakticky stejná potřeba je téměř u každé aplikace postavené na moderním frameworku.

Editoval Jakub Bouček (2. 3. 2019 1:35)

Václav Pávek
Backer | 96
+
0
-

@JakubBouček já to mám na coolhosting takto (zkrácená verze). Přesměrování na HTTPS, pravidla kolem .well-known mám v tom prvním .htaccessu.

.htaccess na úrovni adresáře www

<IfModule !mod_rewrite.c>
    Require all denied
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
#    RewriteBase /

    RewriteRule (app|log|temp|vendor) - [R=404,L]
    RewriteRule .* www/$0 [L]
</IfModule>

.htaccess v adresáři www

Require all granted

<IfModule mod_rewrite.c>
	RewriteEngine On
#   RewriteBase /

    # prevents for multiple urls / OR /www/
    RewriteCond %{THE_REQUEST} /www/
    RewriteRule .* - [R=404,L]

	# front controller
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule !\.(pdf|js|ico|gif|jpg|jpeg|png|webp|svg|css|rar|zip|7z|tar\.gz|map|eot|ttf|otf|woff|woff2)$ index.php [L]
</IfModule>

Editoval Václav Pávek (5. 3. 2019 23:15)