====== Jednoduchý hostingový server ====== Rád bych popsal konfiguraci pro malý hostingový server, kterou jsem nedávno vymyslel. Apache2, Postfix, Dovecot a vsftp -- žádný LDAP, SQL nebo ISPAdmin a podobné nesmysly. Není to kompletní howto návod copy&paste, spíše nasměrování, jak se to dá řešit. ===== Uživatelé ===== Bylo potřeba mít "virtuální" domény, které bylo třeba omezovat na velikost dat. K tomuto jsem použil přirozeně diskové kvóty, které na svazku /home. Potřeboval jsem, aby se omezovala velikost na doménu za www prostor i poštu (tedy například 10 GB na www + pošta). Proto jsem mé řešení navrhl tak, že každá doména bude mít jednoho uživatele v systému. Pro každou doménu tedy vytvořím systémového uživatele (přirozeně se zablokovaným shellem). Jména uživatelů musí být ve formátu //domena.cz//. Vytvoří se zároveň domovský adresář, ve kterém pomocí ''/etc/skel'' šablony vytvořím dva přednastavené adresáře: ''mails'' a ''web''. A také jeden soubor ''hesla-posta.txt'' (vizte níže). Adresář skel může vypadat nějak takto: # ll total 20 -rw-r--r-- 1 root root 257 Jun 15 10:20 hesla-posta.txt drwxr-xr-x 2 root root 4096 Jun 12 16:13 mails drwxr-xr-x 3 root root 4096 Jun 12 16:22 web # cat hesla-posta.txt # # Soubor s hesly pro POP3/IMAP pristup ke schrankam pro tuto domenu # # Format: # uzivatel:{typ_kodu}heslo:domena:nobody:::: # # Heslo muzete zakodovat programem dovecotpw # # Priklad (nezakodovane heslo): # franta:{plain}franta123:domena.cz:nobody:::: # Adresáře mails a web jsou prázdné. V adresáři web můžete například vytvořit soubor www/index.html s nějakou uvítací stránkou pro doménu www.domena.cz (Funguje to!). Můj původní nápad byl, aby v domovském adresáři měl uživatel všechno -- tedy www stránky i poštu. Podíváme se, jestli se mi toho podařilo docílit. ===== Přístup přes FTP ===== Tím, že jsou to systémoví uživatelé, se řeší FTP přístup. Stačí nastavit vsftp, aby FTP konexe chrootoval do jejich domovských adresářů. Pokud chcete, můžete také zakázat viditelnost adresáře ''mails'', aby administrátoři domény nelezli do mailových schránek ve své doméně. Tuto vlastnost umí vsftp pomocí nějaké volby (hledejte slovo "hide" v dokumentaci). Možná by bylo vhodné adresář pojmenovat jinak, aby byl název více jedinečný a nemohlo dojít ke schování nějakého adresáře u stránek. Další možností je použít místo adresáře ''mails'' skrytý adresář ''.mails'' -- hodně FTP klientů implicitně tečkové soubory schovává. Tak jako tak, FTP přístup je hotov. Jen si dejte pozor na to, až budete něco vytvářet jako root v domovských adresářích, abyste pak nastavili vlastníka na daného uživatele -- jinak by s daným souborem nešlo přes FTP dále manipulovat. ===== Apache ===== Virtuální hosting v Apachi se nastaví triviálně. Konfigurace by mohla vypadat nějak takto: Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all # this log format can be split per-virtual-host based on the first field LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon CustomLog logs/access_log vcommon # include the server name in the filenames used to satisfy requests VirtualDocumentRoot /home/%2+/web/%1 Apache pochopitelně můžete obohatit o PHP, SSL a další moduly. Pokud chcete statistiky pro jednotlivé domény zvlášť, doporučuji AWStat. Ještě popis jak to funguje pro apache-neznalé čtenáře: abyste vytvořili doménu **www.firma.cz**, stačí nahrát do adresáře ''/home/firma.cz/web/www'' kýžené HTML soubory. Tak, tohle bychom měli, nyní ta zajímavější část. ===== Postfix ===== Nebudu se zde zabývat nastavením antiviru, antispamu a podobných věcí. To si můžete u dělat, jak je libo, ostatně i na mém blogu je pár zápisků na toto téma. Věnuji se výhradně řešení virtuálních schránek. Moje řešení je triviální -- je třeba nastavit Postfix tak, aby doručoval do adresářů formátu ''/home/domena.cz/mails/uzivatel''. A dále je nutné specifikovat, pro jaké domény a jaké uživatele má Postfix přijímat. Poslední vecí, kterou bylo třeba nastavit, byly práva. Postfix musí dodržet správné uživatele (poštu pro uzivatel@domena.cz musí doručovat s právy systémového účtu domena.cz). Všech těchto věcí snadno docílíte pomocí hash tabulek (nastavení main.cf): virtual_mailbox_domains = hash:/etc/postfix/vdomain virtual_mailbox_base = /home virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_minimum_uid = 500 virtual_uid_maps = hash:/etc/postfix/vuid virtual_gid_maps = static:99 virtual_alias_maps = hash:/etc/postfix/virtual Toto napíšete na konec souboru ''main.cf'', Postfix ve většině distribucí je přednastaven a není vůbec třeba nic měnit. Pozastavím se jen u hodnoty ''virtual_minimum_uid'', která specifikuje minimální UID, pod kterým se vyskytují uživatelé v systému. Red Hat distribuce používají pro normální uživatele UID větší než 500, SUSE třeba 1000. Nastavte podle svého systému. A dále ''virtual_gid_maps'' specifikuje, pod jakou skupinou se bude doručovat. Já používám skupinu **nobody**, tedy číslo 99 v mém systému. Nyní ukázka souborů s hash tabulkami. Tyto soubory jsou, jak je vidno, uloženy v adresáři /etc/postfix, ale kklidně je můžete dát i jinam. Nejprve ''vdomain'', který obsahuje seznam domén, pro které Postfix poštu přijímá: # # Soubor obsahuje seznam domen, pro ktere server prijima postu. # Pro pridani domeny pouzijte skript /usr/local/sbin/vadddomain # # Pokud tento soubor editujete rucne, na konci editace spustte # skript /usr/local/sbin/vreload ktery provede rebuild db a restart # firma.cz domain firma2.cz domain Soubor ''vmailbox'' obsahuje vlastní schránky, do kterých server doručuje: # # Soubor obsahuje virtualni schranky, co radek to jedna schranka. # Domena musi byt nejprve zanesena v souboru vdomain! # # Pokud tento soubor editujete rucne, na konci editace spustte # skript /usr/local/sbin/vreload # # Soubor ma format: # uzivatel@domena domena/mails/uzivatel/ # Kazdy radek _musi_ koncit lomitkem! # test@firma.cz firma.cz/mails/test/ Důležitý je také soubor ''vuid'', který nastavuje uživatele (UID čísla systémových účtů), pod kterými Postfix provádí doručení: # # Soubor obsahuje virtualni schranky, co radek to jedna schranka # # Pokud tento soubor editujete rucne, na konci editace spustte # skript /usr/local/sbin/vreload # @firma.cz 501 @firma2.cz 522 Soubor ''virtual'' obsahuje aliasy (přesměrování na jiné adresy). Mít jej nemusíte, pak ale smažte nastavení v souboru main.cf v Postfixu: # # Soubor obsahuje aliasy (presmerovani) # # Pokud tento soubor editujete rucne, na konci editace spustte # skript /usr/local/sbin/vreload ktery provede rebuild tabulek # a reload postfixu # lzap@firma.cz lukas.zapletal@uplnejinde.cz Doporučuji u Postfixu povolit [[postfix_a_tls_za_2_minuty|zabezpečený přístup]]. ===== Skripty na přidání domény a uživatele ===== Napsal jsem si skripty, které automaticky přidají doménu (resp. schránku) do systému a Postfixe. Jak je vidět, server spravuji přes ssh. Skripty umístěte do ''/usr/local/sbin/'' třeba... Skript **vreload**: #!/bin/bash # # Restartuje sluzby a provede rehash Postfix databazi # cd /etc/postfix postmap vdomain postmap virtual postmap vmailbox postmap vuid /etc/init.d/dovecot reload /etc/init.d/postfix reload /etc/init.d/httpd reload echo `date`: $0 $* >> /var/log/virtual.log Skript **vadddomain**: #!/bin/bash # # Prida virtualni domenu do postfixu # # vadddomain domena.cz # # Skript se zepta na heslo k systemovemu uctu (FTP pristup) # if [ -z "$1" ]; then echo "Pouziti: vadduser domena.cz" echo "Skript se zepta na heslo pro FTP pristup" exit 0 fi if [ -d "/home/$1" ]; then echo "Zadana domena jiz existuje!" exit 1 fi # systemovy uzivatel echo "Vytvarim systemoveho uzivatele $1" useradd -m -s /sbin/nologin $1 passwd $1 chmod 755 /home/$1 # vytvoreni domeny pro postfix echo "Pridavam domenu $1 do Postfixu" echo "$1 domain" >> /etc/postfix/vdomain U=$(id -u $1) echo "@$1 $U" >> /etc/postfix/vuid echo "Ucet vytvoren, FTP pristup aktivni." echo `date`: $0 $* >> /var/log/virtual.log /usr/local/sbin/vreload A skript **vadduser**: #!/bin/bash # # Prida virtualni schranku a vytvori POP3/IMAP pristup # # vadduser domena.cz uzivatel [heslo] # if [ -z "$1" -o -z "$2" ]; then echo "Pouziti: vadduser domena.cz uzivatel [heslo]" exit 0 fi # heslo nezadano -> vygenerujeme if [ -z "$3" ]; then PASS=$(cat /dev/urandom | tr -cd A-Za-z0-9 | fold -w8 | head -n 1) else PASS=$3 fi if [ ! -d "/home/$1" ]; then echo "Zadana domena neexistuje!" exit 1 fi echo "Schranka $2@$1 s heslem $PASS vytvorena" # pridej uzivatele do postfixu echo "$2@$1 $1/mails/$2/" >> /etc/postfix/vmailbox # pridej uzivatele do dovecotu echo "$2:{plain}$PASS:$1:nobody::::" >> /home/$1/hesla-posta.txt echo `date`: $0 $* >> /var/log/virtual.log /usr/local/sbin/vreload Po přidání domény a virtuálního účtu se Postfix reloadne a jakmile přijde první e-mail do schránky, vytvoří se (se správnými právy) adresář (maildir) a dopis se doručí. Díky diskovým kvótám na svazku /home je zajištěno, aby jedna doména nezabrala víc, než je povoleno. Jak aktivovat diskové kvóty v systému zde popisovat nebudu. Kvótu na schránku je možné nastavit pomocí souboru ''maildirsize'' (více info na http://wiki.dovecot.org/Quota/Maildir). ===== Smazání schránek a účtu ===== Smazání jedné schránky je snadné, stačí smazat záznam z vmailbox a poté smazat i vlastní adresář s poštou a řádek v souboru s hesly. Poté je nutné provést vreload! Smazání domény je taktéž jednoduché, nejprve vymažeme ze souboru vmailbox všechny schránky spojené s touto doménou, poté smažeme doménu z vdomain a vuid. Nakonec smažeme samotného uživatele ze systému příkazem ''userdel -r domena.cz'' a provedeme reload služeb příkazem vreload. ===== Dovecot ===== Konfigurace Dovecotu by mohla vypadat asi nějak takhle # zapneme vsechny protokoly protocols = imap imaps pop3 pop3s # tady najde Dovecot schranky uzivatelu mail_location = maildir:/home/%d/mails/%n # cache pro hesla bych doporucil vypnout (toto je implicitni) auth_cache_size = 0 # a hesla ke schrankam najde Dovecot v techto souborech auth default { mechanisms = plain login digest-md5 cram-md5 apop passdb passwd-file { args = /home/%d/hesla-posta.txt } userdb passwd-file { args = /home/%d/hesla-posta.txt } # hesla cteme pod timto uctem user = root # a vytvorime autentifikacni socket pro Postfix (vizte nize) socket listen { client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } } # a konecne povolime quotas na schranky plugin { quota = maildir } ===== SMTP AUTH ===== Pro odesílání pošty je nutno povolit SMTP AUTH v Postfixu (relay všem doporučuji zakázat). Nejprve jsem myslel, že budu potřebovat SASL2 knihovnu a nějak jí vnucovat hesla z textových souborů pro Dovecot. Jenže Dovecot je super, v konfiguraci výše v textu jsme vytvořili socket ''/var/spool/postfix/private/auth'' (toto je cesta v systémech Red Hat), který umožňuje autentifikovat uživatele přes databáze Dovecotu. V Postfixu tedy stačí nastavit: smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth Ostatně toto jsem popsal v mém [[smtp_auth_pro_relay_na_postfixu|vyčerpávajícím příspěvku]] již dříve. ===== Závěr ===== Takto jsem si udělal jednoduchý web/mail hostingový servřík. Manipulace s účty, nastavování kvót a ostatní věci lze dělat přes ssh. Doporučuji nainstalovat další služby, například pro DNS je výbornou kombinací MySQL+MyDNS (autoritativní), djbdns (nebo dnsmasq) jako caching server, phpMyAdmin, SquirrelMail a podobně. Prosím, podělte se v diskusi o vaše názory, jak by se to dalo vylepšit, případně napište, jak to řešíte vy! {{tag>linux}} ~~DISCUSSION~~